|
@@ -125,172 +125,181 @@ namespace Hotline.Api.Controllers
|
|
|
var aiOrderVisitDetail = aiOrderVisit.AiOrderVisitDetails.FirstOrDefault(x => x.TaskUid == dto.TaskUid);
|
|
|
if (aiOrderVisitDetail != null)
|
|
|
{
|
|
|
+ var list = dto.CallRecordList.OrderBy(x => x.CallStartTime);
|
|
|
// 回访结果(ReturnVisit)[1成功、0不涉及、-1失败]
|
|
|
- var callRecord = dto.CallRecordList.OrderByDescending(x => x.CallNo).FirstOrDefault(x => x.ReturnVisit == 1);
|
|
|
- if (callRecord != null) //有结果的任务
|
|
|
+ foreach (var callRecord in list)
|
|
|
{
|
|
|
- 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);
|
|
|
- //先处理子表
|
|
|
- //先处理坐席(因没有坐席回访,所以默认满意)
|
|
|
- var seatDetail = visitDetail.First(x => x.VisitTarget == Share.Enums.Order.EVisitTarget.Seat);
|
|
|
- if (seatDetail != null)
|
|
|
+ if (callRecord != null) //有结果的任务
|
|
|
{
|
|
|
- seatDetail.VoiceEvaluate = Share.Enums.Order.EVoiceEvaluate.Satisfied;
|
|
|
- seatDetail.SeatEvaluate = Share.Enums.Order.ESeatEvaluate.Satisfied;
|
|
|
- }
|
|
|
- await _orderVisitDetailRepository.UpdateAsync(seatDetail, HttpContext.RequestAborted);
|
|
|
- //处理部门
|
|
|
- var orgDetail = visitDetail.Where(x => x.VisitTarget == Share.Enums.Order.EVisitTarget.Org).ToList();
|
|
|
- //过滤结果
|
|
|
- var orgProcessingResults = new Kv();
|
|
|
- var orgHandledAttitude = new Kv();
|
|
|
- EVoiceEvaluate? seatEvaluate;
|
|
|
- var visitContent = "";
|
|
|
- var seatVisitContent = "";
|
|
|
- foreach (var item in callRecord.QuestionnaireResult)
|
|
|
- {
|
|
|
- ////服务过程满意度
|
|
|
- //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.QuestionIdOne)
|
|
|
+ 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);
|
|
|
+ //先处理子表
|
|
|
+
|
|
|
+ //处理部门
|
|
|
+ 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 = "";
|
|
|
+ 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 == _options.Value.QuestionIdOne)
|
|
|
{
|
|
|
-
|
|
|
+ if (item.QuestionResult == "")
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ volveConent = callRecord.SceneVariable[_options.Value.VisitContentIdThree];
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+ //办件结果满意度
|
|
|
+ if (item.QuestionId == _options.Value.QuestionIdTwo)
|
|
|
{
|
|
|
-
|
|
|
+ if (item.QuestionResult == "满意")
|
|
|
+ {
|
|
|
+ orgProcessingResults = new Kv() { Key = "4", Value = "满意" };
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ orgProcessingResults = new Kv() { Key = "2", Value = "不满意" };
|
|
|
+ visitContent = callRecord.SceneVariable[_options.Value.VisitContentIdOne];
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- //办件结果满意度
|
|
|
- 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.QuestionId == _options.Value.QuestionIdThree)
|
|
|
{
|
|
|
- orgProcessingResults = new Kv() { Key = "2", Value = "不满意" };
|
|
|
- visitContent = callRecord.SceneVariable[_options.Value.VisitContentIdOne];
|
|
|
+ if (item.QuestionResult == "满意")
|
|
|
+ {
|
|
|
+ seatEvaluate = ESeatEvaluate.Satisfied;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ seatVisitContent = callRecord.SceneVariable[_options.Value.VisitContentIdTwo];
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ //先处理坐席(因没有坐席回访,所以默认满意)
|
|
|
+ var seatDetail = visitDetail.First(x => x.VisitTarget == Share.Enums.Order.EVisitTarget.Seat);
|
|
|
+ if (seatDetail != null)
|
|
|
{
|
|
|
- aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
|
|
|
+ seatDetail.VoiceEvaluate = Share.Enums.Order.EVoiceEvaluate.Satisfied;
|
|
|
+ seatDetail.SeatEvaluate = seatEvaluate;
|
|
|
}
|
|
|
+ await _orderVisitDetailRepository.UpdateAsync(seatDetail, HttpContext.RequestAborted);
|
|
|
|
|
|
- //坐席是否满意
|
|
|
- if (item.QuestionId == _options.Value.QuestionIdThree)
|
|
|
+ //处理结果
|
|
|
+ orgDetail.ForEach(x =>
|
|
|
{
|
|
|
- if (item.QuestionResult == "满意")
|
|
|
+ x.OrgHandledAttitude = orgHandledAttitude;
|
|
|
+ x.OrgProcessingResults = orgProcessingResults;
|
|
|
+ x.VisitContent = visitContent;
|
|
|
+ if (orgProcessingResults.Value == "不满意")
|
|
|
{
|
|
|
-
|
|
|
+ //x.OrgNoSatisfiedReason = new List<Kv>() { new Kv() { Key = "7", Value = "未回复" } };
|
|
|
+ //TODO 记录不满意原因到内容中供人工回访甄别选择不满意原因
|
|
|
+ aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- seatVisitContent = callRecord.SceneVariable[_options.Value.VisitContentIdTwo];
|
|
|
+ aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.Visited;
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
- //处理结果
|
|
|
- orgDetail.ForEach(x =>
|
|
|
- {
|
|
|
- x.OrgHandledAttitude = orgHandledAttitude;
|
|
|
- x.OrgProcessingResults = orgProcessingResults;
|
|
|
- x.VisitContent = visitContent;
|
|
|
- if (orgProcessingResults.Value == "不满意")
|
|
|
+ });
|
|
|
+ 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
|
|
|
+ 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)
|
|
|
- {
|
|
|
- aiOrderVisitDetail.OrderVisit.NowEvaluate = orgProcessingResults;
|
|
|
}
|
|
|
- await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit, HttpContext.RequestAborted);
|
|
|
-
|
|
|
- //处理Order表
|
|
|
- if (orgProcessingResults != null && aiOrderVisitDetail.OrderVisit.VisitState == EVisitState.Visited)
|
|
|
+ else
|
|
|
{
|
|
|
- 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);
|
|
|
+ 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);
|
|
|
}
|
|
|
}
|
|
|
- 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)
|