TelsStatusRefreshService.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using Hotline.CallCenter.Calls;
  2. using Hotline.CallCenter.Tels;
  3. using Hotline.Realtimes;
  4. using Hotline.Share.Enums.CallCenter;
  5. using Hotline.Users;
  6. using Microsoft.Extensions.DependencyInjection;
  7. using Microsoft.Extensions.Hosting;
  8. using Tr.Sdk;
  9. using XF.Domain.Cache;
  10. using XF.Domain.Repository;
  11. namespace Hotline.Application.CallCenter.Calls
  12. {
  13. public class TelsStatusRefreshService : BackgroundService
  14. {
  15. private readonly IServiceScopeFactory _serviceScopeFactory;
  16. public TelsStatusRefreshService(IServiceScopeFactory serviceScopeFactory)
  17. {
  18. _serviceScopeFactory = serviceScopeFactory;
  19. }
  20. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  21. {
  22. using var scope = _serviceScopeFactory.CreateScope();
  23. var realtimeService = scope.ServiceProvider.GetRequiredService<IRealtimeService>();
  24. var _trClient = scope.ServiceProvider.GetRequiredService<ITrClient>();
  25. var _workRepository = scope.ServiceProvider.GetRequiredService<IRepository<Work>>();
  26. var _telRestRepository = scope.ServiceProvider.GetRequiredService<IRepository<TelRest>>();
  27. var _cacheWork = scope.ServiceProvider.GetRequiredService<ITypedCache<Work>>();
  28. var _telActionRecordRepository = scope.ServiceProvider.GetRequiredService<IRepository<TelActionRecord>>();
  29. int times = 300000;
  30. while (!stoppingToken.IsCancellationRequested)
  31. {
  32. try
  33. {
  34. //var list = await _workRepository.Queryable().Where(x => !x.EndTime.HasValue).ToListAsync();
  35. var list = await _workRepository.Queryable().Where(x => 1==1 && !x.EndTime.HasValue).ToListAsync();
  36. //var list = await _workRepository.Queryable().Where(x => x.EndTime is null).ToListAsync();
  37. var tellist = await _trClient.QueryTelStateAsync(new Tr.Sdk.Tels.QueryTelStateRequest { }, stoppingToken);
  38. foreach (var item in list)
  39. {
  40. var telmodel = tellist.AgentList.First(x => x.TelNo == item.TelNo);
  41. if (telmodel != null)
  42. {
  43. if (telmodel.State == "logout")
  44. {
  45. var telRest = await _telRestRepository.GetAsync(x => x.TelNo == item.TelNo && x.EndTime != null, stoppingToken);
  46. if (telRest is not null)
  47. {
  48. telRest.EndRest();
  49. await _telRestRepository.UpdateAsync(telRest, stoppingToken);
  50. }
  51. item.OffDuty();
  52. await _workRepository.UpdateAsync(item, stoppingToken);
  53. _cacheWork.Remove(item.GetKey(KeyMode.UserId));
  54. _cacheWork.Remove(item.GetKey(KeyMode.TelNo));
  55. var listx = await _telActionRecordRepository.Queryable().Where(x => x.TelNo == item.TelNo && !x.EndTime.HasValue).ToListAsync();
  56. foreach (var itemx in listx)
  57. {
  58. itemx.EndAction();
  59. await _telActionRecordRepository.UpdateAsync(itemx);
  60. }
  61. //#region 小休状态
  62. //var telAction = await _telActionRecordRepository.GetAsync(x => x.TelNo == item.TelNo && x.ActionType == EActionType.TelRest && !x.EndTime.HasValue, stoppingToken);
  63. //if (telAction != null)
  64. //{
  65. // telAction.EndAction();
  66. // await _telActionRecordRepository.UpdateAsync(telAction);
  67. //}
  68. //#endregion
  69. //#region 话后整理
  70. //var telarrangeAction = await _telActionRecordRepository.GetAsync(x => x.TelNo == item.TelNo && x.ActionType == EActionType.CallEndArrange && !x.EndTime.HasValue,stoppingToken);
  71. //if (telarrangeAction != null)
  72. //{
  73. // telarrangeAction.EndAction();
  74. // await _telActionRecordRepository.UpdateAsync(telarrangeAction);
  75. //}
  76. //#endregion
  77. }
  78. }
  79. }
  80. }
  81. catch
  82. {
  83. }
  84. await Task.Delay(times);
  85. }
  86. }
  87. }
  88. }