|
@@ -73,6 +73,8 @@ namespace Hotline.Api.Controllers
|
|
|
private readonly ICallTelClient _callTelClient;
|
|
|
private readonly IRepository<TelOperation> _telOperationRepository;
|
|
|
private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
|
|
|
+ private readonly ITypedCache<List<TelNotifyStatusDto>> _cacheTelNotifyStatusDto;
|
|
|
+ private const string TelNotifyStatusListKey = "Tel_NotifyStatus_List";
|
|
|
|
|
|
public IPPbxController(IMapper mapper, IUserDomainService userDomainService,
|
|
|
ISessionContext sessionContext, IRepository<TrCallRecord> trCallRecordRepository,
|
|
@@ -92,7 +94,8 @@ namespace Hotline.Api.Controllers
|
|
|
IIPPbxApplication iPPbxApplication,
|
|
|
ICallTelClient callTelClient,
|
|
|
IRepository<TelOperation> telOperationRepository,
|
|
|
- IOptionsSnapshot<AppConfiguration> appOptions)
|
|
|
+ IOptionsSnapshot<AppConfiguration> appOptions,
|
|
|
+ ITypedCache<List<TelNotifyStatusDto>> cacheTelNotifyStatusDto)
|
|
|
{
|
|
|
_mapper = mapper;
|
|
|
_userDomainService = userDomainService;
|
|
@@ -122,6 +125,7 @@ namespace Hotline.Api.Controllers
|
|
|
_callTelClient = callTelClient;
|
|
|
_telOperationRepository = telOperationRepository;
|
|
|
_appOptions = appOptions;
|
|
|
+ _cacheTelNotifyStatusDto = cacheTelNotifyStatusDto;
|
|
|
}
|
|
|
|
|
|
#region 添添呼
|
|
@@ -682,16 +686,135 @@ namespace Hotline.Api.Controllers
|
|
|
[LogFilterAlpha("话机状态通知")]
|
|
|
public async Task NotifyStatus(NotifyInDto dto)
|
|
|
{
|
|
|
- var userName = _sessionContext.UserName;
|
|
|
- if (dto.Status == 0) // 签出
|
|
|
+ if (dto.Status == 202)//如果是繁忙状态将状态改成小休
|
|
|
+ dto.Status = 201;
|
|
|
+
|
|
|
+ #region 处理动作数据
|
|
|
+ var time = DateTime.Now;
|
|
|
+ TelOperation telOperation = new()
|
|
|
+ {
|
|
|
+ StaffNo = dto.StaffNo,
|
|
|
+ TelNo = dto.TelNo,
|
|
|
+ OperateState = dto.Status,
|
|
|
+ OperateTime = time,
|
|
|
+ };
|
|
|
+
|
|
|
+ switch (dto.Status)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ telOperation.OperateStateText = "签出";
|
|
|
+ break;
|
|
|
+ case 100:
|
|
|
+ telOperation.OperateStateText = "签入";
|
|
|
+ break;
|
|
|
+ case 200:
|
|
|
+ telOperation.OperateStateText = "空闲";
|
|
|
+ break;
|
|
|
+ case 201:
|
|
|
+ telOperation.OperateStateText = "小休";
|
|
|
+ break;
|
|
|
+ case 202:
|
|
|
+ telOperation.OperateStateText = "繁忙";
|
|
|
+ break;
|
|
|
+ case 300:
|
|
|
+ telOperation.OperateStateText = "呼入振铃";
|
|
|
+ break;
|
|
|
+ case 301:
|
|
|
+ telOperation.OperateStateText = "呼入通话";
|
|
|
+ break;
|
|
|
+ case 302:
|
|
|
+ telOperation.OperateStateText = "呼出振铃";
|
|
|
+ break;
|
|
|
+ case 303:
|
|
|
+ telOperation.OperateStateText = "呼出通话";
|
|
|
+ break;
|
|
|
+ case 310:
|
|
|
+ telOperation.OperateStateText = "通话保持";
|
|
|
+ break;
|
|
|
+ case 320:
|
|
|
+ telOperation.OperateStateText = "会议";
|
|
|
+ break;
|
|
|
+ case 330:
|
|
|
+ telOperation.OperateStateText = "咨询";
|
|
|
+ break;
|
|
|
+ case 400:
|
|
|
+ telOperation.OperateStateText = "整理";
|
|
|
+ break;
|
|
|
+ case 900:
|
|
|
+ telOperation.OperateStateText = "注册";
|
|
|
+ break;
|
|
|
+ case 901:
|
|
|
+ telOperation.OperateStateText = "注销";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ await _telOperationRepository.AddAsync(telOperation);
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ if (dto.Status == 0)
|
|
|
+ {
|
|
|
+ var telNotifyStatusDto = _mapper.Map<TelNotifyStatusDto>(dto);
|
|
|
+ telNotifyStatusDto.NotifyStatusTime = time;
|
|
|
+ // 如果推送的是签出,则延迟处理数据
|
|
|
+ var list = await _cacheTelNotifyStatusDto.GetAsync(TelNotifyStatusListKey, HttpContext.RequestAborted);
|
|
|
+ if (list == null)
|
|
|
+ {
|
|
|
+ list = [telNotifyStatusDto];
|
|
|
+ await _cacheTelNotifyStatusDto.SetAsync(TelNotifyStatusListKey, list, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var data = list.Find(p => p.StaffNo == dto.StaffNo && p.TelNo == dto.TelNo && p.Status == dto.Status);
|
|
|
+ if (data != null)
|
|
|
+ list.Remove(data);
|
|
|
+
|
|
|
+ list.Add(telNotifyStatusDto);
|
|
|
+ await _cacheTelNotifyStatusDto.SetAsync(TelNotifyStatusListKey, list, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ //处理分机状态
|
|
|
+ var telWork = _userCacheManager.GetWorkByTelNoExp(dto.TelNo);
|
|
|
+ if (telWork != null && telWork.ExtensionStatus != (EExtensionStatus)dto.Status)
|
|
|
{
|
|
|
- //await _iPPbxApplication.ResetTelStatus(null, dto.TelNo, CancellationToken.None);
|
|
|
+ telWork.OldExtensionStatus = telWork.ExtensionStatus;
|
|
|
+ telWork.ExtensionStatus = (EExtensionStatus)dto.Status;
|
|
|
+ _userCacheManager.SetWorkByUser(telWork);
|
|
|
}
|
|
|
- //dto.Status = await _callTelClient.GetStatusAsync(dto.Status);
|
|
|
- //await _callApplication.EndActionAsync(dto.Adapt<EndActionInDto>());
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 处理状态
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("processing-checked-out-data")]
|
|
|
+ [AllowAnonymous]
|
|
|
+ public async Task ProcessingCheckedOutData()
|
|
|
+ {
|
|
|
+ var list = await _cacheTelNotifyStatusDto.GetAsync(TelNotifyStatusListKey, HttpContext.RequestAborted);
|
|
|
+ if (list != null && list.Any())
|
|
|
+ {
|
|
|
+ foreach (var dto in list)
|
|
|
+ {
|
|
|
+ var data = await _telOperationRepository.GetAsync(p => p.TelNo == dto.TelNo && p.StaffNo == dto.StaffNo && p.CreationTime > dto.NotifyStatusTime);
|
|
|
+ if (data != null)
|
|
|
+ {
|
|
|
+ list.Remove(dto);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ list.Remove(dto);
|
|
|
+ //处理签出
|
|
|
+ await _callApplication.SingOutAsync(HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ await _cacheTelNotifyStatusDto.SetAsync(TelNotifyStatusListKey, list, cancellationToken: HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
#endregion
|
|
|
|
|
|
#region 通话记录(对内)
|