SeatStateDataService.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Hotline.CallCenter.Calls;
  7. using SqlSugar;
  8. using XF.Domain.Dependency;
  9. using XF.Domain.Repository;
  10. namespace Hotline.Application.Bigscreen
  11. {
  12. public class SeatStateDataService: ISeatStateDataService , IScopeDependency
  13. {
  14. public static string now = DateTime.Now.ToString("yyyy-MM-dd");
  15. private readonly IRepository<TrCallRecord> _callRepository;
  16. public SeatStateDataService(IRepository<TrCallRecord> callRepository) {
  17. _callRepository= callRepository;
  18. }
  19. public async Task<object> GetCall24(CancellationToken stoppingToken) {
  20. List<string> timeList = new List<string>();
  21. for (int i = 0; i < 24; i++)
  22. {
  23. var time = i < 10 ? $"0{i}" : i.ToString();
  24. timeList.Add(time);
  25. }
  26. var call24 = await _callRepository.Queryable()
  27. .Where(x => x.CreatedTime.ToString("yyyy-MM-dd") == now
  28. && x.CallOrderType == Share.Enums.CallCenter.ECallOrderType.Order
  29. )
  30. .Select(x => new { time = x.CreatedTime.ToString("hh"), x.CallDirection }).MergeTable()
  31. .GroupBy(x => x.time)
  32. .Select(x => new
  33. {
  34. Time = x.time.ToString(),
  35. In = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.In, 1, 0)),
  36. Out = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.Out, 1, 0)),
  37. }).MergeTable().ToListAsync(stoppingToken);
  38. var call24List = (from t1 in timeList
  39. join t2 in call24 on t1 equals t2.Time into t1_t2
  40. from item in t1_t2.DefaultIfEmpty()
  41. select new {
  42. Time = t1 + ":00",
  43. In = t1_t2.Select(x => x.In).FirstOrDefault() ,
  44. Out = t1_t2.Select(x => x.Out).FirstOrDefault()
  45. }).ToList();
  46. return call24List;
  47. }
  48. public async Task<object> GetCallTop10(CancellationToken stoppingToken)
  49. {
  50. var callTop10 = await _callRepository.Queryable()
  51. .Where(x => x.CreatedTime.ToString("yyyy-MM-dd") == now
  52. && x.CallOrderType == Share.Enums.CallCenter.ECallOrderType.Order
  53. )
  54. .GroupBy(x => x.UserName)
  55. .Select(x => new
  56. {
  57. UserName = x.UserName,
  58. In = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.In, 1, 0))
  59. }).MergeTable().OrderByDescending(x => x.In).Take(10).ToListAsync(stoppingToken);
  60. return callTop10;
  61. }
  62. public async Task<object> GetCallList(CancellationToken stoppingToken)
  63. {
  64. var callList = await _callRepository.Queryable()
  65. .Where(x => x.CreatedTime.ToString("yyyy-MM-dd") == now
  66. && x.CallOrderType == Share.Enums.CallCenter.ECallOrderType.Order
  67. )
  68. .Select(x => new
  69. {
  70. InOn = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.In && x.OnState == Share.Enums.CallCenter.EOnState.On, 1, 0)),
  71. ValidOn = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.In && x.OnState == Share.Enums.CallCenter.EOnState.On && x.Duration > 5, 1, 0)),
  72. InNoOn = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.In && x.OnState == Share.Enums.CallCenter.EOnState.NoOn, 1, 0)),
  73. OutOn = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.Out && x.OnState == Share.Enums.CallCenter.EOnState.On, 1, 0)),
  74. InQueueNoOn = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.In && x.OnState == Share.Enums.CallCenter.EOnState.NoOn && x.QueueTims > 0, 1, 0)),
  75. }).MergeTable().ToListAsync(stoppingToken);
  76. return callList;
  77. }
  78. public async Task<object> GetCallAverage(CancellationToken stoppingToken)
  79. {
  80. List<string> timeList = new List<string>();
  81. for (int i = 0; i < 24; i++)
  82. {
  83. var time = i < 10 ? $"0{i}" : i.ToString();
  84. timeList.Add(time);
  85. }
  86. var callAverage = await _callRepository.Queryable()
  87. .Where(x => x.CreatedTime.ToString("yyyy-MM-dd") == now
  88. && x.CallOrderType == Share.Enums.CallCenter.ECallOrderType.Order
  89. )
  90. .Select(x => new { time = x.CreatedTime.ToString("hh"), x.CallDirection }).MergeTable()
  91. .GroupBy(x => x.time)
  92. .Select(x => new
  93. {
  94. Time = x.time.ToString(),
  95. In = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.In, 1, 0)),
  96. InAverag = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.In, 1, 0)) / 60,
  97. Out = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.Out, 1, 0)),
  98. OutAverag = SqlFunc.AggregateSum(SqlFunc.IIF(x.CallDirection == Share.Enums.CallCenter.ECallDirection.Out, 1, 0)) / 60,
  99. }).MergeTable().ToListAsync(stoppingToken);
  100. var callAverageList = (from t1 in timeList
  101. join t2 in callAverage on t1 equals t2.Time into t1_t2
  102. from item in t1_t2.DefaultIfEmpty()
  103. select new {
  104. Time = t1 + ":00",
  105. In = t1_t2.Select(x => x.In).FirstOrDefault(),
  106. InAverag = t1_t2.Select(x => x.InAverag).FirstOrDefault(),
  107. Out = t1_t2.Select(x => x.Out).FirstOrDefault(),
  108. OutAverag = t1_t2.Select(x => x.OutAverag).FirstOrDefault()
  109. }).ToList();
  110. return callAverageList;
  111. }
  112. }
  113. }