CalloldController.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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.Enums.Order;
  9. using Hotline.Share.Requests;
  10. using MapsterMapper;
  11. using Microsoft.AspNetCore.Http.Features;
  12. using Microsoft.AspNetCore.Mvc;
  13. using XF.Domain.Repository;
  14. using XF.Utility.EnumExtensions;
  15. namespace Hotline.Api.Controllers
  16. {
  17. /// <summary>
  18. /// 通话相关接口
  19. /// </summary>
  20. public class CalloldController : BaseController
  21. {
  22. private readonly ICallRepository _callRepository;
  23. private readonly IMapper _mapper;
  24. private readonly IBlacklistDomainService _blacklistDomainService;
  25. private readonly IBlacklistRepository _blacklistRepository;
  26. private readonly IRepository<WexCallRecord> _wexCallRecordRepository;
  27. /// <summary>
  28. /// 通话相关接口构造
  29. /// </summary>
  30. /// <param name="callRepository"></param>
  31. /// <param name="mapper"></param>
  32. /// <param name="blacklistDomainService"></param>
  33. /// <param name="blacklistRepository"></param>
  34. /// <param name="wexCallRecordRepository"></param>
  35. public CalloldController(
  36. ICallRepository callRepository,
  37. IMapper mapper,
  38. IBlacklistDomainService blacklistDomainService,
  39. IBlacklistRepository blacklistRepository,
  40. IRepository<WexCallRecord> wexCallRecordRepository)
  41. {
  42. _callRepository = callRepository;
  43. _mapper = mapper;
  44. _blacklistDomainService = blacklistDomainService;
  45. _blacklistRepository = blacklistRepository;
  46. _wexCallRecordRepository = wexCallRecordRepository;
  47. }
  48. #region 威而信通话记录
  49. /// <summary>
  50. /// 威而信通话记录
  51. /// </summary>
  52. /// <param name="request"></param>
  53. /// <returns></returns>
  54. [HttpGet("wexpaged")]
  55. public async Task<PagedDto<CallWexDto>> GetCallListWex([FromQuery] GetCallListWexRequest request)
  56. {
  57. var (total,items) = await _wexCallRecordRepository.Queryable()
  58. .WhereIF(!string.IsNullOrEmpty(request.CDPN), d => d.CDPN.Contains(request.CDPN!))
  59. .WhereIF(!string.IsNullOrEmpty(request.CPN), d => d.CPN.Contains(request.CPN!))
  60. .WhereIF(request.Direction is not null, d => d.Direction == request.Direction)
  61. .WhereIF(request.OnState is not null, d => d.OnState == request.OnState)
  62. .WhereIF(!string.IsNullOrEmpty(request.StaffNo), d => d.StaffNo.Contains(request.StaffNo))
  63. .OrderByDescending(d => d.BeginTime)
  64. .ToPagedListAsync(request.PageIndex, request.PageSize);
  65. return new PagedDto<CallWexDto>(total, _mapper.Map<IReadOnlyList<CallWexDto>>(items));
  66. }
  67. /// <summary>
  68. /// 页面基础信息
  69. /// </summary>
  70. /// <returns></returns>
  71. [HttpGet("base-data")]
  72. public async Task<object> BaseData()
  73. {
  74. var rsp = new
  75. {
  76. CallDirectionOption = EnumExts.GetDescriptions<ECallDirection>(),
  77. OnStateOption = EnumExts.GetDescriptions<EOnState>()
  78. };
  79. return rsp;
  80. }
  81. #endregion
  82. #region 通话记录
  83. /// <summary>
  84. /// 分页通话记录列表
  85. /// </summary>
  86. /// <param name="request"></param>
  87. /// <returns></returns>
  88. [HttpGet("paged")]
  89. public async Task<PagedDto<CallDto>> GetCallList([FromQuery] GetCallListRequest request)
  90. {
  91. var (total, items) = await _callRepository.Queryable()
  92. .Includes(d => d.CallDetails)
  93. .WhereIF(!string.IsNullOrEmpty(request.PhoneNum), d => d.FromNo.Contains(request.PhoneNum!))
  94. .WhereIF(!string.IsNullOrEmpty(request.ToNum), d => d.ToNo.Contains(request.ToNum!))
  95. .WhereIF(request.Direction is not null, d => d.CallDirection == request.Direction)
  96. .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"))
  97. .WhereIF(!string.IsNullOrEmpty(request.UserName), d => d.UserName.Contains(request.UserName))
  98. .OrderByDescending(d => d.CreationTime)
  99. .ToPagedListAsync(request.PageIndex, request.PageSize);
  100. return new PagedDto<CallDto>(total, _mapper.Map<IReadOnlyList<CallDto>>(items));
  101. }
  102. /// <summary>
  103. /// 查询未接通话记录
  104. /// </summary>
  105. /// <param name="request"></param>
  106. /// <returns></returns>
  107. [HttpGet("messed-paged")]
  108. public async Task<PagedDto<CallDto>> GetCallListMissed([FromQuery] GetCallListRequest request)
  109. {
  110. var (total, items) = await _callRepository.Queryable()
  111. .Where(x => !x.CallDetails.Any(d => d.EventName == "ANSWERED"))
  112. .WhereIF(!string.IsNullOrEmpty(request.PhoneNum), d => d.FromNo.Contains(request.PhoneNum!))
  113. .WhereIF(!string.IsNullOrEmpty(request.ToNum), d => d.ToNo.Contains(request.ToNum!))
  114. .WhereIF(request.Direction is not null, d => d.CallDirection == request.Direction)
  115. .Includes(d => d.CallDetails)
  116. .OrderByDescending(d => d.CreationTime)
  117. .ToPagedListAsync(request.PageIndex, request.PageSize);
  118. return new PagedDto<CallDto>(total, _mapper.Map<IReadOnlyList<CallDto>>(items));
  119. }
  120. #endregion
  121. #region 对外通话记录
  122. /// <summary>
  123. /// 通话记录(外部对接)
  124. /// </summary>
  125. /// <param name="request"></param>
  126. /// <returns></returns>
  127. [HttpGet("out-calllist")]
  128. public async Task<IReadOnlyList<OutCallDto>> GetOutCallList([FromQuery] GetOutCallListRequest request)
  129. {
  130. var list = await _callRepository.QueryPartAsync(request.time);
  131. List<OutCallDto> outCallList = new List<OutCallDto>();
  132. foreach (var item in list)
  133. {
  134. OutCallDto outCallDto = new OutCallDto();
  135. outCallDto.CallId = item.Id;
  136. outCallDto.InfoType = EInfoType.Call;//TODO目前写死(只有电话)
  137. outCallDto.Direction = item.CallDirection;
  138. outCallDto.Cpn = item.FromNo ?? "";
  139. outCallDto.Cdpn = item.ToNo ?? "";
  140. outCallDto.Answered = item.CallDetails?.FirstOrDefault(x => x.EventName == "ANSWERED")?.AnswerNo ?? "";
  141. outCallDto.BeginTime = item.CreationTime;
  142. outCallDto.OnTime = item.CallDetails?.FirstOrDefault(x => x.EventName == "ANSWERED")?.CreationTime;//TODO 接通时间是否可以为空
  143. outCallDto.ByeTime = item.CallDetails?.FirstOrDefault(x => x.EventName == "BYE")?.CreationTime;
  144. outCallDto.TalkTime = item.Duration;
  145. outCallDto.SoundFileName = item.CallDetails?.FirstOrDefault(x => x.EventName == "BYE")?.Recording ?? "";
  146. outCallDto.EvaluateResult = "";
  147. outCallDto.EndBy = item.EndBy;
  148. outCallDto.OnState = item.CallDetails?.Any(x => x.EventName == "ANSWERED") == true ? EOnState.On : EOnState.NoOn;
  149. outCallList.Add(outCallDto);
  150. }
  151. return outCallList;
  152. }
  153. #endregion
  154. #region 黑名单
  155. /// <summary>
  156. /// 添加电话号至黑名单
  157. /// </summary>
  158. /// <param name="dto"></param>
  159. /// <returns></returns>
  160. [HttpPost("blacklist")]
  161. public async Task AddBlacklist([FromBody] AddBlacklistDto dto)
  162. {
  163. await _blacklistDomainService.AddAsync(dto, HttpContext.RequestAborted);
  164. }
  165. /// <summary>
  166. /// 删除黑名单数据
  167. /// </summary>
  168. /// <param name="phone"></param>
  169. [HttpDelete("blacklist/{phone}")]
  170. public void RemoveBlacklist(string phone)
  171. {
  172. _blacklistDomainService.RemoveAsync(phone);
  173. }
  174. /// <summary>
  175. /// 分页查询黑名单
  176. /// </summary>
  177. /// <param name="dto"></param>
  178. /// <returns></returns>
  179. [HttpGet("blacklist/paged")]
  180. public async Task<PagedDto<Blacklist>> QueryPaged([FromQuery] BlacklistPagedDto dto)
  181. {
  182. var (total, items) = await _blacklistRepository.QueryPagedAsync(
  183. d => !d.IsDeleted,
  184. d => d.OrderByDescending(x => x.CreationTime),
  185. dto.PageIndex,
  186. dto.PageSize,
  187. whereIfs: (!string.IsNullOrEmpty(dto.PhoneNo), d => d.PhoneNo.Contains(dto.PhoneNo!)));
  188. return new PagedDto<Blacklist>(total, items);
  189. }
  190. #endregion
  191. }
  192. }