|
@@ -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))
|
|
|
{
|