瀏覽代碼

tel voice

admin 2 年之前
父節點
當前提交
62c96cd1ef

+ 101 - 41
src/CallCenter.Api/Controllers/TelController.cs

@@ -1,6 +1,7 @@
 using CallCenter.Caches;
 using CallCenter.Calls;
 using CallCenter.Devices;
+using CallCenter.Ivrs;
 using CallCenter.Repository.SqlSugar;
 using CallCenter.Share.Dtos;
 using CallCenter.Share.Enums;
@@ -32,8 +33,11 @@ namespace CallCenter.Api.Controllers
         private readonly ITelCacheManager _telCacheManager;
         private readonly IDeviceManager _deviceManager;
         private readonly IMapper _mapper;
-        private readonly ICallDetailRepository _callDetailRepository;
         private readonly ICallRepository _callRepository;
+        private readonly IIvrCacheManager _ivrCacheManager;
+        private readonly IIvrDomainService _ivrDomainService;
+        private readonly ILogger<TelController> _logger;
+        private readonly ICallDetailRepository _callDetailRepository;
 
         public TelController(
             ITelDomainService telDomainService,
@@ -47,8 +51,11 @@ namespace CallCenter.Api.Controllers
             ITelCacheManager telCacheManager,
             IDeviceManager deviceManager,
             IMapper mapper,
-            ICallDetailRepository callDetailRepository,
-            ICallRepository callRepository)
+            ICallRepository callRepository,
+            IIvrCacheManager ivrCacheManager,
+            IIvrDomainService ivrDomainService,
+            ILogger<TelController> logger,
+            ICallDetailRepository callDetailRepository)
         {
             _telDomainService = telDomainService;
             _userCacheManager = userCacheManager;
@@ -61,8 +68,11 @@ namespace CallCenter.Api.Controllers
             _telCacheManager = telCacheManager;
             _deviceManager = deviceManager;
             _mapper = mapper;
-            _callDetailRepository = callDetailRepository;
             _callRepository = callRepository;
+            _ivrCacheManager = ivrCacheManager;
+            _ivrDomainService = ivrDomainService;
+            _logger = logger;
+            _callDetailRepository = callDetailRepository;
         }
         /// <summary>
         /// 查询所有分机
@@ -166,48 +176,49 @@ namespace CallCenter.Api.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        //[HttpPost("group")]
-        //public async Task AddTelGroup([FromBody] AddTelGroupDto dto)
-        //{
-        //    var works = await _workRepository.QueryAsync(d => dto.TelNos.Contains(d.TelNo) && !d.EndTime.HasValue);
-
-        //    await _deviceManager.AssginConfigGroupAsync(
-        //        dto.No,
-        //        dto.Distribution.ToString().ToLower(),
-        //        ext: works.Select(d => d.TelNo).ToList(),
-        //        voiceFile: dto.Voice ?? null,
-        //        cancellationToken: HttpContext.RequestAborted);
-
-        //    var group = _mapper.Map<TelGroup>(dto);
-        //    var tels = await _telRepository.QueryAsync(d => dto.TelNos.Contains(d.No));
-        //    group.Tels = tels;
-        //    await _telGroupRepository.AddNavTelsAsync(group, HttpContext.RequestAborted);
-        //    _cacheTelGroup.Remove(dto.No);
-        //}
+        [HttpPost("group")]
+        public async Task AddTelGroup([FromBody] AddTelGroupDto dto)
+        {
+            var works = await _workRepository.QueryAsync(d => dto.TelNos.Contains(d.TelNo) && !d.EndTime.HasValue);
+
+            await _deviceManager.AssginConfigGroupAsync(
+                dto.No,
+                dto.Distribution,
+                //dto.Distribution.ToString().ToLower(),
+                ext: works.Select(d => d.TelNo).ToList(),
+                voiceFile: dto.Voice ?? null,
+                cancellationToken: HttpContext.RequestAborted);
+
+            var group = _mapper.Map<TelGroup>(dto);
+            var tels = await _telRepository.QueryAsync(d => dto.TelNos.Contains(d.No));
+            group.Tels = tels;
+            await _telGroupRepository.AddNavTelsAsync(group, HttpContext.RequestAborted);
+            _cacheTelGroup.Remove(dto.No);
+        }
 
         /// <summary>
         /// 更新分机组
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        //[HttpPut("group")]
-        //public async Task UpdateTelGroup([FromBody] UpdateTelGroupDto dto)
-        //{
-        //    var works = await _workRepository.QueryAsync(d => dto.TelNos.Contains(d.TelNo) && !d.EndTime.HasValue);
-
-        //    await _deviceManager.AssginConfigGroupAsync(
-        //        dto.No,
-        //        dto.Distribution.ToString().ToLower(),
-        //        ext: works.Select(d => d.TelNo).ToList(),
-        //        voiceFile: dto.Voice ?? null,
-        //        cancellationToken: HttpContext.RequestAborted);
-
-        //    var group = _mapper.Map<TelGroup>(dto);
-        //    var tels = await _telRepository.QueryAsync(d => dto.TelNos.Contains(d.No));
-        //    group.Tels = tels;
-        //    await _telGroupRepository.UpdateNavTelsAsync(group, HttpContext.RequestAborted);
-        //    _cacheTelGroup.Remove(dto.No);
-        //}
+        [HttpPut("group")]
+        public async Task UpdateTelGroup([FromBody] UpdateTelGroupDto dto)
+        {
+            var works = await _workRepository.QueryAsync(d => dto.TelNos.Contains(d.TelNo) && !d.EndTime.HasValue);
+
+            await _deviceManager.AssginConfigGroupAsync(
+                dto.No,
+                dto.Distribution,
+                ext: works.Select(d => d.TelNo).ToList(),
+                voiceFile: dto.Voice ?? null,
+                cancellationToken: HttpContext.RequestAborted);
+
+            var group = _mapper.Map<TelGroup>(dto);
+            var tels = await _telRepository.QueryAsync(d => dto.TelNos.Contains(d.No));
+            group.Tels = tels;
+            await _telGroupRepository.UpdateNavTelsAsync(group, HttpContext.RequestAborted);
+            _cacheTelGroup.Remove(dto.No);
+        }
 
         /// <summary>
         /// 分机休息
@@ -442,7 +453,56 @@ namespace CallCenter.Api.Controllers
         }
 
 
-        //public async Task 
+        /// <summary>
+        /// 语音评价
+        /// </summary>
+        /// <param name="callId"></param>
+        /// <returns></returns>
+        [HttpGet("evaluate/{callId}")]
+        public async Task Evaluate(string  callId)
+        {
+            //检查通话是否存在
+            var call =await _callRepository.GetAsync(callId,HttpContext.RequestAborted);
+            if (call is null)
+            {
+                throw new UserFriendlyException("未找到当前通话");
+            }
+            if (call.CallStatus ==  ECallStatus.Bye)
+            {
+                throw new UserFriendlyException("当前通话已结束");
+            }
+            if (call.CallStatus == ECallStatus.Answer || call.CallStatus == ECallStatus.Answered)
+            {
+                throw new UserFriendlyException("当前未进行通话,不能发送评价邀请");
+            }
+            //获取配置
+            var correct = _ivrDomainService.GetCorrectIvr(call.ToNo,true);
+
+            if (correct is null)
+            {
+                throw new UserFriendlyException("系统未配置评价,请联系管理员");
+            }
+            //检查是否有评价录音配置
+            var ivrList = _ivrCacheManager.GetIvrs();
+            var ivr = ivrList.First(x => x.IvrCategoryId == correct.ReturnValue && x.IsRoot);
+
+            _logger.LogInformation("transfer to ivr.no:{ivrNo}", ivr.No);
+
+            //写入子表
+            var detail = new CallDetail()
+            {
+                CallId = call.Id,
+                CallStatus = ECallStatus.Evaluate,
+                ConversationId = call.ConversationId,
+                EventName = "EVALUATE",
+                FromNo = call.FromNo,
+                ToNo = call.ToNo,
+            };
+
+            await _callDetailRepository.AddAsync(detail, HttpContext.RequestAborted);
+
+            await _deviceManager.VisitorToMenuAsync(call.ConversationId,ivr.No,HttpContext.RequestAborted);
+        }
 
     }
 }

+ 40 - 20
src/CallCenter.Api/appsettings.Development.json

@@ -67,7 +67,8 @@
         "WorkCategory": "08dae7d5-4332-40e8-85dd-ad210e40270b",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         //"NumNo": "12345",
@@ -80,7 +81,8 @@
         "WorkCategory": "08dae7d5-4332-40e8-85dd-ad210e40270b",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "3490",
@@ -92,7 +94,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "2",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12319",
@@ -104,7 +107,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "3497",
@@ -116,7 +120,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12310",
@@ -128,7 +133,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12312",
@@ -140,7 +146,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12313",
@@ -152,7 +159,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12318",
@@ -164,7 +172,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12336",
@@ -176,7 +185,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12338",
@@ -188,7 +198,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12349",
@@ -200,7 +211,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12350",
@@ -212,7 +224,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12351",
@@ -224,7 +237,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12355",
@@ -236,7 +250,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12356",
@@ -248,7 +263,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12363",
@@ -260,7 +276,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "12385",
@@ -272,7 +289,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "96198",
@@ -284,7 +302,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       },
       {
         "NumNo": "96960",
@@ -296,7 +315,8 @@
         "WorkCategory": "",
         "RestCategory": "",
         "WorkToGroup": "1",
-        "RestToGroup": "1"
+        "RestToGroup": "1",
+        "EvaluateCategory": ""
       }
     ]
   },

+ 1 - 1
src/CallCenter.Application/Handlers/FlowControl/CdrNotificationHandler.cs

@@ -109,7 +109,7 @@ namespace CallCenter.Application.Handlers
                             callDto.OnState = call.CallDetails?.Any(x => x.EventName == "ANSWER" || x.EventName == "ANSWERED") == true ? EOnState.On : EOnState.NoOn;
                         }
                         callDto.BeginTime = call.CreationTime;
-                        callDto.ByeTime = call.CallDetails?.FirstOrDefault(x => x.EventName == "BYE")?.CreationTime;
+                        callDto.ByeTime = call.CallDetails?.FirstOrDefault(x => x.EventName == "BYE")?.CreationTime ?? DateTime.Now;
                         callDto.TalkTime = call.Duration;
                         callDto.SoundFileName = model.Recording;
                         if (string.IsNullOrEmpty(callDto.SoundFileName))

+ 7 - 77
src/CallCenter.Application/Handlers/FlowControl/IncomingNotificationHandler.cs

@@ -25,17 +25,17 @@ namespace CallCenter.Application.Handlers
         private readonly IIvrCacheManager _ivrCacheManager;
         private readonly INewRockClient _newRockClient;
         private readonly IOptionsSnapshot<DeviceConfigs> _options;
-        private readonly ITypedCache<WorkTimeSettings> _worktimeCache;
-        private readonly IOptionsSnapshot<WorkTimeSettings> _worktimeOptions;
         private readonly ILogger<IncomingNotificationHandler> _logger;
         private readonly ICallCacheManager _callCacheManager;
+        private readonly IIvrDomainService _ivrDomainService;
+        
 
         public IncomingNotificationHandler(
             ICallRepository callRepository, ICallDetailRepository callDetailRepository,
             ISystemSettingCacheManager systemSettingCacheManager, IIvrCacheManager ivrCacheManager,
             INewRockClient newRockClient, IOptionsSnapshot<DeviceConfigs> options,
-            ITypedCache<WorkTimeSettings> worktimeCache, IOptionsSnapshot<WorkTimeSettings> worktimeOptions,
-            ILogger<IncomingNotificationHandler> logger, ICallCacheManager callCacheManager)
+            ILogger<IncomingNotificationHandler> logger, ICallCacheManager callCacheManager,
+            IIvrDomainService ivrDomainService)
         {
             _callRepository = callRepository;
             _callDetailRepository = callDetailRepository;
@@ -43,10 +43,9 @@ namespace CallCenter.Application.Handlers
             _ivrCacheManager = ivrCacheManager;
             _newRockClient = newRockClient;
             _options = options;
-            _worktimeCache = worktimeCache;
-            _worktimeOptions = worktimeOptions;
             _logger = logger;
             _callCacheManager = callCacheManager;
+            _ivrDomainService = ivrDomainService;
         }
 
         public async Task Handle(IncomingNotification notification, CancellationToken cancellationToken)
@@ -70,7 +69,7 @@ namespace CallCenter.Application.Handlers
                 };
                 await _callDetailRepository.AddAsync(detail, cancellationToken);
 
-                var correct = GetCorrectIvr(notification.Visitor.To);
+                var correct = _ivrDomainService.GetCorrectIvr(notification.Visitor.To);
 
                 //TODO IVR处理
                 var setting = _systemSettingCacheManager.GetSetting(SettingConstants.IVRConfig);
@@ -138,75 +137,6 @@ namespace CallCenter.Application.Handlers
             
         }
 
-        private Ivr GetCorrectIvr()
-        {
-            var worktimeSettings = _worktimeCache.GetOrAdd("worktimesettings", d => _worktimeOptions.Value, ExpireMode.Absolute, TimeSpan.FromDays(1));
-            var categoryId = GetCorrectCategory(worktimeSettings);
-            var ivrList = _ivrCacheManager.GetIvrs();
-            var ivr = ivrList.First(x => x.IvrCategoryId == categoryId && x.IsRoot);
-            return ivr;
-        }
-
-        private CorrectIvr GetCorrectIvr(string to)
-        {
-            var worktimeSettings = _worktimeCache.GetOrAdd("worktimesettings", d => _worktimeOptions.Value, ExpireMode.Absolute, TimeSpan.FromDays(1));
-            var correct = GetCorrectCategory(worktimeSettings.LineSetting.First(x => x.NumNo == to));
-            return correct;
-        }
-
-        private CorrectIvr GetCorrectCategory(LineSetting settings)
-        {
-            if (!settings.WorkDay.Contains((int)DateTime.Now.DayOfWeek))
-                return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Group, ReturnValue = settings.RestToGroup };
-            var time = TimeOnly.FromDateTime(DateTime.Now);
-            if ((time >= TimeOnly.Parse(settings.MorningBegin) && time <= TimeOnly.Parse(settings.MorningEnd))
-                || (time >= TimeOnly.Parse(settings.AfterBegin) && time <= TimeOnly.Parse(settings.AfterEnd)))
-            {
-                if (!string.IsNullOrEmpty(settings.WorkCategory))
-                {
-                    return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Ivr, ReturnValue = settings.WorkCategory };
-                }
-                else
-                {
-                    return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Group, ReturnValue = settings.WorkToGroup };
-                }
-            }
-            else
-            {
-                if (!string.IsNullOrEmpty(settings.RestCategory))
-                {
-                    return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Ivr, ReturnValue = settings.RestCategory };
-                }
-                else
-                {
-                    return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Group,ReturnValue = settings.RestToGroup };
-                }
-            }
-        }
-
-        public class CorrectIvr
-        {
-            public string ReturnValue { get; set; }
-
-            public ECorrectIvr eCorrectIvr { get; set; }
-        }
-
-        public enum ECorrectIvr
-        {
-            Ivr = 0,
-            Group = 1,
-        }
-
-        private string GetCorrectCategory(WorkTimeSettings settings)
-        {
-            if (!settings.WorkDay.Contains((int)DateTime.Now.DayOfWeek))
-                return settings.RestCategory;
-            var time = TimeOnly.FromDateTime(DateTime.Now);
-            if ((time >= TimeOnly.Parse(settings.MorningBegin) && time <= TimeOnly.Parse(settings.MorningEnd))
-                || (time >= TimeOnly.Parse(settings.AfterBegin) && time <= TimeOnly.Parse(settings.AfterEnd))
-                )
-                return settings.WorkCategory;
-            return settings.RestCategory;
-        }
+        
     }
 }

+ 8 - 0
src/CallCenter.Share/Enums/ECallStatus.cs

@@ -55,6 +55,13 @@ public enum ECallStatus
     [Description("呼叫被应答")]
     Answered = 50,
 
+
+    /// <summary>
+    /// 评价
+    /// </summary>
+    [Description("评价")]
+    Evaluate = 59,
+
     /// <summary>
     /// 通话结束
     /// </summary>
@@ -91,5 +98,6 @@ public enum ECallStatus
     [Description("语音播放完成")]
     EndOfAnn=110,
 
+    
     //todo 待完善
 }

+ 14 - 0
src/CallCenter.Share/Enums/ECorrectIvr.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CallCenter.Share.Enums
+{
+    public enum ECorrectIvr
+    {
+        Ivr = 0,
+        Group = 1,
+    }
+}

+ 8 - 0
src/CallCenter/Ivrs/IIvrDomainService.cs

@@ -5,6 +5,7 @@ using System.Text;
 using System.Threading.Tasks;
 using CallCenter.Calls;
 using CallCenter.Share.Dtos;
+using static CallCenter.Ivrs.IvrDomainService;
 
 namespace CallCenter.Ivrs
 {
@@ -67,5 +68,12 @@ namespace CallCenter.Ivrs
         /// <returns></returns>
         Task ReplaceRootAsync(string ivrId, CancellationToken cancellationToken);
 
+
+        #region IVR流程处理
+
+        CorrectIvr GetCorrectIvr(string to, bool isEvaluate = false);
+
+        #endregion
+
     }
 }

+ 90 - 1
src/CallCenter/Ivrs/IvrDomainService.cs

@@ -1,10 +1,12 @@
 using CallCenter.Caches;
 using CallCenter.Calls;
 using CallCenter.Devices;
+using CallCenter.Settings;
 using CallCenter.Share.Dtos;
 using CallCenter.Share.Enums;
 using MapsterMapper;
 using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
 using XF.Domain.Cache;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
@@ -21,6 +23,8 @@ public class IvrDomainService : IIvrDomainService, IScopeDependency
     private readonly IUserCacheManager _userCacheManager;
     private readonly IMapper _mapper;
     private readonly ILogger<IvrDomainService> _logger;
+    private readonly IOptionsSnapshot<WorkTimeSettings> _worktimeOptions;
+    private readonly ITypedCache<WorkTimeSettings> _worktimeCache;
 
     public IvrDomainService(
         IDeviceManager deviceManager,
@@ -30,7 +34,9 @@ public class IvrDomainService : IIvrDomainService, IScopeDependency
         ITelCacheManager telCacheManager,
         IUserCacheManager userCacheManager,
         IMapper mapper,
-        ILogger<IvrDomainService> logger)
+        ILogger<IvrDomainService> logger,
+        IOptionsSnapshot<WorkTimeSettings> worktimeOptions,
+        ITypedCache<WorkTimeSettings> worktimeCache)
     {
         _deviceManager = deviceManager;
         _ivrRepository = ivrRepository;
@@ -40,6 +46,8 @@ public class IvrDomainService : IIvrDomainService, IScopeDependency
         _userCacheManager = userCacheManager;
         _mapper = mapper;
         _logger = logger;
+        _worktimeOptions = worktimeOptions;
+        _worktimeCache = worktimeCache;
     }
 
     /// <summary>
@@ -281,4 +289,85 @@ public class IvrDomainService : IIvrDomainService, IScopeDependency
     }
 
     #endregion
+
+
+    #region IVR流程处理
+
+    private Ivr GetCorrectIvr()
+    {
+        var worktimeSettings = _worktimeCache.GetOrAdd("worktimesettings", d => _worktimeOptions.Value, ExpireMode.Absolute, TimeSpan.FromDays(1));
+        var categoryId = GetCorrectCategory(worktimeSettings);
+        var ivrList = _ivrCacheManager.GetIvrs();
+        var ivr = ivrList.First(x => x.IvrCategoryId == categoryId && x.IsRoot);
+        return ivr;
+    }
+
+    public CorrectIvr GetCorrectIvr(string to,bool isEvaluate = false)
+    {
+        var worktimeSettings = _worktimeCache.GetOrAdd("worktimesettings", d => _worktimeOptions.Value, ExpireMode.Absolute, TimeSpan.FromDays(1));
+        var correct = GetCorrectCategory(worktimeSettings.LineSetting.First(x => x.NumNo == to),isEvaluate);
+        return correct;
+    }
+
+
+
+    private CorrectIvr GetCorrectCategory(LineSetting settings,bool isEvaluate)
+    {
+        if (isEvaluate)
+        {
+            return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Ivr, ReturnValue = settings.EvaluateCategory };
+        }
+
+        if (!settings.WorkDay.Contains((int)DateTime.Now.DayOfWeek))
+            return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Group, ReturnValue = settings.RestToGroup }; 
+        var time = TimeOnly.FromDateTime(DateTime.Now);
+        if ((time >= TimeOnly.Parse(settings.MorningBegin) && time <= TimeOnly.Parse(settings.MorningEnd))
+            || (time >= TimeOnly.Parse(settings.AfterBegin) && time <= TimeOnly.Parse(settings.AfterEnd)))
+        {
+            if (!string.IsNullOrEmpty(settings.WorkCategory))
+            {
+                return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Ivr, ReturnValue = settings.WorkCategory };
+            }
+            else
+            {
+                return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Group, ReturnValue = settings.WorkToGroup };
+            }
+        }
+        else
+        {
+            if (!string.IsNullOrEmpty(settings.RestCategory))
+            {
+                return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Ivr, ReturnValue = settings.RestCategory };
+            }
+            else
+            {
+                return new CorrectIvr() { eCorrectIvr = ECorrectIvr.Group, ReturnValue = settings.RestToGroup };
+            }
+        }
+    }
+
+    public class CorrectIvr
+    {
+        public string ReturnValue { get; set; }
+
+        public ECorrectIvr eCorrectIvr { get; set; }
+    }
+
+    
+
+    private string GetCorrectCategory(WorkTimeSettings settings)
+    {
+        if (!settings.WorkDay.Contains((int)DateTime.Now.DayOfWeek))
+            return settings.RestCategory;
+        var time = TimeOnly.FromDateTime(DateTime.Now);
+        if ((time >= TimeOnly.Parse(settings.MorningBegin) && time <= TimeOnly.Parse(settings.MorningEnd))
+            || (time >= TimeOnly.Parse(settings.AfterBegin) && time <= TimeOnly.Parse(settings.AfterEnd))
+            )
+            return settings.WorkCategory;
+        return settings.RestCategory;
+    }
+
+    #endregion
+
+
 }

+ 1 - 0
src/CallCenter/Settings/WorkTimeSettings.cs

@@ -37,5 +37,6 @@ namespace CallCenter.Settings
         public string RestCategory { get; set; }
         public string WorkToGroup { get; set; }
         public string RestToGroup { get; set; }
+        public string EvaluateCategory { get; set; }
     }
 }