using Hotline.CallCenter.BlackLists;
using Hotline.CallCenter.Calls;
using Hotline.Permissions;
using Hotline.Repository.SqlSugar.Extensions;
using Hotline.Share.Dtos;
using Hotline.Share.Dtos.CallCenter;
using Hotline.Share.Enums.CallCenter;
using Hotline.Share.Requests;
using MapsterMapper;
using Microsoft.AspNetCore.Mvc;
namespace Hotline.Api.Controllers
{
///
/// 通话相关接口
///
public class CallController : BaseController
{
private readonly ICallRepository _callRepository;
private readonly IMapper _mapper;
private readonly IBlacklistDomainService _blacklistDomainService;
private readonly IBlacklistRepository _blacklistRepository;
///
/// 通话相关接口构造
///
///
///
///
///
public CallController(
ICallRepository callRepository,
IMapper mapper,
IBlacklistDomainService blacklistDomainService,
IBlacklistRepository blacklistRepository)
{
_callRepository = callRepository;
_mapper = mapper;
_blacklistDomainService = blacklistDomainService;
_blacklistRepository = blacklistRepository;
}
#region 通话记录
///
/// 分页通话记录列表
///
///
///
[Permission(EPermission.GetCallList)]
[HttpGet("paged")]
public async Task> GetCallList([FromQuery] GetCallListRequest request)
{
var (total, items) = await _callRepository.Queryable()
.Includes(d => d.CallDetails)
.WhereIF(!string.IsNullOrEmpty(request.PhoneNum), d => d.FromNo.Contains(request.PhoneNum!))
.WhereIF(!string.IsNullOrEmpty(request.ToNum), d => d.ToNo.Contains(request.ToNum!))
.WhereIF(request.Direction is not null, d => d.CallDirection == request.Direction)
.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"))
.WhereIF(!string.IsNullOrEmpty(request.UserName), d => d.UserName.Contains(request.UserName))
.OrderByDescending(d => d.CreationTime)
.ToPagedListAsync(request.PageIndex, request.PageSize);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 查询未接通话记录
///
///
///
[Permission(EPermission.GetCallListMissed)]
[HttpGet("messed-paged")]
public async Task> GetCallListMissed([FromQuery] GetCallListRequest request)
{
var (total, items) = await _callRepository.Queryable()
.Where(x => !x.CallDetails.Any(d => d.EventName == "ANSWERED"))
.WhereIF(!string.IsNullOrEmpty(request.PhoneNum), d => d.FromNo.Contains(request.PhoneNum!))
.WhereIF(!string.IsNullOrEmpty(request.ToNum), d => d.ToNo.Contains(request.ToNum!))
.WhereIF(request.Direction is not null, d => d.CallDirection == request.Direction)
.Includes(d => d.CallDetails)
.OrderByDescending(d => d.CreationTime)
.ToPagedListAsync(request.PageIndex, request.PageSize);
return new PagedDto(total, _mapper.Map>(items));
}
#endregion
#region 对外通话记录
///
/// 通话记录(外部对接)
///
///
///
[HttpGet("out-calllist")]
public async Task> GetOutCallList([FromQuery] GetOutCallListRequest request)
{
var list = await _callRepository.QueryPartAsync(request.time);
List outCallList = new List();
foreach (var item in list)
{
OutCallDto outCallDto = new OutCallDto();
outCallDto.CallId = item.Id;
outCallDto.InfoType = EInfoType.Call;//TODO目前写死(只有电话)
outCallDto.Direction = item.CallDirection;
outCallDto.Cpn = item.FromNo ?? "";
outCallDto.Cdpn = item.ToNo ?? "";
outCallDto.Answered = item.CallDetails?.FirstOrDefault(x => x.EventName == "ANSWERED")?.AnswerNo ?? "";
outCallDto.BeginTime = item.CreationTime;
outCallDto.OnTime = item.CallDetails?.FirstOrDefault(x => x.EventName == "ANSWERED")?.CreationTime;//TODO 接通时间是否可以为空
outCallDto.ByeTime = item.CallDetails?.FirstOrDefault(x => x.EventName == "BYE")?.CreationTime;
outCallDto.TalkTime = item.Duration;
outCallDto.SoundFileName = item.CallDetails?.FirstOrDefault(x => x.EventName == "BYE")?.Recording ?? "";
outCallDto.EvaluateResult = "";
outCallDto.EndBy = item.EndBy;
outCallDto.OnState = item.CallDetails?.Any(x => x.EventName == "ANSWERED") == true ? EOnState.On : EOnState.NoOn;
outCallList.Add(outCallDto);
}
return outCallList;
}
#endregion
#region 黑名单
///
/// 添加电话号至黑名单
///
///
///
[Permission(EPermission.AddBlackList)]
[HttpPost("blacklist")]
public async Task AddBlacklist([FromBody] AddBlacklistDto dto)
{
await _blacklistDomainService.AddAsync(dto, HttpContext.RequestAborted);
}
///
/// 删除黑名单数据
///
///
[Permission(EPermission.RemoveBlacklist)]
[HttpDelete("blacklist/{phone}")]
public void RemoveBlacklist(string phone)
{
_blacklistDomainService.RemoveAsync(phone);
}
///
/// 分页查询黑名单
///
///
///
[Permission(EPermission.QueryPagedBlack)]
[HttpGet("blacklist/paged")]
public async Task> QueryPaged([FromQuery] BlacklistPagedDto dto)
{
var (total, items) = await _blacklistRepository.QueryPagedAsync(
d => true,
d => d.OrderByDescending(x => x.CreationTime),
dto.PageIndex,
dto.PageSize,
whereIfs: (!string.IsNullOrEmpty(dto.PhoneNo), d => d.PhoneNo.Contains(dto.PhoneNo!)));
return new PagedDto(total, items);
}
#endregion
}
}