|
@@ -1,19 +1,34 @@
|
|
|
|
|
|
|
|
+using Consul;
|
|
using Hotline.Caching.Interfaces;
|
|
using Hotline.Caching.Interfaces;
|
|
|
|
+using Hotline.Orders;
|
|
|
|
+using Hotline.Share.Dtos;
|
|
|
|
+using Hotline.Share.Dtos.Ai;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Http.Features;
|
|
using Microsoft.AspNetCore.Http.Features;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
+using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json;
|
|
using XF.Domain.Constants;
|
|
using XF.Domain.Constants;
|
|
|
|
+using XF.Domain.Repository;
|
|
|
|
|
|
namespace Hotline.Api.Controllers
|
|
namespace Hotline.Api.Controllers
|
|
{
|
|
{
|
|
public class AiController: BaseController
|
|
public class AiController: BaseController
|
|
{
|
|
{
|
|
private readonly ISystemSettingCacheManager _systemSettingCacheManager;
|
|
private readonly ISystemSettingCacheManager _systemSettingCacheManager;
|
|
- public AiController(ISystemSettingCacheManager systemSettingCacheManager)
|
|
|
|
|
|
+ private readonly IRepository<AiOrderVisit> _aiOrderVisitRepository;
|
|
|
|
+ private readonly IRepository<AiOrderVisitDetail> _aiOrderVisitDetailRepository;
|
|
|
|
+ private readonly IRepository<OrderVisit> _orderVisitRepository;
|
|
|
|
+ private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
|
|
|
|
+
|
|
|
|
+ public AiController(ISystemSettingCacheManager systemSettingCacheManager,IRepository<AiOrderVisit> aiOrderVisitRepository,IRepository<AiOrderVisitDetail> aiOrderVisitDetailRepository,IRepository<OrderVisit> orderVisitRepository,IRepository<OrderVisitDetail> orderVisitDetailRepository)
|
|
{
|
|
{
|
|
_systemSettingCacheManager = systemSettingCacheManager;
|
|
_systemSettingCacheManager = systemSettingCacheManager;
|
|
|
|
+ _aiOrderVisitRepository = aiOrderVisitRepository;
|
|
|
|
+ _aiOrderVisitDetailRepository = aiOrderVisitDetailRepository;
|
|
|
|
+ _orderVisitRepository = orderVisitRepository;
|
|
|
|
+ _orderVisitDetailRepository = orderVisitDetailRepository;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -50,6 +65,108 @@ namespace Hotline.Api.Controllers
|
|
return IsOk;
|
|
return IsOk;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 智能回访外呼结果回传
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="dto"></param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ [AllowAnonymous]
|
|
|
|
+ [HttpPost("visit/aivisit-back")]
|
|
|
|
+ public async Task AiVisitBack([FromBody]AiVisitBackDto dto)
|
|
|
|
+ {
|
|
|
|
+ var aiOrderVisit = await _aiOrderVisitRepository.Queryable()
|
|
|
|
+ .Includes(x => x.AiOrderVisitDetails,s=>s.OrderVisit)
|
|
|
|
+ .FirstAsync(x => x.BatchUid == dto.BatchUid);
|
|
|
|
+ if (aiOrderVisit!=null)
|
|
|
|
+ {
|
|
|
|
+ //验证记录中是否存在有结果的任务
|
|
|
|
+ if (dto.TaskStatus == 6)//执行完
|
|
|
|
+ {
|
|
|
|
+ var aiOrderVisitDetail = aiOrderVisit.AiOrderVisitDetails.FirstOrDefault(x => x.TaskUid == dto.TaskUid);
|
|
|
|
+ if (aiOrderVisitDetail != null)
|
|
|
|
+ {
|
|
|
|
+ var callRecord = dto.CallRecordList.OrderByDescending(x => x.CallNo).FirstOrDefault(x => x.ReturnVisit == 1);
|
|
|
|
+ if (callRecord != null) //有结果的任务
|
|
|
|
+ {
|
|
|
|
+ aiOrderVisitDetail.AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.Ended; //更新AI子表
|
|
|
|
+ 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)
|
|
|
|
+ {
|
|
|
|
+ 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();
|
|
|
|
+ foreach (var item in callRecord.QuestionnaireResult)
|
|
|
|
+ {
|
|
|
|
+ //服务过程满意度
|
|
|
|
+ if (item.QuestionId == "2" )
|
|
|
|
+ {
|
|
|
|
+ if (item.QuestionResult == "满意")
|
|
|
|
+ {
|
|
|
|
+ orgHandledAttitude = new Kv() { Key="4", Value="满意" };
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ orgHandledAttitude = new Kv() { Key = "2", Value = "不满意" };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //办件结果满意度
|
|
|
|
+ if (item.QuestionId == "3")
|
|
|
|
+ {
|
|
|
|
+ if (item.QuestionResult == "满意")
|
|
|
|
+ {
|
|
|
|
+ orgProcessingResults = new Kv() { Key = "4", Value = "满意" };
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ orgProcessingResults = new Kv() { Key = "4", Value = "不满意" };
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //处理结果
|
|
|
|
+ orgDetail.ForEach(x =>
|
|
|
|
+ {
|
|
|
|
+ x.OrgHandledAttitude = orgHandledAttitude;
|
|
|
|
+ x.OrgProcessingResults = orgProcessingResults;
|
|
|
|
+ if (orgProcessingResults.Value == "不满意")
|
|
|
|
+ {
|
|
|
|
+ x.OrgNoSatisfiedReason = new List<Kv>() { new Kv() { Key = "7", Value = "未回复" } };
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ await _orderVisitDetailRepository.UpdateRangeAsync(orgDetail, HttpContext.RequestAborted);
|
|
|
|
+ //处理主表
|
|
|
|
+ aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.Visited;
|
|
|
|
+ aiOrderVisitDetail.OrderVisit.AiVisitCount++;
|
|
|
|
+ aiOrderVisitDetail.OrderVisit.VisitTime = DateTime.Now;
|
|
|
|
+ aiOrderVisitDetail.OrderVisit.AiVisitTime();
|
|
|
|
+ await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit, HttpContext.RequestAborted);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ aiOrderVisitDetail.AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.Cancel; //更新AI子表
|
|
|
|
+ aiOrderVisit.VisitedFailCount++;
|
|
|
|
+ //处理回访主表
|
|
|
|
+ aiOrderVisitDetail.OrderVisit.AiVisitTime();
|
|
|
|
+ await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit, HttpContext.RequestAborted);
|
|
|
|
+ }
|
|
|
|
+ await _aiOrderVisitDetailRepository.UpdateAsync(aiOrderVisitDetail, HttpContext.RequestAborted);
|
|
|
|
+ await _aiOrderVisitRepository.UpdateAsync(aiOrderVisit, HttpContext.RequestAborted);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|