Преглед на файлове

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

Dun.Jason преди 4 месеца
родител
ревизия
e25d8550e0
променени са 23 файла, в които са добавени 464 реда и са изтрити 412 реда
  1. 20 1
      src/Hotline.Api/Controllers/OrderController.cs
  2. 7 0
      src/Hotline.Api/Controllers/WorkflowController.cs
  3. 15 1
      src/Hotline.Application.Tests/Controller/OrderControllerTest.cs
  4. 2 2
      src/Hotline.Application/CallCenter/DefaultCallApplication.cs
  5. 3 3
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  6. 1 1
      src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs
  7. 23 12
      src/Hotline.Application/Knowledge/KnowApplication.cs
  8. 305 289
      src/Hotline.Application/Orders/OrderApplication.cs
  9. 5 1
      src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenNextWorkflowHandler.cs
  10. 1 81
      src/Hotline.Application/StatisticalReport/OrderReportApplication.cs
  11. 4 1
      src/Hotline.Application/Systems/ISystemLogApplication.cs
  12. 7 2
      src/Hotline.Application/Systems/SystemLogApplication.cs
  13. 6 2
      src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs
  14. 3 2
      src/Hotline.Repository.SqlSugar/System/SystemLogRepository.cs
  15. 7 1
      src/Hotline.Share/Dtos/Bi/BiOrderDto.cs
  16. 4 2
      src/Hotline.Share/Dtos/Order/OrderDto.cs
  17. 1 1
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  18. 6 6
      src/Hotline/Orders/DatabaseEventHandler/OrderVisitDetailEventHandler.cs
  19. 12 3
      src/Hotline/Orders/OrderDomainService.cs
  20. 6 0
      src/Hotline/Schedulings/Scheduling.cs
  21. 1 1
      src/Hotline/Settings/ISystemLogRepository.cs
  22. 5 0
      src/Hotline/Settings/SettingConstants.cs
  23. 20 0
      src/Hotline/Statistics/StatisticsDepart.cs

+ 20 - 1
src/Hotline.Api/Controllers/OrderController.cs

@@ -146,6 +146,7 @@ public class OrderController : BaseController
     private readonly IRepository<OrderPushType> _orderPushTypeRepository;
     private readonly IRepository<OrderRevoke> _orderRevokeRepository;
     private readonly IOrderTerminateRepository _orderTerminateRepository;
+    private readonly ISystemLogApplication _systemLogApplication;
 
     public OrderController(
         IOrderDomainService orderDomainService,
@@ -211,7 +212,8 @@ public class OrderController : BaseController
         IRepository<OrderRevoke> orderRevokeRepository,
         BaseDataApplication baseDataApplication,
         IOrderTerminateRepository orderTerminateRepository,
-        ITypedCache<string> typeCache)
+        ITypedCache<string> typeCache,
+        ISystemLogApplication systemLogApplication)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -278,6 +280,7 @@ public class OrderController : BaseController
         _orderRevokeRepository = orderRevokeRepository;
         _typeCache = typeCache;
         _baseDataApplication = baseDataApplication;
+        _systemLogApplication = systemLogApplication;
     }
 
     #endregion
@@ -414,6 +417,12 @@ public class OrderController : BaseController
             throw UserFriendlyException.SameMessage("选择的工单中含有会签工单, 不能批量发布. 请排除会签工单.");
 
         var hasProvince = await _orderRepository.Queryable().AnyAsync(x => dto.Ids.Contains(x.Id) && x.Source == ESource.ProvinceStraight);
+        //if (hasProvince)
+        //    throw UserFriendlyException.SameMessage("选择的工单中含有省工单, 不能批量发布. 请排除省工单.");
+        if (_appOptions.Value.IsYiBin)
+        {
+			hasProvince = await _orderRepository.Queryable().AnyAsync(x => dto.Ids.Contains(x.Id) && x.IsProvince);
+		}
         if (hasProvince)
             throw UserFriendlyException.SameMessage("选择的工单中含有省工单, 不能批量发布. 请排除省工单.");
 
@@ -3470,6 +3479,9 @@ public class OrderController : BaseController
             orderTerminateList.Any(x => x.Status == ETerminateStatus.Refuse) ? "不同意" :
             orderTerminateList.Any(x => x.Status == ETerminateStatus.Approval || x.Status == ETerminateStatus.SendBack) ? "审批中" : null;
 
+        dto.IsReTransact = await _orderSpecialRepository.Queryable()
+	        .Where(x => x.OrderId == dto.Id && x.SpecialType == ESpecialType.ReTransact).AnyAsync();
+
         return _sessionContext.OrgIsCenter ? dto : dto.DataMask();
     }
 
@@ -3495,6 +3507,13 @@ public class OrderController : BaseController
             var exists = await _orderRepository.AnyAsync(d => d.CallId == dto.CallId, HttpContext.RequestAborted);
             if (exists)
                 throw new UserFriendlyException($"来电已保存工单, phone:{dto.FromPhone}, callId: {dto.CallId}", "来电已保存工单");
+            exists = await _systemLogApplication.HasByIpUrlAsync(dto.CallId);
+            if (exists)
+            {
+                // IpUrl 里面存的是 callId, 用来判断是工单的 CallId 是否已经被修复过了.
+                // 存入的地方是 Hotline.Application.CallCenter.OrderRelateCallHandlerAsync
+                throw new UserFriendlyException($"来电已保存工单, phone:{dto.FromPhone}, callId: {dto.CallId} !", "来电已保存工单!");
+            }
         }
 
         var order = _mapper.Map<Orders.Order>(dto);

+ 7 - 0
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -493,6 +493,13 @@ public class WorkflowController : BaseController
             InstanceModeOptions = EnumExts.GetDescriptions<EInstanceMode>(),
             StepTypeOptions = EnumExts.GetDescriptions<EStepType>().Where(d => d.Key != 1 && d.Key != 2),
             DynamicPolicyOptions = EnumExts.GetDescriptions<EDynamicPolicy>()
+                .Select(d => new
+                {
+                    Key = d.Key,
+                    Value = d.Value,
+                    Items = d.Key is 0 or 2 or 4 or 6? centerIsTop : orgs
+                }),
+            CountersignPolicyOptions = EnumExts.GetDescriptions<ECountersignPolicy>()
                 .Select(d => new
                 {
                     Key = d.Key,

+ 15 - 1
src/Hotline.Application.Tests/Controller/OrderControllerTest.cs

@@ -59,7 +59,7 @@ public class OrderControllerTest : TestBase
     private readonly IOrderVisitRepository _orderVisitRepository;
     private readonly IRepository<SystemSetting> _systemSettingRepository;
     private readonly ISystemSettingCacheManager _systemSettingCacheManager;
-    private readonly IRepository<CallNative> _callNativeRepository; 
+    private readonly IRepository<CallNative> _callNativeRepository;
     private readonly IRepository<CallidRelation> _callIdRelationRepository;
     private readonly XingTangCallApplication _defaultCallApplication;
     private readonly ISqlSugarClient _capSqlClient;
@@ -90,6 +90,7 @@ public class OrderControllerTest : TestBase
     /// 验证: 
     /// 测试在延迟消息后会不会把工单测CallId修复成正确的CallId
     /// 推送的省上数据是否正确
+    /// 测试修复后的CallId 再次保存功能, 能通过 systemLog 查询修复记录, 拦截工单保存
     /// </summary>
     /// <returns></returns>
     [Fact]
@@ -100,6 +101,7 @@ public class OrderControllerTest : TestBase
             .With(m => m.Id, Ulid.NewUlid().ToString())
             .With(m => m.CallNo, callNo)
             .With(m => m.Direction, ECallDirection.In)
+            .With(m => m.IsDeleted , false)
             .Create();
         await _callNativeRepository.AddAsync(inDto);
 
@@ -108,6 +110,7 @@ public class OrderControllerTest : TestBase
             .With(m => m.Direction, ECallDirection.Out)
             .With(m => m.CallNo, callNo)
             .With(m => m.AudioFile, string.Empty)
+            .With(m => m.IsDeleted , false)
             .Create();
         await _callNativeRepository.AddAsync(inDto2);
         var callOrder = new CallidRelation
@@ -136,6 +139,17 @@ public class OrderControllerTest : TestBase
         message.Value.Order.ShouldNotBeNull("推送的工单信息为空");
         message.Value.Order.ProvinceNo.ShouldNotBeNull("省工单编号不能为空");
         message.Value.Order.No.ShouldBe(order.No, "推送的工单编号错误");
+
+        try
+        {
+            order = _orderServiceMock.CreateOrder(callNo)
+                       .办理到派单员()
+                       .GetCreateResult();
+        }
+        catch (UserFriendlyException e)
+        {
+            e.FriendlyMessage.ShouldBe("来电已保存工单!");
+        }
     }
 
     /// <summary>

+ 2 - 2
src/Hotline.Application/CallCenter/DefaultCallApplication.cs

@@ -405,7 +405,7 @@ public abstract class DefaultCallApplication : ICallApplication
     /// </summary>
     public virtual async Task<CallNative> GetCallByCallNoAsync(string callNo, CancellationToken cancellationToken)
     {
-        return  await _callNativeRepository.Queryable()
+        return await _callNativeRepository.Queryable()
             .Where(m => m.CallNo == callNo && !string.IsNullOrEmpty(m.AudioFile))
             .FirstAsync(cancellationToken);
     }
@@ -580,7 +580,7 @@ public abstract class DefaultCallApplication : ICallApplication
             TrCallRecordDto = call.Adapt<TrCallDto>()
         }, cancellationToken: cancellationToken);
         var msg = $"原CallId: {orderCall.CallId}, 更新CallId: {call.Id}";
-        _systemLogRepository.Add("延迟更新工单通话", orderId, msg, status: 1);
+        _systemLogRepository.Add("延迟更新工单通话", orderId, msg,status:1, ipUrl: orderCall.CallId);
         return msg + "(完成推省上)";
     }
 

+ 3 - 3
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -667,7 +667,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     var countersignEndOption = GetCsEndStepByTargetPrev(workflow.Steps, startCountersignStep);
 
                     //按会签策略
-                    var nextStepOption = await GetDynamicStepAsync(currentStep.CountersignPolicy.Value,
+                    var nextStepOption = await GetCountersignStepAsync(currentStep.CountersignPolicy.Value,
                         EStepType.Normal, currentStep.BusinessType, cancellationToken);
 
                     dto.Steps = new List<NextStepOption> { nextStepOption };
@@ -682,7 +682,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 var countersignEndOption = GetCsEndStepByTargetPrev(workflow.Steps, currentStep);
                 //按会签策略
                 var nextStepOption =
-                    await GetDynamicStepAsync(currentStep.CountersignPolicy.Value,
+                    await GetCountersignStepAsync(currentStep.CountersignPolicy.Value,
                         EStepType.Normal, currentStep.BusinessType, cancellationToken);
                 dto.Steps = new List<NextStepOption> { nextStepOption };
                 if (countersignEndOption != null)
@@ -1488,7 +1488,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// 会签 动态策略
     /// </summary>
     /// <returns></returns>
-    private async Task<NextStepOption> GetDynamicStepAsync(
+    private async Task<NextStepOption> GetCountersignStepAsync(
         ECountersignPolicy policy, EStepType stepType,
         EBusinessType currentBusinessType, CancellationToken cancellationToken)
     {

+ 1 - 1
src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs

@@ -125,7 +125,7 @@ public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
                     var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId,
                         withExtension: true, cancellationToken: cancellationToken);
                     //order.CheckIfFiled();
-                    order.UpdateHandlingStatus(workflow.IsInCountersign);
+                    //order.UpdateHandlingStatus(workflow.IsInCountersign);
                     _mapper.Map(workflow, order);
                     var now = DateTime.Now;
                     var handleDuration = order.CenterToOrgTime.HasValue && order.ActualHandleTime.HasValue

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

@@ -1,4 +1,5 @@
 using Hotline.Application.Tools;
+using Hotline.Configurations;
 using Hotline.KnowledgeBase;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Settings;
@@ -13,6 +14,7 @@ using Mapster;
 using MapsterMapper;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
 using Org.BouncyCastle.Utilities.IO;
 using PanGu;
 using SqlSugar;
@@ -34,16 +36,17 @@ namespace Hotline.Application.Knowledge
         private readonly IRepository<KnowledgeHotWord> _knowledgeHotWordRepository;
         private readonly ISessionContext _sessionContext;
         private readonly IMapper _mapper;
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="knowledgeRepository"></param>
-        /// <param name="knowledgeApplyRepository"></param>
-        /// <param name="sessionContext"></param>
-        /// <param name="knowledgeDomainService"></param>
-        /// <param name="mapper"></param>
-        public KnowApplication(IKnowledgeRepository knowledgeRepository, IRepository<KnowledgeApply> knowledgeApplyRepository, ISessionContext sessionContext, IMapper mapper, IRepository<KnowledgeType> knowledgeTypeRepository, IRepository<Hotspot> hotspotTypeRepository, IRepository<KnowledgeWord> knowledgeWordRepository, IRepository<KnowledgePv> knowledgePvepository, IRepository<KnowledgeHotWord> knowledgeHotWordRepository)
+        private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="knowledgeRepository"></param>
+		/// <param name="knowledgeApplyRepository"></param>
+		/// <param name="sessionContext"></param>
+		/// <param name="knowledgeDomainService"></param>
+		/// <param name="mapper"></param>
+		public KnowApplication(IKnowledgeRepository knowledgeRepository, IOptionsSnapshot<AppConfiguration> appOptions, IRepository<KnowledgeApply> knowledgeApplyRepository, ISessionContext sessionContext, IMapper mapper, IRepository<KnowledgeType> knowledgeTypeRepository, IRepository<Hotspot> hotspotTypeRepository, IRepository<KnowledgeWord> knowledgeWordRepository, IRepository<KnowledgePv> knowledgePvepository, IRepository<KnowledgeHotWord> knowledgeHotWordRepository)
         {
             _knowledgeRepository = knowledgeRepository;
             _knowledgeApplyRepository = knowledgeApplyRepository;
@@ -54,7 +57,9 @@ namespace Hotline.Application.Knowledge
             _knowledgeWordRepository = knowledgeWordRepository;
             _knowledgePvepository = knowledgePvepository;
             _knowledgeHotWordRepository = knowledgeHotWordRepository;
-        }
+			_appOptions  = appOptions;
+
+		}
 
         /// <summary>
         /// 知识库查询
@@ -67,7 +72,13 @@ namespace Hotline.Application.Knowledge
 	        {
 		        pagedDto.Attribution = "部门知识库";
 	        }
-            var typeSpliceName = string.Empty;
+
+	        if (_appOptions.Value.IsZiGong || _appOptions.Value.IsLuZhou)
+	        {
+		        pagedDto.Attribution = string.Empty;
+	        }
+
+	        var typeSpliceName = string.Empty;
             var hotspotHotSpotFullName = string.Empty;
             if (!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId))
             {

+ 305 - 289
src/Hotline.Application/Orders/OrderApplication.cs

@@ -1781,7 +1781,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var orgLevel = _sessionContextProvider.SessionContext.OrgLevel;
         string orgLevelStr = (_sessionContextProvider.SessionContext.RequiredOrgId.Length + 3).ToString();
 
-		var list = _orderVisitDetailRepository.Queryable()
+        var list = _orderVisitDetailRepository.Queryable()
             .Where(x => x.OrderVisit.VisitTime >= dto.StartTime.Value && x.OrderVisit.VisitTime <= dto.EndTime.Value &&
                         x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
             .WhereIF(string.IsNullOrEmpty(dto.OrgName) == false, x => x.VisitOrgName.Contains(dto.OrgName))
@@ -1794,111 +1794,111 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var data = new List<VisitAndOrgSatisfactionStatisticsDto>();
         var oldData = new List<VisitAndOrgSatisfactionStatisticsDto>();
 
-		if (IsCenter && list != null)
-		{
-			data = await list.GroupBy(x => new
-			{
-				VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
-			})
-				.Select(x => new VisitAndOrgSatisfactionStatisticsDto()
-				{
-					OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
-					TotalSumCount =
-						SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
-					VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))), //非常满意数
-					SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
-					RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))), //视为满意
-					DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))), //默认满意
-					NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))), //不满意
-					NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))), //未做评价
-					NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))), //未接通
-				})
-				.MergeTable()
-				.LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
-				.Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
-				{
-					OrgName = o.Name,
-					OrgCode = it.OrgCode,
-					OrgType = o.OrgType,
-					TotalSumCount = it.TotalSumCount,
-					VerySatisfiedCount = it.VerySatisfiedCount, //非常满意数
-					SatisfiedCount = it.SatisfiedCount, //满意数
-					RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount, //视为满意
-					DefaultSatisfiedCount = it.DefaultSatisfiedCount, //默认满意
-					NoSatisfiedCount = it.NoSatisfiedCount, //不满意
-					NoEvaluateCount = it.NoEvaluateCount, //未做评价
-					NoPutThroughCount = it.NoPutThroughCount, //未接通
-				})
-				.ToListAsync();
-		}
-		else
-		{
-			data = await list.GroupBy(x => new
-			{
-				VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"),SqlFunc.MappingColumn<int>(orgLevelStr))
-			})
-				.Select(x => new VisitAndOrgSatisfactionStatisticsDto()
-				{
-					OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr)),
-					TotalSumCount =
-						SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr))),
-					VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))), //非常满意数
-					SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
-					RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))), //视为满意
-					DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))), //默认满意
-					NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))), //不满意
-					NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))), //未做评价
-					NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1,
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)),
-						SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))), //未接通
-				})
-				.MergeTable()
-				.LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id && (o.Level == orgLevel || o.Level == (orgLevel + 1)))
-				.Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
-				{
-					OrgName = o.Name,
-					OrgCode = it.OrgCode,
-					OrgType = o.OrgType,
-					TotalSumCount = it.TotalSumCount,
-					VerySatisfiedCount = it.VerySatisfiedCount, //非常满意数
-					SatisfiedCount = it.SatisfiedCount, //满意数
-					RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount, //视为满意
-					DefaultSatisfiedCount = it.DefaultSatisfiedCount, //默认满意
-					NoSatisfiedCount = it.NoSatisfiedCount, //不满意
-					NoEvaluateCount = it.NoEvaluateCount, //未做评价
-					NoPutThroughCount = it.NoPutThroughCount, //未接通
-				})
-				.ToListAsync();
-		}
-
-		#region 老系统数据
-		if (await _statisticsDepartSatisfiedRepository.Queryable().Where(x => x.Time >= dto.StartTime.Value && x.Time <= dto.EndTime.Value).AnyAsync())
+        if (IsCenter && list != null)
+        {
+            data = await list.GroupBy(x => new
+            {
+                VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+            })
+                .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                    TotalSumCount =
+                        SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
+                    VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))), //非常满意数
+                    SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+                    RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))), //视为满意
+                    DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))), //默认满意
+                    NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))), //不满意
+                    NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))), //未做评价
+                    NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))), //未接通
+                })
+                .MergeTable()
+                .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
+                .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgName = o.Name,
+                    OrgCode = it.OrgCode,
+                    OrgType = o.OrgType,
+                    TotalSumCount = it.TotalSumCount,
+                    VerySatisfiedCount = it.VerySatisfiedCount, //非常满意数
+                    SatisfiedCount = it.SatisfiedCount, //满意数
+                    RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount, //视为满意
+                    DefaultSatisfiedCount = it.DefaultSatisfiedCount, //默认满意
+                    NoSatisfiedCount = it.NoSatisfiedCount, //不满意
+                    NoEvaluateCount = it.NoEvaluateCount, //未做评价
+                    NoPutThroughCount = it.NoPutThroughCount, //未接通
+                })
+                .ToListAsync();
+        }
+        else
+        {
+            data = await list.GroupBy(x => new
+            {
+                VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr))
+            })
+                .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr)),
+                    TotalSumCount =
+                        SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr))),
+                    VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))), //非常满意数
+                    SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+                    RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))), //视为满意
+                    DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))), //默认满意
+                    NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))), //不满意
+                    NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))), //未做评价
+                    NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1,
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)),
+                        SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))), //未接通
+                })
+                .MergeTable()
+                .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id && (o.Level == orgLevel || o.Level == (orgLevel + 1)))
+                .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgName = o.Name,
+                    OrgCode = it.OrgCode,
+                    OrgType = o.OrgType,
+                    TotalSumCount = it.TotalSumCount,
+                    VerySatisfiedCount = it.VerySatisfiedCount, //非常满意数
+                    SatisfiedCount = it.SatisfiedCount, //满意数
+                    RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount, //视为满意
+                    DefaultSatisfiedCount = it.DefaultSatisfiedCount, //默认满意
+                    NoSatisfiedCount = it.NoSatisfiedCount, //不满意
+                    NoEvaluateCount = it.NoEvaluateCount, //未做评价
+                    NoPutThroughCount = it.NoPutThroughCount, //未接通
+                })
+                .ToListAsync();
+        }
+
+        #region 老系统数据
+        if (await _statisticsDepartSatisfiedRepository.Queryable().Where(x => x.Time >= dto.StartTime.Value && x.Time <= dto.EndTime.Value).AnyAsync())
         {
             var query = _statisticsDepartSatisfiedRepository.Queryable()
                 .LeftJoin<SystemOrganize>((x, so) => x.DepartmentId == so.oldBmid)
@@ -2006,141 +2006,141 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         bool IsCenter = _sessionContextProvider.SessionContext.OrgIsCenter;
         var org = await _systemOrganizeRepository.Queryable().FirstAsync(x => x.Id == dto.OrgCode);
 
-		string orgLevelStr = (dto.OrgCode.Length + 3 ).ToString();
-		var oldData = new List<VisitAndOrgSatisfactionStatisticsDto>();
-
-		var quer =  _systemOrganizeRepository.Queryable().Where(x => x.Id.StartsWith(dto.OrgCode))
-			.LeftJoin<OrderVisitDetail>((x, it) => x.Id == it.VisitOrgCode)
-			.Where((x, it) => it.OrderVisit.VisitTime >= dto.StartTime.Value &&
-			                  it.OrderVisit.VisitTime <= dto.EndTime.Value &&
-			                  it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
-			.WhereIF(dto.OrgCode == "001", (x, it) => it.VisitOrgCode == dto.OrgCode)
-			.WhereIF(dto.OrgCode != "001", (x, it) => it.VisitOrgCode.StartsWith(dto.OrgCode))
-			.WhereIF(!string.IsNullOrEmpty(dto.LineNum),
-				(x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
-			.WhereIF(dto.TypeCode != null && dto.TypeCode == 1,
-				(x, it) => it.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
-			.WhereIF(dto.TypeCode != null && dto.TypeCode == 2,
-				(x, it) => it.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
-			.WhereIF(IsCenter == false,
-				(x, it) => it.VisitOrgCode.StartsWith(_sessionContextProvider.SessionContext.OrgId))
-			.WhereIF(dto.VisitType != null, (x, it) => it.OrderVisit.VisitType == dto.VisitType)
-			.GroupBy((x, it) => new
-			{
-				VisitOrgCode = it.VisitOrgCode
-			})
-			.Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
-			{
-				OrgCode = it.VisitOrgCode,
-				TotalSumCount = SqlFunc.AggregateCount(it.VisitOrgCode),
-				VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "5", 1, 0)),
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "5", 1,
-						0))), //非常满意数
-				SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "4", 1, 0)),
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "4", 1,
-						0))), //满意数
-				RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "-1", 1, 0)),
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "-1", 1,
-						0))), //视为满意
-				DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "0", 1, 0)),
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "0", 1,
-						0))), //默认满意
-				NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)),
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "2", 1,
-						0))), //不满意
-				NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1,
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "7", 1, 0)),
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "7", 1,
-						0))), //未做评价
-				NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1,
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "6", 1, 0)),
-					SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "6", 1,
-						0))) //未接通
-			})
-			.MergeTable()
-			.LeftJoin<SystemOrganize>((x, it) =>
-				x.OrgCode == it.Id && (it.Level == org.Level || it.Level == (org.Level + 1)))
-			.Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
-			{
-				OrgName = it.Name,
-				OrgCode = x.OrgCode,
-				OrgType = it.OrgType,
-				TotalSumCount = x.TotalSumCount,
-				VerySatisfiedCount = x.VerySatisfiedCount, //非常满意数
-				SatisfiedCount = x.SatisfiedCount, //满意数
-				RegardedAsSatisfiedCount = x.RegardedAsSatisfiedCount, //视为满意
-				DefaultSatisfiedCount = x.DefaultSatisfiedCount, //默认满意
-				NoSatisfiedCount = x.NoSatisfiedCount, //不满意
-				NoEvaluateCount = x.NoEvaluateCount, //未做评价
-				NoPutThroughCount = x.NoPutThroughCount, //未接通
-			});
-		var list = await quer.ToListAsync();
-
-		#region 老系统数据
-		if (await _statisticsDepartSatisfiedRepository.Queryable().Where(x => x.Time >= dto.StartTime.Value && x.Time <= dto.EndTime.Value).AnyAsync())
-		{
-			var query = _statisticsDepartSatisfiedRepository.Queryable()
-				.LeftJoin<SystemOrganize>((x, so) => x.DepartmentId == so.oldBmid)
-				.WhereIF(dto.OrgCode == "001", (x, so) => so.Id == dto.OrgCode)
-				.WhereIF(dto.OrgCode != "001", (x, so) => so.Id.StartsWith(dto.OrgCode))
-				.Where((x, so) => x.Time >= dto.StartTime.Value && x.Time <= dto.EndTime.Value);
-
-			oldData = await query.GroupBy((x, so) => new
-				{
-					VisitOrgCode = so.Id
-			}).Select((x, so) => new VisitAndOrgSatisfactionStatisticsDto()
-				{
-					OrgCode = so.Id,//.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr)),
-					TotalSumCount = SqlFunc.AggregateSum(x.Total),
-					VerySatisfiedCount = SqlFunc.AggregateSum(x.VerySatisfaction), //非常满意数
-					SatisfiedCount = SqlFunc.AggregateSum(x.Satisfaction), //满意数
-					RegardedAsSatisfiedCount = SqlFunc.AggregateSum(x.TreatSatisfaction), //视为满意
-					DefaultSatisfiedCount = SqlFunc.AggregateSum(x.DefaultSatisfaction), //默认满意
-					NoSatisfiedCount = SqlFunc.AggregateSum(x.Dissatisfaction), //不满意
-					NoEvaluateCount = SqlFunc.AggregateSum(x.NotEvaluated), //未做评价
-					NoPutThroughCount = SqlFunc.AggregateSum(x.BlockCall), //未接通
-				})
-				.MergeTable().LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id && (o.Level == org.Level || o.Level == (org.Level + 1)))
-				.Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
-				{
-					OrgName = o.Name,
-					OrgCode = it.OrgCode,
-					OrgType = o.OrgType,
-					TotalSumCount = it.TotalSumCount,
-					VerySatisfiedCount = it.VerySatisfiedCount, //非常满意数
-					SatisfiedCount = it.SatisfiedCount, //满意数
-					RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount, //视为满意
-					DefaultSatisfiedCount = it.DefaultSatisfiedCount, //默认满意
-					NoSatisfiedCount = it.NoSatisfiedCount, //不满意
-					NoEvaluateCount = it.NoEvaluateCount, //未做评价
-					NoPutThroughCount = it.NoPutThroughCount, //未接通
-				})
-				.ToListAsync();
-			list = (from t1 in list
+        string orgLevelStr = (dto.OrgCode.Length + 3).ToString();
+        var oldData = new List<VisitAndOrgSatisfactionStatisticsDto>();
+
+		var mainList = await _systemOrganizeRepository.Queryable().Where(x => x.Id.StartsWith(dto.OrgCode))
+		   .LeftJoin<OrderVisitDetail>((x, it) => x.Id == it.VisitOrgCode)
+		   .Where((x, it) => it.OrderVisit.VisitTime >= dto.StartTime.Value &&
+							 it.OrderVisit.VisitTime <= dto.EndTime.Value &&
+							 it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
+           .Where((x, it) => it.VisitOrgCode.StartsWith(dto.OrgCode)  )
+		                 //&& it.VisitOrgCode != dto.OrgCode
+		   .WhereIF(!string.IsNullOrEmpty(dto.LineNum),
+			   (x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
+		   .WhereIF(dto.TypeCode != null && dto.TypeCode == 1,
+			   (x, it) => it.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
+		   .WhereIF(dto.TypeCode != null && dto.TypeCode == 2,
+			   (x, it) => it.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
+		   .WhereIF(IsCenter == false,
+			   (x, it) => it.VisitOrgCode.StartsWith(_sessionContextProvider.SessionContext.OrgId))
+		   .WhereIF(dto.VisitType != null, (x, it) => it.OrderVisit.VisitType == dto.VisitType)
+		   .GroupBy((x, it) => new
+		   {
+			   VisitOrgCode = it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr))
+		   })
+		   .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
+		   {
+			   OrgCode = it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr)),
+			   TotalSumCount = SqlFunc.AggregateCount(it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr))),
+			   VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "5", 1, 0)),
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "5", 1,
+					   0))), //非常满意数
+			   SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "4", 1, 0)),
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "4", 1,
+					   0))), //满意数
+			   RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "-1", 1, 0)),
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "-1", 1,
+					   0))), //视为满意
+			   DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "0", 1, 0)),
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "0", 1,
+					   0))), //默认满意
+			   NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)),
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "2", 1,
+					   0))), //不满意
+			   NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1,
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "7", 1, 0)),
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "7", 1,
+					   0))), //未做评价
+			   NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1,
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "6", 1, 0)),
+				   SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "6", 1,
+					   0))) //未接通
+		   })
+		   .MergeTable()
+		   .LeftJoin<SystemOrganize>((x, it) =>
+			   x.OrgCode == it.Id && (it.Level == org.Level || it.Level == (org.Level + 1)))
+		   .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
+		   {
+			   OrgName = it.Name,
+			   OrgCode = x.OrgCode,
+			   OrgType = it.OrgType,
+			   TotalSumCount = x.TotalSumCount,
+			   VerySatisfiedCount = x.VerySatisfiedCount, //非常满意数
+			   SatisfiedCount = x.SatisfiedCount, //满意数
+			   RegardedAsSatisfiedCount = x.RegardedAsSatisfiedCount, //视为满意
+			   DefaultSatisfiedCount = x.DefaultSatisfiedCount, //默认满意
+			   NoSatisfiedCount = x.NoSatisfiedCount, //不满意
+			   NoEvaluateCount = x.NoEvaluateCount, //未做评价
+			   NoPutThroughCount = x.NoPutThroughCount, //未接通
+		   }).ToListAsync();
+
+
+        #region 老系统数据
+        if (await _statisticsDepartSatisfiedRepository.Queryable().Where(x => x.Time >= dto.StartTime.Value && x.Time <= dto.EndTime.Value).AnyAsync())
+        {
+            var query = _statisticsDepartSatisfiedRepository.Queryable()
+                .LeftJoin<SystemOrganize>((x, so) => x.DepartmentId == so.oldBmid)
+                .WhereIF(dto.OrgCode == "001", (x, so) => so.Id == dto.OrgCode)
+                .WhereIF(dto.OrgCode != "001", (x, so) => so.Id.StartsWith(dto.OrgCode))
+                .Where((x, so) => x.Time >= dto.StartTime.Value && x.Time <= dto.EndTime.Value);
+
+            oldData = await query.GroupBy((x, so) => new
+            {
+                VisitOrgCode = so.Id
+            }).Select((x, so) => new VisitAndOrgSatisfactionStatisticsDto()
+            {
+                OrgCode = so.Id,//.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr)),
+                TotalSumCount = SqlFunc.AggregateSum(x.Total),
+                VerySatisfiedCount = SqlFunc.AggregateSum(x.VerySatisfaction), //非常满意数
+                SatisfiedCount = SqlFunc.AggregateSum(x.Satisfaction), //满意数
+                RegardedAsSatisfiedCount = SqlFunc.AggregateSum(x.TreatSatisfaction), //视为满意
+                DefaultSatisfiedCount = SqlFunc.AggregateSum(x.DefaultSatisfaction), //默认满意
+                NoSatisfiedCount = SqlFunc.AggregateSum(x.Dissatisfaction), //不满意
+                NoEvaluateCount = SqlFunc.AggregateSum(x.NotEvaluated), //未做评价
+                NoPutThroughCount = SqlFunc.AggregateSum(x.BlockCall), //未接通
+            })
+                .MergeTable().LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id && (o.Level == org.Level || o.Level == (org.Level + 1)))
+                .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgName = o.Name,
+                    OrgCode = it.OrgCode,
+                    OrgType = o.OrgType,
+                    TotalSumCount = it.TotalSumCount,
+                    VerySatisfiedCount = it.VerySatisfiedCount, //非常满意数
+                    SatisfiedCount = it.SatisfiedCount, //满意数
+                    RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount, //视为满意
+                    DefaultSatisfiedCount = it.DefaultSatisfiedCount, //默认满意
+                    NoSatisfiedCount = it.NoSatisfiedCount, //不满意
+                    NoEvaluateCount = it.NoEvaluateCount, //未做评价
+                    NoPutThroughCount = it.NoPutThroughCount, //未接通
+                })
+                .ToListAsync();
+            mainList = (from t1 in mainList
 					join t2 in oldData on t1.OrgCode equals t2.OrgCode into t1_t2
-					from item in t1_t2.DefaultIfEmpty()
-					select new VisitAndOrgSatisfactionStatisticsDto()
-					{
-						OrgName = t1.OrgName,
-						OrgCode = t1.OrgCode,
-						OrgType = t1.OrgType,
-						TotalSumCount = t1.TotalSumCount + t1_t2.Select(x => x.TotalSumCount).FirstOrDefault(),
-						VerySatisfiedCount = t1.VerySatisfiedCount + t1_t2.Select(x => x.VerySatisfiedCount).FirstOrDefault(),//非常满意数
-						SatisfiedCount = t1.SatisfiedCount + t1_t2.Select(x => x.SatisfiedCount).FirstOrDefault(), //满意数
-						RegardedAsSatisfiedCount = t1.RegardedAsSatisfiedCount + t1_t2.Select(x => x.RegardedAsSatisfiedCount).FirstOrDefault(), //视为满意
-						DefaultSatisfiedCount = t1.DefaultSatisfiedCount + t1_t2.Select(x => x.DefaultSatisfiedCount).FirstOrDefault(), //默认满意
-						NoSatisfiedCount = t1.NoSatisfiedCount + t1_t2.Select(x => x.NoSatisfiedCount).FirstOrDefault(), //不满意
-						NoEvaluateCount = t1.NoEvaluateCount + t1_t2.Select(x => x.NoEvaluateCount).FirstOrDefault(), //未做评价
-						NoPutThroughCount = t1.NoPutThroughCount + t1_t2.Select(x => x.NoPutThroughCount).FirstOrDefault(), //未接通
-					}).ToList();
-		}
-		#endregion
-		return list;
+                    from item in t1_t2.DefaultIfEmpty()
+                    select new VisitAndOrgSatisfactionStatisticsDto()
+                    {
+                        OrgName = t1.OrgName,
+                        OrgCode = t1.OrgCode,
+                        OrgType = t1.OrgType,
+                        TotalSumCount = t1.TotalSumCount + t1_t2.Select(x => x.TotalSumCount).FirstOrDefault(),
+                        VerySatisfiedCount = t1.VerySatisfiedCount + t1_t2.Select(x => x.VerySatisfiedCount).FirstOrDefault(),//非常满意数
+                        SatisfiedCount = t1.SatisfiedCount + t1_t2.Select(x => x.SatisfiedCount).FirstOrDefault(), //满意数
+                        RegardedAsSatisfiedCount = t1.RegardedAsSatisfiedCount + t1_t2.Select(x => x.RegardedAsSatisfiedCount).FirstOrDefault(), //视为满意
+                        DefaultSatisfiedCount = t1.DefaultSatisfiedCount + t1_t2.Select(x => x.DefaultSatisfiedCount).FirstOrDefault(), //默认满意
+                        NoSatisfiedCount = t1.NoSatisfiedCount + t1_t2.Select(x => x.NoSatisfiedCount).FirstOrDefault(), //不满意
+                        NoEvaluateCount = t1.NoEvaluateCount + t1_t2.Select(x => x.NoEvaluateCount).FirstOrDefault(), //未做评价
+                        NoPutThroughCount = t1.NoPutThroughCount + t1_t2.Select(x => x.NoPutThroughCount).FirstOrDefault(), //未接通
+                    }).ToList();
+        }
+        #endregion
+        return mainList;
     }
 
 
@@ -3737,13 +3737,13 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
     public ISugarQueryable<Order> QueryWaitedForSeat(QueryOrderWaitedDto dto)
     {
-        EOrderStatus[] handleStatuses = EnumExts.GetFields<EOrderStatus>().Select(d => (EOrderStatus)d.Key).ToArray();
-        handleStatuses = handleStatuses.WhereIF(dto.IsHandled.HasValue,
-                d => dto.IsHandled!.Value
-                    ? d is not EOrderStatus.WaitForAccept and not EOrderStatus.BackToUnAccept and not EOrderStatus.SpecialToUnAccept and not EOrderStatus.HandOverToUnAccept
-                    : d is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept or EOrderStatus.HandOverToUnAccept or EOrderStatus.Handling
-                    or EOrderStatus.Countersigning)
-            .ToArray();
+        //EOrderStatus[] handleStatuses = EnumExts.GetFields<EOrderStatus>().Select(d => (EOrderStatus)d.Key).ToArray();
+        //handleStatuses = handleStatuses.WhereIF(dto.IsHandled.HasValue,
+        //        d => dto.IsHandled!.Value
+        //            ? d is not EOrderStatus.WaitForAccept and not EOrderStatus.BackToUnAccept and not EOrderStatus.SpecialToUnAccept and not EOrderStatus.HandOverToUnAccept
+        //            : d is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept or EOrderStatus.HandOverToUnAccept or EOrderStatus.Handling
+        //            or EOrderStatus.Countersigning)
+        //    .ToArray();
 
         //var query = _orderRepository.Queryable()
         //    .Includes(d => d.WorkflowSteps.Where(step =>
@@ -3758,11 +3758,38 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         //    );
         var query = _orderRepository.Queryable();
 
-        var hasHandled = (dto.IsHandled.HasValue && dto.IsHandled.Value) || dto.TypeCode == 1 || dto.TypeCode == 2;
-        if (hasHandled)
+        switch (dto.TypeCode)
         {
-            if (dto.TypeCode == 1)
-            {
+            case 0://待办
+                query.Includes(d => d.WorkflowSteps.Where(step =>
+                            ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+                             (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                             (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+                             (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+                              && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
+                            && step.Status < EWorkflowStepStatus.Handled)
+                        .OrderByDescending(step => step.CreationTime)
+                        .Take(1)
+                        .ToList())
+                    .Where(d => d.WorkflowSteps
+                                    .Any(step =>
+                                        ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+                                         (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                                         (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+                                         (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+                                          && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
+                                        && step.Status < EWorkflowStepStatus.Handled)
+                                || (SqlFunc.IsNullOrEmpty(d.WorkflowId) 
+                                    && (SqlFunc.IsNullOrEmpty(d.SignerId) || (!SqlFunc.IsNullOrEmpty(d.SignerId) && d.SignerId == _sessionContext.UserId)))
+                    )
+                    .Where(d => d.Status <= EOrderStatus.HandOverToUnAccept
+                        || d.Status == EOrderStatus.Handling//指派给班长再指派回坐席时
+                        //|| d.Status == EOrderStatus.Countersigning//跨级派单业务如发起会签再回到坐席会签汇总时
+                        )
+                    ;
+
+                break;
+            case 1://交办: 已派单其他节点的工单,该选项卡下工单若办结就不显示
                 query.Includes(d => d.WorkflowSteps.Where(step =>
                         !string.IsNullOrEmpty(step.HandlerId)
                         && step.HandlerId == _sessionContext.UserId
@@ -3772,33 +3799,16 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                         .Any(step =>
                             !string.IsNullOrEmpty(step.HandlerId)
                             && step.HandlerId == _sessionContext.UserId
-                            && step.Status == EWorkflowStepStatus.Handled));
-            }
+                            && step.Status == EWorkflowStepStatus.Handled)
+                    && d.Status < EOrderStatus.Filed);
+                break;
+            case 2://办结: 当前登录坐席作为最初受理人已办结的工单
+                query.Where(d =>
+                    d.Status >= EOrderStatus.Filed
+                    && d.AcceptorId == _sessionContextProvider.SessionContext.RequiredUserId);
+                break;
         }
-        else
-        {
 
-            query.Includes(d => d.WorkflowSteps.Where(step =>
-                        ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
-                         (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-                         (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
-                         (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
-                          && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
-                    .OrderByDescending(step => step.CreationTime)
-                    .Take(1)
-                    .ToList())
-                .Where(d => d.WorkflowSteps
-                .Any(step =>
-                    ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
-                     (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-                     (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
-                     (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
-                      && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
-                    && step.Status < EWorkflowStepStatus.Handled)
-                || (SqlFunc.IsNullOrEmpty(d.WorkflowId) && SqlFunc.IsNullOrEmpty(d.SignerId)
-                || (!SqlFunc.IsNullOrEmpty(d.SignerId) && d.SignerId == _sessionContext.UserId))
-                );
-        }
 
         //query = query.Where(d => SqlFunc.Subqueryable<WorkflowTrace>()
         //.Where(step => step.ExternalId == d.Id &&
@@ -3812,12 +3822,12 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         //);
 
         return query
-            // 交办件:已派单其他节点的工单,该选项卡下工单若办结就不显示
-            .WhereIF(dto.TypeCode.HasValue == true && dto.TypeCode == 1, d => /*d.ProcessType == EProcessType.Jiaoban &&*/ d.Status < EOrderStatus.Filed)
-            // 办结件:当前登录坐席作为最初受理人已办结的工单
-            .WhereIF(dto.TypeCode.HasValue == true && dto.TypeCode == 2, d => d.Status >= EOrderStatus.Filed && d.AcceptorId == _sessionContextProvider.SessionContext.RequiredUserId)
+            //// 交办件:已派单其他节点的工单,该选项卡下工单若办结就不显示
+            //.WhereIF(dto.TypeCode.HasValue == true && dto.TypeCode == 1, d => /*d.ProcessType == EProcessType.Jiaoban &&*/ d.Status < EOrderStatus.Filed)
+            //// 办结件:当前登录坐席作为最初受理人已办结的工单
+            //.WhereIF(dto.TypeCode.HasValue == true && dto.TypeCode == 2, d => d.Status >= EOrderStatus.Filed && d.AcceptorId == _sessionContextProvider.SessionContext.RequiredUserId)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
-            .WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status))
+            //.WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status))
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
             .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)
@@ -3835,13 +3845,13 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent.Value)
             .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
             .Where(x => x.Status != EOrderStatus.BackToProvince)
-            .WhereIF(dto.TypeCode.HasValue == false, m => m.Status < EOrderStatus.Filed)
+            //.WhereIF(dto.TypeCode.HasValue == false, m => m.Status < EOrderStatus.Filed)
             .WhereIF(!string.IsNullOrEmpty(dto.AcceptorName), d => d.AcceptorName == dto.AcceptorName)
              //.OrderBy(d => d.Status)
-             .OrderByIF(dto.IsHandled == true, d => d.StartTime, OrderByType.Desc)
+             .OrderByIF(dto.TypeCode != 0, d => d.StartTime, OrderByType.Desc)
             //.OrderByIF(dto.IsHandled == false, d => new { IsUrgent = d.IsUrgent }, OrderByType.Desc)
             //.OrderByIF(dto.IsHandled == false, d => new { d.Status })
-            .OrderByIF(dto.IsHandled == false && string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc)
+            .OrderByIF(dto.TypeCode == 0 && string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc)
             .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
             .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //创建时间降序
             .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, d => d.StartTime, OrderByType.Asc) //受理时间升序
@@ -3897,6 +3907,15 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
         }
 
+        if (dto.QueryType is 1 || dto.QueryType is 2)
+        {
+            query.WhereIF(dto.QueryType is 1, d => d.IsForwarded == false)
+                .WhereIF(dto.QueryType is 2, d => d.IsForwarded == true)
+                .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact)
+                    .NotAny())
+                ;
+        }
+
         query.Where(d => d.Status != EOrderStatus.WaitForAccept &&
                          d.Status != EOrderStatus.BackToUnAccept &&
                          d.Status != EOrderStatus.SpecialToUnAccept &&
@@ -3906,11 +3925,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(d => SqlFunc.Subqueryable<OrderDelay>().Where(od => od.OrderId == d.Id && od.IsDeleted == false && od.DelayState == EDelayState.Examining).NotAny())
             .Where(d => SqlFunc.Subqueryable<OrderSendBackAudit>().Where(osba => osba.OrderId == d.Id && osba.IsDeleted == false && osba.State == ESendBackAuditState.Apply)
                 .NotAny())
-            .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(s => s.OrderId == d.Id && s.State == 0 && s.IsDeleted == false)
-                .WhereIF(dto.QueryType != null && (dto.QueryType == 1 || dto.QueryType == 2), s => s.SpecialType == ESpecialType.ReTransact)
-                //.WhereIF(dto.QueryType != null && dto.QueryType == 3, s =>  s.SpecialType != ESpecialType.ReTransact)
-                .NotAny())
-            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+			.Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(s => s.OrderId == d.Id && s.State == 0 && s.IsDeleted == false).NotAny())
+			.WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
             .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)

+ 5 - 1
src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenNextWorkflowHandler.cs

@@ -75,9 +75,13 @@ public class OrderScreenNextWorkflowHandler : INotificationHandler<NextStepNotif
 								//省件甄别--以省审批前一个节点整理的甄别意见为准推送省上 宜宾
 								if (_appOptions.Value.IsYiBin)
 								{
-									screenDto.Content = notification.Dto.Opinion;
+									
 									screenDto.Files = new List<Share.Dtos.File.FileDto>();
 								}
+								if (_appOptions.Value.IsLuZhou)
+								{
+									screenDto.Content = notification.Dto.Opinion;
+								}
 								//推省上
 								_capPublisher.Publish(EventNames.HotlineOrderScreenApply, new PublishScreenDto()
 								{

Файловите разлики са ограничени, защото са твърде много
+ 1 - 81
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs


+ 4 - 1
src/Hotline.Application/Systems/ISystemLogApplication.cs

@@ -10,5 +10,8 @@ namespace Hotline.Application.Systems
 	public interface ISystemLogApplication
 	{
 		Task AddLog<T>(string name, string res, T entity, HttpContext context,string crName ="");
-	}
+
+		Task<bool> HasByIpUrlAsync(string ipUrl);
+
+    }
 }

+ 7 - 2
src/Hotline.Application/Systems/SystemLogApplication.cs

@@ -11,7 +11,7 @@ using XF.Domain.Repository;
 
 namespace Hotline.Application.Systems
 {
-	public class SystemLogApplication: ISystemLogApplication, IScopeDependency
+    public class SystemLogApplication : ISystemLogApplication, IScopeDependency
 	{
 		private readonly IMapper _mapper;
 		private readonly IRepository<SystemLog> _systemLogRepository;
@@ -43,5 +43,10 @@ namespace Hotline.Application.Systems
 			if (!string.IsNullOrEmpty(crName))
 				await _systemLogRepository.Updateable().SetColumns(l => new SystemLog() { CreatorName = crName }).Where(l => l.Id == log.Id).ExecuteCommandAsync();
 		}
-	}
+
+        public async Task<bool> HasByIpUrlAsync(string ipUrl)
+        {
+			return await _systemLogRepository.Queryable().Where(x => x.IpUrl == ipUrl).AnyAsync();
+        }
+    }
 }

+ 6 - 2
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -1470,7 +1470,10 @@ namespace Hotline.Repository.SqlSugar.Orders
         public ISugarQueryable<OrgVisitDetailListResp> VisitAndOrgSatisfactionDetail(VisitAndOrgSatisfactionDetailDto dto)
         {
             bool IsCenter = _sessionContext.OrgIsCenter;
-            return _orderVisitDetailRepository.Queryable()
+            if (IsCenter == false && string.IsNullOrEmpty(dto.PickOrgCode))
+	            dto.PickOrgCode = _sessionContext.RequiredOrgId;
+
+			return _orderVisitDetailRepository.Queryable()
                 .Includes(x => x.OrderVisit, o => o.Order, d => d.CallRecord)
                 .Where(x => x.OrderVisit.VisitTime >= dto.StartTime && x.OrderVisit.VisitTime <= dto.EndTime && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
                 .WhereIF(dto.OrgCode == "001", x => x.VisitOrgCode == dto.OrgCode)
@@ -1482,7 +1485,8 @@ namespace Hotline.Repository.SqlSugar.Orders
                 //.WhereIF(IsCenter == true && dto.IsOnlyMy == null, x => x.VisitOrgCode.StartsWith(dto.OrgCode))
                 //.WhereIF(IsCenter == true , x=> x.VisitOrgCode.StartsWith(dto.OrgCode))
                 //.WhereIF(IsCenter == false, x => x.VisitOrgCode == dto.OrgCode)
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), x => x.VisitOrgCode.StartsWith(dto.OrgCode))
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && (string.IsNullOrEmpty(dto.PickOrgCode) ||  dto.OrgCode != dto.PickOrgCode), x => x.VisitOrgCode.StartsWith(dto.OrgCode))
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && (!string.IsNullOrEmpty(dto.PickOrgCode)  && dto.PickOrgCode == dto.OrgCode) ,x=>x.VisitOrgCode == dto.OrgCode)  
                 .WhereIF(dto.TypeId is 1, x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.DateValue)
                 .WhereIF(dto.TypeId is 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == dto.DateValue)
                 .WhereIF(!string.IsNullOrEmpty(dto.LineNum), x => x.OrderVisit.Order.CallRecord.Gateway == dto.LineNum)

+ 3 - 2
src/Hotline.Repository.SqlSugar/System/SystemLogRepository.cs

@@ -18,7 +18,7 @@ public class SystemLogRepository : BaseRepository<SystemLog>, ISystemLogReposito
     {
     }
 
-    public void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0)
+    public void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "")
     {
         try
         {
@@ -28,7 +28,8 @@ public class SystemLogRepository : BaseRepository<SystemLog>, ISystemLogReposito
                 ExecuteParam = executeParam,
                 ExecuteUrl = executeUrl,
                 Remark = remark,
-                Status = status
+                Status = status,
+                IpUrl = ipUrl
             };
             if (executeUrl.IsNullOrEmpty())
             {

+ 7 - 1
src/Hotline.Share/Dtos/Bi/BiOrderDto.cs

@@ -56,7 +56,13 @@ namespace Hotline.Share.Dtos.Bi
         /// 回访方式
         /// </summary>
         public EVisitType? VisitType { get; set; }
-    }
+
+        /// <summary>
+        /// 选择的部门
+        /// </summary>
+        public string? PickOrgCode { get; set; }
+
+	}
 
     public record HighFrequencyCallStatisticsRequest : PagedRequest
     {

+ 4 - 2
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -792,7 +792,7 @@ namespace Hotline.Share.Dtos.Order
                 {
                     overDays = (FiledTime - ExpiredTime).Value.Days + "天";
                 }
-                else if (ExpiredTime < DateTime.Now)
+				else if (FiledTime.HasValue == false && ExpiredTime < DateTime.Now)
                 {
                     overDays = (DateTime.Now - ExpiredTime).Value.Days + "天";
                 }
@@ -953,7 +953,9 @@ namespace Hotline.Share.Dtos.Order
         /// 工单补充
         /// </summary>
         public List<OrderComplementDto> OrderComplements { get; set; }
-    }
+
+        public bool? IsReTransact { get; set; }
+	}
 
     public class UpdateOrderDto : AddOrderDto
     {

+ 1 - 1
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1746,7 +1746,7 @@ namespace Hotline.FlowEngine.Workflows
                         }
                     }
                 };
-                if (_appOptions.Value.IsZiGong && handlers.Any())
+                if (_appOptions.Value.IsZiGong && handlers != null && handlers.Any())
                 {
                     dto.NextHandlers = handlers;
                 }

+ 6 - 6
src/Hotline/Orders/DatabaseEventHandler/OrderVisitDetailEventHandler.cs

@@ -42,26 +42,26 @@ public class OrderVisitDetailEventHandler : IUpdateDatabaseEvent<OrderVisitDetai
         {
             var orderId = _orderVisitRepository.Queryable()
                 .Where(m => m.Id == visit.VisitId)
-                .Select(m => m.OrderId)
+                .Select(m => new { m.OrderId, m.No })
                 .First();
             _orderRepository.Updateable()
                 .SetColumns(m => m.OrgProcessingResults == visit.OrgProcessingResults)
-                .Where(m => m.Id == orderId)
+                .Where(m => m.Id == orderId.OrderId)
                 .ExecuteCommand();
-            _systemLogRepository.Add(name, $"OrgProcessingResults: {visit.OrgProcessingResults.ToJson()}",status: 1);
+            _systemLogRepository.Add(name, $"OrgProcessingResults: {visit.OrgProcessingResults.ToJson()}", orderId.No, orderId.No, 1);
         }
 
         if (visit.VisitTarget == EVisitTarget.Seat && visit.SeatEvaluate != null)
         {
             var orderId = _orderVisitRepository.Queryable()
                 .Where(m => m.Id == visit.VisitId)
-                .Select(m => m.OrderId)
+                .Select(m => new { m.OrderId, m.No })
                 .First();
             _orderRepository.Updateable()
                 .SetColumns(m => m.SeatEvaluate == visit.SeatEvaluate)
-                .Where(m => m.Id == orderId)
+                .Where(m => m.Id == orderId.OrderId)
                 .ExecuteCommand();
-            _systemLogRepository.Add(name, $"SeatEvaluate: {visit.SeatEvaluate}",status: 1);
+            _systemLogRepository.Add(name, $"SeatEvaluate: {visit.SeatEvaluate}",orderId.No, orderId.No, 1);
         }
 
     }

+ 12 - 3
src/Hotline/Orders/OrderDomainService.cs

@@ -299,7 +299,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         {
             try
             {
-                if (order.Source != ESource.ProvinceStraight)
+                if (order.Source != ESource.ProvinceStraight && order.FileOrgIsCenter.Value  == false)
                 {
                     var code = "";
                     //受理类型为“投诉、举报”
@@ -584,10 +584,19 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         {
             var sendNum = steps.Count / schedulings;
             scheduling.SendOrderNum += sendNum;
-            await _schedulingRepository.Updateable()
+            if (!scheduling.LoginSendOrderNum.HasValue)
+            {
+	            scheduling.LoginSendOrderNum = scheduling.LoginSendOrderNum.HasValue && scheduling.LoginSendOrderNum > sendNum ? scheduling.LoginSendOrderNum : sendNum;
+				await _schedulingRepository.Updateable()
+					.SetColumns(s => new Scheduling() { LoginSendOrderNum = scheduling.LoginSendOrderNum })
+					.Where(s => s.SchedulingTime == scheduling.SchedulingTime).ExecuteCommandAsync(cancellationToken);
+			}
+            sendNum = scheduling.LoginSendOrderNum.Value;
+			await _schedulingRepository.Updateable()
                 .SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum, AtWork = scheduling.AtWork })
                 .Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
-            if (sendNum <= 0) return;
+		
+			if (sendNum <= 0) return;
             var sendSteps = steps.Take(sendNum).ToList();
             await _orderRepository.Updateable().SetColumns(o => new Order()
             {

+ 6 - 0
src/Hotline/Schedulings/Scheduling.cs

@@ -66,6 +66,12 @@ namespace Hotline.Schedulings
 		/// </summary>
 		public int? SendOrderNum { get; set; }
 
+
+		/// <summary>
+		/// 登录派单次数
+		/// </summary>
+		public int? LoginSendOrderNum { get; set; }
+
 		/// <summary>
 		/// 是否上班
 		/// </summary>

+ 1 - 1
src/Hotline/Settings/ISystemLogRepository.cs

@@ -18,5 +18,5 @@ public interface ISystemLogRepository : IRepository<SystemLog>
     /// <param name="remark">备注</param>
     /// <param name="status">状态(0失败 1成功)</param>
     /// <returns></returns>
-    void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0);
+    void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "");
 }

+ 5 - 0
src/Hotline/Settings/SettingConstants.cs

@@ -677,5 +677,10 @@ namespace Hotline.Settings
         /// 企业话机
         /// </summary>
         public const string EnterpriseTel = "EnterpriseTel";
+
+        /// <summary>
+        /// 启用随手拍功能
+        /// </summary>
+        public const string Snapshot = "Snapshot";
     }
 }

+ 20 - 0
src/Hotline/Statistics/StatisticsDepart.cs

@@ -216,6 +216,26 @@ namespace Hotline.Statistics
 		[SugarColumn(ColumnDescription = "入库时间")]
 		public DateTime InsertTime { get; set; }
 
+		/// <summary>
+		/// 满意
+		/// </summary>
+		/// </summary>
+		[SugarColumn(ColumnDescription = "满意")]
+		public int SatisfactionCount { get; set; }
+
+		/// <summary>
+		/// 不满意
+		/// </summary>
+		/// </summary>
+		[SugarColumn(ColumnDescription = "不满意")]
+		public int NotSatisfactionCount { get; set; }
+
+		/// <summary>
+		/// 按时办结
+		/// </summary>
+		/// </summary>
+		[SugarColumn(ColumnDescription = "按时办结")]
+		public int CompleteOnTime { get; set; }
 
 	}
 }

Някои файлове не бяха показани, защото твърде много файлове са промени