Parcourir la source

Merge branch 'test_20250305tj' into test

tangjiang il y a 1 mois
Parent
commit
545660b4bd

+ 56 - 31
src/Hotline.Api/Controllers/OrderController.cs

@@ -578,32 +578,37 @@ public class OrderController : BaseController
         {
             orderVisit.EmployeeId = _sessionContext.RequiredUserId;
         }
-
+        var isReturn = false;
         if (_appOptions.Value.IsZiGong)
         {
             orderVisit.EmployeeId = string.Empty;
+            //自贡任务  348 语音评价不满意的工单需回访
+            var callNative = await _callApplication.GetReplyVoiceOrDefaultByOrderIdAsync(orderVisit.OrderId);
+            if (callNative == EVoiceEvaluate.NoSatisfied || callNative == EVoiceEvaluate.VeryNoSatisfied)
+                isReturn = true;
         }
-
-        if (order is { FileOrgIsCenter: true, CounterSignType: null } && !order.IsProvince)
+        if (isReturn == false)
         {
-            orderVisit.VisitState = EVisitState.Visited;
-            orderVisit.VisitTime = DateTime.Now;
-            orderVisit.VisitType = EVisitType.OtherVisit;
-            orderVisit.NowEvaluate = new Kv() { Key = "4", Value = "满意" };
-
-            if (_appOptions.Value.IsZiGong)
+            if (order is { FileOrgIsCenter: true, CounterSignType: null } && !order.IsProvince)
             {
-                // 根据禅道 自贡需求 Id_361, 第一条, 3小条需求;
-                // 直办件归档后自动回访量需统计在“胡玲”的默认回访量中;
-                orderVisit.EmployeeId = _systemSettingCacheManager.DefaultVisitEmployeeId;
+                orderVisit.VisitState = EVisitState.Visited;
+                orderVisit.VisitTime = DateTime.Now;
+                orderVisit.VisitType = EVisitType.OtherVisit;
+                orderVisit.NowEvaluate = new Kv() { Key = "4", Value = "满意" };
+
+                if (_appOptions.Value.IsZiGong)
+                {
+                    // 根据禅道 自贡需求 Id_361, 第一条, 3小条需求;
+                    // 直办件归档后自动回访量需统计在“胡玲”的默认回访量中;
+                    orderVisit.EmployeeId = _systemSettingCacheManager.DefaultVisitEmployeeId;
+                }
             }
-        }
 
-        if (order.CounterSignType != ECounterSignType.Center)
-        {
-            orderVisit.IsCanAiVisit = true;
+            if (order.CounterSignType != ECounterSignType.Center)
+            {
+                orderVisit.IsCanAiVisit = true;
+            }
         }
-
         string visitId = await _orderVisitRepository.AddAsync(orderVisit);
         await _orderSnapshotApplication.UpdateLabelAsync(order.Id, dto.SnapshotLabels);
 
@@ -621,25 +626,28 @@ public class OrderController : BaseController
             orgDetail.VisitOrgCode = item.Key;
             orgDetail.VisitOrgName = item.Value;
             orgDetail.VisitTarget = EVisitTarget.Org;
-            if (order is { CounterSignType: null, FileOrgIsCenter: true })
+            if (isReturn == false)
             {
-                var satisfy = new Kv() { Key = "4", Value = "满意" };
-                orgDetail.OrgProcessingResults = satisfy;
-                //orgDetail.OrgHandledAttitude = satisfy;
+                if (order is { CounterSignType: null, FileOrgIsCenter: true })
+                {
+                    var satisfy = new Kv() { Key = "4", Value = "满意" };
+                    orgDetail.OrgProcessingResults = satisfy;
+                    //orgDetail.OrgHandledAttitude = satisfy;
+                }
             }
-
             visitedDetail.Add(orgDetail);
         }
-
-        if (order is { FileOrgIsCenter: true, CounterSignType: null, IsProvince: false })
+        if (isReturn == false)
         {
-            seatDetail.VoiceEvaluate = EVoiceEvaluate.Satisfied;
-            seatDetail.SeatEvaluate = ESeatEvaluate.Satisfied;
-            order.Visited("4", "满意");
-            order.Status = EOrderStatus.Visited;
-            await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
+            if (order is { FileOrgIsCenter: true, CounterSignType: null, IsProvince: false })
+            {
+                seatDetail.VoiceEvaluate = EVoiceEvaluate.Satisfied;
+                seatDetail.SeatEvaluate = ESeatEvaluate.Satisfied;
+                order.Visited("4", "满意");
+                order.Status = EOrderStatus.Visited;
+                await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
+            }
         }
-
         visitedDetail.Add(seatDetail);
         await _orderVisitedDetailRepository.AddRangeAsync(visitedDetail, HttpContext.RequestAborted);
 
@@ -1251,6 +1259,7 @@ public class OrderController : BaseController
         aiVisitVoiceBaseUrl = _systemSettingCacheManager.GetSetting(SettingConstants.AiVisitVoiceBaseUrl)?.SettingValue[0];
 
         var histories = new List<OrderVisitDetailHistoryDto>();
+        var isCanUpdate = false;
         if (_appOptions.Value.IsZiGong)
         {
             histories = await _orderVisitRepository.Queryable()
@@ -1269,6 +1278,21 @@ public class OrderController : BaseController
                     VisitTime = m.VisitTime,
                     CallId = m.CallId
                 }).ToListAsync();
+
+            if (orderVisit.OrderVisitDetails != null && orderVisit.OrderVisitDetails.Any())
+            {
+                var seatVisit = orderVisit.OrderVisitDetails.FirstOrDefault(p => p.VisitTarget == EVisitTarget.Seat);
+                if (seatVisit != null)
+                {
+                    if (seatVisit.VoiceEvaluate == null ||
+                        seatVisit.VoiceEvaluate.HasValue == false ||
+                        seatVisit.VoiceEvaluate == EVoiceEvaluate.NoSatisfied ||
+                        seatVisit.VoiceEvaluate == EVoiceEvaluate.VeryNoSatisfied)
+                    {
+                        isCanUpdate = true;
+                    }
+                }
+            }
         }
 
         var seat = orderVisit.OrderVisitDetails.FirstOrDefault(m => m.VisitTarget == EVisitTarget.Seat);
@@ -1306,7 +1330,8 @@ public class OrderController : BaseController
             RecordingBaseAddress = recordingBaseAddress,
             RecordingAbsolutePath = recordingAbsolutePath,
             AiVisitVoiceBaseUrl = aiVisitVoiceBaseUrl,
-            Histories = histories
+            Histories = histories,
+            IsCanUpdate = isCanUpdate
         };
     }
 

+ 44 - 0
src/Hotline.Api/Controllers/StatisticalReportController.cs

@@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using SqlSugar;
 using XF.Domain.Authentications;
+using Hotline.Repository.SqlSugar.Extensions;
 
 namespace Hotline.Api.Controllers
 {
@@ -122,5 +123,48 @@ namespace Hotline.Api.Controllers
             return ExcelStreamResult(stream, "中心退件明细数据");
         }
 
+        /// <summary>
+        /// 延期审批统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("order_delay_statisical_list")]
+        public async Task<PagedDto<OrderDelayStatisicalReturnDto>> OrderDelayStatisicalList([FromQuery] OrderDelayStatisicalRequestDto dto)
+        {
+            var (total, items) = await _orderReportApplication.OrderDelayStatisicalList(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+            return new PagedDto<OrderDelayStatisicalReturnDto>(total, _mapper.Map<IReadOnlyList<OrderDelayStatisicalReturnDto>>(items));
+        }
+
+        /// <summary>
+        /// 延期审批统计--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("order_delay_statisical_list_export")]
+        public async Task<FileStreamResult> OrderDelayStatisicalListExport([FromBody] ExportExcelDto<OrderDelayStatisicalRequestDto> dto)
+        {
+            var query = _orderReportApplication.OrderDelayStatisicalList(dto.QueryDto);
+
+            List<OrderDelayStatisicalReturnDto> data;
+            if (dto.IsExportAll)
+            {
+                data = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                RefAsync<int> total = 0;
+                data = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total);
+            }
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = data
+                .Select(stu => _mapper.Map(stu, typeof(OrderDelayStatisicalReturnDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "延期审批统计数据");
+        }
     }
 }

+ 33 - 12
src/Hotline.Application/Knowledge/KnowApplication.cs

@@ -453,19 +453,40 @@ namespace Hotline.Application.Knowledge
                 var exp = Expressionable.Create<KnowledgeBase.Knowledge>();
                 foreach (var keyword in keywords)
                 {
-                    if (dto.RetrievalType == EKnowledgeRetrievalType.All)
-                        exp.Or(x => x.Title.Contains(keyword) || x.Content.Contains(keyword));
-                    if (dto.RetrievalType == EKnowledgeRetrievalType.Title)
-                        exp.Or(x => x.Title.Contains(keyword));
-                    if (dto.RetrievalType == EKnowledgeRetrievalType.Content)
-                        exp.Or(x => x.Content.Contains(keyword));
-                    if (dto.RetrievalType == EKnowledgeRetrievalType.Summary)
-                        exp.Or(x => x.Summary != null && x.Summary.Contains(keyword));
-                    if (dto.RetrievalType == EKnowledgeRetrievalType.KeyWord)
+                    if (_appOptions.Value.IsZiGong)
                     {
-                        var keywordEntity = await _knowledgeWordRepository.GetAsync(m => m.Tag == keyword && m.IsEnable == 1);
-                        if (keywordEntity is null) continue;
-                        exp.Or(x => SqlFunc.JsonArrayAny(x.Keywords, keywordEntity.Id));
+                        //自贡任务 359 泸州自贡通用-调整知识检索时,多关键词组合查询的查询方式
+                        if (dto.RetrievalType == EKnowledgeRetrievalType.All)
+                            exp.And(x => x.Title.Contains(keyword) || x.Content.Contains(keyword));
+                        if (dto.RetrievalType == EKnowledgeRetrievalType.Title)
+                            exp.And(x => x.Title.Contains(keyword));
+                        if (dto.RetrievalType == EKnowledgeRetrievalType.Content)
+                            exp.And(x => x.Content.Contains(keyword));
+                        if (dto.RetrievalType == EKnowledgeRetrievalType.Summary)
+                            exp.And(x => x.Summary != null && x.Summary.Contains(keyword));
+                        if (dto.RetrievalType == EKnowledgeRetrievalType.KeyWord)
+                        {
+                            var keywordEntity = await _knowledgeWordRepository.GetAsync(m => m.Tag == keyword && m.IsEnable == 1);
+                            if (keywordEntity is null) continue;
+                            exp.And(x => SqlFunc.JsonArrayAny(x.Keywords, keywordEntity.Id));
+                        }
+                    }
+                    else
+                    {
+                        if (dto.RetrievalType == EKnowledgeRetrievalType.All)
+                            exp.Or(x => x.Title.Contains(keyword) || x.Content.Contains(keyword));
+                        if (dto.RetrievalType == EKnowledgeRetrievalType.Title)
+                            exp.Or(x => x.Title.Contains(keyword));
+                        if (dto.RetrievalType == EKnowledgeRetrievalType.Content)
+                            exp.Or(x => x.Content.Contains(keyword));
+                        if (dto.RetrievalType == EKnowledgeRetrievalType.Summary)
+                            exp.Or(x => x.Summary != null && x.Summary.Contains(keyword));
+                        if (dto.RetrievalType == EKnowledgeRetrievalType.KeyWord)
+                        {
+                            var keywordEntity = await _knowledgeWordRepository.GetAsync(m => m.Tag == keyword && m.IsEnable == 1);
+                            if (keywordEntity is null) continue;
+                            exp.Or(x => SqlFunc.JsonArrayAny(x.Keywords, keywordEntity.Id));
+                        }
                     }
                 }
                 sugar = sugar.Where(exp.ToExpression());

+ 8 - 0
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -344,6 +344,14 @@ namespace Hotline.Application.Orders
 
         Task SpecialVerify(OrderSpecialAddDto dto, Order order, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// 省要求重办、省要求撤单 删除甄别等数据
+        /// </summary>
+        /// <param name="order"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        Task SpecialNewVerify(Order order, CancellationToken cancellationToken);
+
         Task EndCountersignAsync(EndCountersignDto dto, CancellationToken cancellationToken);
         ISugarQueryable<OrderPublish> GetPublishedOrder(PublishedPagedRequest dto);
         ISugarQueryable<Order> GetPublishOrderList(QueryOrderPublishDto dto);

+ 53 - 1
src/Hotline.Application/Orders/OrderApplication.cs

@@ -3347,7 +3347,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var orderSecondaries = await _orderSecondaryHandlingRepository.Queryable()
             .Where(x => x.OrderId == dto.OrderId && x.State == ESecondaryHandlingState.Apply).ToListAsync(cancellationToken);
 
-        if (_appOptions.Value.IsYiBin)
+        if (_appOptions.Value.IsYiBin || _appOptions.Value.IsZiGong)
         {
             if (screen.Any())
             {
@@ -3391,6 +3391,55 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
     }
 
+    /// <summary>
+    /// 省要求重办、省要求撤单 删除甄别等数据
+    /// </summary>
+    /// <param name="order"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public async Task SpecialNewVerify(Order order, CancellationToken cancellationToken)
+    {
+        var screen = await _orderScreenRepository.Queryable().Where(x => x.OrderId == order.Id && (int)x.Status < 2)
+        .ToListAsync(cancellationToken);
+        var sendBackAudit = await _orderSendBackAuditRepository.Queryable()
+            .Where(x => x.OrderId == order.Id && x.State == ESendBackAuditState.Apply).ToListAsync(cancellationToken);
+        var orderDelay = await _orderDelayRepository.Queryable().Where(x => x.OrderId == order.Id && x.DelayState == EDelayState.Examining)
+            .ToListAsync(cancellationToken);
+        var orderSecondaries = await _orderSecondaryHandlingRepository.Queryable()
+            .Where(x => x.OrderId == order.Id && x.State == ESecondaryHandlingState.Apply).ToListAsync(cancellationToken);
+
+        if (screen.Any())
+        {
+            await _orderScreenRepository.RemoveRangeAsync(screen, false, cancellationToken);
+        }
+
+        if (sendBackAudit.Any())
+        {
+            await _orderSendBackAuditRepository.RemoveRangeAsync(sendBackAudit, false, cancellationToken);
+        }
+
+        if (orderDelay.Any())
+        {
+            await _orderDelayRepository.RemoveRangeAsync(orderDelay, false, cancellationToken);
+        }
+
+        if (orderSecondaries.Any())
+        {
+            await _orderSecondaryHandlingRepository.RemoveRangeAsync(orderSecondaries, false, cancellationToken);
+        }
+
+        if (order.Workflow.IsInCountersign)
+        {
+            var workflowStep = await _workflowStepRepository.Queryable().Where(x => x.Id == order.Workflow.TopCountersignStepId)
+                .FirstAsync(cancellationToken);
+            if (workflowStep != null)
+            {
+                var dtoEnd = new EndCountersignDto() { CountersignId = workflowStep.StartCountersignId };
+                await EndCountersignAsync(dtoEnd, cancellationToken);
+            }
+        }
+    }
+
     public async Task EndCountersignAsync(EndCountersignDto dto, CancellationToken cancellationToken)
     {
         var countersign = await _workflowCountersignRepository.GetAsync(dto.CountersignId, cancellationToken);
@@ -4386,6 +4435,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
             await _orderRepository.UpdateAsync(order, cancellationToken);
             //await _workflowDomainService.RecallToStartStepAsync(order.WorkflowId, "省工单重派", current, cancellationToken);
+
+            //删除甄别、延期、二次办理等数据
+            await SpecialNewVerify(order, cancellationToken);
         }
 
         return _mapper.Map<AddOrderResponse>(order);

+ 7 - 0
src/Hotline.Application/StatisticalReport/IOrderReportApplication.cs

@@ -200,5 +200,12 @@ namespace Hotline.Application.StatisticalReport
         /// <param name="dto"></param>
         /// <returns></returns>
         ISugarQueryable<SeatReturnOrderListDto> GetCenterReturnOrderList(SeatReturnOrderListRequestDto dto);
+
+        /// <summary>
+        /// 延期审批统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderDelayStatisicalReturnDto> OrderDelayStatisicalList(OrderDelayStatisicalRequestDto dto);
     }
 }

+ 27 - 0
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -2857,5 +2857,32 @@ namespace Hotline.Application.StatisticalReport
             .OrderByDescending(d => d.SpecialCreationTime);
             return dataList;
         }
+
+        /// <summary>
+        /// 延期审批统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<OrderDelayStatisicalReturnDto> OrderDelayStatisicalList(OrderDelayStatisicalRequestDto dto)
+        {
+            var query = _orderDelayRepository.Queryable()
+                    .InnerJoin<WorkflowTrace>((o, w) => o.Id == w.ExternalId)
+                    .Where((o, w) => w.Name != "开始" && w.Name != "结束" && w.Code != "end" && w.Status == EWorkflowStepStatus.Handled
+                    && w.ModuleCode == "OrderDelay" && w.ReviewResult != EReviewResult.Unknown)
+                    .WhereIF(dto.StartTime.HasValue, (o, w) => w.HandleTime >= dto.StartTime)
+                    .WhereIF(dto.EndTime.HasValue, (o, w) => w.HandleTime <= dto.EndTime)
+                    .WhereIF(!string.IsNullOrEmpty(dto.UserName), (o, w) => w.HandlerName.Contains(dto.UserName))
+                    //.WhereIF(!string.IsNullOrEmpty(dto.NodeCode),(o,w)=>w.co)
+                    .GroupBy((o, w) => new { w.HandlerName, w.HandlerId, w.Name })
+                    .Select((o, w) => new OrderDelayStatisicalReturnDto
+                    {
+                        UserId = w.HandlerId,
+                        UserName = w.HandlerName,
+                        NodeName = w.Name,
+                        PassNum = SqlFunc.AggregateSum(SqlFunc.IIF(w.ReviewResult == EReviewResult.Approval, 1, 0)),
+                        NoPassNum = SqlFunc.AggregateSum(SqlFunc.IIF(w.ReviewResult == EReviewResult.Failed, 1, 0)),
+                    });
+            return query;
+        }
     }
 }

+ 3 - 0
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -358,6 +358,9 @@ namespace Hotline.Application.Subscribers
 
                 await _orderRepository.UpdateAsync(order, cancellationToken);
             }
+
+            //删除甄别、延期、二次办理等数据
+            await _orderApplication.SpecialNewVerify(order, cancellationToken);
         }
 
         /// <summary>

+ 47 - 0
src/Hotline.Share/Dtos/StatisticalReport/OrderDelayStatisicalReturnDto.cs

@@ -0,0 +1,47 @@
+using Hotline.Share.Requests;
+
+namespace Hotline.Share.Dtos.StatisticalReport
+{
+    public class OrderDelayStatisicalReturnDto
+    {
+        /// <summary>
+        /// 审批人id
+        /// </summary>
+        public string UserId { get; set; }
+
+        /// <summary>
+        /// 审批人名称
+        /// </summary>
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// 节点名称
+        /// </summary>
+        public string NodeName { get; set; }
+
+        /// <summary>
+        /// 同意数量
+        /// </summary>
+        public int PassNum { get; set; }
+
+        /// <summary>
+        /// 不同意数量
+        /// </summary>
+        public int NoPassNum { get; set; }
+
+        /// <summary>
+        /// 审批数量
+        /// </summary>
+        public int TotalNum => PassNum + NoPassNum;
+    }
+
+    public record OrderDelayStatisicalRequestDto : PagedKeywordRequest
+    {
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// 节点名称
+        /// </summary>
+        public string NodeCode { get; set; }
+    }
+}

+ 81 - 38
src/Hotline/Orders/OrderDomainService.cs

@@ -71,6 +71,8 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     private readonly ISystemLogRepository _systemLogRepository;
     private readonly IOrderSnapshotRepository _orderSnapshotRepository;
     private readonly ICalcExpireTime _expireTime;
+    private readonly ICallDomainService _callDomainService;
+    private readonly IOrderVisitDomainService _orderVisitDomainService;
 
     public OrderDomainService(
         IOrderRepository orderRepository,
@@ -98,7 +100,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         ISystemLogRepository systemLogRepository,
         IOptionsSnapshot<AppConfiguration> appOptions,
         IOrderSnapshotRepository orderSnapshotRepository,
-        ICalcExpireTime expireTime)
+        ICalcExpireTime expireTime,
+        ICallDomainService callDomainService,
+        IOrderVisitDomainService orderVisitDomainService)
     {
         _orderRepository = orderRepository;
         _orderRedoRepository = orderRedoRepository;
@@ -125,7 +129,8 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         _appOptions = appOptions;
         _orderSnapshotRepository = orderSnapshotRepository;
         _expireTime = expireTime;
-
+        _callDomainService = callDomainService;
+        _orderVisitDomainService = orderVisitDomainService;
     }
 
     /// <summary>
@@ -236,64 +241,81 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             orderVisit.EmployeeId = _sessionContext.RequiredUserId;
         }
 
+        var isReturn = false;
         if (_appOptions.Value.IsZiGong)
         {
             orderVisit.EmployeeId = string.Empty;
+
+            //自贡任务  348 语音评价不满意的工单需回访
+            var callNative = await GetReplyVoiceOrDefaultByOrderIdAsync(orderVisit.OrderId);
+            if (callNative == EVoiceEvaluate.NoSatisfied || callNative == EVoiceEvaluate.VeryNoSatisfied)
+                isReturn = true;
         }
 
-        if (order is { FileOrgIsCenter: true, CounterSignType: null } && !order.IsProvince)
+        if (isReturn == false)
         {
-            orderVisit.VisitState = EVisitState.Visited;
-            orderVisit.VisitTime = DateTime.Now;
-            orderVisit.VisitType = EVisitType.OtherVisit;
-            orderVisit.NowEvaluate = new Kv() { Key = "4", Value = "满意" };
-            if (_appOptions.Value.IsZiGong)
+            if (order is { FileOrgIsCenter: true, CounterSignType: null } && !order.IsProvince)
             {
-                // 根据禅道 自贡需求 Id_361, 第一条, 3小条需求;
-                // 直办件归档后自动回访量需统计在“胡玲”的默认回访量中;
-                orderVisit.EmployeeId = _systemSettingCacheManager.DefaultVisitEmployeeId;
+                orderVisit.VisitState = EVisitState.Visited;
+                orderVisit.VisitTime = DateTime.Now;
+                orderVisit.VisitType = EVisitType.OtherVisit;
+                orderVisit.NowEvaluate = new Kv() { Key = "4", Value = "满意" };
+                if (_appOptions.Value.IsZiGong)
+                {
+                    // 根据禅道 自贡需求 Id_361, 第一条, 3小条需求;
+                    // 直办件归档后自动回访量需统计在“胡玲”的默认回访量中;
+                    orderVisit.EmployeeId = _systemSettingCacheManager.DefaultVisitEmployeeId;
+                }
             }
-        }
 
-        if (order.CounterSignType != ECounterSignType.Center)
-        {
-            orderVisit.IsCanAiVisit = true;
+            if (order.CounterSignType != ECounterSignType.Center)
+            {
+                orderVisit.IsCanAiVisit = true;
+            }
         }
-
         string visitId = await _orderVisitRepository.AddAsync(orderVisit);
 
         //新增回访信息
         var visitedDetail = new List<OrderVisitDetail>();
 
-        var seatDetail = new OrderVisitDetail();
-        seatDetail.VisitId = visitId;
-        seatDetail.VisitTarget = EVisitTarget.Seat;
-
-
-        var orgDetail = new OrderVisitDetail();
-        orgDetail.VisitId = visitId;
-        orgDetail.VisitOrgCode = order.ActualHandleOrgCode;
-        orgDetail.VisitOrgName = order.ActualHandleOrgName;
-        orgDetail.VisitTarget = EVisitTarget.Org;
-        if (order is { FileOrgIsCenter: true, CounterSignType: null, IsProvince: false })
+        //坐席回访明细
+        var seatDetail = new OrderVisitDetail
         {
-            var satisfy = new Kv() { Key = "4", Value = "满意" };
-            orgDetail.OrgProcessingResults = satisfy;
-            //orgDetail.OrgHandledAttitude = satisfy;
-        }
+            VisitId = visitId,
+            VisitTarget = EVisitTarget.Seat
+        };
 
-        visitedDetail.Add(orgDetail);
+        //部门回访明细
+        var orgDetail = new OrderVisitDetail
+        {
+            VisitId = visitId,
+            VisitOrgCode = order.ActualHandleOrgCode,
+            VisitOrgName = order.ActualHandleOrgName,
+            VisitTarget = EVisitTarget.Org
+        };
 
-        if (order is { FileOrgIsCenter: true, CounterSignType: null })
+        if (isReturn == false)
         {
-            seatDetail.VoiceEvaluate = EVoiceEvaluate.Satisfied;
-            seatDetail.SeatEvaluate = ESeatEvaluate.Satisfied;
-            order.Visited("4", "满意");
-            order.Status = EOrderStatus.Visited;
-            await _orderRepository.UpdateAsync(order, cancellationToken);
+            if (order is { FileOrgIsCenter: true, CounterSignType: null, IsProvince: false })
+            {
+                var satisfy = new Kv() { Key = "4", Value = "满意" };
+                orgDetail.OrgProcessingResults = satisfy;
+                //orgDetail.OrgHandledAttitude = satisfy;
+            }
+
+            if (order is { FileOrgIsCenter: true, CounterSignType: null })
+            {
+                seatDetail.VoiceEvaluate = EVoiceEvaluate.Satisfied;
+                seatDetail.SeatEvaluate = ESeatEvaluate.Satisfied;
+                order.Visited("4", "满意");
+                order.Status = EOrderStatus.Visited;
+                await _orderRepository.UpdateAsync(order, cancellationToken);
+            }
         }
 
+        visitedDetail.Add(orgDetail);
         visitedDetail.Add(seatDetail);
+
         await _orderVisitDetailRepository.AddRangeAsync(visitedDetail, cancellationToken);
         await _publisher.PublishAsync(new ContingencyManagementNotify(order, order.Title, order.Content, order.ActualOpinion),
     PublishStrategy.ParallelWhenAll, cancellationToken);
@@ -934,7 +956,28 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         return $"{today:yyyyMMdd}{count:000000}";
     }
 
+    /// <summary>
+    /// 根据 OrderId 返回用户电话评价枚举
+    /// 默认返回 默认满意
+    /// </summary>
+    /// <param name="orderId"></param>
+    /// <returns></returns>
+    private async Task<EVoiceEvaluate> GetReplyVoiceOrDefaultByOrderIdAsync(string orderId)
+    {
+        var callNative = await _callDomainService.GetByOrderIdAsync(orderId);
+        if (callNative is null || callNative.ReplyTxt.IsNullOrEmpty())
+            return EVoiceEvaluate.DefaultSatisfied;
 
+        try
+        {
+            var smsReply = _orderVisitDomainService.GetVisitEvaluateByReplyTxt(callNative.ReplyTxt!.Trim());
+            return smsReply!.VoiceEvaluate!.Value;
+        }
+        catch (UserFriendlyException)
+        {
+            return EVoiceEvaluate.DefaultSatisfied;
+        }
+    }
     #endregion
 }