TelsStatusRefreshService.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Hotline.CallCenter.Tels;
  2. using Hotline.Realtimes;
  3. using Hotline.Users;
  4. using Microsoft.Extensions.DependencyInjection;
  5. using Microsoft.Extensions.Hosting;
  6. using System.Threading;
  7. using Tr.Sdk;
  8. using XF.Domain.Cache;
  9. using XF.Domain.Repository;
  10. namespace Hotline.Application.CallCenter.Calls
  11. {
  12. public class TelsStatusRefreshService : BackgroundService
  13. {
  14. private readonly IServiceScopeFactory _serviceScopeFactory;
  15. public TelsStatusRefreshService(IServiceScopeFactory serviceScopeFactory)
  16. {
  17. _serviceScopeFactory = serviceScopeFactory;
  18. }
  19. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  20. {
  21. using var scope = _serviceScopeFactory.CreateScope();
  22. var realtimeService = scope.ServiceProvider.GetRequiredService<IRealtimeService>();
  23. var _trClient = scope.ServiceProvider.GetRequiredService<ITrClient>();
  24. var _workRepository = scope.ServiceProvider.GetRequiredService<IRepository<Work>>();
  25. var _telRestRepository = scope.ServiceProvider.GetRequiredService<IRepository<TelRest>>();
  26. var _cacheWork = scope.ServiceProvider.GetRequiredService<ITypedCache<Work>>();
  27. int times = 300000;
  28. while (!stoppingToken.IsCancellationRequested)
  29. {
  30. try
  31. {
  32. //var list = await _workRepository.Queryable().Where(x => !x.EndTime.HasValue).ToListAsync();
  33. var list = await _workRepository.Queryable().Where(x => 1==1 && !x.EndTime.HasValue).ToListAsync();
  34. //var list = await _workRepository.Queryable().Where(x => x.EndTime is null).ToListAsync();
  35. var tellist = await _trClient.QueryTelStateAsync(new Tr.Sdk.Tels.QueryTelStateRequest { }, stoppingToken);
  36. foreach (var item in list)
  37. {
  38. var telmodel = tellist.AgentList.First(x => x.TelNo == item.TelNo);
  39. if (telmodel != null)
  40. {
  41. if (telmodel.State == "logout")
  42. {
  43. var telRest = await _telRestRepository.GetAsync(x => x.TelNo == item.TelNo && x.EndTime != null, stoppingToken);
  44. if (telRest is not null)
  45. {
  46. telRest.EndRest();
  47. await _telRestRepository.UpdateAsync(telRest, stoppingToken);
  48. }
  49. item.OffDuty();
  50. await _workRepository.UpdateAsync(item, stoppingToken);
  51. _cacheWork.Remove(item.GetKey(KeyMode.UserId));
  52. _cacheWork.Remove(item.GetKey(KeyMode.TelNo));
  53. }
  54. }
  55. }
  56. }
  57. catch
  58. {
  59. }
  60. await Task.Delay(times);
  61. }
  62. }
  63. }
  64. }