Dun.Jason 1 жил өмнө
parent
commit
f9f4172e3d

+ 18 - 23
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -33,6 +33,7 @@ public class BiCallController : BaseController
     private readonly IMapper _mapper;
     private readonly ITrCallRecordRepository _trCallRecordRepositoryEx;
     private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+    private readonly IRepository<Work> _workRepository;
 
 
 
@@ -42,7 +43,8 @@ public class BiCallController : BaseController
         IRepository<TelRest> telRestRepository,
         IMapper mapper,
         ITrCallRecordRepository trCallRecordRepositoryEx,
-        ISystemSettingCacheManager systemSettingCacheManager)
+        ISystemSettingCacheManager systemSettingCacheManager,
+        IRepository<Work> workRepository)
     {
         _trCallRecordRepository = trCallRecordRepository;
         _userRepository = userRepository;
@@ -50,6 +52,7 @@ public class BiCallController : BaseController
         _mapper = mapper;
         _trCallRecordRepositoryEx = trCallRecordRepositoryEx;
         _systemSettingCacheManager = systemSettingCacheManager;
+        _workRepository = workRepository;
     }
 
     [HttpGet("calls")]
@@ -124,8 +127,8 @@ public class BiCallController : BaseController
         int noConnectByeTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.NoConnectByeTimes)?.SettingValue[0]);
         int effectiveTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.EffectiveTimes)?.SettingValue[0]);
         int connectByeTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.ConnectByeTimes)?.SettingValue[0]);
-        
-        return await _userRepository.Queryable()
+
+        var list = await _userRepository.Queryable()
               .LeftJoin<TrCallRecord>((u, c) => u.Id == c.UserId)
               .Where(u => !u.IsDeleted && u.UserType == EUserType.Seat)
               .WhereIF(dto.StartTime.HasValue, (u, c) => c.CreatedTime >= dto.StartTime.Value)
@@ -147,27 +150,19 @@ public class BiCallController : BaseController
                   InHangupImmediateWhenAnswered = SqlFunc.AggregateSum(SqlFunc.IIF(c.CallDirection == ECallDirection.In && c.AnsweredTime != null && c.Duration < connectByeTimes, 1, 0)),
               })
               .MergeTable()
-              .LeftJoin<Work>((it, o) => it.UserId == o.UserId && o.CreationTime>= dto.StartTime && o.CreationTime<= dto.EndTime)
-              .LeftJoin<TelRest>((it,o,c)=> it.UserId == c.UserId && c.CreationTime>= dto.StartTime && c.CreationTime<=dto.EndTime)
-              .GroupBy((it, o,c) => new { it.UserId,it.Name })
-              .Select((it, o,c) => new BiSeatCallsDto
-              {
-                  Name = it.Name,
-                  UserId = it.UserId,
-                  InTotal = SqlFunc.AggregateSum(it.InTotal),
-                  OutTotal = SqlFunc.AggregateSum(it.OutTotal),
-                  InAnswered = SqlFunc.AggregateSum(it.InAnswered),
-                  OutAnswered = SqlFunc.AggregateSum(it.OutAnswered),
-                  InHangupImmediate = SqlFunc.AggregateSum(it.InHangupImmediate),
-                  InHanguped = SqlFunc.AggregateSum(it.InHanguped),
-                  InDurationAvg = SqlFunc.AggregateSum(it.InDurationAvg),
-                  OutDurationAvg = SqlFunc.AggregateSum(it.OutDurationAvg),
-                  InAvailableAnswer = SqlFunc.AggregateSum(it.InAvailableAnswer),
-                  InHangupImmediateWhenAnswered = SqlFunc.AggregateSum(it.InHangupImmediateWhenAnswered),
-                  LoginDuration = SqlFunc.AggregateSum(SqlFunc.IIF(o.WorkingDuration!=null, o.WorkingDuration.Value,0)),
-                  RestDuration = SqlFunc.AggregateSum(SqlFunc.IIF(c.RestDuration!=0,c.RestDuration,0)),
-              })
               .ToListAsync(HttpContext.RequestAborted);
+
+
+        list.ForEach(d=>
+        {
+            d.LoginDuration = _workRepository.Queryable().Where(q => q.UserId == d.UserId && q.CreationTime >= dto.StartTime && q.CreationTime <= dto.EndTime).Sum(q => q.WorkingDuration);
+            d.LoginDuration = Math.Round(d.LoginDuration.Value,2);
+            d.RestDuration = _telRestRepository.Queryable().Where(q => q.UserId == d.UserId && q.CreationTime >= dto.StartTime && q.CreationTime <= dto.EndTime).Sum(q => q.RestDuration);
+            d.RestDuration = Math.Round(d.RestDuration, 2);
+        });
+              
+
+        return list;
     }
 
     /// <summary>

+ 5 - 5
src/Hotline.Share/Dtos/CallCenter/BiSeatCallsDto.cs

@@ -78,7 +78,7 @@ public class BiSeatCallsDto
     /// <summary>
     /// 登录时长(分钟)
     /// </summary>
-    public double LoginDuration { get; set; }
+    public double? LoginDuration { get; set; }
 
     /// <summary>
     /// 小修+摘机时长
@@ -88,22 +88,22 @@ public class BiSeatCallsDto
     /// <summary>
     /// 呼入接通率
     /// </summary>
-    public double InAnsweredRate => InTotal > 0 ? Math.Round((double)InAnswered / (double)InTotal, digits: 4) : 0;
+    public double InAnsweredRate => InTotal > 0 ? Math.Round((double)InAnswered / (double)InTotal, digits: 4)*100 : 0;
 
     /// <summary>
     /// 呼出接通率
     /// </summary>
-    public double OutAnsweredRate => OutTotal > 0 ? Math.Round((double)OutAnswered / (double)OutTotal, digits: 4) : 0;
+    public double OutAnsweredRate => OutTotal > 0 ? Math.Round((double)OutAnswered / (double)OutTotal, digits: 4)*100 : 0;
 
     /// <summary>
     /// 呼入有效接通率
     /// </summary>
-    public double AvailableAnswerRate => InTotal > 0 ? Math.Round((double)InAvailableAnswer / (double)InTotal, digits: 4) : 0;
+    public double AvailableAnswerRate => InTotal > 0 ? Math.Round((double)InAvailableAnswer / (double)InTotal, digits: 4)*100 : 0;
 
     /// <summary>
     /// 工作效率
     /// </summary>
-    public double WorkRate => LoginDuration > 0 ? Math.Round(1 - (double)RestDuration / (double)LoginDuration, digits: 4) : 0;
+    public double WorkRate => LoginDuration > 0 ? Math.Round(1 - (double)RestDuration / (double)LoginDuration, digits: 4)*100 : 0;
 }