|
@@ -13,11 +13,14 @@ using Hotline.Share.Dtos.CallCenter;
|
|
|
using Hotline.Share.Dtos.Quality;
|
|
|
using Hotline.Share.Dtos.TrCallCenter;
|
|
|
using Hotline.Share.Enums.CallCenter;
|
|
|
+using Hotline.Repository.SqlSugar.Extensions;
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
using Microsoft.Extensions.Options;
|
|
|
using System.Threading;
|
|
|
using XF.Domain.Exceptions;
|
|
|
using XF.Utility.EnumExtensions;
|
|
|
+using XF.Domain.Repository;
|
|
|
+using MapsterMapper;
|
|
|
|
|
|
namespace Hotline.Api.Controllers
|
|
|
{
|
|
@@ -25,33 +28,39 @@ namespace Hotline.Api.Controllers
|
|
|
{
|
|
|
private readonly ICallApplication _callApplication;
|
|
|
private readonly Publisher _publisher;
|
|
|
+ private readonly IMapper _mapper;
|
|
|
private readonly IOptionsSnapshot<CallCenterConfiguration> _callcenterOptions;
|
|
|
private readonly ISystemSettingCacheManager _systemSettingCacheManager;
|
|
|
+ private readonly IRepository<TelOperationXthx> _telOperationXthxRepository;
|
|
|
|
|
|
- public CallController(
|
|
|
+ public CallController(
|
|
|
ICallApplication callApplication,
|
|
|
Publisher publisher,
|
|
|
+ IMapper mapper,
|
|
|
IOptionsSnapshot<CallCenterConfiguration> callcenterOptions,
|
|
|
- ISystemSettingCacheManager systemSettingCacheManager)
|
|
|
+ ISystemSettingCacheManager systemSettingCacheManager,
|
|
|
+ IRepository<TelOperationXthx> telOperationXthxRepository)
|
|
|
{
|
|
|
_callApplication = callApplication;
|
|
|
_publisher = publisher;
|
|
|
+ _mapper = mapper;
|
|
|
_callcenterOptions = callcenterOptions;
|
|
|
_systemSettingCacheManager = systemSettingCacheManager;
|
|
|
- }
|
|
|
+ _telOperationXthxRepository = telOperationXthxRepository;
|
|
|
+ }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 查询分机
|
|
|
/// </summary>
|
|
|
[HttpGet("tels")]
|
|
|
public async Task<IList<TelDto>> QueryTels()
|
|
|
- => (await _callApplication.QueryTelsAsync(new QueryTelsInDto(null) { PageSize = 99999}, HttpContext.RequestAborted)).Item2;
|
|
|
+ => (await _callApplication.QueryTelsAsync(new QueryTelsInDto(null) { PageSize = 99999 }, HttpContext.RequestAborted)).Item2;
|
|
|
|
|
|
/// <summary>
|
|
|
/// 查询分机
|
|
|
/// </summary>
|
|
|
[HttpGet("tels-paged")]
|
|
|
- public async Task<PagedDto<TelDto>> QueryTelsAsync([FromQuery]QueryTelsInDto dto)
|
|
|
+ public async Task<PagedDto<TelDto>> QueryTelsAsync([FromQuery] QueryTelsInDto dto)
|
|
|
=> (await _callApplication.QueryTelsAsync(dto, HttpContext.RequestAborted)).ToPaged();
|
|
|
|
|
|
/// <summary>
|
|
@@ -140,7 +149,7 @@ namespace Hotline.Api.Controllers
|
|
|
/// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
[HttpGet("tel-operations-fixed")]
|
|
|
- public Task<IReadOnlyList<TelOperation>> QueryTelOperationsFixed([FromQuery] QueryTelOperationsFixedDto dto) =>
|
|
|
+ public Task<IReadOnlyList<TelOperation>> QueryTelOperationsFixed([FromQuery] QueryTelOperationsFixedDto dto) =>
|
|
|
_callApplication.QueryTelOperationsAsync(dto, HttpContext.RequestAborted);
|
|
|
|
|
|
/// <summary>
|
|
@@ -155,8 +164,6 @@ namespace Hotline.Api.Controllers
|
|
|
};
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 通话转写
|
|
|
/// </summary>
|
|
@@ -165,36 +172,59 @@ namespace Hotline.Api.Controllers
|
|
|
[HttpPost("calls/transliteration")]
|
|
|
public async Task CallTransliteration([FromBody] CallTransliteration dto)
|
|
|
{
|
|
|
- foreach (var id in dto.Ids)
|
|
|
- {
|
|
|
- var call = await _callApplication.GetTianrunCallAsync(id, HttpContext.RequestAborted);
|
|
|
- if (call is null)
|
|
|
- throw UserFriendlyException.SameMessage("通话信息错误");
|
|
|
- if (call.TransliterationState == ECallTransliterationState.Underway)
|
|
|
- throw UserFriendlyException.SameMessage("正在转写中,请勿重复点击,请稍作等待");
|
|
|
- if (call.TransliterationState == ECallTransliterationState.Succeed)
|
|
|
- throw UserFriendlyException.SameMessage("转写成功,不能重新转写");
|
|
|
- call.InitTransliterationId();
|
|
|
- await _callApplication.EditTransliterationStateAsync(call.Id, ECallTransliterationState.Underway, call.TransliterationId, HttpContext.RequestAborted);
|
|
|
- var audioFile = call.RecordingAbsolutePath;
|
|
|
- var fromNo = call.CPN;
|
|
|
- var callStartTime = call.CreatedTime;
|
|
|
- var Id = call.TransliterationId;
|
|
|
- var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ViteRecordPrefix);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- var handler = new AiQualityHandler()
|
|
|
- {
|
|
|
- Id = Id,
|
|
|
- Source = "AiAnswered",
|
|
|
- AudioFile = audioFile,
|
|
|
- FromNo = fromNo,
|
|
|
- CallStartTime = callStartTime,
|
|
|
- ViteRecordPrefix = setting?.SettingValue[0],
|
|
|
- };
|
|
|
- await _publisher.PublishAsync(new AiOrderQualityNotify(handler), PublishStrategy.ParallelNoWait, HttpContext.RequestAborted);
|
|
|
- }
|
|
|
+ foreach (var id in dto.Ids)
|
|
|
+ {
|
|
|
+ var call = await _callApplication.GetTianrunCallAsync(id, HttpContext.RequestAborted);
|
|
|
+ if (call is null)
|
|
|
+ throw UserFriendlyException.SameMessage("通话信息错误");
|
|
|
+ if (call.TransliterationState == ECallTransliterationState.Underway)
|
|
|
+ throw UserFriendlyException.SameMessage("正在转写中,请勿重复点击,请稍作等待");
|
|
|
+ if (call.TransliterationState == ECallTransliterationState.Succeed)
|
|
|
+ throw UserFriendlyException.SameMessage("转写成功,不能重新转写");
|
|
|
+ call.InitTransliterationId();
|
|
|
+ await _callApplication.EditTransliterationStateAsync(call.Id, ECallTransliterationState.Underway, call.TransliterationId, HttpContext.RequestAborted);
|
|
|
+ var audioFile = call.RecordingAbsolutePath;
|
|
|
+ var fromNo = call.CPN;
|
|
|
+ var callStartTime = call.CreatedTime;
|
|
|
+ var Id = call.TransliterationId;
|
|
|
+ var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ViteRecordPrefix);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var handler = new AiQualityHandler()
|
|
|
+ {
|
|
|
+ Id = Id,
|
|
|
+ Source = "AiAnswered",
|
|
|
+ AudioFile = audioFile,
|
|
|
+ FromNo = fromNo,
|
|
|
+ CallStartTime = callStartTime,
|
|
|
+ ViteRecordPrefix = setting?.SettingValue[0],
|
|
|
+ };
|
|
|
+ await _publisher.PublishAsync(new AiOrderQualityNotify(handler), PublishStrategy.ParallelNoWait, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #region 坐席动作类型统计
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 坐席动作类型统计
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("telaction/list")]
|
|
|
+ public async Task<PagedDto<TelActionListXthx>> TelActionList([FromQuery] TelActionXthxDto dto)
|
|
|
+ {
|
|
|
+ var (total, items) = await _telOperationXthxRepository.Queryable()
|
|
|
+ .WhereIF(string.IsNullOrEmpty(dto.TelNo) == false, x => x.TelNo.Contains(dto.TelNo))
|
|
|
+ .WhereIF(dto.OperationStatus != null, x => x.OperationStatus == dto.OperationStatus)
|
|
|
+ .WhereIF(string.IsNullOrEmpty(dto.UserName) == false, x => x.UserName.Contains(dto.UserName))
|
|
|
+ .WhereIF(dto.StartTime.HasValue, x => x.StartTime >= dto.StartTime)
|
|
|
+ .WhereIF(dto.EndTime.HasValue, x => x.StartTime <= dto.EndTime)
|
|
|
+ .OrderByDescending(x => x.StartTime)
|
|
|
+ .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
+ return new PagedDto<TelActionListXthx>(total, _mapper.Map<IReadOnlyList<TelActionListXthx>>(items));
|
|
|
}
|
|
|
- }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+ }
|
|
|
}
|