|
@@ -10,9 +10,13 @@ using Microsoft.AspNetCore.Mvc;
|
|
|
using MongoDB.Driver;
|
|
|
using SqlSugar;
|
|
|
using System.Reflection.Metadata;
|
|
|
+using Hotline.Application.CallCenter;
|
|
|
+using Hotline.CallCenter.Configs;
|
|
|
using Hotline.FlowEngine.Workflows;
|
|
|
using Hotline.Settings.TimeLimits;
|
|
|
+using Hotline.Share.Enums.CallCenter;
|
|
|
using Hotline.Share.Enums.Order;
|
|
|
+using Microsoft.Extensions.Options;
|
|
|
using XF.Domain.Authentications;
|
|
|
using XF.Domain.Exceptions;
|
|
|
using XF.Domain.Repository;
|
|
@@ -34,34 +38,40 @@ namespace Hotline.Api.Controllers
|
|
|
private readonly ITimeLimitDomainService _timeLimitDomainService;
|
|
|
private readonly IOrderScreenRepository _orderScreenRepository;
|
|
|
private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
|
|
|
+ private readonly ICallApplication _callApplication;
|
|
|
+ private readonly IOptionsSnapshot<CallCenterConfiguration> _callcenterOptions;
|
|
|
|
|
|
public CommonPController(
|
|
|
ISystemCommonOpinionDomainService commonOpinionDomainService,
|
|
|
ISystemAreaDomainService systemAreaDomainService,
|
|
|
ISessionContext sessionContext,
|
|
|
- IRepository<TrCallRecord> trCallRecordRepository,
|
|
|
+ // IRepository<TrCallRecord> trCallRecordRepository,
|
|
|
IOrderRepository orderRepository,
|
|
|
IMapper mapper,
|
|
|
IOrderDelayRepository orderDelayRepository,
|
|
|
ITimeLimitDomainService timeLimitDomainService,
|
|
|
IOrderScreenRepository orderScreenRepository,
|
|
|
- IRepository<OrderVisitDetail> orderVisitedDetailRepository)
|
|
|
+ IRepository<OrderVisitDetail> orderVisitedDetailRepository,
|
|
|
+ ICallApplication callApplication,
|
|
|
+ IOptionsSnapshot<CallCenterConfiguration> callcenterOptions)
|
|
|
{
|
|
|
_commonOpinionDomainService = commonOpinionDomainService;
|
|
|
_systemAreaDomainService = systemAreaDomainService;
|
|
|
_mapper = mapper;
|
|
|
_sessionContext = sessionContext;
|
|
|
- _trCallRecordRepository = trCallRecordRepository;
|
|
|
+ // _trCallRecordRepository = trCallRecordRepository;
|
|
|
_orderRepository = orderRepository;
|
|
|
_orderDelayRepository = orderDelayRepository;
|
|
|
_timeLimitDomainService = timeLimitDomainService;
|
|
|
_orderScreenRepository = orderScreenRepository;
|
|
|
_orderVisitedDetailRepository = orderVisitedDetailRepository;
|
|
|
+ _callApplication = callApplication;
|
|
|
+ _callcenterOptions = callcenterOptions;
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
#region 省市区
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 获取省市区树形
|
|
|
/// </summary>
|
|
@@ -89,46 +99,88 @@ namespace Hotline.Api.Controllers
|
|
|
var orderQuery = _orderRepository.Queryable(false, false, false)
|
|
|
.Includes(o => o.Workflow, w => w.Steps);
|
|
|
//今日来电
|
|
|
- var tadayCalls = await _trCallRecordRepository.Queryable()
|
|
|
- .Where(x => x.CallDirection == Share.Enums.CallCenter.ECallDirection.In && tadayTime.Equals(x.CreatedTime.ToString("yyyy-MM-dd"))).ToListAsync();
|
|
|
- var callNum = tadayCalls.Count();
|
|
|
- var validCallNum = tadayCalls.Where(x => x.Duration > 0 || x.QueueTims > 0 || x.RingTimes > 0).Count();
|
|
|
- //今日接通率
|
|
|
- var answeredNum = tadayCalls.Where(x => x.Duration > 0).Count();
|
|
|
- var answeredRate = validCallNum > 0 ? Math.Round((double.Parse(answeredNum.ToString()) / double.Parse(validCallNum.ToString())) * 100, 2) + "%" : "-";
|
|
|
+ // var tadayCalls = await _trCallRecordRepository.Queryable()
|
|
|
+ // .Where(x => x.CallDirection == Share.Enums.CallCenter.ECallDirection.In && tadayTime.Equals(x.CreatedTime.ToString("yyyy-MM-dd"))).ToListAsync();
|
|
|
+ // var callNum = tadayCalls.Count();
|
|
|
+ // var validCallNum = tadayCalls.Where(x => x.Duration > 0 || x.QueueTims > 0 || x.RingTimes > 0).Count();
|
|
|
+ // //今日接通率
|
|
|
+ // var answeredNum = tadayCalls.Where(x => x.Duration > 0).Count();
|
|
|
+ // var answeredRate = validCallNum > 0 ? Math.Round((double.Parse(answeredNum.ToString()) / double.Parse(validCallNum.ToString())) * 100, 2) + "%" : "-";
|
|
|
+
|
|
|
+ int callNum = 0, validCallNum = 0, answeredNum = 0;
|
|
|
+ var answeredRate = string.Empty;
|
|
|
+ var today = DateTime.Today.Date;
|
|
|
+ if (_callcenterOptions.Value.CallCenterType == AppDefaults.CallCenterType.TianRun)
|
|
|
+ {
|
|
|
+ var calls = await _callApplication.QueryTianrunCallsAsync(
|
|
|
+ direction: ECallDirection.In,
|
|
|
+ callStartTimeStart: today,
|
|
|
+ callStartTimeEnd: today.AddDays(1).AddSeconds(-1),
|
|
|
+ cancellationToken: HttpContext.RequestAborted);
|
|
|
+ callNum = calls.Count();
|
|
|
+ validCallNum = calls.Where(x => x.Duration > 0 || x.QueueTims > 0 || x.RingTimes > 0).Count();
|
|
|
+ //今日接通率
|
|
|
+ answeredNum = calls.Where(x => x.Duration > 0).Count();
|
|
|
+ answeredRate = validCallNum > 0
|
|
|
+ ? Math.Round((double.Parse(answeredNum.ToString()) / double.Parse(validCallNum.ToString())) * 100, 2) + "%"
|
|
|
+ : "-";
|
|
|
+ }
|
|
|
+ else if (_callcenterOptions.Value.CallCenterType == AppDefaults.CallCenterType.XingTang)
|
|
|
+ {
|
|
|
+ var calls = await _callApplication.QueryCallsAsync(
|
|
|
+ callStartTimeStart: today,
|
|
|
+ callStartTimeEnd: today.AddDays(1).AddSeconds(-1),
|
|
|
+ cancellationToken: HttpContext.RequestAborted);
|
|
|
+ callNum = calls.Count();
|
|
|
+ validCallNum = calls.Where(x => x.Duration > 0 || x.WaitDuration > 0 || x.RingDuration > 0).Count();
|
|
|
+ //今日接通率
|
|
|
+ answeredNum = calls.Where(x => x.Duration > 0).Count();
|
|
|
+ answeredRate = validCallNum > 0
|
|
|
+ ? Math.Round((double.Parse(answeredNum.ToString()) / double.Parse(validCallNum.ToString())) * 100, 2) + "%"
|
|
|
+ : "-";
|
|
|
+ }
|
|
|
+
|
|
|
//今日受理工单
|
|
|
var tadayOrders = await orderQuery
|
|
|
.Where(o => tadayTime.Equals(o.CreationTime.ToString("yyyy-MM-dd"))).ToListAsync();
|
|
|
var orderNum = tadayOrders.Count();
|
|
|
var directlyNum = tadayOrders.Where(o => o.ProcessType == Share.Enums.Order.EProcessType.Zhiban).Count();
|
|
|
- return new { CallNum = callNum, ValidCallNum = validCallNum, AnsweredNum = answeredNum, AnsweredRate = answeredRate, OrderNum = orderNum, DirectlyNum = directlyNum };
|
|
|
+ return new
|
|
|
+ {
|
|
|
+ CallNum = callNum, ValidCallNum = validCallNum, AnsweredNum = answeredNum, AnsweredRate = answeredRate, OrderNum = orderNum,
|
|
|
+ DirectlyNum = directlyNum
|
|
|
+ };
|
|
|
}
|
|
|
+
|
|
|
//部门
|
|
|
//今日待办 tasksOkNum
|
|
|
//var time = DateTime.Parse(tadayTime);
|
|
|
//工单
|
|
|
var order = await _orderRepository.Queryable()
|
|
|
- .Where(o => SqlFunc.JsonListObjectAny(o.HandlerUsers, "Key", _sessionContext.RequiredUserId) || SqlFunc.JsonListObjectAny(o.HandlerOrgs, "Key", _sessionContext.RequiredOrgId))
|
|
|
- .GroupBy(o => o.Id).MergeTable()
|
|
|
- .Select(o => new
|
|
|
- {
|
|
|
- aboutExpire = SqlFunc.AggregateSum(SqlFunc.IIF(DateTime.Now > o.NearlyExpiredTime!.Value && DateTime.Now < o.ExpiredTime!.Value, 1, 0)),
|
|
|
- havExpired = SqlFunc.AggregateSum(SqlFunc.IIF(DateTime.Now > o.ExpiredTime!.Value, 1, 0)),
|
|
|
- countersignHandle = SqlFunc.AggregateSum(SqlFunc.IIF(o.CounterSignType.HasValue, 1, 0)),
|
|
|
-
|
|
|
- }).FirstAsync();
|
|
|
+ .Where(o => SqlFunc.JsonListObjectAny(o.HandlerUsers, "Key", _sessionContext.RequiredUserId) ||
|
|
|
+ SqlFunc.JsonListObjectAny(o.HandlerOrgs, "Key", _sessionContext.RequiredOrgId))
|
|
|
+ .GroupBy(o => o.Id).MergeTable()
|
|
|
+ .Select(o => new
|
|
|
+ {
|
|
|
+ aboutExpire = SqlFunc.AggregateSum(SqlFunc.IIF(DateTime.Now > o.NearlyExpiredTime!.Value && DateTime.Now < o.ExpiredTime!.Value,
|
|
|
+ 1, 0)),
|
|
|
+ havExpired = SqlFunc.AggregateSum(SqlFunc.IIF(DateTime.Now > o.ExpiredTime!.Value, 1, 0)),
|
|
|
+ countersignHandle = SqlFunc.AggregateSum(SqlFunc.IIF(o.CounterSignType.HasValue, 1, 0)),
|
|
|
+ }).FirstAsync();
|
|
|
var aboutExpire = order?.aboutExpire ?? 0;
|
|
|
var havExpired = order?.havExpired ?? 0;
|
|
|
var countersignHandle = order?.countersignHandle ?? 0;
|
|
|
//延期
|
|
|
var delay = await _orderDelayRepository.Queryable()
|
|
|
.Includes(x => x.Workflow)
|
|
|
- .Where(x => SqlFunc.JsonListObjectAny(x.HandlerUsers, "Key", _sessionContext.RequiredUserId) || SqlFunc.JsonListObjectAny(x.HandlerOrgs, "Key", _sessionContext.RequiredOrgId))
|
|
|
+ .Where(x => SqlFunc.JsonListObjectAny(x.HandlerUsers, "Key", _sessionContext.RequiredUserId) ||
|
|
|
+ SqlFunc.JsonListObjectAny(x.HandlerOrgs, "Key", _sessionContext.RequiredOrgId))
|
|
|
.Where(x => x.DelayState == EDelayState.Examining).CountAsync();
|
|
|
//甄别
|
|
|
var screenAudit = await _orderScreenRepository.Queryable()
|
|
|
.Includes(x => x.Workflow)
|
|
|
- .Where(x => SqlFunc.JsonListObjectAny(x.HandlerUsers, "Key", _sessionContext.RequiredUserId) || SqlFunc.JsonListObjectAny(x.HandlerOrgs, "Key", _sessionContext.RequiredOrgId))
|
|
|
+ .Where(x => SqlFunc.JsonListObjectAny(x.HandlerUsers, "Key", _sessionContext.RequiredUserId) ||
|
|
|
+ SqlFunc.JsonListObjectAny(x.HandlerOrgs, "Key", _sessionContext.RequiredOrgId))
|
|
|
.Where(x => x.Status == EScreenStatus.Apply)
|
|
|
.CountAsync();
|
|
|
var workTime = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
|
|
@@ -139,9 +191,13 @@ namespace Hotline.Api.Controllers
|
|
|
.Where(x => x.OrderVisit.VisitTime < DateTime.Now && x.OrderVisit.VisitTime > workTime)
|
|
|
.Where((x, s) => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
|
|
|
.Where((x, s) => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode == _sessionContext.OrgId && (
|
|
|
- SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
|
|
|
- SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2")).CountAsync();
|
|
|
- return new { AboutExpire = aboutExpire, HavExpired = havExpired, CountersignHandle = countersignHandle, ScreenAudit = screenAudit, Delay = delay, ScreenHandle = screenHandle };
|
|
|
+ SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
|
|
|
+ SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2")).CountAsync();
|
|
|
+ return new
|
|
|
+ {
|
|
|
+ AboutExpire = aboutExpire, HavExpired = havExpired, CountersignHandle = countersignHandle, ScreenAudit = screenAudit, Delay = delay,
|
|
|
+ ScreenHandle = screenHandle
|
|
|
+ };
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
+}
|