Sfoglia il codice sorgente

Merge branch 'test' into test_Guardian

田爽 1 mese fa
parent
commit
db7edfd467

+ 1 - 3
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -66,7 +66,6 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<User> _userRepository;
         private readonly ITelApplication _telApplication;
         private readonly IRepository<Quality.Quality> _qualiteyRepository;
-        private readonly IAiQualityService _aiQualityService;
         private readonly IRepository<QualityTemplate> _qualityTemplate;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly IRepository<TelActionRecord> _telActionRecordRepository;
@@ -87,7 +86,7 @@ namespace Hotline.Api.Controllers
             IUserCacheManager userCacheManager, ICapPublisher capPublisher,
             ITelRestRepository telRestRepository, IRepository<User> userRepository,
             ITelApplication telApplication, IRepository<Quality.Quality> qualiteyRepository,
-            IAiQualityService aiQualityService, IRepository<QualityTemplate> qualityTemplate,
+            IRepository<QualityTemplate> qualityTemplate,
             ISystemSettingCacheManager systemSettingCacheManager, IRepository<TelActionRecord> telActionRecordRepository,
             ISystemMobilAreaApplication systemMobilAreaApplication, IRepository<Work> workRepository, Publisher publisher, ITrCallRecordRepository callRecordRepository, ITypedCache<Work> cacheWork, IIPPbxApplication iPPbxApplication, ICallTelClient callTelClient, IRepository<TelOperation> telOperationRepository)
         {
@@ -107,7 +106,6 @@ namespace Hotline.Api.Controllers
             _userRepository = userRepository;
             _telApplication = telApplication;
             _qualiteyRepository = qualiteyRepository;
-            _aiQualityService = aiQualityService;
             _qualityTemplate = qualityTemplate;
             _systemSettingCacheManager = systemSettingCacheManager;
             _telActionRecordRepository = telActionRecordRepository;

+ 22 - 15
src/Hotline.Api/Controllers/OrderController.cs

@@ -2111,6 +2111,7 @@ public class OrderController : BaseController
     /// </summary>
     [HttpPost("delay/batch_audit")]
     [LogFilter("批量审批延期")]
+    [LogFilterAlpha("延期审核")]
     public async Task<string> BatchAuditDelay([FromBody] BatchDelayNextFlowDto dto)
     {
         var result = new StringBuilder();
@@ -5550,7 +5551,7 @@ public class OrderController : BaseController
             if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行退回!");
 
             var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
-               dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, HttpContext.RequestAborted);
+               dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles,dto.AssignStepId, HttpContext.RequestAborted);
 
             if (oneSendBack && isOrgToCenter && _appOptions.Value.IsZiGong)
             {
@@ -5597,9 +5598,9 @@ public class OrderController : BaseController
             audit.AuditUser = "默认通过";
             audit.AuditTime = DateTime.Now;
             await _orderApplication.OrderPrevious(audit, order, HttpContext.RequestAborted);
-		}
-		await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
-	}
+        }
+        await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
+    }
 
     /// <summary>
     /// 工单业务退回审批
@@ -5607,6 +5608,7 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("order_previous_audit")]
+    [LogFilterAlpha("退回审批")]
     public async Task Audit([FromBody] AuditSendBackDto dto)
     {
         if (dto.State == ESendBackAuditState.Refuse && string.IsNullOrEmpty(dto.AuditContent))
@@ -5630,8 +5632,8 @@ public class OrderController : BaseController
             if (_appOptions.Value.IsZiGong)
             {
                 var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
-                    order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
-                    HttpContext.RequestAborted);
+                    order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(), sendBack.AssignStepId,
+					HttpContext.RequestAborted);
 
                 if (prevStep.BusinessType == EBusinessType.Send)
                 {
@@ -5651,16 +5653,17 @@ public class OrderController : BaseController
         {
             await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { Status = sendBack.Status.Value })
                 .Where(o => o.Id == sendBack.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
-            
+
         }
-		await _orderSendBackAuditRepository.UpdateAsync(sendBack, HttpContext.RequestAborted);
-	}
+        await _orderSendBackAuditRepository.UpdateAsync(sendBack, HttpContext.RequestAborted);
+    }
 
     /// <summary>
     /// 工单业务批量退回审批
     /// </summary>
     /// <returns></returns>
     [HttpPost("order_previous_audit_batch")]
+    [LogFilterAlpha("退回审批批量")]
     public async Task AuditBatch([FromBody] BatchAuditSendBackDto dto)
     {
         foreach (string id in dto.Ids)
@@ -5686,8 +5689,8 @@ public class OrderController : BaseController
                 if (_appOptions.Value.IsZiGong)
                 {
                     var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
-                        order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
-                        HttpContext.RequestAborted);
+                        order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(), sendBack.AssignStepId,
+						HttpContext.RequestAborted);
                     if (prevStep.BusinessType == EBusinessType.Send)
                     {
                         // 平均派单
@@ -5708,8 +5711,8 @@ public class OrderController : BaseController
                 await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { Status = sendBack.Status.Value })
                     .Where(o => o.Id == sendBack.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
             }
-			await _orderSendBackAuditRepository.UpdateAsync(sendBack, HttpContext.RequestAborted);
-		}
+            await _orderSendBackAuditRepository.UpdateAsync(sendBack, HttpContext.RequestAborted);
+        }
     }
 
     /// <summary>
@@ -5808,7 +5811,7 @@ public class OrderController : BaseController
             throw UserFriendlyException.SameMessage("该工单未开启流程");
 
         var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
-            order.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, HttpContext.RequestAborted);
+            order.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles,string.Empty, HttpContext.RequestAborted);
         ///查询上一节点是否是领导节点
         ///ture 流程排除领导节点 排除当前节点 prevStep.BusinessType == EBusinessType.DepartmentLeader
         if (_appOptions.Value.IsYiBin && prevStep.Name.Contains("领导"))
@@ -6024,6 +6027,7 @@ public class OrderController : BaseController
     /// <returns></returns>
     [HttpPost("special")]
     [LogFilter("新增工单特提")]
+    [LogFilterAlpha("特提审核")]
     public async Task Add([FromBody] OrderSpecialAddDto dto)
     {
         var specialAny = await _orderSpecialRepository.Queryable().Where(x => x.OrderId == dto.OrderId && x.State == 0)
@@ -6526,6 +6530,7 @@ public class OrderController : BaseController
     /// <returns></returns>
     [HttpPut("special_batch")]
     [LogFilter("批量审批工单特提")]
+    [LogFilterAlpha("特提审核批量")]
     public async Task UpdateBatch([FromBody] BatchAuditOrderSpecialDto dto)
     {
         var specials = await _orderSpecialRepository.Queryable()
@@ -6640,7 +6645,7 @@ public class OrderController : BaseController
                 var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) =
                 await _orderApplication.RecallAsync(dto, special, order, HttpContext.RequestAborted);
 
-				if (string.IsNullOrEmpty(currentStep?.HandlerOrgId))
+                if (string.IsNullOrEmpty(currentStep?.HandlerOrgId))
                 {
                     special.OrgId = currentStep.HandlerOrgId;
                     special.OrgName = currentStep.HandlerOrgName;
@@ -8155,6 +8160,7 @@ public class OrderController : BaseController
     /// <returns></returns>
     [HttpPut("secondary_handling/audit")]
     [LogFilter("二次办理审批")]
+    [LogFilterAlpha("二次办理审核")]
     public async Task OrderSecondaryHandlingAudit([FromBody] AuditOrderSecondaryHandlingDto dto)
     {
         var model = await _orderSecondaryHandlingApplication.Entity(dto.Id, HttpContext.RequestAborted);
@@ -8170,6 +8176,7 @@ public class OrderController : BaseController
     /// <returns></returns>
     [HttpPut("secondary_handling/batch_audit")]
     [LogFilter("二次办理批量审批")]
+    [LogFilterAlpha("二次办理审核批量")]
     public async Task OrderSecondaryHandlingBatchAudit([FromBody] AuditOrderSecondaryHandlingDto dto)
     {
         foreach (var item in dto.Ids)

+ 106 - 0
src/Hotline.Api/Controllers/SpecialController.cs

@@ -0,0 +1,106 @@
+using MapsterMapper;
+using Microsoft.AspNetCore.Mvc;
+using XF.Domain.Authentications;
+using Hotline.Share.Dtos;
+using Hotline.Share.Tools;
+using Hotline.Application.SpecialNumber;
+using Hotline.Share.Dtos.Special;
+
+namespace Hotline.Api.Controllers
+{
+    /// <summary>
+    /// 特殊号码
+    /// </summary>
+    public class SpecialController : BaseController
+    {
+        #region 注入
+
+        private readonly IMapper _mapper;
+        private readonly ISessionContext _sessionContext;
+        private readonly ISpecialNumberApplication _specialNumberApplication;
+
+
+        public SpecialController(
+           IMapper mapper,
+           ISessionContext sessionContext,
+           ISpecialNumberApplication specialNumberApplication)
+        {
+            _mapper = mapper;
+            _sessionContext = sessionContext;
+            _specialNumberApplication = specialNumberApplication;
+        }
+
+        #endregion
+
+        #region 特殊号码
+
+        /// <summary>
+        /// 特殊号码列表
+        /// </summary>
+        /// <param name="pagedDto"></param>
+        /// <returns></returns>
+        [HttpGet("number/list")]
+        public async Task<PagedDto<SpecialNumberInfoDto>> QueryAllSpecialNumberListAsync([FromQuery] SpecialNumberDto pagedDto)
+        {
+            return (await _specialNumberApplication.QueryAllSpecialNumberListAsync(pagedDto, HttpContext.RequestAborted)).ToPaged();
+        }
+
+        /// <summary>
+        /// 特殊号码新增
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("number/add")]
+        public async Task<string> AddSpecialNumberAsync([FromBody] AddSpecialNumberDto dto)
+        {
+            return await _specialNumberApplication.AddSpecialNumberAsync(dto, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 特殊号码编辑
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPut("number/update")]
+        public async Task UpdateSpecialNumberAsync([FromBody] UpdateSpecialNumberDto dto)
+        {
+            await _specialNumberApplication.UpdateSpecialNumberAsync(dto, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 特殊号码删除
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpDelete("number/remove")]
+        public async Task RemoveSpecialNumberAsync([FromBody] DelSpecialNumberDto dto)
+        {
+            await _specialNumberApplication.RemoveSpecialNumberAsync(dto, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 特殊号码详情根据id查询
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <returns></returns>
+        [HttpGet("number/info")]
+        public async Task<SpecialNumberInfoDto> GetSpecialNumberAsync(string Id)
+        {
+            return await _specialNumberApplication.GetSpecialNumberAsync(Id, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 特殊号码详情根据号码查询
+        /// </summary>
+        /// <param name="PhoneNumber"></param>
+        /// <returns></returns>
+        [HttpGet("number/info/num")]
+        public async Task<SpecialNumberInfoDto> GetSpecialNumberByAsync(string PhoneNumber)
+        {
+            return await _specialNumberApplication.GetSpecialNumberByAsync(PhoneNumber, HttpContext.RequestAborted);
+        }
+
+        #endregion
+    }
+}
+

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

@@ -28,6 +28,7 @@ using Hotline.Settings.TimeLimits;
 using Hotline.SeedData;
 using Hotline.Tools;
 using Hotline.Share.Enums.Order;
+using Hotline.Api.Filter;
 
 namespace Hotline.Api.Controllers;
 
@@ -343,6 +344,7 @@ public class WorkflowController : BaseController
     /// </summary>
     [HttpPost("next")]
     [Obsolete("即将弃用")]
+    [LogFilterAlpha("审核开始")]
     public async Task Next([FromBody] NextWorkflowDto dto)
     {
         await _workflowDomainService.NextAsync(_sessionContext, dto, cancellationToken: HttpContext.RequestAborted);
@@ -352,6 +354,7 @@ public class WorkflowController : BaseController
     /// 退回(返回前一节点)
     /// </summary>
     [HttpPost("previous")]
+    [LogFilterAlpha("审核退回")]
     public async Task Previous([FromBody] PreviousWorkflowDto dto)
     {
         await _workflowApplication.PreviousAsync(dto, cancellationToken: HttpContext.RequestAborted);

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

@@ -19,6 +19,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Mq;
 using Hotline.Share.Tools;
 using Hotline.Users;
+using JiebaNet.Segmenter.Common;
 using Mapster;
 using MapsterMapper;
 using Microsoft.Extensions.Logging;
@@ -305,8 +306,8 @@ public abstract class DefaultCallApplication : ICallApplication
                 Title = o.Title,
                 IsVisit = !SqlFunc.IsNullOrEmpty(v.Id),
                 IsOrder = !SqlFunc.IsNullOrEmpty(o.Id),
-                StaffNo = SqlFunc.Subqueryable<CallNative>().Where(s => s.CallNo == d.CallNo && SqlFunc.IsNullOrEmpty(s.CallNo) == false && s.CallNo != "0").Select(s => s.StaffNo),
-                TelNo = SqlFunc.Subqueryable<CallNative>().Where(s => s.CallNo == d.TelNo && SqlFunc.IsNullOrEmpty(s.TelNo) == false && s.TelNo != "0").Select(s => s.TelNo),
+                StaffNo = SqlFunc.IsNull(SqlFunc.Subqueryable<CallNative>().Where(s => s.CallNo == d.CallNo && SqlFunc.IsNullOrEmpty(s.CallNo) == false && s.CallNo != "0").Select(s => s.StaffNo), "0"),
+                TelNo = SqlFunc.IsNull(SqlFunc.Subqueryable<CallNative>().Where(s => s.CallNo == d.TelNo && SqlFunc.IsNullOrEmpty(s.TelNo) == false && s.TelNo != "0").Select(s => s.TelNo), "0"),
             }, true);
         }
         return query.Select((d, o, v) => new CallNativeDto

+ 2 - 2
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -118,8 +118,8 @@ namespace Hotline.Application.FlowEngine
         /// 检查退回节点信息
         /// </summary>
         Task<(WorkflowStep currentStep, WorkflowStep prevStep,List<WorkflowStep> steps, bool isOrgToCenter, bool isSecondToFirstOrgLevel)>
-            GetPreviousInformationAsync(string workflowId, string operatorId, string operatorOrgId, string[] roles,
-                CancellationToken cancellationToken);
+            GetPreviousInformationAsync(string workflowId, string operatorId, string operatorOrgId, string[] roles, string? assignStepId,
+				CancellationToken cancellationToken);
 
         /// <summary>
         /// 更新省平台办理结果节点附件

+ 6 - 2
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -1870,12 +1870,16 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// 检查退回节点信息
     /// </summary>
     public async Task<(WorkflowStep currentStep, WorkflowStep prevStep, List<WorkflowStep> steps, bool isOrgToCenter, bool isSecondToFirstOrgLevel)>
-        GetPreviousInformationAsync(string workflowId, string operatorId, string operatorOrgId, string[] roles,
-            CancellationToken cancellationToken)
+        GetPreviousInformationAsync(string workflowId, string operatorId, string operatorOrgId, string[] roles,string? assignStepId,
+			CancellationToken cancellationToken)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withSteps: true,
             withCountersigns: true, cancellationToken: cancellationToken);
         var (currentStep, prevStep, _) = _workflowDomainService.GetPreviousStep(workflow, operatorId, operatorOrgId, roles);
+        if (!string.IsNullOrEmpty(assignStepId))
+        {
+			prevStep = workflow.Steps.FirstOrDefault(d => d.Id == assignStepId);
+		}
         var isOrgToCenter = currentStep.BusinessType is EBusinessType.Department &&
                             prevStep.BusinessType is EBusinessType.Seat or EBusinessType.Send;
         var isSecondToFirstOrgLevel = currentStep.HandlerType is EHandlerType.OrgLevel &&

+ 174 - 172
src/Hotline.Application/Orders/OrderApplication.cs

@@ -111,9 +111,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly IRepository<KnowledgeQuote> _knowledgeQuoteRepository;
     private readonly IRepository<OrderSpecial> _orderSpecialRepository;
     private readonly IWorkflowApplication _workflowApplication;
-	private readonly ICircularRecordDomainService _circularRecordDomainService;
+    private readonly ICircularRecordDomainService _circularRecordDomainService;
 
-	public OrderApplication(
+    public OrderApplication(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -158,7 +158,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         IRepository<KnowledgeQuote> knowledgeQuoteRepository,
         IRepository<OrderSpecial> orderSpecialRepository,
         IWorkflowApplication workflowApplication,
-		ICircularRecordDomainService circularRecordDomainService)
+        ICircularRecordDomainService circularRecordDomainService)
     {
         _orderDomainService = orderDomainService;
         _workflowDomainService = workflowDomainService;
@@ -205,7 +205,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _orderSpecialRepository = orderSpecialRepository;
         _workflowApplication = workflowApplication;
         _circularRecordDomainService = circularRecordDomainService;
-	}
+    }
 
     /// <summary>
     /// 更新工单办理期满时间(延期调用,其他不调用)
@@ -380,9 +380,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门
             .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.CurrentStepCode == dto.CurrentStepCode) //当前办理节点
             .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
-            //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
-            //.Where(d => d.ExpiredTime != null &&
-            //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
+                                                                                                                       //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
+                                                                                                                       //.Where(d => d.ExpiredTime != null &&
+                                                                                                                       //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
             .Where(d => d.Status < EOrderStatus.Filed && dateTime > d.NearlyExpiredTime && dateTime < d.ExpiredTime)
             .OrderByIF(dto is { SortField: "no", SortRule: 0 }, x => x.No, OrderByType.Asc) //工单编号升序
             .OrderByIF(dto is { SortField: "no", SortRule: 1 }, x => x.No, OrderByType.Desc) //工单编号降序
@@ -776,10 +776,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
             .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
             .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
-            //.WhereIF(!string.IsNullOrEmpty(dto.PubMan),
-            //    d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
-            //.WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
-            //.WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
+                                                                                              //.WhereIF(!string.IsNullOrEmpty(dto.PubMan),
+                                                                                              //    d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
+                                                                                              //.WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
+                                                                                              //.WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
             .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.IsProvince == true)
             .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.IsProvince == false)
             //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
@@ -906,16 +906,16 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
 
         var res = (from t1 in items
-            join t2 in orders on t1.Name equals t2.Name into t1_t2
-            from item in t1_t2.DefaultIfEmpty()
-            select new PublishedOrderStatisticsDto
-            {
-                Name = t1.Name,
-                PublishTime = t1.PublishTime,
-                WaitCount = t1_t2.Select(x => x.WaitCount).FirstOrDefault(),
-                PublicCount = t1.PublicCount,
-                PrivateCount = t1.PrivateCount
-            }).ToList();
+                   join t2 in orders on t1.Name equals t2.Name into t1_t2
+                   from item in t1_t2.DefaultIfEmpty()
+                   select new PublishedOrderStatisticsDto
+                   {
+                       Name = t1.Name,
+                       PublishTime = t1.PublishTime,
+                       WaitCount = t1_t2.Select(x => x.WaitCount).FirstOrDefault(),
+                       PublicCount = t1.PublicCount,
+                       PrivateCount = t1.PrivateCount
+                   }).ToList();
 
         return (total, res);
     }
@@ -965,16 +965,16 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
 
         var res = (from t1 in items
-            join t2 in orders on t1.Name equals t2.Name into t1_t2
-            from item in t1_t2.DefaultIfEmpty()
-            select new PublishedOrderStatisticsDto
-            {
-                Name = t1.Name,
-                PublishTime = t1.PublishTime,
-                WaitCount = t1_t2.Select(x => x.WaitCount).FirstOrDefault(),
-                PublicCount = t1.PublicCount,
-                PrivateCount = t1.PrivateCount
-            }).ToList();
+                   join t2 in orders on t1.Name equals t2.Name into t1_t2
+                   from item in t1_t2.DefaultIfEmpty()
+                   select new PublishedOrderStatisticsDto
+                   {
+                       Name = t1.Name,
+                       PublishTime = t1.PublishTime,
+                       WaitCount = t1_t2.Select(x => x.WaitCount).FirstOrDefault(),
+                       PublicCount = t1.PublicCount,
+                       PrivateCount = t1.PrivateCount
+                   }).ToList();
 
         return (total, res);
     }
@@ -1487,15 +1487,15 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .WhereIF(dto.IsReTransact.HasValue && dto.IsReTransact.Value == false, d => d.ReTransactNum == null || d.ReTransactNum == 0)
                 .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No)) //工单编码
                 .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
-                //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
+                                                                                                         //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
                 .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
                 //.WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
                 //.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
                 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
                 .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone == dto.TransferPhone!) //转接号码
-                //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
-                //.WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
-                //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
+                                                                                                               //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
+                                                                                                               //.WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
+                                                                                                               //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
                 .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
                 .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
@@ -1503,16 +1503,16 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
                 .WhereIF(dto.StartTimeStart.HasValue, d => d.StartTime >= dto.StartTimeStart) //流程开启时间开始
                 .WhereIF(dto.StartTimeEnd.HasValue, d => d.StartTime <= dto.StartTimeEnd) //流程开启时间结束
-                //.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))  //紧急程度
+                                                                                          //.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))  //紧急程度
                 .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone.Contains(dto.FromPhone)) //来电号码
                 .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Contact.Contains(dto.PhoneNo)) //联系电话
-                //.WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
+                                                                                                   //.WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
                 .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), x => x.OrderPushTypes.Any(opt => opt.PushTypeCode == dto.PushTypeCode)) //推送分类
                 .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
                 .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
-                //.WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status))  //工单状态
+                                                                                                //.WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status))  //工单状态
                 .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status) //工单状态
-                //.WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
+                                                                           //.WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
                 .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.ActualHandlerName == dto.ActualHandlerName) //接办人
                 .WhereIF(dto.IsScreen == true, d => d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //有甄别
                 .WhereIF(dto.IsScreen == false, d => !d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //无甄别
@@ -1527,8 +1527,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                          (d.ExpiredTime > d.FiledTime && d.Status >= EOrderStatus.Filed)) //否 超期
                 .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
                 .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName == dto.FromName) //来电人姓名
-                //.WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
-                //.WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)//区域
+                                                                                               //.WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
+                                                                                               //.WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)//区域
                 .WhereIF(!string.IsNullOrEmpty(dto.AreaCode) && dto.AreaCode.LastIndexOf("00") > 0,
                     d => d.AreaCode.StartsWith(SqlFunc.Substring(dto.AreaCode, 0, 4)))
                 .WhereIF(!string.IsNullOrEmpty(dto.AreaCode) && dto.AreaCode.LastIndexOf("00") <= 0, d => d.AreaCode.StartsWith(dto.AreaCode))
@@ -1544,14 +1544,14 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     d.SourceChannelCode == "SZMHD" && d.IsProvince == true) //政民互动
                 .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "3", d => d.Source == ESource.ProvinceStraight &&
                     d.SourceChannelCode == "S12345" && d.IsProvince == true) //省12345
-                //.WhereIF(!string.IsNullOrEmpty(dto.ContentRetrieval),d => d.Title.Contains(dto.ContentRetrieval) || d.Content.Contains(dto.ContentRetrieval) || d.FileOpinion.Contains(dto.ContentRetrieval) || d.ActualOpinion.Contains(dto.ContentRetrieval))
+                                                                             //.WhereIF(!string.IsNullOrEmpty(dto.ContentRetrieval),d => d.Title.Contains(dto.ContentRetrieval) || d.Content.Contains(dto.ContentRetrieval) || d.FileOpinion.Contains(dto.ContentRetrieval) || d.ActualOpinion.Contains(dto.ContentRetrieval))
                 .WhereIF(!string.IsNullOrEmpty(dto.ContentRetrieval), d => d.Content.Contains(dto.ContentRetrieval!))
                 .WhereIF(!string.IsNullOrEmpty(dto.FileOption), d => d.FileOpinion.Contains(dto.FileOption!))
                 .WhereIF(dto.IsSgin.HasValue && dto.IsSgin == true, d => d.CurrentStepAcceptTime != null)
                 .WhereIF(dto.IsSgin.HasValue && dto.IsSgin == false, d => d.CurrentStepAcceptTime == null)
                 .WhereIF(dto.FiledType is FiledType.CenterFiled, d => d.FileOrgIsCenter == true) //d => d.ProcessType == EProcessType.Zhiban
                 .WhereIF(dto.FiledType is FiledType.OrgFiled, d => d.FileOrgIsCenter == false) //d => d.ProcessType == EProcessType.Jiaoban
-                //.WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTagCode == dto.OrderTagCode)// 工单标签
+                                                                                               //.WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTagCode == dto.OrderTagCode)// 工单标签
                 .WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTags.Any(ot => ot.DicDataValue == dto.OrderTagCode)) //工单标签
                 .WhereIF(!string.IsNullOrEmpty(dto.FocusOnEvents),
                     d => d.FocusOnEvents.Contains(dto
@@ -1969,9 +1969,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (IsCenter && list != null)
         {
             data = await list.GroupBy(x => new
-                {
-                    VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
-                })
+            {
+                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")),
@@ -2028,9 +2028,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         else
         {
             data = await list.GroupBy(x => new
-                {
-                    VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr))
-                })
+            {
+                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)),
@@ -2097,20 +2097,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             if (IsCenter)
             {
                 oldData = await query.GroupBy((x, so) => new
-                    {
-                        VisitOrgCode = so.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
-                    }).Select((x, so) => new VisitAndOrgSatisfactionStatisticsDto()
-                    {
-                        OrgCode = so.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
-                        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), //未接通
-                    })
+                {
+                    VisitOrgCode = so.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+                }).Select((x, so) => new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgCode = so.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                    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)
                     .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
@@ -2133,20 +2133,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             else
             {
                 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), //未接通
-                    })
+                {
+                    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 == orgLevel || o.Level == (orgLevel + 1)))
                     .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
                     {
@@ -2166,22 +2166,22 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             }
 
             data = (from t1 in data
-                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();
+                    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
@@ -2294,20 +2294,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .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), //未接通
-                })
+            {
+                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()
                 {
@@ -2325,22 +2325,22 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 })
                 .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();
+                        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
@@ -2666,10 +2666,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (IsCenter && list != null)
         {
             data = await list.GroupBy((x, h) => new
-                {
-                    HotspotName = h.HotSpotName,
-                    HotspotId = h.Id
-                })
+            {
+                HotspotName = h.HotSpotName,
+                HotspotId = h.Id
+            })
                 .Select((x, h) => new VisitAndHotspotSatisfactionStatisticsDto()
                 {
                     HotspotName = h.HotSpotName,
@@ -2704,10 +2704,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         else
         {
             data = await list.GroupBy((x, h) => new
-                {
-                    HotspotName = h.HotSpotName,
-                    HotspotId = h.Id
-                })
+            {
+                HotspotName = h.HotSpotName,
+                HotspotId = h.Id
+            })
                 .Select((x, h) => new VisitAndHotspotSatisfactionStatisticsDto()
                 {
                     HotspotName = h.HotSpotName,
@@ -2769,21 +2769,21 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .ToListAsync();
 
             data = (from t1 in data
-                join t2 in oldList on t1.HotspotId equals t2.HotspotId into t1_t2
-                from item in t1_t2.DefaultIfEmpty()
-                select new VisitAndHotspotSatisfactionStatisticsDto()
-                {
-                    HotspotName = t1.HotspotName,
-                    HotspotId = t1.HotspotId,
-                    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();
+                    join t2 in oldList on t1.HotspotId equals t2.HotspotId into t1_t2
+                    from item in t1_t2.DefaultIfEmpty()
+                    select new VisitAndHotspotSatisfactionStatisticsDto()
+                    {
+                        HotspotName = t1.HotspotName,
+                        HotspotId = t1.HotspotId,
+                        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();
         }
 
         return data;
@@ -3228,7 +3228,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Includes(x => x.OrderScreens)
             .Where(x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true) ||
                         x.OrderScreens.Any() == false
-                //|| x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false
+            //|| x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false
             )
             .Where(x => x.OrderVisit.Order.ReceiveProvinceNo.StartsWith("ZGZFW") == false ||
                         string.IsNullOrEmpty(x.OrderVisit.Order.ReceiveProvinceNo))
@@ -4443,20 +4443,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             }).ToListAsync();
 
         var res = (from t1 in items
-            join t2 in items2 on t1.UserId equals t2.UserId into t1_t2
-            from item in t1_t2.DefaultIfEmpty()
-            select new SendOrderReportOutDto
-            {
-                UserId = t1.UserId,
-                UserName = t1.UserName,
-                SendOrderNum = t1.SendOrderNum,
-                NoSendOrderNum = t1.NoSendOrderNum,
-                ReSendOrderNum = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault(),
-                ChainRate = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault() > 0
-                    ? ((double.Parse(t1.SendOrderNum.ToString()) - double.Parse(t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault().ToString())) /
-                        double.Parse(t1.SendOrderNum.ToString()) * 100).ToString("F2") + "%"
-                    : "100.00%",
-            }).ToList();
+                   join t2 in items2 on t1.UserId equals t2.UserId into t1_t2
+                   from item in t1_t2.DefaultIfEmpty()
+                   select new SendOrderReportOutDto
+                   {
+                       UserId = t1.UserId,
+                       UserName = t1.UserName,
+                       SendOrderNum = t1.SendOrderNum,
+                       NoSendOrderNum = t1.NoSendOrderNum,
+                       ReSendOrderNum = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault(),
+                       ChainRate = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault() > 0
+                           ? ((double.Parse(t1.SendOrderNum.ToString()) - double.Parse(t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault().ToString())) /
+                               double.Parse(t1.SendOrderNum.ToString()) * 100).ToString("F2") + "%"
+                           : "100.00%",
+                   }).ToList();
         return res;
     }
 
@@ -4609,7 +4609,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     )
                     .Where(d => d.Status <= EOrderStatus.HandOverToUnAccept
                                 || d.Status == EOrderStatus.Handling //指派给班长再指派回坐席时
-                        //|| d.Status == EOrderStatus.Countersigning//跨级派单业务如发起会签再回到坐席会签汇总时
+                                                                     //|| d.Status == EOrderStatus.Countersigning//跨级派单业务如发起会签再回到坐席会签汇总时
                     )
                     ;
 
@@ -4799,7 +4799,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status) //工单状态
             .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.CurrentStepCode == dto.CurrentStepCode) //当前办理节点
             .WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTags.Any(ot => ot.DicDataValue == dto.OrderTagCode)) //工单标签
-            //.OrderByDescending(d => d.IsUrgent)
+                                                                                                                               //.OrderByDescending(d => d.IsUrgent)
             .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.IsUrgent, OrderByType.Desc)
             .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.StartTime, OrderByType.Desc)
             .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
@@ -5020,7 +5020,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     public ISugarQueryable<ExtendedSendBackVo> ExtendedSendBackStatistics(PagedKeywordRequest dto)
     {
         var query = _orderSendBackAuditRepository.Queryable()
-            .Where(x => x.ApplyOrgId.Length == 6)
+            .Where(x => x.ApplyOrgId.Length == 6 && x.CreationTime > x.OrderExpiredTime)
+            .WhereIF(!_sessionContext.OrgIsCenter, x=>x.ApplyOrgId == _sessionContext.OrgId)
             .WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue, x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
             .GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName })
             .Select(x => new ExtendedSendBackVo()
@@ -5045,11 +5046,11 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     {
         var query = _orderSendBackAuditRepository.Queryable()
                 .Includes(x => x.Order)
-                .Where(x => x.ApplyOrgId.Length == 6)
+                .Where(x => x.ApplyOrgId.Length == 6 && x.CreationTime > x.OrderExpiredTime)
                 .WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue, x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
                 .WhereIF(!_sessionContext.OrgIsCenter, x => x.ApplyOrgId == _sessionContext.RequiredOrgId)
                 .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Order.No.Contains(dto.No!))
-                .WhereIF(!string.IsNullOrEmpty(dto.Titel), x => x.Order.Title.Contains(dto.Titel!))
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title!))
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgId), x => x.ApplyOrgId == dto.OrgId)
                 .WhereIF(dto.Type is ExtendedSendBackType.PassNum, x => x.State == ESendBackAuditState.End)
                 .WhereIF(dto.Type is ExtendedSendBackType.NoPassNum, x => x.State == ESendBackAuditState.Refuse)
@@ -5184,11 +5185,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                         var validator = new StepAssignInfoValidator();
                         await validator.ValidateAndThrowAsync(stepAssignInfo);
                         newStep.Assign(stepAssignInfo);
-
-                        if (sendBack.AssignStepId != prevStep1.Id) handleMode = EHandleMode.PreviousNoDisplay;
                     },
                     cancellationToken);
 
+            if (sendBack.AssignStepId != prevStep.Id) handleMode = EHandleMode.PreviousNoDisplay;
             startStep ??= currentStep;
             userId = prevStep.HandlerId;
             orgId = prevStep.HandlerOrgId;
@@ -5217,10 +5217,12 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (prevStep.BusinessType == EBusinessType.Send)
         {
             await _orderRepository.Updateable().SetColumns(o => new Order()
-                {
-                    CenterToOrgHandlerId = newStep.HandlerId, CenterToOrgHandlerName = newStep.HandlerName, ProcessType = processType,
-                    SendBackNum = order.SendBackNum
-                })
+            {
+                CenterToOrgHandlerId = newStep.HandlerId,
+                CenterToOrgHandlerName = newStep.HandlerName,
+                ProcessType = processType,
+                SendBackNum = order.SendBackNum
+            })
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
         }
         else

+ 54 - 0
src/Hotline.Application/SpecialNumber/ISpecialNumberApplication.cs

@@ -0,0 +1,54 @@
+using Hotline.Share.Dtos.Special;
+
+namespace Hotline.Application.SpecialNumber
+{
+    public interface ISpecialNumberApplication
+    {
+        #region 特殊号码
+
+        /// <summary>
+        /// 特殊号码 - 列表
+        /// </summary>
+        /// <param name="pagedDto"></param>
+        /// <returns></returns>
+        Task<(int, IList<SpecialNumberInfoDto>)> QueryAllSpecialNumberListAsync(SpecialNumberDto pagedDto, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 特殊号码 - 新增
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        Task<string> AddSpecialNumberAsync(AddSpecialNumberDto dto, CancellationToken cancellationToken);
+
+        /// <summary>
+        ///特殊号码 - 编辑
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task UpdateSpecialNumberAsync(UpdateSpecialNumberDto dto, CancellationToken cancellationToken);
+
+        /// <summary>
+        ///特殊号码 - 删除
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task RemoveSpecialNumberAsync(DelSpecialNumberDto dto, CancellationToken cancellationToken);
+
+        /// <summary>
+        ///特殊号码 - 详情
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <returns></returns>
+        Task<SpecialNumberInfoDto> GetSpecialNumberAsync(string Id, CancellationToken cancellationToken);
+
+        /// <summary>
+        ///特殊号码 - 详情
+        /// </summary>
+        /// <param name="PhoneNumber"></param>
+        /// <returns></returns>
+        Task<SpecialNumberInfoDto> GetSpecialNumberByAsync(string PhoneNumber, CancellationToken cancellationToken);
+
+        #endregion
+    }
+}

+ 169 - 0
src/Hotline.Application/SpecialNumber/SpecialNumberApplication.cs

@@ -0,0 +1,169 @@
+using MapsterMapper;
+using SqlSugar;
+using XF.Domain.Authentications;
+using XF.Domain.Dependency;
+using XF.Domain.Exceptions;
+using XF.Domain.Repository;
+using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Share.Dtos.Special;
+
+namespace Hotline.Application.SpecialNumber
+{
+    public class SpecialNumberApplication : ISpecialNumberApplication, IScopeDependency
+    {
+        #region 注册
+
+        private readonly IRepository<Hotline.Special.SpecialNumber> _specialNumberRepository;
+        private readonly ISessionContext _sessionContext;
+        private readonly IMapper _mapper;
+
+        public SpecialNumberApplication(
+            IRepository<Hotline.Special.SpecialNumber> specialNumberRepository,
+            ISessionContext sessionContext,
+            IMapper mapper)
+        {
+            _specialNumberRepository = specialNumberRepository;
+            _sessionContext = sessionContext;
+            _mapper = mapper;
+        }
+
+        #endregion
+
+        #region 特殊号码
+
+        #region 特殊号码 - 列表
+
+        /// <summary>
+        /// 特殊号码 - 列表
+        /// </summary>
+        /// <param name="pagedDto"></param>
+        /// <returns></returns>
+        public async Task<(int, IList<SpecialNumberInfoDto>)> QueryAllSpecialNumberListAsync(SpecialNumberDto dto, CancellationToken cancellationToken)
+        {
+            var typeSpliceName = string.Empty;
+
+            //单表分页
+            var (total, temp) = await _specialNumberRepository.Queryable()
+
+                .WhereIF(!string.IsNullOrEmpty(dto.PhoneNumber), x => x.PhoneNumber.Contains(dto.PhoneNumber))
+                .WhereIF(!string.IsNullOrEmpty(dto.Notes), x => x.Notes.Contains(dto.Notes))
+                .WhereIF(dto.CreationTimeStart.HasValue, x => x.CreationTime >= dto.CreationTimeStart)
+                .WhereIF(dto.CreationTimeEnd.HasValue, x => x.CreationTime <= dto.CreationTimeEnd)
+                .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, x => x.CreationTime, OrderByType.Asc)  //创建时间升序
+                .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, x => x.CreationTime, OrderByType.Desc) //创建时间降序
+                .ToPagedListAsync(dto.PageIndex, dto.PageSize, cancellationToken);
+            return (total, _mapper.Map<IList<SpecialNumberInfoDto>>(temp));
+            //return (total, temp);
+        }
+
+        #endregion
+
+        #region 特殊号码 - 新增
+
+        /// <summary>
+        /// 新增
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<string> AddSpecialNumberAsync(AddSpecialNumberDto dto, CancellationToken cancellationToken)
+        {
+            var data = _mapper.Map<Hotline.Special.SpecialNumber>(dto);
+
+            var any = await _specialNumberRepository.Queryable().Where(x => x.PhoneNumber == dto.PhoneNumber).AnyAsync();
+            if (any)
+                throw UserFriendlyException.SameMessage("特殊号码已存在!");
+
+            data.InitId();
+
+            return await _specialNumberRepository.AddAsync(data, cancellationToken);
+        }
+
+        #endregion
+
+        #region 特殊号码 - 修改
+
+        /// <summary>
+        /// 修改
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task UpdateSpecialNumberAsync(UpdateSpecialNumberDto dto, CancellationToken cancellationToken)
+        {
+            var data = await _specialNumberRepository.GetAsync(dto.Id);
+
+            if (data == null)
+                throw UserFriendlyException.SameMessage("特殊号码查询失败");
+
+            var any = await _specialNumberRepository.Queryable().Where(x => x.PhoneNumber == dto.PhoneNumber && x.Id != dto.Id).AnyAsync();
+            if (any)
+                throw UserFriendlyException.SameMessage("特殊号码已存在!");
+
+            data.PhoneNumber = dto.PhoneNumber;
+            data.Notes = dto.Notes;
+
+            await _specialNumberRepository.UpdateAsync(data, cancellationToken);
+        }
+
+        #endregion
+
+        #region 特殊号码 - 删除
+
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task RemoveSpecialNumberAsync(DelSpecialNumberDto dto, CancellationToken cancellationToken)
+        {
+            var data = await _specialNumberRepository.GetAsync(dto.Id);
+
+            if (data == null)
+                throw UserFriendlyException.SameMessage("特殊号码查询失败");
+
+            await _specialNumberRepository.RemoveAsync(data, false, cancellationToken);
+        }
+
+        #endregion
+
+        #region 特殊号码 - 详情
+
+        /// <summary>
+        /// 详情
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <returns></returns>
+        public async Task<SpecialNumberInfoDto> GetSpecialNumberAsync(string Id, CancellationToken cancellationToken)
+        {
+            var data = await _specialNumberRepository.Queryable()
+                .Where(x => x.Id == Id).FirstAsync();
+            if (data == null)
+                throw UserFriendlyException.SameMessage("特殊号码查询失败");
+            return _mapper.Map<SpecialNumberInfoDto>(data);
+        }
+
+        #endregion
+
+        #region 特殊号码 - 详情
+
+        /// <summary>
+        /// 详情
+        /// </summary>
+        /// <param name="PhoneNumber"></param>
+        /// <returns></returns>
+        public async Task<SpecialNumberInfoDto> GetSpecialNumberByAsync(string PhoneNumber, CancellationToken cancellationToken)
+        {
+            var data = await _specialNumberRepository.Queryable()
+                .Where(x => x.PhoneNumber == PhoneNumber).FirstAsync();
+            if (data == null)
+                throw UserFriendlyException.SameMessage("特殊号码查询失败");
+            return _mapper.Map<SpecialNumberInfoDto>(data);
+        }
+
+        #endregion
+
+        #endregion
+    }
+}

+ 87 - 0
src/Hotline.Share/Dtos/Special/SpecialNumberDto.cs

@@ -0,0 +1,87 @@
+using Hotline.Share.Requests;
+
+namespace Hotline.Share.Dtos.Special
+{
+    public record AddSpecialNumberDto
+    {
+        /// <summary>
+        /// 电话号码
+        /// </summary>
+        public string PhoneNumber { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string? Notes { get; set; }
+    }
+
+    public record UpdateSpecialNumberDto : AddSpecialNumberDto
+    {
+        /// <summary>
+        /// 案例库ID
+        /// </summary>
+        public string Id { get; set; }
+    }
+
+    public record DelSpecialNumberDto
+    {
+        public string Id { get; set; }
+    }
+
+    public record SpecialNumberDto : PagedRequest
+    {
+        /// <summary>
+        /// 电话号码
+        /// </summary>
+        public string PhoneNumber { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+
+        public string? Notes { get; set; }
+
+        /// <summary>
+        /// 创建开始时间
+        /// </summary>
+        public DateTime? CreationTimeStart { get; set; }
+
+        /// <summary>
+        /// 创建结束时间
+        /// </summary>
+        public DateTime? CreationTimeEnd { get; set; }
+
+        /// <summary>
+        /// 排序字段
+        /// </summary>
+        public string? SortField { get; set; } = "creationTime";
+
+        /// <summary>
+        /// 排序方式 // 0 升序 1 降序
+        /// </summary>
+        public int? SortRule { get; set; } = 0;
+    }
+
+    public record SpecialNumberInfoDto
+    {
+        /// <summary>
+        /// 特殊电话ID
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 电话号码
+        /// </summary>
+        public string PhoneNumber { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string? Notes { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime? CreationTime { get; set; }
+    }
+}

+ 1 - 1
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -1543,7 +1543,7 @@ public record ExtendedSendBackRequest : PagedKeywordRequest
 {
     public string? No { get; set; }
 
-    public string? Titel { get; set; }
+    public string? Title { get; set; }
 
     public string? OrgId { get; set; }
 

+ 22 - 0
src/Hotline/Special/SpecialNumber.cs

@@ -0,0 +1,22 @@
+using SqlSugar;
+using System.ComponentModel;
+using XF.Domain.Repository;
+
+namespace Hotline.Special
+{
+    [Description("特殊号码管理")]
+    public class SpecialNumber : CreationEntity
+    {
+        /// <summary>
+        /// 电话号码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "电话号码")]
+        public string PhoneNumber { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        [SugarColumn(ColumnDescription = "备注")]
+        public string? Notes { get; set; }
+    }
+}