浏览代码

Merge branch 'release/yibin' into dev

Dun.Jason 11 月之前
父节点
当前提交
0aa1f29180

+ 2 - 2
src/Hotline.Ai.Jths/AiJthsStartupExtensions.cs

@@ -18,9 +18,9 @@ namespace Hotline.Ai.Jths
 			return services;
 		}
 
-		public static IServiceCollection AddAiVisitService(this IServiceCollection services,string baseUrl,string appkey,string serviceversion,string sceneuid,string ruleuid,string visitFromNameKey,string visitFromGenderKey,string visitCreationTimeKey,string visitOrderTitleKey,string visitIsCallOrderKey)
+		public static IServiceCollection AddAiVisitService(this IServiceCollection services,string baseUrl,string appkey,string serviceversion)
 		{
-			services.AddSingleton<IAiVisitService, AiVisitService>(_ => new AiVisitService(baseUrl, appkey, serviceversion, sceneuid, ruleuid,visitFromNameKey,visitFromGenderKey,visitCreationTimeKey,visitOrderTitleKey,visitIsCallOrderKey));
+			services.AddSingleton<IAiVisitService, AiVisitService>(_ => new AiVisitService(baseUrl, appkey, serviceversion));
 			return services;
 		}
 	}

+ 46 - 46
src/Hotline.Ai.Jths/AiVisitConfig.cs

@@ -6,65 +6,65 @@ namespace Hotline.Ai.Jths
         public string Url { get; set; }
         public string Appkey { get; set; }
         public string ServiceVersion { get; set; }
-        public string SceneUid { get; set; }
-        public string RuleUid { get;set; }
+        //public string SceneUid { get; set; }
+        //public string RuleUid { get;set; }
 
-        /// <summary>
-        /// 来电名称
-        /// </summary>
-        public string VisitFromNameKey { get; set; }
+        ///// <summary>
+        ///// 来电名称
+        ///// </summary>
+        //public string VisitFromNameKey { get; set; }
 
 
-        /// <summary>
-        /// 来电性别
-        /// </summary>
-        public string VisitFromGenderKey { get; set; }
+        ///// <summary>
+        ///// 来电性别
+        ///// </summary>
+        //public string VisitFromGenderKey { get; set; }
 
-        /// <summary>
-        /// 来电时间
-        /// </summary>
-        public string VisitCreationTimeKey { get; set; }
+        ///// <summary>
+        ///// 来电时间
+        ///// </summary>
+        //public string VisitCreationTimeKey { get; set; }
 
-        /// <summary>
-        /// 工单标题
-        /// </summary>
-        public string VisitOrderTitleKey { get; set; }
+        ///// <summary>
+        ///// 工单标题
+        ///// </summary>
+        //public string VisitOrderTitleKey { get; set; }
 
-        /// <summary>
-        /// 是否来电工单
-        /// </summary>
-        public string VisitIsCallOrder { get; set; }
+        ///// <summary>
+        ///// 是否来电工单
+        ///// </summary>
+        //public string VisitIsCallOrder { get; set; }
 
-        /// <summary>
-        /// 是否联系
-        /// </summary>
-        public string QuestionIdZone { get; set; }
+        ///// <summary>
+        ///// 是否联系
+        ///// </summary>
+        //public string QuestionIdZone { get; set; }
 
 
-        /// <summary>
-        /// 是否解决
-        /// </summary>
-        public string QuestionIdOne { get; set; }
+        ///// <summary>
+        ///// 是否解决
+        ///// </summary>
+        //public string QuestionIdOne { get; set; }
 
-        /// <summary>
-        /// 办件结果满意度
-        /// </summary>
-        public string QuestionIdTwo { get; set;}
+        ///// <summary>
+        ///// 办件结果满意度
+        ///// </summary>
+        //public string QuestionIdTwo { get; set;}
 
-        /// <summary>
-        /// 坐席是否满意
-        /// </summary>
-        public string QuestionIdThree { get; set; }
+        ///// <summary>
+        ///// 坐席是否满意
+        ///// </summary>
+        //public string QuestionIdThree { get; set; }
 
-        /// <summary>
-        /// 办件结果不满意原因
-        /// </summary>
-        public string VisitContentIdOne { get; set; }
+        ///// <summary>
+        ///// 办件结果不满意原因
+        ///// </summary>
+        //public string VisitContentIdOne { get; set; }
 
-        /// <summary>
-        /// 坐席不满意原因
-        /// </summary>
-        public string VisitContentIdTwo { get; set;}
+        ///// <summary>
+        ///// 坐席不满意原因
+        ///// </summary>
+        //public string VisitContentIdTwo { get; set;}
 
     }
 }

+ 10 - 23
src/Hotline.Ai.Jths/AiVisitService.cs

@@ -21,43 +21,30 @@ namespace Hotline.Ai.Jths
         private readonly string _baseUrl;
         private readonly string _appkey;
         private readonly string _serviceversion;
-        private readonly string _sceneuid;
-        private readonly string _ruleuid;
-        private readonly string _visitFromNameKey;
-        private readonly string _visitFromGenderKey;
-        private readonly string _visitCreationTimeKey;
-        private readonly string _visitOrderTitleKey;
-        private readonly string _visitIsCallOrderKey;
 
-        public AiVisitService(string baseUrl, string appkey, string serviceversion, string sceneuid, string ruleuid,string visitFromNameKey,string visitFromGenderKey,string visitCreationTimeKey,string visitOrderTitleKey,string visitIsCallOrderKey)
+        public AiVisitService(string baseUrl, string appkey, string serviceversion)
         {
             _baseUrl = baseUrl;
             _appkey = appkey;
             _serviceversion = serviceversion;
-            _sceneuid = sceneuid;
-            _ruleuid = ruleuid;
-            _visitFromNameKey = visitFromNameKey;
-            _visitFromGenderKey = visitFromGenderKey;
-            _visitCreationTimeKey = visitCreationTimeKey;
-            _visitOrderTitleKey = visitOrderTitleKey;
-            _visitIsCallOrderKey = visitIsCallOrderKey;
             var options = new RestClientOptions(_baseUrl);
             _client = new RestClient(options);
         }
 
-        public async Task<AiOrderVisit> CreateAiOrderVisitTask(AiOrderVisit aiOrderVisit, CancellationToken cancellationToken)
+        public async Task<AiOrderVisit> CreateAiOrderVisitTask(AiOrderVisit aiOrderVisit,string sceneuid,string ruleuId,string visitFromNameKey,string visitFromGenderKey,string visitCreationTimeKey,string visitOrderTitleKey,string visitIsCallOrderKey, CancellationToken cancellationToken)
         {
+
             var requestData = new AiVisitServiceRequest()
             {
                 BatchName = aiOrderVisit.Name,
                 BatchStatus = 1,
-                SceneUid = _sceneuid,
+                SceneUid = sceneuid,
                 Priority = 1,
                 StartDate = aiOrderVisit.BeginTime.ToString("yyyy/MM/dd HH:mm:ss"),
                 EndDate = aiOrderVisit.EndTime.ToString("yyyy/MM/dd HH:mm:ss"),
                 FestivalBan = aiOrderVisit.FestivalBan,
                 RuleType = aiOrderVisit.RuleType,
-                RuleUid = _ruleuid,
+                RuleUid = ruleuId,
             };
             var taskDataList = new List<TaskData>();
             foreach (var item in aiOrderVisit.AiOrderVisitDetails)
@@ -73,26 +60,26 @@ namespace Hotline.Ai.Jths
                         //来电名称
                         //开发环境 :OC_SCENE_VAR_FIELD11
                         //生产环境:OC_SCENE_VAR_FIELD12
-                        taskData.VariableList.Add(new Variable() { Code = _visitFromNameKey, Value = item.Order.FromName });
+                        taskData.VariableList.Add(new Variable() { Code = visitFromNameKey, Value = item.Order.FromName });
                     }
                     //来电性别
                     //开发环境: OC_SCENE_VAR_FIELD14
                     //生产环境:OC_SCENE_VAR_FIELD14
-                    taskData.VariableList.Add(new Variable() { Code = _visitFromGenderKey, Value = item.Order.FromGender == EGender.Female ? "女士" : "先生" });
+                    taskData.VariableList.Add(new Variable() { Code = visitFromGenderKey, Value = item.Order.FromGender == EGender.Female ? "女士" : "先生" });
                 }
                 //来电时间
                 //开发环境:OC_SCENE_VAR_FIELD17
                 //生产环境:OC_SCENE_VAR_FIELD19
-                taskData.VariableList.Add(new Variable() { Code = _visitCreationTimeKey, Value = item.Order.CreationTime.ToString("yyyy年MM月dd日hh点mm分") });
+                taskData.VariableList.Add(new Variable() { Code = visitCreationTimeKey, Value = item.Order.CreationTime.ToString("yyyy年MM月dd日hh点mm分") });
                 //工单标题
                 //开发环境:OC_SCENE_VAR_FIELD18
                 //生产环境:OC_SCENE_VAR_FIELD20
-                taskData.VariableList.Add(new Variable() { Code = _visitOrderTitleKey, Value = item.Order.Title });
+                taskData.VariableList.Add(new Variable() { Code = visitOrderTitleKey, Value = item.Order.Title });
 
                 //是否来电工单
                 //开发环境:
                 //生产环境:
-                taskData.VariableList.Add(new Variable() { Code = _visitIsCallOrderKey, Value = item.Order.SourceChannelCode == "RGDH" ? "income" : "outbound" });
+                taskData.VariableList.Add(new Variable() { Code = visitIsCallOrderKey, Value = item.Order.SourceChannelCode == "RGDH" ? "income" : "outbound" });
                 taskDataList.Add(taskData);
             }
             requestData.TaskDataList = taskDataList;

+ 293 - 252
src/Hotline.Api/Controllers/AiController.cs

@@ -13,6 +13,7 @@ using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Ai;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Ai;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Quality;
 using MapsterMapper;
@@ -37,7 +38,7 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<OrderVisit> _orderVisitRepository;
         private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
         private readonly IMapper _mapper;
-        private readonly IOptionsSnapshot<AiVisitConfig> _options;
+        //private readonly IOptionsSnapshot<AiVisitConfig> _options;
         private readonly IAiVisitService _aiVisitService;
         private readonly ILogger<AiController> _logger;
         private readonly ICapPublisher _capPublisher;
@@ -45,7 +46,7 @@ namespace Hotline.Api.Controllers
         private readonly IQualityApplication _qualityApplication;
         private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
 
-        public AiController(ISystemSettingCacheManager systemSettingCacheManager,IRepository<AiOrderVisit> aiOrderVisitRepository,IRepository<AiOrderVisitDetail>  aiOrderVisitDetailRepository,IRepository<OrderVisit> orderVisitRepository,IRepository<OrderVisitDetail> orderVisitDetailRepository,IMapper mapper, IOptionsSnapshot<AiVisitConfig> options,IAiVisitService aiVisitService, ILogger<AiController> logger,ICapPublisher capPublisher,IOrderRepository orderRepository,IQualityApplication qualityApplication, ISystemDicDataCacheManager sysDicDataCacheManager)
+        public AiController(ISystemSettingCacheManager systemSettingCacheManager,IRepository<AiOrderVisit> aiOrderVisitRepository,IRepository<AiOrderVisitDetail>  aiOrderVisitDetailRepository,IRepository<OrderVisit> orderVisitRepository,IRepository<OrderVisitDetail> orderVisitDetailRepository,IMapper mapper, /*IOptionsSnapshot<AiVisitConfig> options,*/IAiVisitService aiVisitService, ILogger<AiController> logger,ICapPublisher capPublisher,IOrderRepository orderRepository,IQualityApplication qualityApplication, ISystemDicDataCacheManager sysDicDataCacheManager)
         {
            _systemSettingCacheManager = systemSettingCacheManager;
             _aiOrderVisitRepository = aiOrderVisitRepository;
@@ -53,7 +54,7 @@ namespace Hotline.Api.Controllers
             _orderVisitRepository = orderVisitRepository;
             _orderVisitDetailRepository = orderVisitDetailRepository;
             _mapper = mapper;
-            _options = options;
+            //_options = options;
             _aiVisitService = aiVisitService;
             _logger = logger;
             _capPublisher = capPublisher;
@@ -113,293 +114,323 @@ namespace Hotline.Api.Controllers
         public async Task AiVisitBack([FromBody]AiVisitBackDto dto)
         {
             _logger.LogInformation($"收到智能外呼结果回传:{JsonConvert.SerializeObject(dto)}");
-
-
-            var aiOrderVisit = await _aiOrderVisitRepository.Queryable()
-                .Includes(x => x.AiOrderVisitDetails,s=>s.OrderVisit,d=>d.Order)
-                .FirstAsync(x => x.BatchUid == dto.BatchUid);
-            if (aiOrderVisit!=null)
+            var SceneUid = _systemSettingCacheManager.GetSetting(SettingConstants.VisitSceneUid)?.SettingValue[0];//场景ID
+            //回访
+            if (dto.SceneUid== SceneUid)
             {
-                //验证记录中是否存在有结果的任务
-                if (dto.TaskStatus == 6)//执行完
+                var aiOrderVisit = await _aiOrderVisitRepository.Queryable()
+                .Includes(x => x.AiOrderVisitDetails, s => s.OrderVisit, d => d.Order)
+                .FirstAsync(x => x.BatchUid == dto.BatchUid);
+                if (aiOrderVisit != null)
                 {
-                    var aiOrderVisitDetail = aiOrderVisit.AiOrderVisitDetails.FirstOrDefault(x => x.TaskUid == dto.TaskUid);
-                    if (aiOrderVisitDetail != null)
+                    //验证记录中是否存在有结果的任务Z
+                    if (dto.TaskStatus == 6)//执行完
                     {
-                        var callRecord = dto.CallRecordList.OrderBy(x => x.CallStartTime).LastOrDefault();
-                        // 回访结果(ReturnVisit)[1成功、0不涉及、-1失败]
-                       
-                        if (callRecord != null) //有结果的任务
+
+                        #region 获取所有配置参数
+                        var QuestionIdZero = _systemSettingCacheManager.GetSetting(SettingConstants.QuestionIdZero)?.SettingValue[0]; //是否联系
+                        var QuestionIdOne = _systemSettingCacheManager.GetSetting(SettingConstants.QuestionIdOne)?.SettingValue[0];//是否解决
+                        var QuestionIdTwo = _systemSettingCacheManager.GetSetting(SettingConstants.QuestionIdTwo)?.SettingValue[0];//办件结果满意度
+                        var QuestionIdThree = _systemSettingCacheManager.GetSetting(SettingConstants.QuestionIdThree)?.SettingValue[0];//坐席是否满意
+                        var VisitContentIdOne = _systemSettingCacheManager.GetSetting(SettingConstants.VisitContentIdOne)?.SettingValue[0];//办件结果不满意原因
+                        var VisitContentIdTwo = _systemSettingCacheManager.GetSetting(SettingConstants.VisitContentIdTwo)?.SettingValue[0];//坐席不满意原因
+                        #endregion
+
+                        var aiOrderVisitDetail = aiOrderVisit.AiOrderVisitDetails.FirstOrDefault(x => x.TaskUid == dto.TaskUid);
+                        if (aiOrderVisitDetail != null)
                         {
-                            aiOrderVisitDetail.AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.Ended; //更新AI子表
-                            aiOrderVisitDetail.AiVisitTime = DateTime.Now;
-                            aiOrderVisit.VisitedCount++;
-                            //处理结果
-                            var visitDetail = _orderVisitDetailRepository.Queryable().Where(x => x.VisitId == aiOrderVisitDetail.OrderVisit.Id).ToList();
-                            //先处理子表
-
-                            //处理部门
-                            var orgDetail = visitDetail.Where(x => x.VisitTarget == Share.Enums.Order.EVisitTarget.Org).ToList();
-                            //过滤结果
-                            var orgProcessingResults = new Kv();
-                            //var orgHandledAttitude = new Kv();
-                            ESeatEvaluate? seatEvaluate = null;
-                            var visitContent = "";
-                            var seatVisitContent = "";
-                            var volveConent = "";
-                            bool? isSolve =  null;
-                            bool? isContact = null;
-                            //通话录音
-                            var recordUrl = callRecord.RecordUrl;
-                            foreach (var item in callRecord.QuestionnaireResult)
+                            var callRecord = dto.CallRecordList.OrderBy(x => x.CallStartTime).LastOrDefault();
+                            // 回访结果(ReturnVisit)[1成功、0不涉及、-1失败]
+
+                            if (callRecord != null) //有结果的任务
                             {
-                                ////服务过程满意度
-                                //if (item.QuestionId == _options.Value.QuestionIdOne)
-                                //{
-                                //    if (item.QuestionResult == "满意")
-                                //    {
-                                //        orgHandledAttitude = new Kv() { Key="4", Value="满意" };
-                                //    }
-                                //    else
-                                //    {
-                                //        orgHandledAttitude = new Kv() { Key = "2", Value = "不满意" };
-
-                                //    }
-                                //}
-                                //是否联系
-                                if (item.QuestionId == _options.Value.QuestionIdZone)
+                                aiOrderVisitDetail.AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.Ended; //更新AI子表
+                                aiOrderVisitDetail.AiVisitTime = DateTime.Now;
+                                aiOrderVisit.VisitedCount++;
+                                //处理结果
+                                var visitDetail = _orderVisitDetailRepository.Queryable().Where(x => x.VisitId == aiOrderVisitDetail.OrderVisit.Id).ToList();
+                                //先处理子表
+
+                                //处理部门
+                                var orgDetail = visitDetail.Where(x => x.VisitTarget == Share.Enums.Order.EVisitTarget.Org).ToList();
+                                //过滤结果
+                                var orgProcessingResults = new Kv();
+                                //var orgHandledAttitude = new Kv();
+                                ESeatEvaluate? seatEvaluate = null;
+                                var visitContent = "";
+                                var seatVisitContent = "";
+                                var volveConent = "";
+                                bool? isSolve = null;
+                                bool? isContact = null;
+                                //通话录音
+                                var recordUrl = callRecord.RecordUrl;
+                                foreach (var item in callRecord.QuestionnaireResult)
                                 {
-                                    if (item.QuestionResult == "有联系")
+                                    ////服务过程满意度
+                                    //if (item.QuestionId == _options.Value.QuestionIdOne)
+                                    //{
+                                    //    if (item.QuestionResult == "满意")
+                                    //    {
+                                    //        orgHandledAttitude = new Kv() { Key="4", Value="满意" };
+                                    //    }
+                                    //    else
+                                    //    {
+                                    //        orgHandledAttitude = new Kv() { Key = "2", Value = "不满意" };
+
+                                    //    }
+                                    //}
+                                    //是否联系
+                                    if (item.QuestionId == QuestionIdZero)
                                     {
-                                        isContact = true;
+                                        if (item.QuestionResult == "有联系")
+                                        {
+                                            isContact = true;
+                                        }
+                                        else if (item.QuestionResult == "没有联系")
+                                        {
+                                            isContact = false;
+                                        }
                                     }
-                                    else if(item.QuestionResult == "没有联系")
+                                    //是否解决
+                                    if (item.QuestionId == QuestionIdOne)
                                     {
-                                        isContact = false;
+                                        if (item.QuestionResult == "得到解决")
+                                        {
+                                            isSolve = true;
+                                        }
+                                        else if (item.QuestionResult == "未得到解决")
+                                        {
+                                            isSolve = false;
+                                        }
                                     }
-                                }
-                                //是否解决
-                                if (item.QuestionId == _options.Value.QuestionIdOne)
-                                {
-                                    if (item.QuestionResult == "得到解决")
+                                    //办件结果满意度
+                                    if (item.QuestionId == QuestionIdTwo)
                                     {
-                                        isSolve = true;
+                                        if (item.QuestionResult == "办件结果满意")
+                                        {
+                                            orgProcessingResults = new Kv() { Key = "4", Value = "满意" };
+                                        }
+                                        else if (item.QuestionResult == "办件结果不满意")
+                                        {
+                                            orgProcessingResults = new Kv() { Key = "2", Value = "不满意" };
+                                            visitContent = callRecord.SceneVariable[VisitContentIdOne];
+                                        }
                                     }
-                                    else if(item.QuestionResult == "未得到解决")
-                                    {
-                                        isSolve = false;
-                                    }
-                                }
-                                //办件结果满意度
-                                if (item.QuestionId == _options.Value.QuestionIdTwo)
-                                {
-                                    if (item.QuestionResult == "办件结果满意")
+                                    else
                                     {
-                                        orgProcessingResults = new Kv() { Key = "4", Value = "满意" };
+                                        aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
                                     }
-                                    else if(item.QuestionResult == "办件结果不满意")
+
+                                    //坐席是否满意
+                                    if (item.QuestionId == QuestionIdThree)
                                     {
-                                        orgProcessingResults = new Kv() { Key = "2", Value = "不满意" };
-                                        visitContent = callRecord.SceneVariable[_options.Value.VisitContentIdOne];
+                                        if (item.QuestionResult == "满意接电坐席")
+                                        {
+                                            seatEvaluate = ESeatEvaluate.Satisfied;
+                                        }
+                                        else if (item.QuestionResult == "不满意接电坐席")
+                                        {
+                                            seatEvaluate = ESeatEvaluate.NoSatisfied;
+                                            seatVisitContent = callRecord.SceneVariable[VisitContentIdTwo];
+                                        }
                                     }
                                 }
-                                else
+
+                                //先处理坐席(因没有坐席回访,所以默认满意)
+                                var seatDetail = visitDetail.Where(x => x.VisitTarget == Share.Enums.Order.EVisitTarget.Seat).ToList();
+                                seatDetail.ForEach(x =>
                                 {
-                                    aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
-                                }
+                                    x.VoiceEvaluate = Share.Enums.Order.EVoiceEvaluate.Satisfied;
+                                    x.SeatEvaluate = seatEvaluate;
+                                    x.VisitContent = seatVisitContent;
+                                });
+
+                                await _orderVisitDetailRepository.UpdateRangeAsync(seatDetail, HttpContext.RequestAborted);
 
-                                //坐席是否满意
-                                if (item.QuestionId == _options.Value.QuestionIdThree)
+                                //处理结果
+                                orgDetail.ForEach(x =>
                                 {
-                                    if (item.QuestionResult == "满意接电坐席")
+                                    //x.OrgHandledAttitude = orgHandledAttitude;
+                                    x.OrgProcessingResults = orgProcessingResults;
+                                    x.VisitContent = visitContent;
+                                    x.Volved = isSolve;
+                                    x.IsContact = isContact;
+                                    if (orgProcessingResults.Value == "不满意" || (string.IsNullOrEmpty(orgProcessingResults.Key) && seatEvaluate != null && isSolve != null && isContact != null))
                                     {
-                                        seatEvaluate = ESeatEvaluate.Satisfied;
+                                        //x.OrgNoSatisfiedReason = new List<Kv>() { new Kv() { Key = "7", Value = "未回复" } };
+                                        //TODO 记录不满意原因到内容中供人工回访甄别选择不满意原因
+                                        aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
                                     }
-                                    else if(item.QuestionResult == "不满意接电坐席")
+                                    else
                                     {
-                                        seatEvaluate = ESeatEvaluate.NoSatisfied;
-                                        seatVisitContent = callRecord.SceneVariable[_options.Value.VisitContentIdTwo];
+                                        aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.Visited;
                                     }
-                                }
-                            }
-
-                            //先处理坐席(因没有坐席回访,所以默认满意)
-                            var seatDetail = visitDetail.Where(x => x.VisitTarget == Share.Enums.Order.EVisitTarget.Seat).ToList();
-                            seatDetail.ForEach(x =>
-                            {
-                                x.VoiceEvaluate = Share.Enums.Order.EVoiceEvaluate.Satisfied;
-                                x.SeatEvaluate = seatEvaluate;
-                                x.VisitContent = seatVisitContent;
-                            });
-                           
-                            await _orderVisitDetailRepository.UpdateRangeAsync(seatDetail, HttpContext.RequestAborted);
-
-                            //处理结果
-                            orgDetail.ForEach(x =>
-                            {
-                                //x.OrgHandledAttitude = orgHandledAttitude;
-                                x.OrgProcessingResults = orgProcessingResults;
-                                x.VisitContent = visitContent;
-                                x.Volved = isSolve;
-                                x.IsContact = isContact;
-                                if (orgProcessingResults.Value == "不满意" || (string.IsNullOrEmpty(orgProcessingResults.Key) && seatEvaluate!=null && isSolve!=null && isContact!=null))
+                                });
+                                await _orderVisitDetailRepository.UpdateRangeAsync(orgDetail, HttpContext.RequestAborted);
+
+                                //var first = orgProcessingResults; //aiOrderVisitDetail.OrderVisit.OrderVisitDetails.FirstOrDefault(x => x.VisitTarget == EVisitTarget.Org);
+                                //处理主表
+                                aiOrderVisitDetail.OrderVisit.AiVisitCount++;
+                                aiOrderVisitDetail.OrderVisit.VisitTime = DateTime.Now;
+                                aiOrderVisitDetail.OrderVisit.IsPutThrough = true;
+                                aiOrderVisitDetail.OrderVisit.VisitType = Share.Enums.Order.EVisitType.ChipVoiceVisit;
+                                aiOrderVisitDetail.OrderVisit.AiVisitTime();
+                                aiOrderVisitDetail.IsSuccess = true;
+                                if (orgProcessingResults != null)
                                 {
-                                    //x.OrgNoSatisfiedReason = new List<Kv>() { new Kv() { Key = "7", Value = "未回复" } };
-                                    //TODO 记录不满意原因到内容中供人工回访甄别选择不满意原因
-                                    aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
+                                    aiOrderVisitDetail.OrderVisit.NowEvaluate = orgProcessingResults;
                                 }
-                                else
+                                //处理是否回访完成TODO
+
+
+                                await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit, HttpContext.RequestAborted);
+
+                                //处理Order表
+                                if (orgProcessingResults != null && aiOrderVisitDetail.OrderVisit.VisitState == EVisitState.Visited)
                                 {
-                                    aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.Visited;
+                                    aiOrderVisitDetail.OrderVisit.Order.Visited(orgProcessingResults.Key, orgProcessingResults.Value);
+                                    await _orderRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit.Order);
+
+                                    //推省上
+                                    var orderDto = _mapper.Map<OrderDto>(aiOrderVisitDetail.OrderVisit.Order);
+                                    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
+                                    new PublishVisitDto()
+                                    {
+                                        Order = orderDto,
+                                        No = aiOrderVisitDetail.OrderVisit.No,
+                                        VisitType = aiOrderVisitDetail.OrderVisit.VisitType,
+                                        VisitName = aiOrderVisitDetail.OrderVisit.CreatorName,
+                                        VisitTime = aiOrderVisitDetail.OrderVisit.VisitTime,
+                                        VisitRemark = string.IsNullOrEmpty(visitContent) ? aiOrderVisitDetail.OrderVisit.NowEvaluate?.Value : visitContent,
+                                        AreaCode = aiOrderVisitDetail.OrderVisit.Order.AreaCode!,
+                                        SubjectResultSatifyCode = orgProcessingResults.Key,
+                                        FirstSatisfactionCode = aiOrderVisitDetail.OrderVisit.Order.FirstVisitResultCode!,
+                                        ClientGuid = ""
+                                    }, cancellationToken: HttpContext.RequestAborted);
+
+                                    //推门户
+                                    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
+                                    {
+                                        Id = aiOrderVisitDetail.OrderVisit.Id,
+                                        Order = orderDto,
+                                        OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(aiOrderVisitDetail.OrderVisit.OrderVisitDetails),
+                                        VisitTime = aiOrderVisitDetail.OrderVisit.VisitTime,
+                                        VisitType = aiOrderVisitDetail.OrderVisit.VisitType,
+                                        PublishTime = aiOrderVisitDetail.OrderVisit.PublishTime,
+                                    }, cancellationToken: HttpContext.RequestAborted);
                                 }
-                            });
-                            await _orderVisitDetailRepository.UpdateRangeAsync(orgDetail, HttpContext.RequestAborted);
-
-                            //var first = orgProcessingResults; //aiOrderVisitDetail.OrderVisit.OrderVisitDetails.FirstOrDefault(x => x.VisitTarget == EVisitTarget.Org);
-                            //处理主表
-                            aiOrderVisitDetail.OrderVisit.AiVisitCount++;
-                            aiOrderVisitDetail.OrderVisit.VisitTime = DateTime.Now;
-                            aiOrderVisitDetail.OrderVisit.IsPutThrough = true;
-                            aiOrderVisitDetail.OrderVisit.VisitType = Share.Enums.Order.EVisitType.ChipVoiceVisit;
-                            aiOrderVisitDetail.OrderVisit.AiVisitTime();
-                            aiOrderVisitDetail.IsSuccess = true;
-                            if (orgProcessingResults != null)
+                            }
+                            else
                             {
-                                aiOrderVisitDetail.OrderVisit.NowEvaluate = orgProcessingResults;
+                                aiOrderVisitDetail.AiOrderVisitState = (Share.Enums.Ai.EAiOrderVisitState)(dto.TaskStatus); //更新AI子表
+                                aiOrderVisit.VisitedFailCount++;
+                                //处理回访主表
+                                aiOrderVisitDetail.OrderVisit.AiVisitTime();
+                                aiOrderVisitDetail.OrderVisit.AiVisitCount++;
+                                aiOrderVisitDetail.OrderVisit.IsCanAiVisit = true;
+                                aiOrderVisitDetail.OrderVisit.VisitState = EVisitState.WaitForVisit;
+                                aiOrderVisitDetail.IsSuccess = false;
+                                await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit, HttpContext.RequestAborted);
                             }
-                            //处理是否回访完成TODO
-
+                            //var callRecord = dto.CallRecordList.OrderByDescending(x => x.CallNo).FirstOrDefault(x => x.ReturnVisit == 1);
 
-                            await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit, HttpContext.RequestAborted);
 
-                            //处理Order表
-                            if (orgProcessingResults != null && aiOrderVisitDetail.OrderVisit.VisitState == EVisitState.Visited)
+                            await _aiOrderVisitDetailRepository.UpdateAsync(aiOrderVisitDetail, HttpContext.RequestAborted);
+                            if ((aiOrderVisit.VisitedFailCount + aiOrderVisit.VisitedCount) == aiOrderVisit.HasVisitCount)
                             {
-                                aiOrderVisitDetail.OrderVisit.Order.Visited(orgProcessingResults.Key, orgProcessingResults.Value);
-                                await _orderRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit.Order);
-
-                                //推省上
-                                var orderDto = _mapper.Map<OrderDto>(aiOrderVisitDetail.OrderVisit.Order);
-                                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
-                                new PublishVisitDto()
-                                {
-                                    Order = orderDto,
-                                    No = aiOrderVisitDetail.OrderVisit.No,
-                                    VisitType = aiOrderVisitDetail.OrderVisit.VisitType,
-                                    VisitName = aiOrderVisitDetail.OrderVisit.CreatorName,
-                                    VisitTime = aiOrderVisitDetail.OrderVisit.VisitTime,
-                                    VisitRemark = string.IsNullOrEmpty(visitContent) ? aiOrderVisitDetail.OrderVisit.NowEvaluate?.Value : visitContent,
-                                    AreaCode = aiOrderVisitDetail.OrderVisit.Order.AreaCode!,
-                                    SubjectResultSatifyCode = orgProcessingResults.Key,
-                                    FirstSatisfactionCode = aiOrderVisitDetail.OrderVisit.Order.FirstVisitResultCode!,
-                                    ClientGuid = ""
-                                }, cancellationToken: HttpContext.RequestAborted);
-
-                                //推门户
-                                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
-                                {
-                                    Id = aiOrderVisitDetail.OrderVisit.Id,
-                                    Order = orderDto,
-                                    OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(aiOrderVisitDetail.OrderVisit.OrderVisitDetails),
-                                    VisitTime = aiOrderVisitDetail.OrderVisit.VisitTime,
-                                    VisitType = aiOrderVisitDetail.OrderVisit.VisitType,
-                                    PublishTime = aiOrderVisitDetail.OrderVisit.PublishTime,
-                                }, cancellationToken: HttpContext.RequestAborted);
+                                aiOrderVisit.TaskState = Share.Enums.Ai.EAiOrderVisitTaskState.Ended;
                             }
+                            await _aiOrderVisitRepository.UpdateAsync(aiOrderVisit, HttpContext.RequestAborted);
+
+                            #region 注释
+                            //处理不满意结果(如果差评没有不满意原因则不能视为回访完成)   --(不满意设置为失效,生成新的人工回访记录)
+                            //处理网站通知差评数据
+                            //if (aiOrderVisitDetail.OrderVisit.Order.Source == ESource.Hotline && aiOrderVisitDetail.OrderVisit.OrderVisitDetails.Any(x => x.OrgHandledAttitude?.Key == "1" || x.OrgHandledAttitude?.Key == "2" || x.OrgProcessingResults?.Key == "1" || x.OrgProcessingResults?.Key == "2"))
+                            //{
+
+                            //    //处理老数据
+                            //    aiOrderVisitDetail.OrderVisit.VisitState = EVisitState.None;
+                            //    await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit);
+                            //    //推送老数据变更给门户
+                            //    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
+                            //    {
+                            //        Id = aiOrderVisitDetail.OrderVisit.Id,
+                            //        Order = _mapper.Map<OrderDto>(aiOrderVisitDetail.OrderVisit.Order),
+                            //        OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(aiOrderVisitDetail.OrderVisit.OrderVisitDetails),
+                            //        VisitTime = aiOrderVisitDetail.OrderVisit.VisitTime,
+                            //        VisitType = aiOrderVisitDetail.OrderVisit.VisitType,
+                            //        VisitState = aiOrderVisitDetail.OrderVisit.VisitState,
+                            //        PublishTime = aiOrderVisitDetail.OrderVisit.PublishTime,
+                            //    }, cancellationToken: HttpContext.RequestAborted);
+
+                            //    //包含不满意数据,重新生成新的回访
+                            //    var newOrderVisit = _mapper.Map<OrderVisit>(aiOrderVisitDetail.OrderVisit);
+                            //    newOrderVisit.InitId();
+                            //    newOrderVisit.VisitState = EVisitState.NoSatisfiedWaitForVisit;
+                            //    newOrderVisit.VisitTime = null;
+                            //    newOrderVisit.IsCanHandle = false;
+                            //    newOrderVisit.IsCanAiVisit = false;
+                            //    newOrderVisit.AiVisitCount = 0;
+                            //    await _orderVisitRepository.AddAsync(newOrderVisit, HttpContext.RequestAborted);
+                            //    var visitDetail = _orderVisitDetailRepository.Queryable().Where(x => x.VisitId == aiOrderVisitDetail.OrderVisit.Id);
+                            //    var list = _mapper.Map<List<OrderVisitDetail>>(visitDetail);
+                            //    list.ForEach(x =>
+                            //    {
+                            //        x.VisitId = newOrderVisit.Id;
+                            //        x.VoiceEvaluate = null;
+                            //        x.VoiceEvaluate = null;
+                            //        x.OrgHandledAttitude = null;
+                            //        x.OrgNoSatisfiedReason = null;
+                            //        x.OrgProcessingResults = null;
+                            //        x.VisitContent = "";
+                            //    });
+                            //    await _orderVisitDetailRepository.AddRangeAsync(list, HttpContext.RequestAborted);
+
+                            //    //推送新数据给门户
+                            //    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
+                            //    {
+                            //        Id = newOrderVisit.Id,
+                            //        Order = _mapper.Map<OrderDto>(aiOrderVisitDetail.OrderVisit.Order),
+                            //        OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(list),
+                            //        VisitTime = newOrderVisit.VisitTime,
+                            //        VisitType = newOrderVisit.VisitType,
+                            //        VisitState = newOrderVisit.VisitState,
+                            //        PublishTime = newOrderVisit.PublishTime,
+                            //    }, cancellationToken: HttpContext.RequestAborted);
+                            //}
+                            //else
+                            //{
+                            #endregion
+                            if (aiOrderVisitDetail.OrderVisit.VisitState == EVisitState.Visited)
+                            {
+                                //写入质检
+                                await _qualityApplication.AddQualityAsync(EQualitySource.Visit, aiOrderVisitDetail.OrderVisit.Order.Id, aiOrderVisitDetail.OrderVisit.Id,
+                                    HttpContext.RequestAborted);
+                            }
+
+                            //}
                         }
-                        else
-                        {
-                            aiOrderVisitDetail.AiOrderVisitState = (Share.Enums.Ai.EAiOrderVisitState)(dto.TaskStatus); //更新AI子表
-                            aiOrderVisit.VisitedFailCount++;
-                            //处理回访主表
-                            aiOrderVisitDetail.OrderVisit.AiVisitTime();
-                            aiOrderVisitDetail.OrderVisit.AiVisitCount++;
-                            aiOrderVisitDetail.OrderVisit.IsCanAiVisit = true;
-                            aiOrderVisitDetail.OrderVisit.VisitState = EVisitState.WaitForVisit;
-                            aiOrderVisitDetail.IsSuccess = false;
-                            await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit, HttpContext.RequestAborted);
-                        }
-                        //var callRecord = dto.CallRecordList.OrderByDescending(x => x.CallNo).FirstOrDefault(x => x.ReturnVisit == 1);
-                       
-                        
-                        await _aiOrderVisitDetailRepository.UpdateAsync(aiOrderVisitDetail, HttpContext.RequestAborted);
-                        if ((aiOrderVisit.VisitedFailCount+aiOrderVisit.VisitedCount)== aiOrderVisit.HasVisitCount)
-                        {
-                            aiOrderVisit.TaskState = Share.Enums.Ai.EAiOrderVisitTaskState.Ended;
-                        }
-                        await _aiOrderVisitRepository.UpdateAsync(aiOrderVisit, HttpContext.RequestAborted);
-
-                        #region 注释
-                        //处理不满意结果(如果差评没有不满意原因则不能视为回访完成)   --(不满意设置为失效,生成新的人工回访记录)
-                        //处理网站通知差评数据
-                        //if (aiOrderVisitDetail.OrderVisit.Order.Source == ESource.Hotline && aiOrderVisitDetail.OrderVisit.OrderVisitDetails.Any(x => x.OrgHandledAttitude?.Key == "1" || x.OrgHandledAttitude?.Key == "2" || x.OrgProcessingResults?.Key == "1" || x.OrgProcessingResults?.Key == "2"))
-                        //{
-
-                        //    //处理老数据
-                        //    aiOrderVisitDetail.OrderVisit.VisitState = EVisitState.None;
-                        //    await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit);
-                        //    //推送老数据变更给门户
-                        //    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
-                        //    {
-                        //        Id = aiOrderVisitDetail.OrderVisit.Id,
-                        //        Order = _mapper.Map<OrderDto>(aiOrderVisitDetail.OrderVisit.Order),
-                        //        OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(aiOrderVisitDetail.OrderVisit.OrderVisitDetails),
-                        //        VisitTime = aiOrderVisitDetail.OrderVisit.VisitTime,
-                        //        VisitType = aiOrderVisitDetail.OrderVisit.VisitType,
-                        //        VisitState = aiOrderVisitDetail.OrderVisit.VisitState,
-                        //        PublishTime = aiOrderVisitDetail.OrderVisit.PublishTime,
-                        //    }, cancellationToken: HttpContext.RequestAborted);
-
-                        //    //包含不满意数据,重新生成新的回访
-                        //    var newOrderVisit = _mapper.Map<OrderVisit>(aiOrderVisitDetail.OrderVisit);
-                        //    newOrderVisit.InitId();
-                        //    newOrderVisit.VisitState = EVisitState.NoSatisfiedWaitForVisit;
-                        //    newOrderVisit.VisitTime = null;
-                        //    newOrderVisit.IsCanHandle = false;
-                        //    newOrderVisit.IsCanAiVisit = false;
-                        //    newOrderVisit.AiVisitCount = 0;
-                        //    await _orderVisitRepository.AddAsync(newOrderVisit, HttpContext.RequestAborted);
-                        //    var visitDetail = _orderVisitDetailRepository.Queryable().Where(x => x.VisitId == aiOrderVisitDetail.OrderVisit.Id);
-                        //    var list = _mapper.Map<List<OrderVisitDetail>>(visitDetail);
-                        //    list.ForEach(x =>
-                        //    {
-                        //        x.VisitId = newOrderVisit.Id;
-                        //        x.VoiceEvaluate = null;
-                        //        x.VoiceEvaluate = null;
-                        //        x.OrgHandledAttitude = null;
-                        //        x.OrgNoSatisfiedReason = null;
-                        //        x.OrgProcessingResults = null;
-                        //        x.VisitContent = "";
-                        //    });
-                        //    await _orderVisitDetailRepository.AddRangeAsync(list, HttpContext.RequestAborted);
-
-                        //    //推送新数据给门户
-                        //    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
-                        //    {
-                        //        Id = newOrderVisit.Id,
-                        //        Order = _mapper.Map<OrderDto>(aiOrderVisitDetail.OrderVisit.Order),
-                        //        OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(list),
-                        //        VisitTime = newOrderVisit.VisitTime,
-                        //        VisitType = newOrderVisit.VisitType,
-                        //        VisitState = newOrderVisit.VisitState,
-                        //        PublishTime = newOrderVisit.PublishTime,
-                        //    }, cancellationToken: HttpContext.RequestAborted);
-                        //}
-                        //else
-                        //{
-                        #endregion
-                        if (aiOrderVisitDetail.OrderVisit.VisitState == EVisitState.Visited)
+
+                    }
+                    else
+                    {
+                        //失败
+                        var aiOrderVisitDetail = aiOrderVisit.AiOrderVisitDetails.FirstOrDefault(x => x.TaskUid == dto.TaskUid);
+                        if (aiOrderVisitDetail!=null)
                         {
-                            //写入质检
-                            await _qualityApplication.AddQualityAsync(EQualitySource.Visit, aiOrderVisitDetail.OrderVisit.Order.Id, aiOrderVisitDetail.OrderVisit.Id,
-                                HttpContext.RequestAborted);
+                            aiOrderVisitDetail.AiOrderVisitState = (EAiOrderVisitState)dto.TaskStatus;
+                            await _aiOrderVisitDetailRepository.UpdateAsync(aiOrderVisitDetail, HttpContext.RequestAborted);
                         }
-                            
-                        //}
+
                     }
-                    
                 }
             }
+            else
+            {
+
+            }
+
+            
         }
 
         /// <summary>
@@ -505,8 +536,18 @@ namespace Hotline.Api.Controllers
                 .Includes(x => x.AiOrderVisitDetails, s => s.Order)
                 .Includes(x => x.AiOrderVisitDetails, s => s.OrderVisit, q => q.OrderVisitDetails)
                 .FirstAsync(x => x.Id == id);
-            
-            var newModel = await _aiVisitService.CreateAiOrderVisitTask(pushModel, HttpContext.RequestAborted);
+
+            #region 获取系统设置
+            var sceneuid = _systemSettingCacheManager.GetSetting(SettingConstants.VisitSceneUid)?.SettingValue[0];
+            var ruleuId = _systemSettingCacheManager.GetSetting(SettingConstants.VisitRuleUid)?.SettingValue[0];
+            var visitFromNameKey = _systemSettingCacheManager.GetSetting(SettingConstants.VisitFromNameKey)?.SettingValue[0];
+            var visitFromGenderKey = _systemSettingCacheManager.GetSetting(SettingConstants.VisitFromGenderKey)?.SettingValue[0];
+            var visitCreationTimeKey = _systemSettingCacheManager.GetSetting(SettingConstants.VisitCreationTimeKey)?.SettingValue[0];
+            var visitOrderTitleKey = _systemSettingCacheManager.GetSetting(SettingConstants.VisitOrderTitleKey)?.SettingValue[0];
+            var visitIsCallOrderKey = _systemSettingCacheManager.GetSetting(SettingConstants.VisitIsCallOrder)?.SettingValue[0];
+            #endregion
+
+            var newModel = await _aiVisitService.CreateAiOrderVisitTask(pushModel, sceneuid, ruleuId, visitFromNameKey, visitFromGenderKey, visitCreationTimeKey, visitOrderTitleKey, visitIsCallOrderKey, HttpContext.RequestAborted);
 
             if (!string.IsNullOrEmpty(newModel.BatchUid))
             {

+ 9 - 9
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -185,16 +185,16 @@ public class BiCallController : BaseController
         return await _telRestRepository.Queryable()
             .WhereIF(!string.IsNullOrEmpty(dto.UserName), x => x.UserName.Contains(dto.UserName))
             .WhereIF(!string.IsNullOrEmpty(dto.StaffNo), x => x.StaffNo.Contains(dto.StaffNo))
-            .WhereIF(dto.StartTime.HasValue,x => x.CreationTime >= dto.StartTime.Value)
-            .WhereIF(dto.EndTime.HasValue,x => x.CreationTime <= dto.EndTime.Value)
-            .GroupBy(x=> new { x.UserId ,x.StaffNo,x.UserName})
+            .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime.Value)
+            .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime.Value)
+            .GroupBy(x => new { x.UserId, x.StaffNo, x.UserName })
             .Select(x => new BiSeatRestDto
-            { 
-                 UserId = x.UserId,
-                 StaffNo  = x.StaffNo,
-                 UserName = x.UserName,
-                 RestCount = SqlFunc.AggregateCount(x.Id),
-                 RestDuration = SqlFunc.AggregateSum(x.RestDuration/60) / SqlFunc.AggregateCount(x.Id)
+            {
+                UserId = x.UserId,
+                StaffNo = x.StaffNo,
+                UserName = x.UserName,
+                RestCount = SqlFunc.AggregateCount(x.Id),
+                RestDuration = SqlFunc.AggregateSum(x.RestDuration / 60) / SqlFunc.AggregateCount(x.Id)
             })
             .OrderByIF(dto.SortRule ==0,a=> a.RestDuration,OrderByType.Asc)
             .OrderByIF(dto.SortRule ==1,a=> a.RestDuration,OrderByType.Desc)

+ 7 - 1
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -1078,12 +1078,18 @@ namespace Hotline.Api.Controllers.Bi
         {
             dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
 
+            bool IsCenter = _sessionContext.OrgIsCenter;
 
             var (total, items) = await _orderVisitDetailRepository.Queryable()
                 .Includes(x => x.OrderVisit, o => o.Order, d => d.CallRecord)
                 .Where(x => x.OrderVisit.VisitTime >= dto.StartDate && x.OrderVisit.VisitTime <= dto.EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
                 .WhereIF(dto.OrgCode == "001", x => x.VisitOrgCode == dto.OrgCode)
-                .WhereIF(dto.OrgCode != "001", x => x.VisitOrgCode.StartsWith(dto.OrgCode))
+                //.WhereIF(dto.OrgCode != "001", x => x.VisitOrgCode == dto.OrgCode).
+                .WhereIF(dto.IsOnlyMy==true,x=>x.VisitOrgCode == dto.OrgCode)
+                .WhereIF(IsCenter==true && dto.IsOnlyMy==true,x=>x.VisitOrgCode == dto.OrgCode)
+                .WhereIF(IsCenter==true && dto.IsOnlyMy==null,x=>x.VisitOrgCode.StartsWith(dto.OrgCode))
+                .WhereIF(IsCenter==false,x=>x.VisitOrgCode == dto.OrgCode)
+                .Where(x=>x.VisitOrgCode == dto.OrgCode)
                 .WhereIF(dto.TypeId == 1, x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.DateValue)
                 .WhereIF(dto.TypeId == 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == dto.DateValue)
                 .WhereIF(!string.IsNullOrEmpty(dto.LineNum), x => x.OrderVisit.Order.CallRecord.Gateway == dto.LineNum)

+ 1 - 0
src/Hotline.Api/Hotline.Api.csproj

@@ -18,6 +18,7 @@
     <PackageReference Include="Serilog.Sinks.Grafana.Loki" Version="8.1.0" />
     <PackageReference Include="Serilog.Sinks.MongoDB" Version="5.3.1" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
+    <PackageReference Include="Quartz.AspNetCore" Version="3.8.0" />
   </ItemGroup>
 
   <ItemGroup>

+ 4 - 8
src/Hotline.Api/StartupExtensions.cs

@@ -115,14 +115,7 @@ internal static class StartupExtensions
         services.AddAiVisitService(
             aiVisitConfig.Url, 
             aiVisitConfig.Appkey, 
-            aiVisitConfig.ServiceVersion, 
-            aiVisitConfig.SceneUid, 
-            aiVisitConfig.RuleUid,
-            aiVisitConfig.VisitFromNameKey,
-            aiVisitConfig.VisitFromGenderKey,
-            aiVisitConfig.VisitCreationTimeKey,
-            aiVisitConfig.VisitOrderTitleKey,
-            aiVisitConfig.VisitIsCallOrder);
+            aiVisitConfig.ServiceVersion);
 
         //sqlsugar
         services.AddSqlSugar(configuration);
@@ -138,6 +131,9 @@ internal static class StartupExtensions
         //mq
         services.AddMq(configuration);
 
+        //job
+        services.RegisterJob();
+
         services.AddSingleton<IAuthorizationPolicyProvider, AuthorizationPolicyProvider>();
         services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
 

+ 34 - 0
src/Hotline.Api/StartupHelper.cs

@@ -1,6 +1,7 @@
 using System.IdentityModel.Tokens.Jwt;
 using System.Reflection;
 using System.Text;
+using Hotline.Application.Jobs;
 using Hotline.Application.Orders;
 using Hotline.Identity;
 using Hotline.Repository.SqlSugar;
@@ -10,6 +11,8 @@ using MapsterMapper;
 using Microsoft.AspNetCore.Authentication.JwtBearer;
 using Microsoft.IdentityModel.Tokens;
 using Microsoft.OpenApi.Models;
+using Quartz;
+using Quartz.AspNetCore;
 using XF.Domain.Cache;
 using XF.Domain.Entities;
 using XF.Domain.Exceptions;
@@ -230,6 +233,37 @@ namespace Hotline.Api
             return services;
         }
 
+        public static IServiceCollection RegisterJob(this IServiceCollection services)
+        {
+            services.AddQuartz(d =>
+            {
+                d.SchedulerId = "scheduler1";
+                d.InterruptJobsOnShutdown = true;
+                d.InterruptJobsOnShutdownWithWait = true;
+                d.MaxBatchSize = 3;
+
+                //load send order job
+                var autoSendOrderKey = new JobKey("task-send-order", "send order task");
+                d.AddJob<SendOrderJob>(autoSendOrderKey);
+
+                d.AddTrigger(t => t
+                    .WithIdentity("task-send-order-trigger")
+                    .ForJob(autoSendOrderKey)
+                    .StartNow()
+                    .WithCronSchedule("0 10 9 * * ?")
+                );
+
+            });
+
+            services.AddQuartzServer(d =>
+            {
+                d.WaitForJobsToComplete = true;
+                d.StartDelay = TimeSpan.FromSeconds(5);
+            });
+
+            return services;
+        }
+
         public static IServiceCollection RegisterRepository(this IServiceCollection services)
         {
             services.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>));

+ 16 - 16
src/Hotline.Api/config/appsettings.Development.json

@@ -16,7 +16,7 @@
     }
   },
   "ConnectionStrings": {
-    "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
+    "Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
     "Redis": "110.188.24.182:50179",
     "MongoDB": "mongodb://192.168.100.121:27017",
     "Wex": "server=222.212.82.225;Port=4509;Database=fs_kft;Uid=root;Pwd=Wex@12345;"
@@ -25,7 +25,7 @@
     "Host": "110.188.24.182",
     "Port": 50179,
     //"Password": "fengwo22@@",
-    "Database": 5
+    "Database": 3
   },
   "Swagger": true,
   "Cors": {
@@ -208,20 +208,20 @@
     "Url": "http://118.122.73.80:19061",
     "Appkey": "MTAwMDAx",
     "ServiceVersion": "V1.0.0", //接口版本号
-    "SceneUid": "MTAwMDAxVW7cUNRwRegsLGqb0pvXCU", //场景ID
-    "RuleUid": "MTAwMDAxUbQsuOcmS5ApRyHGyWQr7g", //现有规则ID
-    "VisitFromNameKey": "OC_SCENE_VAR_FIELD14", //来电名称       //开发环境 :OC_SCENE_VAR_FIELD14  //生产环境:OC_SCENE_VAR_FIELD12
-    "VisitFromGenderKey": "OC_SCENE_VAR_FIELD13", //来电性别     //开发环境: OC_SCENE_VAR_FIELD13   //生产环境:OC_SCENE_VAR_FIELD14
-    "VisitCreationTimeKey": "OC_SCENE_VAR_FIELD15", //来电时间   //开发环境:OC_SCENE_VAR_FIELD15    //生产环境:OC_SCENE_VAR_FIELD19
-    "VisitOrderTitleKey": "OC_SCENE_VAR_FIELD16", //工单标题      //开发环境:OC_SCENE_VAR_FIELD16    //生产环境:OC_SCENE_VAR_FIELD20
-    "VisitIsCallOrder": "OC_SCENE_VAR_FIELD17", //是否来电工单 //开发环境:OC_SCENE_VAR_FIELD17          //生产环境:
-    //"QuestionIdOne": "MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM", //服务过程满意度 //开发环境:MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM  //生产环境:MTAwMDAxvgT-2PoYRR8pxyL4p8AJsM
-    "QuestionIdZone": "MTAwMDAxvpXEOVcRQR0meGKouw6oXU", //是否联系  //开发环境:MTAwMDAxvpXEOVcRQR0meGKouw6oXU    //测试环境:
-    "QuestionIdOne": "MTAwMDAxP2AJqUCvTU4jsgzvRkADVo", //是否解决 , //开发环境:MTAwMDAxP2AJqUCvTU4jsgzvRkADVo   //生产环境:
-    "QuestionIdTwo": "MTAwMDAx_mLpLD0hSyosIwvgW-byjg", //办件结果满意度 //开发环境:MTAwMDAx_mLpLD0hSyosIwvgW-byjg  //生产环境:MTAwMDAxhIyRJzpwTskpsiXPD-uwl0
-    "QuestionIdThree": "MTAwMDAxos3PXU5TTzEnXMSU8GeApc", //坐席是否满意  //开发环境:  //生产环境:
-    "VisitContentIdOne": "reason1", //办件结果不满意原因 // 开发环境:NotSat2   //生产环境:NotSat2
-    "VisitContentIdTwo": "reason2", //坐席不满意原因  // 开发环境:    //生产环境:
+    //"SceneUid": "MTAwMDAxVW7cUNRwRegsLGqb0pvXCU", //场景ID
+    //"RuleUid": "MTAwMDAxUbQsuOcmS5ApRyHGyWQr7g", //现有规则ID
+    //"VisitFromNameKey": "OC_SCENE_VAR_FIELD14", //来电名称       //开发环境 :OC_SCENE_VAR_FIELD14  //生产环境:OC_SCENE_VAR_FIELD12
+    //"VisitFromGenderKey": "OC_SCENE_VAR_FIELD13", //来电性别     //开发环境: OC_SCENE_VAR_FIELD13   //生产环境:OC_SCENE_VAR_FIELD14
+    //"VisitCreationTimeKey": "OC_SCENE_VAR_FIELD15", //来电时间   //开发环境:OC_SCENE_VAR_FIELD15    //生产环境:OC_SCENE_VAR_FIELD19
+    //"VisitOrderTitleKey": "OC_SCENE_VAR_FIELD16", //工单标题      //开发环境:OC_SCENE_VAR_FIELD16    //生产环境:OC_SCENE_VAR_FIELD20
+    //"VisitIsCallOrder": "OC_SCENE_VAR_FIELD17", //是否来电工单 //开发环境:OC_SCENE_VAR_FIELD17          //生产环境:
+    ////"QuestionIdOne": "MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM", //服务过程满意度 //开发环境:MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM  //生产环境:MTAwMDAxvgT-2PoYRR8pxyL4p8AJsM
+    //"QuestionIdZone": "MTAwMDAxvpXEOVcRQR0meGKouw6oXU", //是否联系  //开发环境:MTAwMDAxvpXEOVcRQR0meGKouw6oXU    //测试环境:
+    //"QuestionIdOne": "MTAwMDAxP2AJqUCvTU4jsgzvRkADVo", //是否解决 , //开发环境:MTAwMDAxP2AJqUCvTU4jsgzvRkADVo   //生产环境:
+    //"QuestionIdTwo": "MTAwMDAx_mLpLD0hSyosIwvgW-byjg", //办件结果满意度 //开发环境:MTAwMDAx_mLpLD0hSyosIwvgW-byjg  //生产环境:MTAwMDAxhIyRJzpwTskpsiXPD-uwl0
+    //"QuestionIdThree": "MTAwMDAxos3PXU5TTzEnXMSU8GeApc", //坐席是否满意  //开发环境:  //生产环境:
+    //"VisitContentIdOne": "reason1", //办件结果不满意原因 // 开发环境:NotSat2   //生产环境:NotSat2
+    //"VisitContentIdTwo": "reason2", //坐席不满意原因  // 开发环境:    //生产环境:
   },
   //智能质检
   "AiQuality": {

+ 17 - 12
src/Hotline.Api/config/appsettings.json

@@ -16,7 +16,7 @@
     }
   },
   "ConnectionStrings": {
-    "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
+    "Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
     "Redis": "110.188.24.182:50179,password=fengwo22@@",
     "MongoDB": "mongodb://192.168.100.121:27017",
     "Wex": "server=222.212.82.225;Port=4509;Database=fs_kft;Uid=root;Pwd=Wex@12345;"
@@ -25,7 +25,7 @@
     "Host": "110.188.24.182",
     "Port": 50179,
     "Password": "fengwo22@@",
-    "Database": 5
+    "Database": 3
   },
   "Swagger": true,
   "Cors": {
@@ -104,18 +104,23 @@
   },
   //智能回访
   "AiVisit": {
-    "Url": "http://118.121.201.140:19061",
+    "Url": "http://118.122.73.80:19061",
     "Appkey": "MTAwMDAx",
     "ServiceVersion": "V1.0.0", //接口版本号
-    "SceneUid": "MTAwMDAxM4yRrAE5SsihkQkKuyMwM", //场景ID
-    "RuleUid": "MTAwMDAxSGdDJryoQUgoDeiKlsTEyc", //现有规则ID
-    "VisitFromNameKey": "OC_SCENE_VAR_FIELD11", //来电名称       //开发环境 :OC_SCENE_VAR_FIELD11   //生产环境:OC_SCENE_VAR_FIELD12
-    "VisitFromGenderKey": "OC_SCENE_VAR_FIELD14", //来电性别     //开发环境: OC_SCENE_VAR_FIELD14   //生产环境:OC_SCENE_VAR_FIELD14
-    "VisitCreationTimeKey": "OC_SCENE_VAR_FIELD17", //来电时间   //开发环境:OC_SCENE_VAR_FIELD17    //生产环境:OC_SCENE_VAR_FIELD19
-    "VisitOrderTitleKey": "OC_SCENE_VAR_FIELD18", //工单标题      //开发环境:OC_SCENE_VAR_FIELD18    //生产环境:OC_SCENE_VAR_FIELD20
-    "QuestionIdOne": "MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM", //服务过程满意度 //开发环境:MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM  //生产环境:MTAwMDAxvgT-2PoYRR8pxyL4p8AJsM
-    "QuestionIdTwo": "MTAwMDAxWQWym04VSRwn4dmWKnYEsQ", //办件结果满意度 //开发环境:MTAwMDAxWQWym04VSRwn4dmWKnYEsQ  //生产环境:MTAwMDAxhIyRJzpwTskpsiXPD-uwl0
-    "VisitContentId": "NotSat2" //不满意原因 // 开发环境:NotSat2   //生产环境:NotSat2
+    //"SceneUid": "MTAwMDAxVW7cUNRwRegsLGqb0pvXCU", //场景ID
+    //"RuleUid": "MTAwMDAxUbQsuOcmS5ApRyHGyWQr7g", //现有规则ID
+    //"VisitFromNameKey": "OC_SCENE_VAR_FIELD14", //来电名称       //开发环境 :OC_SCENE_VAR_FIELD14  //生产环境:OC_SCENE_VAR_FIELD12
+    //"VisitFromGenderKey": "OC_SCENE_VAR_FIELD13", //来电性别     //开发环境: OC_SCENE_VAR_FIELD13   //生产环境:OC_SCENE_VAR_FIELD14
+    //"VisitCreationTimeKey": "OC_SCENE_VAR_FIELD15", //来电时间   //开发环境:OC_SCENE_VAR_FIELD15    //生产环境:OC_SCENE_VAR_FIELD19
+    //"VisitOrderTitleKey": "OC_SCENE_VAR_FIELD16", //工单标题      //开发环境:OC_SCENE_VAR_FIELD16    //生产环境:OC_SCENE_VAR_FIELD20
+    //"VisitIsCallOrder": "OC_SCENE_VAR_FIELD17", //是否来电工单 //开发环境:OC_SCENE_VAR_FIELD17          //生产环境:
+    ////"QuestionIdOne": "MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM", //服务过程满意度 //开发环境:MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM  //生产环境:MTAwMDAxvgT-2PoYRR8pxyL4p8AJsM
+    //"QuestionIdZone": "MTAwMDAxvpXEOVcRQR0meGKouw6oXU", //是否联系  //开发环境:MTAwMDAxvpXEOVcRQR0meGKouw6oXU    //测试环境:
+    //"QuestionIdOne": "MTAwMDAxP2AJqUCvTU4jsgzvRkADVo", //是否解决 , //开发环境:MTAwMDAxP2AJqUCvTU4jsgzvRkADVo   //生产环境:
+    //"QuestionIdTwo": "MTAwMDAx_mLpLD0hSyosIwvgW-byjg", //办件结果满意度 //开发环境:MTAwMDAx_mLpLD0hSyosIwvgW-byjg  //生产环境:MTAwMDAxhIyRJzpwTskpsiXPD-uwl0
+    //"QuestionIdThree": "MTAwMDAxos3PXU5TTzEnXMSU8GeApc", //坐席是否满意  //开发环境:  //生产环境:
+    //"VisitContentIdOne": "reason1", //办件结果不满意原因 // 开发环境:NotSat2   //生产环境:NotSat2
+    //"VisitContentIdTwo": "reason2" //坐席不满意原因  // 开发环境:    //生产环境:
   },
   //企业服务
   "Enterprise": {

+ 1 - 0
src/Hotline.Application/Hotline.Application.csproj

@@ -9,6 +9,7 @@
   <ItemGroup>
     <PackageReference Include="NPOI" Version="2.7.0" />
     <PackageReference Include="XC.RSAUtil" Version="1.3.6" />
+    <PackageReference Include="Quartz.Jobs" Version="3.8.0" />
   </ItemGroup>
 
   <ItemGroup>

+ 31 - 0
src/Hotline.Application/Jobs/SendOrderJob.cs

@@ -0,0 +1,31 @@
+using Hotline.Orders;
+using Microsoft.AspNetCore.Http;
+using Quartz;
+
+namespace Hotline.Application.Jobs
+{
+    /// <summary>
+    /// 自动派单
+    /// </summary>
+    public class SendOrderJob : IJob, IDisposable
+    {
+        private readonly IOrderDomainService _orderDomainService;
+
+        public SendOrderJob(IOrderDomainService orderDomainService)
+        {
+            _orderDomainService = orderDomainService;
+        }
+        
+        public async Task Execute(IJobExecutionContext context)
+        {
+            Console.WriteLine($"{nameof(SendOrderJob)} 执行, {DateTime.Now}");
+
+            await _orderDomainService.TriggerAverageOrder(context.CancellationToken);
+        }
+
+        /// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
+        public void Dispose()
+        {
+        }
+    }
+}

+ 17 - 2
src/Hotline.Application/Visit/OrderVisitApplication.cs

@@ -1,4 +1,5 @@
 using Hotline.Ai.Visit;
+using Hotline.Caching.Interfaces;
 using Hotline.Orders;
 using StackExchange.Redis;
 using System;
@@ -6,6 +7,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using XF.Domain.Constants;
 using XF.Domain.Dependency;
 using XF.Domain.Repository;
 
@@ -15,10 +17,13 @@ namespace Hotline.Application.Visit
     {
         private readonly IRepository<AiOrderVisit> _aiOrderVisitRepository;
         private readonly IAiVisitService _aiVisitService;
-        public OrderVisitApplication(IRepository<AiOrderVisit> aiOrderVisitRepository,IAiVisitService aiVisitService)
+        private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+
+        public OrderVisitApplication(IRepository<AiOrderVisit> aiOrderVisitRepository,IAiVisitService aiVisitService, ISystemSettingCacheManager systemSettingCacheManager)
         {
             _aiOrderVisitRepository = aiOrderVisitRepository;
             _aiVisitService = aiVisitService;
+            _systemSettingCacheManager = systemSettingCacheManager;
         }
 
 
@@ -29,7 +34,17 @@ namespace Hotline.Application.Visit
                 .Includes(x => x.AiOrderVisitDetails, s => s.OrderVisit)
                 .FirstAsync(x => x.Id == aivisitId);
 
-            aiOrderVisit = await _aiVisitService.CreateAiOrderVisitTask(aiOrderVisit, cancellationToken);
+            #region 获取系统设置
+            var sceneuid = _systemSettingCacheManager.GetSetting(SettingConstants.VisitSceneUid)?.SettingValue[0];
+            var ruleuId = _systemSettingCacheManager.GetSetting(SettingConstants.VisitRuleUid)?.SettingValue[0];
+            var visitFromNameKey = _systemSettingCacheManager.GetSetting(SettingConstants.VisitFromNameKey)?.SettingValue[0];
+            var visitFromGenderKey = _systemSettingCacheManager.GetSetting(SettingConstants.VisitFromGenderKey)?.SettingValue[0];
+            var visitCreationTimeKey = _systemSettingCacheManager.GetSetting(SettingConstants.VisitCreationTimeKey)?.SettingValue[0];
+            var visitOrderTitleKey = _systemSettingCacheManager.GetSetting(SettingConstants.VisitOrderTitleKey)?.SettingValue[0];
+            var visitIsCallOrderKey = _systemSettingCacheManager.GetSetting(SettingConstants.VisitIsCallOrder)?.SettingValue[0];
+            #endregion
+
+            aiOrderVisit = await _aiVisitService.CreateAiOrderVisitTask(aiOrderVisit,sceneuid, ruleuId,visitFromNameKey,visitFromGenderKey,visitCreationTimeKey,visitOrderTitleKey,visitIsCallOrderKey, cancellationToken);
 
             await _aiOrderVisitRepository.UpdateNav(aiOrderVisit).Include(d => d.AiOrderVisitDetails).ExecuteCommandAsync();
         }

+ 5 - 0
src/Hotline.Share/Dtos/Bi/BiOrderDto.cs

@@ -11,6 +11,11 @@ namespace Hotline.Share.Dtos.Bi
         public string DateValue { get; set; }
 
         public string? LineNum { get; set; }
+
+        /// <summary>
+        /// 是否只看自己(优先级最高)
+        /// </summary>
+        public bool? IsOnlyMy { get; set; }
     }
 
     public record HighFrequencyCallStatisticsRequest : PagedRequest

+ 1 - 1
src/Hotline/Ai/Visit/IAiVisitService.cs

@@ -6,7 +6,7 @@ namespace Hotline.Ai.Visit
 {
     public interface IAiVisitService
     {
-        Task<AiOrderVisit> CreateAiOrderVisitTask(AiOrderVisit aiOrderVisit, CancellationToken cancellationToken);
+        Task<AiOrderVisit> CreateAiOrderVisitTask(AiOrderVisit aiOrderVisit, string sceneuid, string ruleuId, string visitFromNameKey, string visitFromGenderKey, string visitCreationTimeKey, string visitOrderTitleKey, string visitIsCallOrderKey, CancellationToken cancellationToken);
 
         Task<AiVisitQueryData> QueryAiVisitTask(string batchId,string taskId, CancellationToken cancellationToken);
     }

+ 19 - 0
src/Hotline/Permissions/EPermission.cs

@@ -569,6 +569,25 @@ namespace Hotline.Permissions
 
         #endregion
 
+        #region 扭转待评判
+        /// <summary>
+        /// 扭转评判
+        /// </summary>
+        [Display(GroupName ="智能回访",Name ="扭转待评判",Description ="扭转待评判")]
+        VisitReverseList = 200907,
+
+        /// <summary>
+        /// 批量扭转评判
+        /// </summary>
+        [Display(GroupName ="智能回访",Name ="批量扭转评判",Description ="批量扭转评判")]
+        BatchVisitReverse = 200908,
+        /// <summary>
+        /// 扭转评判
+        /// </summary>
+        [Display(GroupName ="智能回访",Name ="扭转评判",Description ="扭转评判")]
+        VisitReverse = 200909,
+        #endregion
+
         #endregion
 
         #region 超期管理

+ 70 - 0
src/XF.Domain/Constants/SettingConstants.cs

@@ -221,5 +221,75 @@ namespace XF.Domain.Constants
         /// 门户网站主题颜色
         /// </summary>
         public const string WebSystemSettingsTheme = "WebSystemSettingsTheme";
+
+
+        #region 智能外呼
+
+        #region 智能回访
+        /// <summary>
+        /// 智能回访场景ID
+        /// </summary>
+        public const string VisitSceneUid = "VisitSceneUid";
+
+        /// <summary>
+        /// 智能回访规则ID
+        /// </summary>
+        public const string VisitRuleUid = "VisitRuleUid";
+
+        /// <summary>
+        /// 来电名称
+        /// </summary>
+        public const string VisitFromNameKey = "VisitFromNameKey";
+
+        /// <summary>
+        /// 来电性别
+        /// </summary>
+        public const string VisitFromGenderKey = "VisitFromGenderKey";
+
+        /// <summary>
+        /// 来电时间
+        /// </summary>
+        public const string VisitCreationTimeKey = "VisitCreationTimeKey";
+
+        /// <summary>
+        /// 工单标题
+        /// </summary>
+        public const string VisitOrderTitleKey = "VisitOrderTitleKey";
+
+        /// <summary>
+        /// 是否来电工单
+        /// </summary>
+        public const string VisitIsCallOrder = "VisitIsCallOrder";
+
+        /// <summary>
+        /// 是否联系
+        /// </summary>
+        public const string QuestionIdZero = "QuestionIdZero";
+        /// <summary>
+        /// 是否解决
+        /// </summary>
+        public const string QuestionIdOne = "QuestionIdOne";
+
+        /// <summary>
+        /// 办件结果满意度
+        /// </summary>
+        public const string QuestionIdTwo = "QuestionIdTwo";
+
+        /// <summary>
+        /// 坐席是否满意
+        /// </summary>
+        public const string QuestionIdThree = "QuestionIdThree";
+
+        /// <summary>
+        /// 办件结果不满意原因
+        /// </summary>
+        public const string VisitContentIdOne = "VisitContentIdOne";
+
+        /// <summary>
+        /// 坐席不满意原因
+        /// </summary>
+        public const string VisitContentIdTwo = "VisitContentIdTwo";
+        #endregion
+        #endregion
     }
 }