瀏覽代碼

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

tangjiang 1 周之前
父節點
當前提交
bd8d3a1a84
共有 34 個文件被更改,包括 1963 次插入977 次删除
  1. 52 53
      src/Hotline.Api/Controllers/JudicialManagementOrdersController.cs
  2. 359 246
      src/Hotline.Api/Controllers/OrderController.cs
  3. 78 41
      src/Hotline.Api/Controllers/QualityController.cs
  4. 1 1
      src/Hotline.Api/Controllers/Snapshot/SnapshotController.cs
  5. 43 5
      src/Hotline.Api/Controllers/TestController.cs
  6. 14 14
      src/Hotline.Api/StartupHelper.cs
  7. 8 4
      src/Hotline.Application/CallCenter/DefaultCallApplication.cs
  8. 5 2
      src/Hotline.Application/JudicialManagement/EnforcementApplication.cs
  9. 122 102
      src/Hotline.Application/OrderApp/OrderApplication.cs
  10. 14 6
      src/Hotline.Application/OrderApp/OrderSecondaryHandlingApplication.cs
  11. 23 12
      src/Hotline.Application/OrderApp/OrderSendBackAuditApplication.cs
  12. 2 1
      src/Hotline.Application/Snapshot/BiSnapshotApplication.cs
  13. 1 1
      src/Hotline.Application/Snapshot/Contracts/ISnapshotApplication.cs
  14. 63 14
      src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs
  15. 17 8
      src/Hotline.Application/Snapshot/SnapshotOrderApplication.cs
  16. 2 2
      src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs
  17. 16 0
      src/Hotline.Share/Dtos/JudicialManagement/EnforcementOrderListDto.cs
  18. 36 1
      src/Hotline.Share/Dtos/JudicialManagement/JudicialManagementAddOrderDto.cs
  19. 155 90
      src/Hotline.Share/Dtos/Order/OrderFinalityDto.cs
  20. 36 1
      src/Hotline.Share/Dtos/Order/OrderSecondaryHandlingDto.cs
  21. 305 25
      src/Hotline.Share/Dtos/Order/QueryOrderDto.cs
  22. 261 200
      src/Hotline.Share/Dtos/Order/SendBackDto.cs
  23. 54 1
      src/Hotline.Share/Dtos/Quality/QualityDto.cs
  24. 167 134
      src/Hotline.Share/Dtos/Quality/QualityItemDto.cs
  25. 23 1
      src/Hotline.Share/Dtos/Quality/QualityTemplateDto.cs
  26. 0 1
      src/Hotline.Share/Dtos/Snapshot/PointsDto.cs
  27. 2 2
      src/Hotline.Share/Enums/Order/ECaseType.cs
  28. 8 0
      src/Hotline/Caching/Services/SystemSettingCacheManager.cs
  29. 75 0
      src/Hotline/Tools/LocationConverter.cs
  30. 1 1
      src/TianQue.Sdk/TQHttpClient.cs
  31. 5 3
      test/Hotline.Tests/Application/DefaultCallApplicationTest.cs
  32. 1 0
      test/Hotline.Tests/Application/PointsRecordApplicationTest.cs
  33. 12 3
      test/Hotline.Tests/Application/SnapshotApplicationTest.cs
  34. 2 2
      test/Hotline.Tests/Domain/PushDomainServiceTest.cs

+ 52 - 53
src/Hotline.Api/Controllers/JudicialManagementOrdersController.cs

@@ -38,7 +38,6 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<EnforcementOrdersHandler> _enforcementOrdersHandlerRepository;
         private readonly IEnforcementApplication _enforcementApplication;
         private readonly IRepository<Order> _orderRepository;
-        private readonly IRepository<LawEnforcementAgencies> _lawEnforcementAgenciesRepository;
 
         /// <summary>
         /// 
@@ -86,7 +85,6 @@ namespace Hotline.Api.Controllers
             _enforcementOrdersHandlerRepository = enforcementOrdersHandlerRepository;
             _enforcementApplication = enforcementApplication;
             _orderRepository = orderRepository;
-            _lawEnforcementAgenciesRepository = lawEnforcementAgenciesRepository;
         }
 
         /// <summary>
@@ -106,12 +104,12 @@ namespace Hotline.Api.Controllers
             await _judicialManagementOrdersService.AddAsync(order, true, HttpContext.RequestAborted);
 
             //处理执法部门
-            if (dto.LawEnforcementAgencies != null && dto.LawEnforcementAgencies.Any())
+            if (dto.EnforcementOrdersHandler != null && dto.EnforcementOrdersHandler.Any())
             {
-                List<LawEnforcementAgencies> lawEnforcementAgencies = new();
-                foreach (var item in dto.LawEnforcementAgencies)
+                List<EnforcementOrdersHandler> enforcementOrdersHandlers = new();
+                foreach (var item in dto.EnforcementOrdersHandler)
                 {
-                    lawEnforcementAgencies.Add(new LawEnforcementAgencies
+                    enforcementOrdersHandlers.Add(new EnforcementOrdersHandler
                     {
                         OrderId = order.Id,
                         OrderNo = order.No,
@@ -120,8 +118,8 @@ namespace Hotline.Api.Controllers
                         OrgName = item.Key
                     });
                 }
-                if (lawEnforcementAgencies != null && lawEnforcementAgencies.Any())
-                    await _lawEnforcementAgenciesRepository.AddRangeAsync(lawEnforcementAgencies, HttpContext.RequestAborted);
+                if (enforcementOrdersHandlers != null && enforcementOrdersHandlers.Any())
+                    await _enforcementOrdersHandlerRepository.AddRangeAsync(enforcementOrdersHandlers, HttpContext.RequestAborted);
             }
             return order.Id;
         }
@@ -148,12 +146,12 @@ namespace Hotline.Api.Controllers
             await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
 
             //处理执法部门
-            if (dto.LawEnforcementAgencies != null && dto.LawEnforcementAgencies.Any())
+            if (dto.EnforcementOrdersHandler != null && dto.EnforcementOrdersHandler.Any())
             {
-                List<LawEnforcementAgencies> lawEnforcementAgencies = new();
-                foreach (var item in dto.LawEnforcementAgencies)
+                List<EnforcementOrdersHandler> enforcementOrdersHandlers = new();
+                foreach (var item in dto.EnforcementOrdersHandler)
                 {
-                    lawEnforcementAgencies.Add(new LawEnforcementAgencies
+                    enforcementOrdersHandlers.Add(new EnforcementOrdersHandler
                     {
                         OrderId = order.Id,
                         OrderNo = order.No,
@@ -161,10 +159,10 @@ namespace Hotline.Api.Controllers
                         OrgCode = item.Value,
                         OrgName = item.Key
                     });
-                    if (lawEnforcementAgencies != null && lawEnforcementAgencies.Any())
+                    if (enforcementOrdersHandlers != null && enforcementOrdersHandlers.Any())
                     {
-                        await _lawEnforcementAgenciesRepository.RemoveAsync(p => p.OrderId == order.Id, false, HttpContext.RequestAborted);
-                        await _lawEnforcementAgenciesRepository.AddRangeAsync(lawEnforcementAgencies, HttpContext.RequestAborted);
+                        await _enforcementOrdersHandlerRepository.RemoveAsync(p => p.OrderId == order.Id, false, HttpContext.RequestAborted);
+                        await _enforcementOrdersHandlerRepository.AddRangeAsync(enforcementOrdersHandlers, HttpContext.RequestAborted);
                     }
 
                 }
@@ -190,45 +188,45 @@ namespace Hotline.Api.Controllers
             await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
         }
 
-        /// <summary>
-        /// 关联执法部门
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [HttpPut("associated_law_enforcement_gencies")]
-        [LogFilter("关联执法部门")]
-        public async Task AssociatedLawEnforcementAgencies([FromBody] AssociatedLawEnforcementAgenciesDto dto)
-        {
-            if (dto.LawEnforcementAgencies == null || dto.LawEnforcementAgencies.Count == 0)
-                throw UserFriendlyException.SameMessage("请选择执法部门");
-
-            var order = await _judicialManagementOrdersRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
-            if (order == null)
-                throw UserFriendlyException.SameMessage("工单查询失败");
-            //处理执法部门
-            if (dto.LawEnforcementAgencies != null && dto.LawEnforcementAgencies.Any())
-            {
-                List<LawEnforcementAgencies> lawEnforcementAgencies = new();
-                foreach (var item in dto.LawEnforcementAgencies)
-                {
-                    lawEnforcementAgencies.Add(new LawEnforcementAgencies
-                    {
-                        OrderId = order.Id,
-                        OrderNo = order.No,
-                        OrderSoure = EOrderSoure.Enforcement,
-                        OrgCode = item.Value,
-                        OrgName = item.Key
-                    });
-                }
-                if (lawEnforcementAgencies != null && lawEnforcementAgencies.Any())
-                {
-                    await _lawEnforcementAgenciesRepository.AddRangeAsync(lawEnforcementAgencies, HttpContext.RequestAborted);
-                    order.LawEnforcementAgencies = dto.LawEnforcementAgencies;
-                    await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
-                }
-            }
+        ///// <summary>
+        ///// 关联执法部门
+        ///// </summary>
+        ///// <param name="dto"></param>
+        ///// <returns></returns>
+        //[HttpPut("associated_law_enforcement_gencies")]
+        //[LogFilter("关联执法部门")]
+        //public async Task AssociatedLawEnforcementAgencies([FromBody] AssociatedLawEnforcementAgenciesDto dto)
+        //{
+        //    if (dto.LawEnforcementAgencies == null || dto.LawEnforcementAgencies.Count == 0)
+        //        throw UserFriendlyException.SameMessage("请选择执法部门");
+
+        //    var order = await _judicialManagementOrdersRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+        //    if (order == null)
+        //        throw UserFriendlyException.SameMessage("工单查询失败");
+        //    //处理执法部门
+        //    if (dto.LawEnforcementAgencies != null && dto.LawEnforcementAgencies.Any())
+        //    {
+        //        List<LawEnforcementAgencies> lawEnforcementAgencies = new();
+        //        foreach (var item in dto.LawEnforcementAgencies)
+        //        {
+        //            lawEnforcementAgencies.Add(new LawEnforcementAgencies
+        //            {
+        //                OrderId = order.Id,
+        //                OrderNo = order.No,
+        //                OrderSoure = EOrderSoure.Enforcement,
+        //                OrgCode = item.Value,
+        //                OrgName = item.Key
+        //            });
+        //        }
+        //        if (lawEnforcementAgencies != null && lawEnforcementAgencies.Any())
+        //        {
+        //            await _enforcementOrdersHandlerRepository.AddRangeAsync(lawEnforcementAgencies, HttpContext.RequestAborted);
+        //            order.LawEnforcementAgencies = dto.LawEnforcementAgencies;
+        //            await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
+        //        }
+        //    }
 
-        }
+        //}
 
         /// <summary>
         /// 查询工单详情
@@ -259,6 +257,7 @@ namespace Hotline.Api.Controllers
                     dto.IsResolved = data.IsResolved;
                     dto.FileOpinion = data.FileOpinion;
                     dto.CenterOpinion = data.CenterToOrgOpinion;
+                    dto.EnforcementOrdersHandler = order.EnforcementOrdersHandler;
                 }
             }
 

+ 359 - 246
src/Hotline.Api/Controllers/OrderController.cs

@@ -9,7 +9,7 @@ using Hotline.Application.Quality;
 using Hotline.Application.Snapshot.Contracts;
 using Hotline.Application.Systems;
 using Hotline.Article;
-using Hotline.Authentications; 
+using Hotline.Authentications;
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
 using Hotline.Configurations;
@@ -2358,146 +2358,41 @@ public class OrderController : BaseController
     /// <summary>
     /// 批量审批延期
     /// </summary>
-    //[HttpPost("delay/batch_audit")]
-    //[LogFilter("批量审批延期")]
-    ////[LogFilterAlpha("延期审核")]
-    //public async Task<string> BatchAuditDelay([FromBody] BatchDelayNextFlowDto dto)
-    //{
-    //    var result = new StringBuilder();
-    //    var fail = 0;
-    //    var success = 0;
-    //    var workflow = dto.NextWorkflow;
-    //    foreach (var item in dto.DelayId)
-    //    {
-    //        try
-    //        {
-    //            //if (workflow.NextHandlers.Any() && workflow.NextHandlers.Count() == 1)
-    //            //{
-    //            //    var handler = workflow.NextHandlers.FirstOrDefault();
-    //            //    if (string.IsNullOrEmpty(handler.UserId))
-    //            //    {
-    //            //        workflow.NextHandlers = new List<StepAssignInfo>();
-    //            //    }
-    //            //}
-
-    //            var delay = await _orderDelayRepository.Queryable().Includes(x => x.Order).Where(x => x.Id == item)
-    //                .FirstAsync(HttpContext.RequestAborted);
-    //            workflow.WorkflowId = delay.WorkflowId;
-    //            var workflowEntuty = await _workflowDomainService.GetWorkflowAsync(workflow.WorkflowId, withDefine: true, withSteps: true,
-    //                cancellationToken: HttpContext.RequestAborted);
-    //            var currentStep = workflowEntuty.Steps.FirstOrDefault(d =>
-    //                d.Status == EWorkflowStepStatus.WaitForAccept || d.Status == EWorkflowStepStatus.WaitForHandle);
-
-    //            NextStepsWithOpinionDto<NextStepOption> next = null;
-
-    //            try
-    //            {
-    //                next = await _workflowApplication.GetNextStepsAsync(delay.WorkflowId, HttpContext.RequestAborted);
-    //            }
-    //            catch (UserFriendlyException e)
-    //            {
-    //                if (e.Message.Contains("未找到对应节点"))
-    //                {
-    //                    result.Append("无权审核:" + delay.No);
-    //                    fail++;
-    //                }
-    //                else
-    //                {
-    //                    throw;
-    //                }
-    //            }
-
-    //            if (next == null) continue;
-
-    //            if (!delay.Order.IsProvince)
-    //            {
-    //                if (next.Steps.Any(x => x.Value == "省审批"))
-    //                {
-    //                    next.Steps.Remove(next.Steps.First(x => x.Value == "省审批"));
-    //                }
-    //            }
-
-    //            if (!_sessionContext.OrgIsCenter && currentStep.Name != "中心初审")
-    //            {
-    //                if (next.Steps.Any(x => x.Value == "中心终审"))
-    //                {
-    //                    next.Steps.Remove(next.Steps.First(x => x.Value == "中心终审"));
-    //                }
-    //            }
-
-    //            workflow.StepId = next.StepId;
-    //            workflow.ReviewResult = dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed;
-
-    //            if (workflow.ReviewResult == EReviewResult.Approval)
-    //            {
-    //                var isBatch = next.Steps.Where(x => x.Value == workflow.NextStepName).Any();
-    //                if (isBatch)
-    //                {
-    //                    var step = next.Steps.Where(x => x.Value == workflow.NextStepName).FirstOrDefault();
-    //                    workflow.NextStepCode = step.Key;
-    //                    workflow.NextStepName = step.Value;
-    //                }
-    //                else
-    //                {
-    //                    result.Append("无权审核:" + delay.No);
-    //                    fail++;
-    //                    continue;
-    //                }
-
-    //                await _workflowDomainService.NextAsync(workflow, cancellationToken: HttpContext.RequestAborted);
-    //            }
-    //            else
-    //            {
-    //                var reject = workflow.Adapt<RejectDto>();
-    //                await _workflowApplication.RejectAsync(reject, HttpContext.RequestAborted);
-    //            }
-
-    //            success++;
-    //        }
-    //        catch (UserFriendlyException e)
-    //        {
-    //            result.Append(e.Message);
-    //            fail++;
-    //        }
-    //    }
-
-    //    return $"总共: {dto.DelayId.Length}, 成功: {success}, 失败: {fail}, 失败原因: {result.ToString()}";
-    //}
-
     [HttpPost("delay/batch_audit")]
     [LogFilter("批量审批延期")]
+    //[LogFilterAlpha("延期审核")]
     public async Task<string> BatchAuditDelay([FromBody] BatchDelayNextFlowDto dto)
     {
         var result = new StringBuilder();
         var fail = 0;
         var success = 0;
-        var workflowDto = dto.NextWorkflow;
-        var delays = await _orderDelayRepository.Queryable()
-            .Includes(x => x.Order)
-            .Includes(x => x.Workflow, d => d.WorkflowDefinition)
-            .Includes(x => x.Workflow, d => d.Steps)
-            .Includes(x => x.Workflow, d => d.Traces)
-            .Includes(x => x.Workflow, d => d.Countersigns)
-            .Where(x => dto.DelayId.Contains(x.Id))
-            .ToListAsync(HttpContext.RequestAborted);
-
-        if (!delays.Any())
-            return string.Empty;
-
-        var currentStep = delays.First().Workflow.Steps.FirstOrDefault(d =>
-            d.Status == EWorkflowStepStatus.WaitForAccept || d.Status == EWorkflowStepStatus.WaitForHandle);
-
-        var updateDelays = new List<OrderDelay>();
-        var updateOrders = new List<Order>();
-        foreach (var delay in delays)
+        var workflow = dto.NextWorkflow;
+        foreach (var item in dto.DelayId)
         {
             try
             {
+                //if (workflow.NextHandlers.Any() && workflow.NextHandlers.Count() == 1)
+                //{
+                //    var handler = workflow.NextHandlers.FirstOrDefault();
+                //    if (string.IsNullOrEmpty(handler.UserId))
+                //    {
+                //        workflow.NextHandlers = new List<StepAssignInfo>();
+                //    }
+                //}
+
+                var delay = await _orderDelayRepository.Queryable().Includes(x => x.Order).Where(x => x.Id == item)
+                    .FirstAsync(HttpContext.RequestAborted);
+                workflow.WorkflowId = delay.WorkflowId;
+                var workflowEntuty = await _workflowDomainService.GetWorkflowAsync(workflow.WorkflowId, withDefine: true, withSteps: true,
+                    cancellationToken: HttpContext.RequestAborted);
+                var currentStep = workflowEntuty.Steps.FirstOrDefault(d =>
+                    d.Status == EWorkflowStepStatus.WaitForAccept || d.Status == EWorkflowStepStatus.WaitForHandle);
+
                 NextStepsWithOpinionDto<NextStepOption> next = null;
 
                 try
                 {
-                    next = await _workflowApplication.GetNextStepsAsync(delay.Workflow, HttpContext.RequestAborted);
+                    next = await _workflowApplication.GetNextStepsAsync(delay.WorkflowId, HttpContext.RequestAborted);
                 }
                 catch (UserFriendlyException e)
                 {
@@ -2530,70 +2425,33 @@ public class OrderController : BaseController
                     }
                 }
 
-                workflowDto.StepId = next.StepId;
-                workflowDto.ReviewResult = dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed;
+                workflow.StepId = next.StepId;
+                workflow.ReviewResult = dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed;
 
-                if (dto.IsPass)
+                if (workflow.ReviewResult == EReviewResult.Approval)
                 {
-                    var step = next.Steps.FirstOrDefault(x => x.Value == workflowDto.NextStepName);
-                    if (step is null)
+                    var isBatch = next.Steps.Where(x => x.Value == workflow.NextStepName).Any();
+                    if (isBatch)
+                    {
+                        var step = next.Steps.Where(x => x.Value == workflow.NextStepName).FirstOrDefault();
+                        workflow.NextStepCode = step.Key;
+                        workflow.NextStepName = step.Value;
+                    }
+                    else
                     {
                         result.Append("无权审核:" + delay.No);
                         fail++;
                         continue;
                     }
 
-                    workflowDto.NextStepCode = step.Key;
-                    workflowDto.NextStepName = step.Value;
-
-                    //处理工单延期
-                    var order = delay.Order;
-                    var expiredTimeBase = DateTime.Now;
-                    if (_appOptions.Value.IsZiGong)
-                    {
-                        expiredTimeBase = order.ExpiredTime.Value;
-                    }
-
-                    var startTime = DateTime.Now;
-                    if (order.CenterToOrgTime.HasValue)
-                    {
-                        startTime = order.CenterToOrgTime!.Value;
-                    }
-
-                    var expiredTimeConfig =
-                        await _expireTime.CalcEndTime(expiredTimeBase, startTime, new TimeConfig(delay.DelayNum, delay.DelayUnit),
-                            order.AcceptTypeCode);
-                    order.ExpiredTime = expiredTimeConfig.ExpiredTime;
-                    order.NearlyExpiredTime = expiredTimeConfig.NearlyExpiredTime;
-                    order.NearlyExpiredTimeOne = expiredTimeConfig.NearlyExpiredTimeOne;
-                    //TODO发送短信即将超期
-                    if (delay.IsProDelay)
-                    {
-                        order.ExpiredTimeProvince = expiredTimeConfig.ExpiredTime;
-                    }
-
-                    updateOrders.Add(order);
-
-                    await _workflowDomainService.NextAsync(delay.Workflow, workflowDto,
-                        expiredTime: order.ExpiredTime,
-                        cancellationToken: HttpContext.RequestAborted);
-
-                    await _workflowDomainService.UpdateUnhandleExpiredTimeAsync(order.WorkflowId, order.ExpiredTime, HttpContext.RequestAborted);
-
-                    var orderDto = _mapper.Map<OrderDto>(order);
-                    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
-                        cancellationToken: HttpContext.RequestAborted);
+                    await _workflowDomainService.NextAsync(workflow, cancellationToken: HttpContext.RequestAborted);
                 }
                 else
                 {
-                    var reject = workflowDto.Adapt<RejectDto>();
+                    var reject = workflow.Adapt<RejectDto>();
                     await _workflowApplication.RejectAsync(reject, HttpContext.RequestAborted);
                 }
 
-
-                delay.DelayState = dto.IsPass ? EDelayState.Pass : EDelayState.NoPass;
-                updateDelays.Add(delay);
-
                 success++;
             }
             catch (UserFriendlyException e)
@@ -2603,23 +2461,165 @@ public class OrderController : BaseController
             }
         }
 
+        return $"总共: {dto.DelayId.Length}, 成功: {success}, 失败: {fail}, 失败原因: {result.ToString()}";
+    }
 
-        await _orderDelayRepository.Updateable(updateDelays)
-            .UpdateColumns(d => d.DelayState)
-            .ExecuteCommandAsync(HttpContext.RequestAborted);
+    //[HttpPost("delay/batch_audit")]
+    //[LogFilter("批量审批延期")]
+    //public async Task<string> BatchAuditDelay([FromBody] BatchDelayNextFlowDto dto)
+    //{
+    //    var result = new StringBuilder();
+    //    var fail = 0;
+    //    var success = 0;
+    //    var workflowDto = dto.NextWorkflow;
+    //    var delays = await _orderDelayRepository.Queryable()
+    //        .Includes(x => x.Order)
+    //        .Includes(x => x.Workflow, d => d.WorkflowDefinition)
+    //        .Includes(x => x.Workflow, d => d.Steps)
+    //        .Includes(x => x.Workflow, d => d.Traces)
+    //        .Includes(x => x.Workflow, d => d.Countersigns)
+    //        .Where(x => dto.DelayId.Contains(x.Id))
+    //        .ToListAsync(HttpContext.RequestAborted);
+
+    //    if (!delays.Any())
+    //        return string.Empty;
+
+    //    var currentStep = delays.First().Workflow.Steps.FirstOrDefault(d =>
+    //        d.Status == EWorkflowStepStatus.WaitForAccept || d.Status == EWorkflowStepStatus.WaitForHandle);
+
+    //    var updateDelays = new List<OrderDelay>();
+    //    var updateOrders = new List<Order>();
+    //    foreach (var delay in delays)
+    //    {
+    //        try
+    //        {
+    //            NextStepsWithOpinionDto<NextStepOption> next = null;
 
-        await _orderRepository.Updateable(updateOrders)
-            .UpdateColumns(d => new
-            {
-                d.ExpiredTime,
-                d.NearlyExpiredTime,
-                d.NearlyExpiredTimeOne,
-                d.ExpiredTimeProvince
-            })
-            .ExecuteCommandAsync(HttpContext.RequestAborted);
+    //            try
+    //            {
+    //                next = await _workflowApplication.GetNextStepsAsync(delay.Workflow, HttpContext.RequestAborted);
+    //            }
+    //            catch (UserFriendlyException e)
+    //            {
+    //                if (e.Message.Contains("未找到对应节点"))
+    //                {
+    //                    result.Append("无权审核:" + delay.No);
+    //                    fail++;
+    //                }
+    //                else
+    //                {
+    //                    throw;
+    //                }
+    //            }
 
-        return $"总共: {dto.DelayId.Length}, 成功: {success}, 失败: {fail}, 失败原因: {result}";
-    }
+    //            if (next == null) continue;
+
+    //            if (!delay.Order.IsProvince)
+    //            {
+    //                if (next.Steps.Any(x => x.Value == "省审批"))
+    //                {
+    //                    next.Steps.Remove(next.Steps.First(x => x.Value == "省审批"));
+    //                }
+    //            }
+
+    //            if (!_sessionContext.OrgIsCenter && currentStep.Name != "中心初审")
+    //            {
+    //                if (next.Steps.Any(x => x.Value == "中心终审"))
+    //                {
+    //                    next.Steps.Remove(next.Steps.First(x => x.Value == "中心终审"));
+    //                }
+    //            }
+
+    //            workflowDto.StepId = next.StepId;
+    //            workflowDto.ReviewResult = dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed;
+
+    //            if (dto.IsPass)
+    //            {
+    //                var step = next.Steps.FirstOrDefault(x => x.Value == workflowDto.NextStepName);
+    //                if (step is null)
+    //                {
+    //                    result.Append("无权审核:" + delay.No);
+    //                    fail++;
+    //                    continue;
+    //                }
+
+    //                workflowDto.NextStepCode = step.Key;
+    //                workflowDto.NextStepName = step.Value;
+
+    //                //处理工单延期
+    //                var order = delay.Order;
+    //                var expiredTimeBase = DateTime.Now;
+    //                if (_appOptions.Value.IsZiGong)
+    //                {
+    //                    expiredTimeBase = order.ExpiredTime.Value;
+    //                }
+
+    //                var startTime = DateTime.Now;
+    //                if (order.CenterToOrgTime.HasValue)
+    //                {
+    //                    startTime = order.CenterToOrgTime!.Value;
+    //                }
+
+    //                var expiredTimeConfig =
+    //                    await _expireTime.CalcEndTime(expiredTimeBase, startTime, new TimeConfig(delay.DelayNum, delay.DelayUnit),
+    //                        order.AcceptTypeCode);
+    //                order.ExpiredTime = expiredTimeConfig.ExpiredTime;
+    //                order.NearlyExpiredTime = expiredTimeConfig.NearlyExpiredTime;
+    //                order.NearlyExpiredTimeOne = expiredTimeConfig.NearlyExpiredTimeOne;
+    //                //TODO发送短信即将超期
+    //                if (delay.IsProDelay)
+    //                {
+    //                    order.ExpiredTimeProvince = expiredTimeConfig.ExpiredTime;
+    //                }
+
+    //                updateOrders.Add(order);
+
+    //                await _workflowDomainService.NextAsync(delay.Workflow, workflowDto,
+    //                    expiredTime: order.ExpiredTime,
+    //                    cancellationToken: HttpContext.RequestAborted);
+
+    //                await _workflowDomainService.UpdateUnhandleExpiredTimeAsync(order.WorkflowId, order.ExpiredTime, HttpContext.RequestAborted);
+
+    //                var orderDto = _mapper.Map<OrderDto>(order);
+    //                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
+    //                    cancellationToken: HttpContext.RequestAborted);
+    //            }
+    //            else
+    //            {
+    //                var reject = workflowDto.Adapt<RejectDto>();
+    //                await _workflowApplication.RejectAsync(reject, HttpContext.RequestAborted);
+    //            }
+
+
+    //            delay.DelayState = dto.IsPass ? EDelayState.Pass : EDelayState.NoPass;
+    //            updateDelays.Add(delay);
+
+    //            success++;
+    //        }
+    //        catch (UserFriendlyException e)
+    //        {
+    //            result.Append(e.Message);
+    //            fail++;
+    //        }
+    //    }
+
+
+    //    await _orderDelayRepository.Updateable(updateDelays)
+    //        .UpdateColumns(d => d.DelayState)
+    //        .ExecuteCommandAsync(HttpContext.RequestAborted);
+
+    //    await _orderRepository.Updateable(updateOrders)
+    //        .UpdateColumns(d => new
+    //        {
+    //            d.ExpiredTime,
+    //            d.NearlyExpiredTime,
+    //            d.NearlyExpiredTimeOne,
+    //            d.ExpiredTimeProvince
+    //        })
+    //        .ExecuteCommandAsync(HttpContext.RequestAborted);
+
+    //    return $"总共: {dto.DelayId.Length}, 成功: {success}, 失败: {fail}, 失败原因: {result}";
+    //}
 
 
 
@@ -3507,11 +3507,34 @@ public class OrderController : BaseController
     {
         var (total, items) = await _orderSuperviseRepository.Queryable()
             .Includes(x => x.Order)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
-            .WhereIF(dto.SuperviseState > -1, x => x.State == dto.SuperviseState)
-            .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
-            .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Order.Title.Contains(dto.Keyword!) || x.Order.No.Contains(dto.Keyword!))
+            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Order.No.Contains(dto.No))                                //工单编号
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.Order.IsProvince == true)   //是否省工单
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.Order.IsProvince == false)
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title))                       //工单标题
+            .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.Order.SourceChannelCode == dto.Channel)              //来源渠道
+            .WhereIF(dto.Status.HasValue, x => x.Order.Status == dto.Status)                                         //工单状态
+            .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), x => x.Order.AcceptTypeCode == dto.AcceptTypeCode)   //受理类型
+            .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.Order.HotspotSpliceName != null && x.Order.HotspotSpliceName.Contains(dto.Hotspot)) //热点
+            .WhereIF(!string.IsNullOrEmpty(dto.AcceptorName), x => x.Order.AcceptorName == dto.AcceptorName!)        //受理人
+            .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), x => x.Order.CurrentHandleOrgName.Contains(dto.CurrentHandleOrgName)) //接办部门
+            .WhereIF(dto.ExpiredTimeStart.HasValue, x => x.Order.ExpiredTime >= dto.ExpiredTimeStart)                //期满时间Start
+            .WhereIF(dto.ExpiredTimeEnd.HasValue, x => x.Order.ExpiredTime <= dto.ExpiredTimeEnd)                    //期满时间End
+            .WhereIF(dto.SuperviseTimeStart.HasValue, x => x.CreationTime >= dto.SuperviseTimeStart)                 //督办时间Start
+            .WhereIF(dto.SuperviseTimeEnd.HasValue, x => x.CreationTime <= dto.SuperviseTimeEnd)                     //督办时间End
+            .WhereIF(dto.ReplyLimitTimeStart.HasValue, x => x.ReplyLimitTime >= dto.ReplyLimitTimeStart)             //督办回复时限Start
+            .WhereIF(dto.ReplyLimitTimeEnd.HasValue, x => x.ReplyLimitTime <= dto.ReplyLimitTimeEnd)                 //督办回复时限End
+            .WhereIF(!string.IsNullOrEmpty(dto.CrUser), x => x.CrUser.Contains(dto.CrUser))                          //督办人
+            .WhereIF(!string.IsNullOrEmpty(dto.LaunchOrgName), x => x.LaunchOrgName.Contains(dto.LaunchOrgName))     //督办部门
+            .WhereIF(!string.IsNullOrEmpty(dto.ApplyContent), x => x.ApplyContent.Contains(dto.ApplyContent))        //督办意见
+            .WhereIF(dto.SuperviseState > -1, x => x.State == dto.SuperviseState)                                    //督办状态
+            .WhereIF(dto.CreationTimeStart.HasValue, x => x.Order.CreationTime >= dto.CreationTimeStart)             //受理时间Start
+            .WhereIF(dto.CreationTimeEnd.HasValue, x => x.Order.CreationTime <= dto.CreationTimeEnd)                 //受理时间End
+            .WhereIF(dto.ReplyTimeStart.HasValue, x => x.ReplyTime >= dto.ReplyTimeStart)                            //督办回复时间Start
+            .WhereIF(dto.ReplyTimeEnd.HasValue, x => x.ReplyTime <= dto.ReplyTimeEnd)                                //督办回复时间End
+            .WhereIF(!string.IsNullOrEmpty(dto.ReplyContent), x => x.ReplyContent.Contains(dto.ReplyContent))        //督办回复内容
+            .WhereIF(dto.SignTimeStart.HasValue, x => x.SignTime >= dto.SignTimeStart)                               //督办签收时间Start
+            .WhereIF(dto.SignTimeEnd.HasValue, x => x.SignTime <= dto.SignTimeEnd)                                   //督办签收时间End
             .Where(x => x.OrgId == _sessionContext.OrgId)
             .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
@@ -3879,22 +3902,38 @@ public class OrderController : BaseController
         //如果角色不为空,则说明催办的是角色,则根据部门和角色一起查
         var (total, items) = await _orderUrgeRepository.Queryable()
             .Includes(x => x.Order)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
-            .WhereIF(dto.UrgeState > -1, d => d.State == dto.UrgeState)
-            .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
-            .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
-            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName),
-                d => d.Order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
-            .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.Order.CurrentStepCode == dto.CurrentStepCode) //当前办理节点
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Order.Title.Contains(dto.Keyword!) || x.Order.No.Contains(dto.Keyword!))
+            .WhereIF(dto.UrgeState > -1, x => x.State == dto.UrgeState)
             .WhereIF(_sessionContext.OrgIsCenter == false, d =>
                 (SqlFunc.IsNullOrEmpty(d.RoleId) == true && d.OrgId.StartsWith(_sessionContext.RequiredOrgId)) ||
                 (SqlFunc.IsNullOrEmpty(d.RoleId) == false && d.OrgId.StartsWith(_sessionContext.RequiredOrgId) &&
                  _sessionContext.Roles.Contains(d.RoleId))
             )
+            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), x => x.Order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.Order.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
+            .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), x => x.Order.CurrentStepCode == dto.CurrentStepCode) //当前办理节点
+            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Order.No.Contains(dto.No))                                //工单编号
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.Order.IsProvince == true)   //是否省工单
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.Order.IsProvince == false)
+            .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.Order.SourceChannelCode == dto.Channel)              //来源渠道
+            .WhereIF(dto.ExpiredTimeStart.HasValue, x => x.Order.ExpiredTime >= dto.ExpiredTimeStart)                //期满时间Start
+            .WhereIF(dto.ExpiredTimeEnd.HasValue, x => x.Order.ExpiredTime <= dto.ExpiredTimeEnd)                    //期满时间End
+            .WhereIF(dto.CreationTimeStart.HasValue, x => x.Order.CreationTime >= dto.CreationTimeStart)             //受理时间Start
+            .WhereIF(dto.CreationTimeEnd.HasValue, x => x.Order.CreationTime <= dto.CreationTimeEnd)                 //受理时间End
+            .WhereIF(dto.Status.HasValue, x => x.Order.Status == dto.Status)                                         //工单状态
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title))                       //工单标题
+            .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), x => x.Order.CurrentHandleOrgName.Contains(dto.CurrentHandleOrgName)) //接办部门
+            .WhereIF(dto.CurrentHandleTimeStart.HasValue, x => x.Order.CurrentHandleTime >= dto.CurrentHandleTimeStart)//接办时间Start
+            .WhereIF(dto.CurrentHandleTimeEnd.HasValue, x => x.Order.CurrentHandleTime <= dto.CurrentHandleTimeEnd)    //接办时间End
+            .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.Order.HotspotSpliceName != null && x.Order.HotspotSpliceName.Contains(dto.Hotspot)) //热点
+            .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), x => x.Order.AcceptTypeCode == dto.AcceptTypeCode)   //受理类型
+            .WhereIF(!string.IsNullOrEmpty(dto.CrUser), x => x.CrUser.Contains(dto.CrUser))                          //催办人
+            .WhereIF(!string.IsNullOrEmpty(dto.CreatorOrgName), x => x.CreatorOrgName.Contains(dto.CreatorOrgName))  //催办部门
+            .WhereIF(dto.CrTimeStart.HasValue, x => x.CreationTime >= dto.CrTimeStart)                               //催办时间Start
+            .WhereIF(dto.CrTimeEnd.HasValue, x => x.CreationTime <= dto.CrTimeEnd)                                   //催办时间End
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName))                       //催办部门
+            .WhereIF(!string.IsNullOrEmpty(dto.ApplyContent), x => x.ApplyContent.Contains(dto.ApplyContent))        //催办内容
 
-            //   .WhereIF(_sessionContext.RequiredOrgId!="001", x => x.OrgId == _sessionContext.OrgId)
             .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
@@ -3911,12 +3950,31 @@ public class OrderController : BaseController
     {
         var (total, items) = await _orderUrgeRepository.Queryable()
             .Includes(x => x.Order)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Order.Title.Contains(dto.Keyword!) || x.Order.No.Contains(dto.Keyword!))
             .WhereIF(dto.UrgeState > -1, x => x.State == dto.UrgeState)
-            .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
-            .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
             .WhereIF(_sessionContext.OrgIsCenter == false, x => x.OrgId.StartsWith(_sessionContext.OrgId))
+            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Order.No.Contains(dto.No))                                //工单编号
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.Order.IsProvince == true)   //是否省工单
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.Order.IsProvince == false)
+            .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.Order.SourceChannelCode == dto.Channel)              //来源渠道
+            .WhereIF(dto.ExpiredTimeStart.HasValue, x => x.Order.ExpiredTime >= dto.ExpiredTimeStart)                //期满时间Start
+            .WhereIF(dto.ExpiredTimeEnd.HasValue, x => x.Order.ExpiredTime <= dto.ExpiredTimeEnd)                    //期满时间End
+            .WhereIF(dto.CreationTimeStart.HasValue, x => x.Order.CreationTime >= dto.CreationTimeStart)             //受理时间Start
+            .WhereIF(dto.CreationTimeEnd.HasValue, x => x.Order.CreationTime <= dto.CreationTimeEnd)                 //受理时间End
+            .WhereIF(dto.Status.HasValue, x => x.Order.Status == dto.Status)                                         //工单状态
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title))                       //工单标题
+            .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), x => x.Order.CurrentHandleOrgName.Contains(dto.CurrentHandleOrgName)) //接办部门
+            .WhereIF(dto.CurrentHandleTimeStart.HasValue, x => x.Order.CurrentHandleTime >= dto.CurrentHandleTimeStart)//接办时间Start
+            .WhereIF(dto.CurrentHandleTimeEnd.HasValue, x => x.Order.CurrentHandleTime <= dto.CurrentHandleTimeEnd)    //接办时间End
+            .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.Order.HotspotSpliceName != null && x.Order.HotspotSpliceName.Contains(dto.Hotspot)) //热点
+            .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), x => x.Order.AcceptTypeCode == dto.AcceptTypeCode)   //受理类型
+            .WhereIF(!string.IsNullOrEmpty(dto.CrUser), x => x.CrUser.Contains(dto.CrUser))                          //催办人
+            .WhereIF(!string.IsNullOrEmpty(dto.CreatorOrgName), x => x.CreatorOrgName.Contains(dto.CreatorOrgName))  //催办部门
+            .WhereIF(dto.CrTimeStart.HasValue, x => x.CreationTime >= dto.CrTimeStart)                               //催办时间Start
+            .WhereIF(dto.CrTimeEnd.HasValue, x => x.CreationTime <= dto.CrTimeEnd)                                   //催办时间End
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName))                       //催办部门
+            .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), x => x.Order.CurrentStepCode == dto.CurrentStepCode) //当前办理节点
+            .WhereIF(dto.CrState.HasValue, x => x.State == dto.CrState)
             .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
@@ -4249,6 +4307,44 @@ public class OrderController : BaseController
         return orderUrgeDto;
     }
 
+    /// <summary>
+    /// 列表页面基础数据
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("basedata")]
+    public async Task<object> BaseDataRange()
+    {
+        // 催办查询 催办状态
+        List<Kv> kvCrState = new()
+        {
+            new Kv { Key = "0", Value = "待办未读" },
+            new Kv { Key = "1", Value = "已回复" },
+            new Kv { Key = "3", Value = "签收已读" }
+        };
+
+        //延期申请单位
+        List<Kv> ETimeType = new()
+        {
+            new Kv { Key = "1", Value = "小时" },
+            new Kv { Key = "2", Value = "工作日" },
+            new Kv { Key = "3", Value = "自然日" }
+        };
+
+        var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted);
+        var definition = wfModule.Definition;
+        var rsp = new
+        {
+            ChannelOptions = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel),
+            AcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
+            OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>(),
+            CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name)),
+            CrState = kvCrState,
+            DelayUnitOptions = ETimeType
+        };
+        return rsp;
+    }
+
+
     #endregion
 
     #region 工单办理
@@ -5620,9 +5716,9 @@ public class OrderController : BaseController
                         var prevSendOrder = sendOrderTrace is not null;
                         if (_appOptions.Value.IsZiGong && prevSendOrder)
                         {
-							prevSendOrder = await _orderDomainService.SchedulingAtWork(sendOrderTrace.HandlerId);
-						}
-						if (prevSendOrder)
+                            prevSendOrder = await _orderDomainService.SchedulingAtWork(sendOrderTrace.HandlerId);
+                        }
+                        if (prevSendOrder)
                         {
                             //todo
                             nextDto.NextHandlers = new List<StepAssignInfo>
@@ -6120,22 +6216,22 @@ public class OrderController : BaseController
     }
 
 
-	/// <summary>
-	/// 提前触发平均派单 
-	/// </summary>
-	/// <returns></returns>
-	[HttpPost("advanced_trigger_average_order")]
-	[AllowAnonymous]
-	public async Task AdvancedTriggerAverageOrder()
-	{
-		await _orderDomainService.AdvancedTriggerAverageOrder(HttpContext.RequestAborted);
-	}
+    /// <summary>
+    /// 提前触发平均派单 
+    /// </summary>
+    /// <returns></returns>
+    [HttpPost("advanced_trigger_average_order")]
+    [AllowAnonymous]
+    public async Task AdvancedTriggerAverageOrder()
+    {
+        await _orderDomainService.AdvancedTriggerAverageOrder(HttpContext.RequestAborted);
+    }
 
-	/// <summary>
-	/// 批量归档(暂时只支持派单组节点操作)
-	/// </summary>
-	/// <returns>成功总量</returns>
-	[HttpPost("batch-file")]
+    /// <summary>
+    /// 批量归档(暂时只支持派单组节点操作)
+    /// </summary>
+    /// <returns>成功总量</returns>
+    [HttpPost("batch-file")]
     public async Task<string> BatchFile([FromBody] OrderBatchFileDto dto)
     {
         var orders = await _orderRepository.Queryable()
@@ -6793,20 +6889,20 @@ public class OrderController : BaseController
             var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == sendBack.OrderId);
             //if (_appOptions.Value.IsZiGong)
             //{
-                //var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
-                //    order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(), sendBack.AssignStepId,
-                //    HttpContext.RequestAborted);
+            //var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
+            //    order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(), sendBack.AssignStepId,
+            //    HttpContext.RequestAborted);
 
-                //if (prevStep.BusinessType == EBusinessType.Send)
-                //{
-                //    // 平均派单
-                //    var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
-                //    if (averageSendOrder)
-                //    {
-                //        var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-                //        sendBack.SendBackData.Handler = handler;
-                //    }
-                //}
+            //if (prevStep.BusinessType == EBusinessType.Send)
+            //{
+            //    // 平均派单
+            //    var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
+            //    if (averageSendOrder)
+            //    {
+            //        var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
+            //        sendBack.SendBackData.Handler = handler;
+            //    }
+            //}
             //}
 
             sendBack.SendBackData.ExpiredTime = order.ExpiredTime;
@@ -8985,11 +9081,28 @@ public class OrderController : BaseController
     {
         var (total, items) = await _orderFinalityRepository.Queryable()
             .Includes(x => x.Order)
-            .WhereIF(dto.IsProvince.HasValue, x => x.Order.IsProvince == dto.IsProvince)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                x => x.Order.No.Contains(dto.Keyword!) || x.Order.Title.Contains(dto.Keyword!))
-            //.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title!))
-            //.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Order.No.Contains(dto.No!))
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Order.No.Contains(dto.Keyword!) || x.Order.Title.Contains(dto.Keyword!))
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.Order.IsProvince == true)   //是否省工单
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.Order.IsProvince == false)
+            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Order.No.Contains(dto.No))                                //工单编号
+            .WhereIF(dto.Status.HasValue, x => x.Order.Status == dto.Status)                                         //工单状态
+            .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.Order.SourceChannelCode == dto.Channel)              //来源渠道
+            .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), x => x.Order.CurrentStepCode.Contains(dto.CurrentStepCode)) //当前节点
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title))                       //工单标题
+            .WhereIF(dto.CreationTimeStart.HasValue, x => x.Order.CreationTime >= dto.CreationTimeStart)             //受理时间Start
+            .WhereIF(dto.CreationTimeEnd.HasValue, x => x.Order.CreationTime <= dto.CreationTimeEnd)                 //受理时间End
+            .WhereIF(!string.IsNullOrEmpty(dto.CreatorName), x => x.CreatorName.Contains(dto.CreatorName))           //设置人
+            .WhereIF(dto.SetCreationTimeStart.HasValue, x => x.CreationTime >= dto.SetCreationTimeStart)             //设置时间Start
+            .WhereIF(dto.SetCreationTimeEnd.HasValue, x => x.CreationTime <= dto.SetCreationTimeEnd)                 //设置时间End
+            .WhereIF(dto.ExpiredTimeStart.HasValue, x => x.Order.ExpiredTime >= dto.ExpiredTimeStart)                //期满时间Start
+            .WhereIF(dto.ExpiredTimeEnd.HasValue, x => x.Order.ExpiredTime <= dto.ExpiredTimeEnd)                    //期满时间End
+            .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), x => x.Order.AcceptTypeCode == dto.AcceptTypeCode)   //受理类型
+            .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.Order.HotspotSpliceName != null && x.Order.HotspotSpliceName.Contains(dto.Hotspot)) //热点
+            .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), x => x.Order.CurrentHandleOrgName.Contains(dto.CurrentHandleOrgName)) //接办部门
+            .WhereIF(dto.CurrentHandleTimeStart.HasValue, x => x.Order.CurrentHandleTime >= dto.CurrentHandleTimeStart)//接办时间Start
+            .WhereIF(dto.CurrentHandleTimeEnd.HasValue, x => x.Order.CurrentHandleTime <= dto.CurrentHandleTimeEnd)    //接办时间End
+            .WhereIF(dto.FiledTimeStart.HasValue, x => x.Order.FiledTime >= dto.FiledTimeStart)                        //办结时间Start
+            .WhereIF(dto.FiledTimeEnd.HasValue, x => x.Order.FiledTime <= dto.FiledTimeEnd)                            //办结时间End
             .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
         return new PagedDto<OrderFinalityDto>(total, _mapper.Map<IReadOnlyList<OrderFinalityDto>>(items));

+ 78 - 41
src/Hotline.Api/Controllers/QualityController.cs

@@ -24,6 +24,10 @@ using Hotline.Configurations;
 using Hotline.CallCenter.Calls;
 using System.Linq;
 using Hotline.Repository.SqlSugar.Quality;
+using Hotline.Caching.Services;
+using Hotline.FlowEngine.WorkflowModules;
+using Hotline.Settings.TimeLimits;
+using Hotline.Share.Enums.Order;
 
 namespace Hotline.Api.Controllers
 {
@@ -51,6 +55,7 @@ namespace Hotline.Api.Controllers
         private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
         private readonly IRepository<SystemLog> _logRepository;
         private readonly IRepository<QualityTransferRecords> _qualityTransferRecordsRepository;
+        private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
 
         public QualityController(
             ISessionContext sessionContext,
@@ -72,7 +77,8 @@ namespace Hotline.Api.Controllers
             ICallApplication callApplication,
             IOptionsSnapshot<AppConfiguration> appOptions,
             IRepository<SystemLog> logRepository,
-            IRepository<QualityTransferRecords> qualityTransferRecordsRepository)
+            IRepository<QualityTransferRecords> qualityTransferRecordsRepository,
+            ISystemDicDataCacheManager sysDicDataCacheManager)
         {
             _sessionContext = sessionContext;
             _mapper = mapper;
@@ -94,6 +100,7 @@ namespace Hotline.Api.Controllers
             _appOptions = appOptions;
             _logRepository = logRepository;
             _qualityTransferRecordsRepository = qualityTransferRecordsRepository;
+            _sysDicDataCacheManager = sysDicDataCacheManager;
         }
         #region 质检管理
         /// <summary>
@@ -123,25 +130,25 @@ namespace Hotline.Api.Controllers
             await _qualityApplication.UpdateQualityAsync(dto, HttpContext.RequestAborted);
         }
 
-		/// <summary>
-		/// 更新质检
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		[HttpPut("transfer")]
-		public async Task TransferUpdate([FromBody] TransferUpdate dto)
-		{
-			await _qualitey.Updateable().SetColumns(x=> new Hotline.Quality.Quality { Transfer  = dto.Transfer }).Where(x=>x.Id == dto.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-		}
+        /// <summary>
+        /// 更新质检
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPut("transfer")]
+        public async Task TransferUpdate([FromBody] TransferUpdate dto)
+        {
+            await _qualitey.Updateable().SetColumns(x => new Hotline.Quality.Quality { Transfer = dto.Transfer }).Where(x => x.Id == dto.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
+        }
 
 
 
-		/// <summary>
-		/// 获取质检列表
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		[HttpGet("list")]
+        /// <summary>
+        /// 获取质检列表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("list")]
         public async Task<PagedDto<QualityDto>> List([FromQuery] QualityListDto dto)
         {
             var (total, items) = await _qualitey.Queryable()
@@ -159,6 +166,18 @@ namespace Hotline.Api.Controllers
                 .WhereIF(dto.CreationTimeEnd.HasValue, x => x.CreationTime <= dto.CreationTimeEnd)
                 .WhereIF(dto.MaxGrade.HasValue, x => x.Grade <= dto.MaxGrade)
                 .WhereIF(dto.MinGrade.HasValue, x => x.Grade >= dto.MinGrade)
+                .WhereIF(!string.IsNullOrEmpty(dto.Mode), x => x.Mode.Contains(dto.Mode))                      //质检方式
+                .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.Order.SourceChannelCode == dto.Channel)    //来源渠道
+                .WhereIF(dto.AcceptanceTimeStart.HasValue, x => x.Order.CreationTime >= dto.AcceptanceTimeStart) //受理时间Star
+                .WhereIF(dto.AcceptanceTimeEnd.HasValue, x => x.Order.CreationTime <= dto.AcceptanceTimeEnd)   //受理时间End
+                .WhereIF(dto.Status.HasValue, x => x.Order.Status == dto.Status)                               //工单状态
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), x => x.Order.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
+                .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.Order.HotspotSpliceName != null && x.Order.HotspotSpliceName.Contains(dto.Hotspot)) //热点
+                .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), x => x.Order.AcceptorName == dto.NameOrNo! || x.Order.AcceptorStaffNo == dto.NameOrNo!)   //受理人/坐席
+                .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), x => x.Order.FromPhone.Contains(dto.FromPhone)) //来电号码
+                .WhereIF(!string.IsNullOrEmpty(dto.UserName), x => x.UserName.Contains(dto.UserName))          //质检人
+                .WhereIF(dto.QualityTimeStart.HasValue, x => x.QualityTime >= dto.QualityTimeStart)              //质检时间Star
+                .WhereIF(dto.QualityTimeEnd.HasValue, x => x.QualityTime <= dto.QualityTimeEnd)                //质检时间End
                 .OrderByDescending(x => x.CreationTime)
                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
             return new PagedDto<QualityDto>(total, _mapper.Map<IReadOnlyList<QualityDto>>(items));
@@ -333,7 +352,17 @@ namespace Hotline.Api.Controllers
                 .WhereIF(!string.IsNullOrEmpty(dto.Name), d => d.Name.Contains(dto.Name!))
                 .WhereIF(!string.IsNullOrEmpty(dto.GroupingName), d => d.GroupingName.Contains(dto.GroupingName!))
                 .WhereIF(dto.IsEnable.HasValue, d => d.IsEnable == dto.IsEnable)
-                .OrderByDescending(x => x.CreationTime)
+
+                .WhereIF(!string.IsNullOrEmpty(dto.Describe), d => d.Describe.Contains(dto.Describe!))
+                .WhereIF(dto.MaxGrade.HasValue, d => d.Grade <= dto.MaxGrade)
+                .WhereIF(dto.MinGrade.HasValue, d => d.Grade >= dto.MinGrade)
+                .WhereIF(!string.IsNullOrEmpty(dto.CreatorName), d => d.CreatorName.Contains(dto.CreatorName!))
+                .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
+                .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
+                .WhereIF(!string.IsNullOrEmpty(dto.LastModificationName), d => d.LastModificationName.Contains(dto.LastModificationName!))
+                .WhereIF(dto.LastModificationTimeStart.HasValue, d => d.LastModificationTime >= dto.LastModificationTimeStart)
+                .WhereIF(dto.LastModificationTimeEnd.HasValue, d => d.LastModificationTime <= dto.LastModificationTimeEnd)
+                .OrderByDescending(d => d.CreationTime)
                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
             return new PagedDto<QualityItemDto>(total, _mapper.Map<IReadOnlyList<QualityItemDto>>(items));
         }
@@ -449,9 +478,15 @@ namespace Hotline.Api.Controllers
             var (total, items) = await _qualityTemplate.Queryable()
                 .Includes(x => x.templateDetails)
                 .Includes(x => x.templateDetails, y => y.QualityItem)
-                .WhereIF(!string.IsNullOrEmpty(dto.Name), d => d.Name.Contains(dto.Name!))
-                .WhereIF(dto.Grouping.HasValue, d => d.Grouping == dto.Grouping)
-                .WhereIF(dto.IsEnable.HasValue, d => d.IsEnable == dto.IsEnable)
+                .WhereIF(!string.IsNullOrEmpty(dto.Name), x => x.Name.Contains(dto.Name!))
+                .WhereIF(dto.Grouping.HasValue, x => x.Grouping == dto.Grouping)
+                .WhereIF(dto.IsEnable.HasValue, x => x.IsEnable == dto.IsEnable)
+                .WhereIF(!string.IsNullOrEmpty(dto.CreatorName), x => x.CreatorName.Contains(dto.CreatorName!))
+                .WhereIF(dto.CreationTimeStart.HasValue, x => x.CreationTime >= dto.CreationTimeStart)
+                .WhereIF(dto.CreationTimeEnd.HasValue, x => x.CreationTime <= dto.CreationTimeEnd)
+                .WhereIF(!string.IsNullOrEmpty(dto.LastModificationName), x => x.LastModificationName.Contains(dto.LastModificationName!))
+                .WhereIF(dto.LastModificationTimeStart.HasValue, x => x.LastModificationTime >= dto.LastModificationTimeStart)
+                .WhereIF(dto.LastModificationTimeEnd.HasValue, x => x.LastModificationTime <= dto.LastModificationTimeEnd)
                 .OrderByDescending(x => x.CreationTime)
                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
             return new PagedDto<QualityTemplateDto>(total, _mapper.Map<IReadOnlyList<QualityTemplateDto>>(items));
@@ -657,16 +692,16 @@ namespace Hotline.Api.Controllers
             await _qualityTransferRecordsRepository.AddRangeAsync(transfers);
         }
 
-		/// <summary>
-		/// 智能质检转写_兴唐_定时调用
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		[AllowAnonymous]
-		[HttpPost("transfer")]
-		[LogFilter("智能质检转写_兴唐_定时调用")]
-		public async Task AiTransfer_XT()
-		{
+        /// <summary>
+        /// 智能质检转写_兴唐_定时调用
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpPost("transfer")]
+        [LogFilter("智能质检转写_兴唐_定时调用")]
+        public async Task AiTransfer_XT()
+        {
             var translatings = await _qualityTransferRecordsRepository.Queryable().Where(x => x.IsFinished == false && x.TransferState == EQualityTransferState.Translating).OrderBy(x => x.TransferTime).ToListAsync();
             if (translatings.Any())
             {
@@ -674,19 +709,21 @@ namespace Hotline.Api.Controllers
                 if ((DateTime.Now - transfer.TransferTime.Value).TotalMinutes >= 30)
                 {
                     await _qualityTransferRecordsRepository.Updateable().SetColumns(x => new QualityTransferRecords { TransferState = EQualityTransferState.Lose }).Where(x => x.Id == transfer.Id).ExecuteCommandAsync();
-					await _qualitey.Updateable().SetColumns(x => new Hotline.Quality.Quality { TransferState = EQualityTransferState.Lose }).Where(x => x.Id == transfer.QualityId).ExecuteCommandAsync();
-				}
+                    await _qualitey.Updateable().SetColumns(x => new Hotline.Quality.Quality { TransferState = EQualityTransferState.Lose }).Where(x => x.Id == transfer.QualityId).ExecuteCommandAsync();
+                }
                 return;
             }
-            else {
+            else
+            {
                 var trany = await _qualityTransferRecordsRepository.Queryable().Where(x => x.IsFinished == false && x.TransferState == EQualityTransferState.NotStarted).AnyAsync();
-                if (trany) {
-					var notStarted = await _qualityTransferRecordsRepository.Queryable().Where(x => x.IsFinished == false && x.TransferState == EQualityTransferState.NotStarted).OrderBy(x => x.TransferTime).FirstAsync();
-					await _qualityTransferRecordsRepository.Updateable().SetColumns(x => new QualityTransferRecords { TransferState = EQualityTransferState.Translating, TransferTime = DateTime.Now }).Where(x => x.Id == notStarted.Id).ExecuteCommandAsync();
-					Task.Run(async () => await _qualityApplication.Transfer_XT(notStarted.QualityId, HttpContext.RequestAborted));
-				}
-			}
-		}
+                if (trany)
+                {
+                    var notStarted = await _qualityTransferRecordsRepository.Queryable().Where(x => x.IsFinished == false && x.TransferState == EQualityTransferState.NotStarted).OrderBy(x => x.TransferTime).FirstAsync();
+                    await _qualityTransferRecordsRepository.Updateable().SetColumns(x => new QualityTransferRecords { TransferState = EQualityTransferState.Translating, TransferTime = DateTime.Now }).Where(x => x.Id == notStarted.Id).ExecuteCommandAsync();
+                    Task.Run(async () => await _qualityApplication.Transfer_XT(notStarted.QualityId, HttpContext.RequestAborted));
+                }
+            }
+        }
 
 
         /// <summary>

+ 1 - 1
src/Hotline.Api/Controllers/Snapshot/SnapshotController.cs

@@ -190,7 +190,7 @@ public class SnapshotController : BaseController
     /// <returns></returns>
     [HttpGet("bulletions")]
     [AllowAnonymous]
-    public async Task<IReadOnlyList<BulletinOutDto>> QueryBulletinsAsync([FromQuery] BulletinInDto dto)
+    public async Task<IReadOnlyList<BulletinListOutDto>> QueryBulletinsAsync([FromQuery] BulletinInDto dto)
         => await _snapshotApplication.GetBulletinsAsync(dto, HttpContext.RequestAborted);
 
     /// <summary>

+ 43 - 5
src/Hotline.Api/Controllers/TestController.cs

@@ -1,5 +1,7 @@
 using System.Text;
 using System.Text.Json;
+using System.Threading;
+using DocumentFormat.OpenXml.Office2010.Excel;
 using DotNetCore.CAP;
 using Hotline.Ai.Quality;
 using Hotline.Application.CallCenter;
@@ -22,6 +24,8 @@ using Hotline.FlowEngine.Workflows;
 using Hotline.Import;
 using Hotline.JudicialManagement;
 using Hotline.Orders;
+using Hotline.Push.FWMessage;
+using Hotline.Push.Notifies;
 using Hotline.Realtimes;
 using Hotline.Repository.SqlSugar;
 using Hotline.Repository.SqlSugar.Ts;
@@ -34,6 +38,7 @@ using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Home;
 using Hotline.Share.Dtos.Identity;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.Push;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Dtos.Snapshot;
 using Hotline.Share.Dtos.TrCallCenter;
@@ -41,6 +46,7 @@ using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.JudicialManagement;
 using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Push;
 using Hotline.Share.Mq;
 using Hotline.ThirdAccountDomainServices.Interfaces;
 using Hotline.Users;
@@ -125,6 +131,7 @@ public class TestController : BaseController
     private readonly IServiceProvider _serviceProvider;
     private readonly IRepository<OrderDelay> _orderDelayRepository;
     private readonly IRepository<OrderSecondaryHandling> _orderSecondaryHandlingRepository;
+    private readonly IRepository<Message> _messageRepository;
 
 
     public TestController(
@@ -182,7 +189,8 @@ public class TestController : BaseController
         IOrderScreenRepository orderScreenRepository,
         IRepository<OrderVisit> orderVisitRepository,
         IServiceProvider serviceProvider,
-        IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository
+        IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository,
+        IRepository<Message> messageRepository
         )
     {
         _logger = logger;
@@ -236,6 +244,7 @@ public class TestController : BaseController
         _serviceProvider = serviceProvider;
         _orderDelayRepository = orderDelayRepository;
         _orderSecondaryHandlingRepository = orderSecondaryHandlingRepository;
+        _messageRepository = messageRepository;
     }
 
     /// <summary>
@@ -1538,9 +1547,38 @@ public class TestController : BaseController
         return ipv4;
     }
 
-    //public string DecryptSign(string sign)
-    //{
-    //    return sign;
-    //}
+    [AllowAnonymous]
+    [HttpGet("sms")]
+    public async Task<string> PushSms(DateTime start, DateTime end, bool rightnow = false)
+    {
+        var smses = await _messageRepository.Queryable()
+            .Where(d=>d.SendState < ESendState.Success)
+            .Where(d => d.CreationTime >= start && d.CreationTime <= end)
+            .ToListAsync(HttpContext.RequestAborted);
+
+        var total = smses.Count;
+        if(!rightnow)
+            return $"共计: {total}";
+
+        var successed = 0;
+        Share.Dtos.Push.MessageDto messageDto;
+        foreach (var message in smses)
+        {
+            PushMessageDto pushMessage = new()
+            {
+                ClientId = "Hotline",
+                ExternalId = message.Id,
+                Content = message.Content,
+                Remark = message.Remark,
+                Name = message.Name,
+                TelNumber = message.TelNumber
+            };
+            //消息队列
+            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.SendSms, pushMessage, cancellationToken:HttpContext.RequestAborted);
+            successed++;
+        }
+
+        return $"共计: {total}, 成功:{successed}";
+    }
 }
 

+ 14 - 14
src/Hotline.Api/StartupHelper.cs

@@ -294,22 +294,22 @@ namespace Hotline.Api
                         .StartNow()
                         .WithCronSchedule("0 0/5 * * * ? *"));
 
-                        d.AddJob<SendOrderJob>(autoSendOrderKey);
-                        d.AddTrigger(t => t
-                            .WithIdentity("task-send-order-trigger")
-                            .ForJob(autoSendOrderKey)
-                            .StartNow()
-                            .WithCronSchedule("0 10 9 * * ?")
-                        );
+                        //d.AddJob<SendOrderJob>(autoSendOrderKey);
+                        //d.AddTrigger(t => t
+                        //    .WithIdentity("task-send-order-trigger")
+                        //    .ForJob(autoSendOrderKey)
+                        //    .StartNow()
+                        //    .WithCronSchedule("0 10 9 * * ?")
+                        //);
                         break;
                     case AppDefaults.AppScope.ZiGong:
-	                    d.AddJob<SendOrderJob>(autoSendOrderKey);
-	                    d.AddTrigger(t => t
-		                    .WithIdentity("task-send-order-trigger")
-		                    .ForJob(autoSendOrderKey)
-		                    .StartNow()
-		                    .WithCronSchedule("0 10 9 * * ?")
-	                    );
+	                    //d.AddJob<SendOrderJob>(autoSendOrderKey);
+	                    //d.AddTrigger(t => t
+		                   // .WithIdentity("task-send-order-trigger")
+		                   // .ForJob(autoSendOrderKey)
+		                   // .StartNow()
+		                   // .WithCronSchedule("0 10 9 * * ?")
+	                    //);
 						break;
 					default:
                         break;

+ 8 - 4
src/Hotline.Application/CallCenter/DefaultCallApplication.cs

@@ -362,15 +362,19 @@ public abstract class DefaultCallApplication : ICallApplication
 
         if (dto.Type == 2)
         {
-            return query.Select((d, o, v) => new CallNativeDto
+            var d = query.Select((d, o, v) => new CallNativeDto
             {
-                OrderId = v.OrderId,
-                OrderNo = v.Order.No,
-                Title = v.Order.Title,
+                OrderId = SqlFunc.IsNull(v.OrderId, v.OrderId),
+                OrderNo = SqlFunc.IsNull(v.Order.No, o.No),
+                Title = SqlFunc.IsNull(v.Order.Title, o.Title),
                 CallState = d.CallState,
                 IsVisit = !SqlFunc.IsNullOrEmpty(v.Id),
                 IsOrder = !SqlFunc.IsNullOrEmpty(o.Id),
             }, true);
+#if DEBUG
+            var sql = d.ToSqlString();
+#endif
+            return d;
         }
         if (dto.Type == 3)
         {

+ 5 - 2
src/Hotline.Application/JudicialManagement/EnforcementApplication.cs

@@ -1,4 +1,5 @@
-using Hotline.IndustryClassification;
+using Hotline.CaseLibrary;
+using Hotline.IndustryClassification;
 using Hotline.JudicialManagement;
 using Hotline.Orders;
 using Hotline.Settings;
@@ -212,6 +213,7 @@ namespace Hotline.Application.JudicialManagement
                        AcceptorStaffNo = o.AcceptorStaffNo,
                        AcceptorOrgCode = o.AcceptorOrgCode,
                        AcceptorOrgName = o.AcceptorOrgName,
+                       CaseType = o.CaseType 
                    })
                 .MergeTable();
         }
@@ -362,7 +364,8 @@ namespace Hotline.Application.JudicialManagement
                     AcceptorStaffNo = x.AcceptorStaffNo,
                     AcceptorOrgCode = x.AcceptorOrgCode,
                     AcceptorOrgName = x.AcceptorOrgName,
-                    VisitId = p.VisitId
+                    VisitId = p.VisitId,
+                    CaseType = x.CaseType 
                 })
                .MergeTable();
 

+ 122 - 102
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -42,6 +42,7 @@ using Hotline.Share.Enums.Quality;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Mq;
 using Hotline.Share.Requests;
+using Hotline.Share.Tools;
 using Hotline.Statistics;
 using Hotline.Tools;
 using Hotline.Users;
@@ -6281,12 +6282,31 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .Queryable(hasHandled: isHandled, isAdmin: isAdmin)
                 .Includes(d => d.Order)
                 .Includes(d => d.Workflow)
-                .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                    d => d.Order.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
-                //.WhereIF(dto.IsApply == true, d => d.DelayState != EDelayState.Examining)
+                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
                 .WhereIF(dto.IsApply == false, d => d.DelayState == EDelayState.Examining)
-                //.WhereIF(dto.DelayState != null, x => x.DelayState == dto.DelayState)
-                //.Where(x=>x.DelayState == EDelayState.Examining)
+                .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Order.No.Contains(dto.No))                                   //工单编号
+                .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Order.IsProvince == true)      //是否省工单
+                .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Order.IsProvince == false)
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Order.Title.Contains(dto.Title))                          //工单标题
+                .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.Order.SourceChannelCode == dto.Channel)                 //来源渠道
+                .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart)                //受理时间Start
+                .WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd)                    //受理时间End
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptorName), d => d.Order.AcceptorName == dto.AcceptorName!)           //受理人
+                .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.Order.HotspotSpliceName != null && d.Order.HotspotSpliceName.Contains(dto.Hotspot)) //热点
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.Order.AcceptTypeCode == dto.AcceptTypeCode)      //受理类型
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
+                .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), d => d.Order.CurrentHandleOrgName.Contains(dto.CurrentHandleOrgName)) //接办部门
+                .WhereIF(dto.CurrentHandleTimeStart.HasValue, d => d.Order.CurrentHandleTime >= dto.CurrentHandleTimeStart) //接办时间Start
+                .WhereIF(dto.CurrentHandleTimeEnd.HasValue, d => d.Order.CurrentHandleTime <= dto.CurrentHandleTimeEnd)     //接办时间End
+                .WhereIF(dto.ApplyTimeStart.HasValue, d => d.CreationTime >= dto.ApplyTimeStart)                            //延期申请时间Start
+                .WhereIF(dto.ApplyTimeEnd.HasValue, d => d.CreationTime <= dto.ApplyTimeEnd)                                //延期申请时间End
+                .WhereIF(!string.IsNullOrEmpty(dto.ApplyName), d => d.CreatorName.Contains(dto.ApplyName))                  //延期申请人
+                .WhereIF(!string.IsNullOrEmpty(dto.ApplyOrgName), d => d.CreatorOrgName.Contains(dto.ApplyOrgName))         //延期申请部门
+                .WhereIF(dto.DelayNum.HasValue, d => d.DelayNum == dto.DelayNum)                                            //延期申请时限
+                .WhereIF(dto.DelayUnit.HasValue, d => d.DelayUnit == dto.DelayUnit)                                         //延期申请单位
+                .WhereIF(!string.IsNullOrEmpty(dto.DelayReason), d => d.DelayReason.Contains(dto.DelayReason))              //申请理由
+                .WhereIF(dto.BeforeDelayStart.HasValue, d => d.BeforeDelay >= dto.BeforeDelayStart)                         //申请前期满时间Start
+                .WhereIF(dto.BeforeDelayEnd.HasValue, d => d.BeforeDelay <= dto.BeforeDelayEnd)                             //申请前期满时间End
                 .OrderByDescending(d => d.ApplyDelayTime)
             ;
 
@@ -6538,15 +6558,15 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         //.GroupBy((x, o) => new { o.AcceptorId})
         //.Select((x, o) => new { UserId = o.AcceptorId, SendOrderBackNum = SqlFunc.AggregateDistinctCount(x.ExternalId), SendOrderBackNumber = SqlFunc.AggregateCount(x.ExternalId) });
         var sendBack = _orderSendBackAuditRepository.Queryable()
-            .LeftJoin<Order>((x, o) => x.OrderId == o.Id)
-            .Where((x, o) => x.ApplyOrgId != OrgSeedData.CenterId && (x.SendBackStepName == "班长审批" || x.SendBackStepName == "派单组") && o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime)
-            .GroupBy((x, o) => new { o.AcceptorId })
-            .Select((x, o) => new SeatSendBackStatisticsVo { UserId = o.AcceptorId, SendOrderBackNum = SqlFunc.AggregateDistinctCount(x.OrderId), SendOrderBackNumber = SqlFunc.AggregateCount(x.Id) });
+			.LeftJoin<Order>((x, o) => x.OrderId == o.Id)
+			.Where((x, o) =>  (x.SendBackStepName == "话务部") && o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime)
+			.GroupBy((x, o) => new { o.AcceptorId })
+			.Select((x, o) => new SeatSendBackStatisticsVo { UserId = o.AcceptorId, SendOrderBackNum = SqlFunc.AggregateDistinctCount(x.OrderId), SendOrderBackNumber = SqlFunc.AggregateCount(x.Id) });
 
 
-        var filed = _orderRepository.Queryable()
-            .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime && x.Status >= EOrderStatus.Filed && x.FileOrgIsCenter == true)
-            .GroupBy(x => x.AcceptorId)
+		var filed = _orderRepository.Queryable()
+            .Where(x=> x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime && x.Status >= EOrderStatus.Filed && x.FileOrgIsCenter == true && x.FileUserRole == EFileUserType.Seat)
+            .GroupBy(x=>x.AcceptorId)
             .Select(x => new SeatSendBackStatisticsVo { UserId = x.AcceptorId, CentreFileNum = SqlFunc.AggregateDistinctCount(x.Id) });
 
         var back = _orderSpecialRepository.Queryable()
@@ -6605,97 +6625,97 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
         else if (dto.StatisticsType == "sendOrderBackNum")
         {
-            var query = _orderRepository.Queryable().Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.UserId), x => x.AcceptorId == dto.UserId)
-                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No.Contains(dto.No!))
-                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
-                .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType) //受理类型
-                .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.SourceChannelCode == dto.Channel) //来源渠道
-                 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
-                    x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
-                .Where(x => SqlFunc.Subqueryable<OrderSendBackAudit>().Where(os => os.OrderId == x.Id && os.ApplyOrgId != OrgSeedData.CenterId && (os.SendBackStepName == "班长审批" || os.SendBackStepName == "派单组")).Any())
-                .Select(x => new OrderDto() { Id = x.Id.SelectAll() })
-                .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, x => x.StartTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, x => x.StartTime, OrderByType.Desc)
-                .OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, x => x.FiledTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, x => x.FiledTime, OrderByType.Desc)
-                .OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 0 }, x => x.SendBackAuditTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 1 }, x => x.SendBackAuditTime, OrderByType.Desc);
-            return query;
-        }
-        else if (dto.StatisticsType == "sendOrderBackNumber")
-        {
-            var query = _orderRepository.Queryable()
-                .LeftJoin<OrderSendBackAudit>((x, os) => x.Id == os.OrderId && os.ApplyOrgId != OrgSeedData.CenterId && (os.SendBackStepName == "班长审批" || os.SendBackStepName == "派单组"))
-                .WhereIF(!string.IsNullOrEmpty(dto.No), (x, os) => x.No.Contains(dto.No!))
-                .WhereIF(!string.IsNullOrEmpty(dto.Title), (x, os) => x.Title.Contains(dto.Title!))
-                .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), (x, os) => x.AcceptTypeCode == dto.AcceptType) //受理类型
-                .WhereIF(!string.IsNullOrEmpty(dto.Channel), (x, os) => x.SourceChannelCode == dto.Channel) //来源渠道
-                 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
-                    (x, os) => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
-                .Where((x, os) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.UserId), (x, os) => x.AcceptorId == dto.UserId)
-                .Select((x, os) => new OrderDto() { Id = x.Id.SelectAll(), SendBackOpinion = os.Content, SendBackAuditTime = os.AuditTime })
+			var query = _orderRepository.Queryable().Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime )
+				.WhereIF(!string.IsNullOrEmpty(dto.UserId), x => x.AcceptorId == dto.UserId)
+				.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No.Contains(dto.No!))
+				.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
+				.WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType) //受理类型
+				.WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.SourceChannelCode == dto.Channel) //来源渠道
+				 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
+					x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
+				.Where(x => SqlFunc.Subqueryable<OrderSendBackAudit>().Where(os => os.OrderId == x.Id && (os.SendBackStepName == "话务部")).Any())
+				.Select(x => new OrderDto() { Id = x.Id.SelectAll() })
+				.OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, x => x.StartTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, x => x.StartTime, OrderByType.Desc)
+				.OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, x => x.FiledTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, x => x.FiledTime, OrderByType.Desc)
+				.OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 0 }, x => x.SendBackAuditTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 1 }, x => x.SendBackAuditTime, OrderByType.Desc);
+			return query;
+		}
+		else if (dto.StatisticsType == "sendOrderBackNumber")
+		{
+			var query = _orderRepository.Queryable()
+                .LeftJoin<OrderSendBackAudit>((x, os) => x.Id == os.OrderId  && (os.SendBackStepName == "话务部"))
+				.WhereIF(!string.IsNullOrEmpty(dto.No), (x, os) => x.No.Contains(dto.No!))
+				.WhereIF(!string.IsNullOrEmpty(dto.Title), (x, os) => x.Title.Contains(dto.Title!))
+				.WhereIF(!string.IsNullOrEmpty(dto.AcceptType), (x, os) => x.AcceptTypeCode == dto.AcceptType) //受理类型
+				.WhereIF(!string.IsNullOrEmpty(dto.Channel), (x, os) => x.SourceChannelCode == dto.Channel) //来源渠道
+				 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
+					(x, os) => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
+				.Where((x, os) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
+				.WhereIF(!string.IsNullOrEmpty(dto.UserId), (x, os) => x.AcceptorId == dto.UserId)
+				.Select((x, os) => new OrderDto() { Id = x.Id.SelectAll(), SendBackOpinion = os.Content, SendBackAuditTime = os.AuditTime })
                 .MergeTable()
-                .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, x => x.StartTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, x => x.StartTime, OrderByType.Desc)
-                .OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, x => x.FiledTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, x => x.FiledTime, OrderByType.Desc)
-                .OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 0 }, x => x.SendBackAuditTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 1 }, x => x.SendBackAuditTime, OrderByType.Desc);
-            return query;
-        }
-        else if (dto.StatisticsType == "centreFileNum")
-        {
-            var query = _orderRepository.Queryable().Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.UserId), x => x.AcceptorId == dto.UserId)
-                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No.Contains(dto.No!))
-                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
-                .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType) //受理类型
-                .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.SourceChannelCode == dto.Channel) //来源渠道
-                 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
-                    x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
-                .Where(x => x.Status >= EOrderStatus.Filed && x.FileOrgIsCenter == true).Select(x => new OrderDto() { Id = x.Id.SelectAll() })
-                .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, x => x.StartTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, x => x.StartTime, OrderByType.Desc)
-                .OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, x => x.FiledTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, x => x.FiledTime, OrderByType.Desc)
-                .OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 0 }, x => x.SendBackAuditTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 1 }, x => x.SendBackAuditTime, OrderByType.Desc);
-            return query;
-        }
-        else if (dto.StatisticsType == "centreFileBackNum")
-        {
-            var query = _orderRepository.Queryable().Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.UserId), x => x.AcceptorId == dto.UserId)
-                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No.Contains(dto.No!))
-                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
-                .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType) //受理类型
-                .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.SourceChannelCode == dto.Channel) //来源渠道
-                 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
-                    x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
-                .Where(x => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == x.Id && os.SpecialType == ESpecialType.SendBack && os.NextStepCode == "start").Any())
-                .Select(x => new OrderDto() { Id = x.Id.SelectAll() })
-                .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, x => x.StartTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, x => x.StartTime, OrderByType.Desc)
-                .OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, x => x.FiledTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, x => x.FiledTime, OrderByType.Desc)
-                .OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 0 }, x => x.SendBackAuditTime, OrderByType.Asc)
-                .OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 1 }, x => x.SendBackAuditTime, OrderByType.Desc);
-            return query;
-        }
-        else if (dto.StatisticsType == "centreFileBackNumber")
-        {
-            var query = _orderRepository.Queryable().LeftJoin<OrderSpecial>((x, os) => x.Id == os.OrderId && os.SpecialType == ESpecialType.SendBack && os.NextStepCode == "start")
-                .WhereIF(!string.IsNullOrEmpty(dto.No), (x, os) => x.No.Contains(dto.No!))
-                .WhereIF(!string.IsNullOrEmpty(dto.Title), (x, os) => x.Title.Contains(dto.Title!))
-                .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), (x, os) => x.AcceptTypeCode == dto.AcceptType) //受理类型
-                .WhereIF(!string.IsNullOrEmpty(dto.Channel), (x, os) => x.SourceChannelCode == dto.Channel) //来源渠道
-                 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
-                    (x, os) => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
-                .Where((x, os) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.UserId), (x, os) => x.AcceptorId == dto.UserId)
-                .Select((x, os) => new OrderDto() { Id = x.Id.SelectAll(), SendBackOpinion = os.Reason, SendBackAuditTime = os.CreationTime })
+				.OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, x => x.StartTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, x => x.StartTime, OrderByType.Desc)
+				.OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, x => x.FiledTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, x => x.FiledTime, OrderByType.Desc)
+				.OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 0 }, x => x.SendBackAuditTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 1 }, x => x.SendBackAuditTime, OrderByType.Desc);
+			return query;
+		}
+		else if (dto.StatisticsType == "centreFileNum")
+		{
+			var query = _orderRepository.Queryable().Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime && x.FileUserRole == EFileUserType.Seat )
+				.WhereIF(!string.IsNullOrEmpty(dto.UserId), x => x.AcceptorId == dto.UserId)
+				.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No.Contains(dto.No!))
+				.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
+				.WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType) //受理类型
+				.WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.SourceChannelCode == dto.Channel) //来源渠道
+				 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
+					x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
+				.Where(x => x.Status >= EOrderStatus.Filed && x.FileOrgIsCenter == true).Select(x => new OrderDto() { Id = x.Id.SelectAll() })
+				.OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, x => x.StartTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, x => x.StartTime, OrderByType.Desc)
+				.OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, x => x.FiledTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, x => x.FiledTime, OrderByType.Desc)
+				.OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 0 }, x => x.SendBackAuditTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 1 }, x => x.SendBackAuditTime, OrderByType.Desc);
+			return query;
+		}
+		else if (dto.StatisticsType == "centreFileBackNum")
+		{
+			var query = _orderRepository.Queryable().Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime )
+				.WhereIF(!string.IsNullOrEmpty(dto.UserId), x => x.AcceptorId == dto.UserId)
+				.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No.Contains(dto.No!))
+				.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
+				.WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType) //受理类型
+				.WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.SourceChannelCode == dto.Channel) //来源渠道
+				 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
+					x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
+				.Where(x => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == x.Id && os.SpecialType == ESpecialType.SendBack && os.NextStepCode == "start").Any())
+				.Select(x => new OrderDto() { Id = x.Id.SelectAll() })
+				.OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, x => x.StartTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, x => x.StartTime, OrderByType.Desc)
+				.OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, x => x.FiledTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, x => x.FiledTime, OrderByType.Desc)
+				.OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 0 }, x => x.SendBackAuditTime, OrderByType.Asc)
+				.OrderByIF(dto is { SortField: "sendBackAuditTime", SortRule: 1 }, x => x.SendBackAuditTime, OrderByType.Desc);
+			return query;
+		}
+		else if (dto.StatisticsType == "centreFileBackNumber")
+		{
+			var query = _orderRepository.Queryable().LeftJoin<OrderSpecial>((x, os) => x.Id == os.OrderId &&  os.SpecialType == ESpecialType.SendBack && os.NextStepCode == "start")
+				.WhereIF(!string.IsNullOrEmpty(dto.No), (x, os) => x.No.Contains(dto.No!))
+				.WhereIF(!string.IsNullOrEmpty(dto.Title), (x, os) => x.Title.Contains(dto.Title!))
+				.WhereIF(!string.IsNullOrEmpty(dto.AcceptType), (x, os) => x.AcceptTypeCode == dto.AcceptType) //受理类型
+				.WhereIF(!string.IsNullOrEmpty(dto.Channel), (x, os) => x.SourceChannelCode == dto.Channel) //来源渠道
+				 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
+					(x, os) => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
+				.Where((x, os) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
+				.WhereIF(!string.IsNullOrEmpty(dto.UserId), (x, os) => x.AcceptorId == dto.UserId)
+				.Select((x, os) => new OrderDto() { Id = x.Id.SelectAll() , SendBackOpinion = os.Reason , SendBackAuditTime = os.CreationTime })
                 .MergeTable()
                 .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, x => x.StartTime, OrderByType.Asc)
                 .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, x => x.StartTime, OrderByType.Desc)

+ 14 - 6
src/Hotline.Application/OrderApp/OrderSecondaryHandlingApplication.cs

@@ -242,13 +242,13 @@ namespace Hotline.Application.OrderApp
                 await _orderRepository.UpdateAsync(order, false, cancellationToken);
 
                 visit.VisitState = EVisitState.None;
-			}
+            }
             else
             {
                 visit.IsCanHandle = true;
             }
-			await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
-			await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
+            await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
+            await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
         }
 
 
@@ -333,9 +333,17 @@ namespace Hotline.Application.OrderApp
                 .Includes(x => x.VisitDetail)
                 .Includes(x => x.Visit, d => d.Order)
                 .Where(x => x.State > ESecondaryHandlingState.NotApply)
-                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Visit.Order.Title.Contains(dto.Keyword!) || x.Visit.Order.No.Contains(dto.Keyword!))
-                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Visit.Order.Title.Contains(dto.Title!))
-                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Visit.Order.No.Contains(dto.No!))
+                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Order.Title.Contains(dto.Keyword!) || x.Order.No.Contains(dto.Keyword!))
+                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Order.No.Contains(dto.No!))
+                .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.Order.SourceChannelCode == dto.Channel)              //来源渠道
+                .WhereIF(dto.SendBack.HasValue, x => x.SendBackNum == dto.SendBack!)                                     //重提办理
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title!))                      //工单编号
+                .WhereIF(!string.IsNullOrEmpty(dto.ApplyName), x => x.CreatorName.Contains(dto.ApplyName))               //申请人
+                .WhereIF(!string.IsNullOrEmpty(dto.ApplyOrgName), x => x.ApplyOrgName.Contains(dto.ApplyOrgName))        //申请部门
+                .WhereIF(dto.ApplyTimeStart.HasValue, x => x.CreationTime >= dto.ApplyTimeStart)                         //申请时间Start
+                .WhereIF(dto.ApplyTimeEnd.HasValue, x => x.CreationTime <= dto.ApplyTimeEnd)                             //申请时间End
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), x => x.Order.AcceptTypeCode == dto.AcceptTypeCode)   //受理类型
+                .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.Order.HotspotSpliceName != null && x.Order.HotspotSpliceName.Contains(dto.Hotspot)) //热点
                 .WhereIF(dto.Status is ESecondaryHandlingState.Apply, x => x.State == ESecondaryHandlingState.Apply)
                 .WhereIF(dto.Status is ESecondaryHandlingState.Handled, x => x.State != ESecondaryHandlingState.Apply)
                 .WhereIF(dto.Status is ESecondaryHandlingState.End || dto.Status is ESecondaryHandlingState.Refuse || dto.Status is ESecondaryHandlingState.NotApply, x => x.State == dto.Status)

+ 23 - 12
src/Hotline.Application/OrderApp/OrderSendBackAuditApplication.cs

@@ -24,22 +24,33 @@ namespace Hotline.Application.OrderApp
             return _orderSendBackAuditRepository.Queryable()
                 .Includes(x => x.Order)
                 .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                    d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
-                .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Order.Title.Contains(dto.Title!))
-                .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Order.No.Contains(dto.No!))
-                .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.Order.AcceptTypeCode == dto.AcceptTypeCode)
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), d => d.ApplyOrgName == dto.OrgName)
-                .WhereIF(dto.DataScope is 1, d => d.CreatorId == _sessionContext.RequiredUserId)
-                .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
-                .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
-                .WhereIF(dto.AuditState == 1, d => d.State == ESendBackAuditState.Apply)
-                .WhereIF(dto is { AuditState: 2, State: null }, d => d.State > ESendBackAuditState.Apply)
-                .WhereIF(dto.AuditState is 2 or 3 && dto.State.HasValue && dto.State != ESendBackAuditState.All, d => d.State == dto.State)
+                    x => x.Order.Title.Contains(dto.Keyword!) || x.Order.No.Contains(dto.Keyword!))
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title!))
+                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Order.No.Contains(dto.No!))
+                .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.Order.IsProvince == true)
+                .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.Order.IsProvince == false)
+                .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.Order.SourceChannelCode == dto.Channel)    //来源渠道
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), x => x.Order.AcceptTypeCode == dto.AcceptTypeCode)
+                .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.Order.HotspotSpliceName != null && x.Order.HotspotSpliceName.Contains(dto.Hotspot)) //热点
+                .WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), x => x.Order.CenterToOrgHandlerName.Contains(dto.CenterToOrgHandlerName))   //最近派单员              
+                .WhereIF(!string.IsNullOrEmpty(dto.SendBackStepName), x => x.SendBackStepName.Contains(dto.SendBackStepName))                           //退回节点                   
+                .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), x => x.Order.AcceptorName == dto.NameOrNo! || x.Order.AcceptorStaffNo == dto.NameOrNo!)   //受理人/坐席
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.Order.OrgLevelOneName.Contains(dto.OrgLevelOneName))                        //一级部门 
+                .WhereIF(!string.IsNullOrEmpty(dto.Content), x => x.Order.Content.Contains(dto.Content))                                                //受理内容 
+                .WhereIF(!string.IsNullOrEmpty(dto.ApplyName), x => x.CreatorName.Contains(dto.ApplyName))                                              //申请人 
+                .WhereIF(!string.IsNullOrEmpty(dto.ApplyOrgName), x => x.ApplyOrgName.Contains(dto.ApplyOrgName))                                       //申请部门 
+                .WhereIF(!string.IsNullOrEmpty(dto.Opinion), x => x.SendBackData.Opinion.Contains(dto.Opinion))
+                .WhereIF(!string.IsNullOrEmpty(dto.ApplyOrgName), x => x.ApplyOrgName == dto.ApplyOrgName)
+                .WhereIF(dto.DataScope is 1, x => x.CreatorId == _sessionContext.RequiredUserId)
+                .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+                .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+                .WhereIF(dto.AuditState == 1, x => x.State == ESendBackAuditState.Apply)
+                .WhereIF(dto is { AuditState: 2, State: null }, x => x.State > ESendBackAuditState.Apply)
+                .WhereIF(dto.AuditState is 2 or 3 && dto.State.HasValue && dto.State != ESendBackAuditState.All, x => x.State == dto.State)
                 .WhereIF(dto.AuditState == 3 && _sessionContext.RequiredOrgId != OrgSeedData.CenterId, x => x.ApplyOrgId.StartsWith(_sessionContext.OrgId))
                 .WhereIF(_sessionContext.Roles.Contains("role_sysadmin") == false && dto.AuditState != 3, x => x.SendBackOrgId == _sessionContext.OrgId) // 123 系统管理员;
                 .WhereIF(dto.ExpiredTimeStart.HasValue, x => x.Order.ExpiredTime >= dto.ExpiredTimeStart)
                 .WhereIF(dto.ExpiredTimeEnd.HasValue, x => x.Order.ExpiredTime <= dto.ExpiredTimeEnd)
-
             .OrderByDescending(x => x.CreationTime);
         }
     }

+ 2 - 1
src/Hotline.Application/Snapshot/BiSnapshotApplication.cs

@@ -734,7 +734,8 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
             .LeftJoin<OrderSendBackAudit>((snapshot, order, back) => snapshot.Id == back.OrderId && back.State == ESendBackAuditState.End)
             .LeftJoin<OrderVisit>((snapshot, order, back, visit) => snapshot.Id == visit.OrderId && visit.VisitState == EVisitState.Visited)
             .LeftJoin<OrderSecondaryHandling>((snapshot, order, back, visit, second) => snapshot.Id == second.OrderId && second.State == ESecondaryHandlingState.End)
-            .Where((snapshot, order) => snapshot.CreationTime >= dto.StartTime && snapshot.CreationTime <= dto.EndTime && order.ActualHandleOrgCode != null)
+            .Where((snapshot, order) => snapshot.CreationTime >= dto.StartTime && snapshot.CreationTime <= dto.EndTime 
+            && order.ActualHandleOrgCode != null && order.ActualHandleOrgCode != "001")
             .GroupBy((snapshot, order) => new
             {
                 OrgCode = order.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))

+ 1 - 1
src/Hotline.Application/Snapshot/Contracts/ISnapshotApplication.cs

@@ -29,7 +29,7 @@ public interface ISnapshotApplication
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    Task<IReadOnlyList<BulletinOutDto>> GetBulletinsAsync(BulletinInDto dto, CancellationToken cancellationToken);
+    Task<IReadOnlyList<BulletinListOutDto>> GetBulletinsAsync(BulletinInDto dto, CancellationToken cancellationToken);
     
     /// <summary>
     /// 获取工单列表

+ 63 - 14
src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs

@@ -41,6 +41,7 @@ using Hotline.Settings.Hotspots;
 using Microsoft.Extensions.Options;
 using XF.Utility.MQ;
 using System.Threading;
+using NPOI.SS.Formula.Functions;
 
 namespace Hotline.Application.Snapshot;
 
@@ -291,7 +292,7 @@ public abstract class SnapshotApplicationBase
     /// 获取随手拍小程序公告
     /// </summary>
     /// <returns></returns>
-    public async Task<IReadOnlyList<BulletinOutDto>> GetBulletinsAsync(BulletinInDto dto, CancellationToken cancellationToken)
+    public async Task<IReadOnlyList<BulletinListOutDto>> GetBulletinsAsync(BulletinInDto dto, CancellationToken cancellationToken)
     {
         var items = await _bulletinRepository.Queryable()
             .Where(m => m.BulletinState == EBulletinState.ReviewPass && m.IsArrive == true)
@@ -299,7 +300,7 @@ public abstract class SnapshotApplicationBase
             .Where((bulletin, industry) => industry.Id == dto.IndustryId)
             .ToFixedListAsync(dto, cancellationToken);
 
-        return items.Adapt<IReadOnlyList<BulletinOutDto>>();
+        return items.Adapt<IReadOnlyList<BulletinListOutDto>>();
     }
 
     /// <summary>
@@ -488,20 +489,19 @@ public abstract class SnapshotApplicationBase
     public async Task<IList<RedPackOutDto>> GetRedPacksAsync(RedPacksInDto dto, CancellationToken cancellationToken)
     {
         var items = await _redPackRecordRepository.Queryable(includeDeleted: true)
-            .LeftJoin<Order>((m , order) => m.OrderId == order.Id)
+            .LeftJoin<Order>((m, order) => m.OrderId == order.Id)
             .Where(m => m.IsDeleted == false)
             .Where(m => m.WXOpenId == _sessionContext.OpenId)
             .WhereIF(dto.Status == ERedPackPickupStatus.Unreceived, (m, order) => m.PickupStatus == dto.Status && (order.HotspotId == null || order.HotspotId.StartsWith("18") == false))
             .WhereIF(dto.Status != ERedPackPickupStatus.Unreceived, (m, order) => m.PickupStatus == dto.Status)
             .Where(m => m.CreationTime.ToString("yyyy-MM") == dto.Time)
-            .LeftJoin<Order>((red, order) => red.OrderId == order.Id)
-            .Select((red, order) => new RedPackOutDto
+            .Select((m, order) => new RedPackOutDto
             {
                 OrderId = order.Id,
-                Amount = red.Amount,
+                Amount = m.Amount,
                 Title = order.Title,
-                CreationTime = red.CreationTime,
-                RedPackAuditId = red.RedPackAuditId
+                CreationTime = m.CreationTime,
+                RedPackAuditId = m.RedPackAuditId
             })
             .ToFixedListAsync(dto, cancellationToken);
 
@@ -967,17 +967,12 @@ public abstract class SnapshotApplicationBase
             .Select((points, citizen) => new PointsRankUserDto
             {
                 IsSecurityMax = citizen.IsSecurityMax ?? false,
-                Rank = SqlFunc.MappingColumn<int>($@"
-            CASE 
-                WHEN citizen.""Id"" = '{_sessionContext.UserId}' THEN 1 
-                ELSE DENSE_RANK() OVER (ORDER BY SUM(CASE WHEN ""points"".""Direction"" = 1 THEN ""points"".""Points"" ELSE 0 END) DESC)
-            END"),
+                Rank = SqlFunc.MappingColumn<int>($@" DENSE_RANK() OVER (ORDER BY SUM(CASE WHEN ""points"".""Direction"" = 0 THEN ""points"".""Points"" ELSE 0 END) DESC)"),
                 Points = SqlFunc.AggregateSum(points.Points),
                 UserName = citizen.Name!,
                 PhoneNumber = citizen.PhoneNumber,
                 CitizenId = citizen.Id,
             }).MergeTable()
-            .OrderByDescending(points => points.Rank)
             .Take(11);
 
 #if DEBUG
@@ -992,6 +987,60 @@ public abstract class SnapshotApplicationBase
             else
                 m.HeadUrl = _systemDicDataCacheManager.HeaderImages("default");
         });
+        if (item.Any(m => m.CitizenId == _sessionContext.UserId) == false)
+        {
+            var my = (await _pointsRecordRepository.Queryable()
+               .LeftJoin<Citizen>((points, citizen) => points.UserId == citizen.Id)
+               .Where((points, citizen) => points.CreationTime >= startTime && points.CreationTime <= endTime)
+               .GroupBy((points, citizen) => new { citizen.Id, points.UserId, citizen.IsSecurityMax, citizen.Name, citizen.PhoneNumber })
+               .Select((points, citizen) => new PointsRankUserDto
+               {
+                   IsSecurityMax = citizen.IsSecurityMax ?? false,
+                   Rank = SqlFunc.MappingColumn<int>($@" DENSE_RANK() OVER (ORDER BY SUM(CASE WHEN ""points"".""Direction"" = 0 THEN ""points"".""Points"" ELSE 0 END) DESC)"),
+                   Points = SqlFunc.AggregateSum(points.Points),
+                   UserName = citizen.Name!,
+                   PhoneNumber = citizen.PhoneNumber,
+                   CitizenId = citizen.Id,
+               }).MergeTable()
+               .ToListAsync()).FirstOrDefault(m => m.CitizenId == _sessionContext.UserId);
+            if (my != null)
+            {
+                item.Insert(0, new PointsRankUserDto
+                {
+                    UserName = my.UserName,
+                    CitizenId = my.CitizenId,
+                    PhoneNumber = my.PhoneNumber,
+                    Rank = my.Rank,
+                    Points = my.Points,
+                    HeadUrl = _systemDicDataCacheManager.HeaderImages("default"),
+                    IsSecurityMax = false
+                });
+            }
+            else
+            {
+                var citizen = await _citizenRepository.GetAsync(_sessionContext.UserId);
+                var count = await _citizenRepository.CountAsync(m => m.Name != "");
+                if (citizen != null)
+                {
+                    item.Insert(0, new PointsRankUserDto
+                    {
+                        UserName = citizen.Name,
+                        CitizenId = citizen.Id,
+                        PhoneNumber = citizen.PhoneNumber,
+                        Rank = count,
+                        Points = 0,
+                        HeadUrl = _systemDicDataCacheManager.HeaderImages("default"),
+                        IsSecurityMax = false
+                    });
+                }
+            }
+        }
+        else
+        {
+            var my = item.First(m => m.CitizenId == _sessionContext.UserId);
+            item.Remove(my);
+            item.Insert(0, my);
+        }
         outDto.Ranks = item;
         return outDto;
     }

+ 17 - 8
src/Hotline.Application/Snapshot/SnapshotOrderApplication.cs

@@ -693,18 +693,27 @@ public class SnapshotOrderApplication : IOrderSnapshotApplication, IScopeDepende
     {
         if (_systemSettingCacheManager.Snapshot == false) return;
 
-        var sspSourceChannel = new List<string>() { "ZGSSP", "SJP12345"};
+        var sspSourceChannel = new List<string>() { "ZGSSP", "SJP12345" };
         if (sspSourceChannel.Any(m => m == dto.SourceChannelCode) == false)
         {
-            await _orderSnapshotRepository.Removeable()
+            await _orderSnapshotRepository.Updateable()
+                .SetColumns(m => m.IsDeleted, true)
                 .Where(m => m.Id == dto.Id)
                 .ExecuteCommandAsync(token);
-            return;
         }
-        await _orderSnapshotRepository.Updateable()
-            .SetColumns(m => m.IndustryId, dto.IndustryId)
-            .SetColumns(m => m.IndustryName, dto.IndustryName)
-            .Where(m => m.Id == dto.Id)
-            .ExecuteCommandAsync(token);
+        else
+        {
+            await _orderSnapshotRepository.Queryable(includeDeleted: true)
+                .Where(m => m.Id == dto.Id)
+                .FirstAsync(token)
+                .Then(async snapshot =>
+                {
+                    snapshot.IsDeleted = false;
+                    snapshot.IndustryId = dto.IndustryId;
+                    snapshot.IndustryName = dto.IndustryName;
+
+                    await _orderSnapshotRepository.UpdateAsync(snapshot, token);
+                });
+        }
     }
 }

+ 2 - 2
src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs

@@ -230,8 +230,8 @@ namespace Hotline.Repository.SqlSugar.Extensions
                 ////获取原生SQL推荐 5.1.4.63  性能OK
                 //Log.Information(UtilMethods.GetNativeSql(sql, pars));
 
-                Log.Information("Sql: {0}", sql);
-                Log.Information("SqlParameters: {0}", string.Join(',', pars.Select(d => d.Value)));
+                //Log.Information("Sql: {0}", sql);
+                //Log.Information("SqlParameters: {0}", string.Join(',', pars.Select(d => d.Value)));
             };
             db.Aop.OnError = (exp) =>//SQL报错
             {

+ 16 - 0
src/Hotline.Share/Dtos/JudicialManagement/EnforcementOrderListDto.cs

@@ -1,5 +1,6 @@
 using Hotline.Share.Enums.Order;
 using System.Diagnostics.Metrics;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.JudicialManagement
 {
@@ -229,6 +230,21 @@ namespace Hotline.Share.Dtos.JudicialManagement
             return $"{Province}{City}{County}";
         }
 
+        /// <summary>
+        /// 个案类型
+        /// </summary>
+        public ECaseType? CaseType { get; set; }
+
+        /// <summary>
+        /// 个案类型
+        /// </summary>
+        public string CaseTypeDesc
+        {
+            get
+            {
+                return CaseType?.GetDescription()??string.Empty;
+            }
+        }
     }
 
     public class EnforcementOrgSatisfactionOrderListDto : EnforcementOrderListDto

+ 36 - 1
src/Hotline.Share/Dtos/JudicialManagement/JudicialManagementAddOrderDto.cs

@@ -2,6 +2,8 @@
 using Hotline.Share.Enums.JudicialManagement;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
+using System.ComponentModel;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.JudicialManagement
 {
@@ -95,7 +97,24 @@ namespace Hotline.Share.Dtos.JudicialManagement
         /// <summary>
         /// 执法部门
         /// </summary>
-        public List<Kv> LawEnforcementAgencies { get; set; }
+        public List<Kv> EnforcementOrdersHandler { get; set; }
+
+        public string EnforcementOrdersHandlerText => GetText();
+
+        public string GetText()
+        {
+            string strOrgName = "";
+            if (EnforcementOrdersHandler != null && EnforcementOrdersHandler.Count > 0)
+            {
+                foreach (var item in EnforcementOrdersHandler)
+                {
+                    strOrgName += item.Key + ",";
+                }
+                if (!string.IsNullOrEmpty(strOrgName))
+                    strOrgName = strOrgName.Substring(0, strOrgName.Length - 1);
+            }
+            return strOrgName;
+        }
     }
 
     /// <summary>
@@ -251,6 +270,22 @@ namespace Hotline.Share.Dtos.JudicialManagement
         {
             return $"{Province}{City}{County}{Town}";
         }
+
+        /// <summary>
+        /// 个案类型
+        /// </summary>
+        public ECaseType? CaseType { get; set; }
+
+        /// <summary>
+        /// 个案类型
+        /// </summary>
+        public string CaseTypeDesc
+        {
+            get
+            {
+                return CaseType?.GetDescription() ?? string.Empty;
+            }
+        }
     }
 
     public class AssociatedLawEnforcementAgenciesDto

+ 155 - 90
src/Hotline.Share/Dtos/Order/OrderFinalityDto.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Requests;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Requests;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -7,93 +8,157 @@ using System.Threading.Tasks;
 
 namespace Hotline.Share.Dtos.Order
 {
-	public class OrderFinalityDto : OrderFinalityBaseDto
-	{
-		/// <summary>
-		/// 工单ID
-		/// </summary>
-		public string OrderId { get; set; }
-
-		/// <summary>
-		/// 
-		/// </summary>
-		public OrderDto Order { get; set; }
-	}
-
-	public class OrderFinalityAddDto
-	{
-
-		/// <summary>
-		/// 工单ID
-		/// </summary>
-		public List<OrdersFinalityAddDto> OrderIds { get; set; }
-	}
-	public class OrdersFinalityAddDto
-	{
-
-		public string OrderId { get; set; }
-	}
-
-	public class OrderFinalityDeleteDto
-	{
-		public List<string> Ids { get; set; }
-	}
-
-	public class OrderFinalityUpdateDto : OrderFinalityAddDto
-	{
-		public string Id { get; set; }
-	}
-
-	public record OrderFinalityListDto : PagedKeywordRequest
-	{
-		/// <summary>
-		/// 标题
-		/// </summary>
-		public string? Title { get; set; }
-
-		/// <summary>
-		/// 编号
-		/// </summary>
-		public string? No { get; set; }
-
-		/// <summary>
-		/// 是否为省工单
-		/// </summary>
-		public bool? IsProvince { get; set; }
-
-	}
-	public class OrderFinalityBaseDto
-	{
-		public DateTime? LastModificationTime { get; set; }
-
-		public bool IsDeleted { get; set; }
-
-		/// <summary>
-		/// 删除时间
-		/// </summary>
-		public DateTime? DeletionTime { get; set; }
-
-
-		/// <summary>
-		/// 创建时间
-		/// </summary>
-		public DateTime CreationTime { get; set; }
-
-		public string Id { get; set; }
-
-		/// <summary>
-		/// 组织Id
-		/// </summary>
-		public string? CreatorOrgId { get; set; }
-
-
-		public string? CreatorOrgName { get; set; }
-
-		/// <summary>
-		/// 创建人
-		/// </summary>
-		public string? CreatorId { get; set; }
-
-		public string? CreatorName { get; set; }
-	}
+    public class OrderFinalityDto : OrderFinalityBaseDto
+    {
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public OrderDto Order { get; set; }
+    }
+
+    public class OrderFinalityAddDto
+    {
+
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public List<OrdersFinalityAddDto> OrderIds { get; set; }
+    }
+    public class OrdersFinalityAddDto
+    {
+
+        public string OrderId { get; set; }
+    }
+
+    public class OrderFinalityDeleteDto
+    {
+        public List<string> Ids { get; set; }
+    }
+
+    public class OrderFinalityUpdateDto : OrderFinalityAddDto
+    {
+        public string Id { get; set; }
+    }
+
+    public record OrderFinalityListDto : PagedKeywordRequest
+    {
+        /// <summary>
+        /// 编号
+        /// </summary>
+        public string? No { get; set; }
+
+        /// <summary>
+        /// 工单状态
+        /// </summary>
+        public EOrderStatus? Status { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? Channel { get; set; }
+
+        /// <summary>
+        /// 当前节点
+        /// </summary>
+        public string? CurrentStepCode { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string? Title { get; set; }
+
+        /// <summary>
+        /// 受理时间(工单创建时间)
+        /// </summary>
+        public DateTime? CreationTimeStart { get; set; }
+        public DateTime? CreationTimeEnd { get; set; }
+
+        /// <summary>
+        /// 设置人
+        /// </summary>
+        public string? CreatorName { get; set; }
+
+        /// <summary>
+        /// 设置时间
+        /// </summary>
+        public DateTime? SetCreationTimeStart { get; set; }
+        public DateTime? SetCreationTimeEnd { get; set; }
+
+        /// <summary>
+        /// 期满时间
+        /// </summary>
+        public DateTime? ExpiredTimeStart { get; set; }
+        public DateTime? ExpiredTimeEnd { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 热点分类关键词
+        /// </summary>
+        public string? Hotspot { get; set; }
+
+        /// <summary>
+        /// 接办部门
+        /// </summary>
+        public string? CurrentHandleOrgName { get; set; }
+
+        /// <summary>
+        /// 接办时间
+        /// </summary>
+        public DateTime? CurrentHandleTimeStart { get; set; }
+        public DateTime? CurrentHandleTimeEnd { get; set; }
+
+        /// <summary>
+        /// 办结时间
+        /// </summary>
+        public DateTime? FiledTimeStart { get; set; }
+        public DateTime? FiledTimeEnd { get; set; }
+
+        /// <summary>
+        /// 省工单
+        /// </summary>
+        public bool? IsProvinceOrder { get; set; }
+    }
+    public class OrderFinalityBaseDto
+    {
+        public DateTime? LastModificationTime { get; set; }
+
+        public bool IsDeleted { get; set; }
+
+        /// <summary>
+        /// 删除时间
+        /// </summary>
+        public DateTime? DeletionTime { get; set; }
+
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
+
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 组织Id
+        /// </summary>
+        public string? CreatorOrgId { get; set; }
+
+
+        public string? CreatorOrgName { get; set; }
+
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        public string? CreatorId { get; set; }
+
+        public string? CreatorName { get; set; }
+    }
 }

+ 36 - 1
src/Hotline.Share/Dtos/Order/OrderSecondaryHandlingDto.cs

@@ -207,5 +207,40 @@ namespace Hotline.Share.Dtos.Order
 		/// </summary>
 		public string? Title { get; set;}
 
-	}
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? Channel { get; set; }
+
+        /// <summary>
+        /// 重提办理
+        /// </summary>
+        public int? SendBack { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 热点分类关键词
+        /// </summary>
+        public string? Hotspot { get; set; }
+
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string? ApplyName { get; set; }
+
+        /// <summary>
+        /// 申请部门
+        /// </summary>
+        public string? ApplyOrgName { get; set; }
+
+        /// <summary>
+        /// 申请时间
+        /// </summary>
+        public DateTime? ApplyTimeStart { get; set; }
+        public DateTime? ApplyTimeEnd { get; set; }
+    }
 }

+ 305 - 25
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -570,8 +570,6 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public bool? IsApply { get; set; }
 
-        public EDelayState? DelayState { get; set; }
-
         /// <summary>
         /// 延期状态快捷查询
         /// </summary>
@@ -593,11 +591,6 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string? ActualHandlerName { get; set; }
 
-        /// <summary>
-        /// 一级部门
-        /// </summary>
-		public string? OrgLevelOneName { get; set; }
-
         /// <summary>
         /// 延期申请时间
         /// </summary>
@@ -609,14 +602,54 @@ namespace Hotline.Share.Dtos.Order
         public DateTime? EndCreationTime { get; set; }
 
         /// <summary>
-        /// 受理类型
+        /// 期满时间
         /// </summary>
-        public string? AcceptType { get; set; }
+        public DateTime? ExpiredTimeStart { get; set; }
+        public DateTime? ExpiredTimeEnd { get; set; }
 
         /// <summary>
-        /// 热点分类关键词
+        /// 延期申请人
         /// </summary>
-        public string? Hotspot { get; set; }
+        public string? DelayApplyName { get; set; }
+
+        /// <summary>
+        /// 延期申请部门
+        /// </summary>
+        public string? DelayApplyOrgName { get; set; }
+
+        /// <summary>
+        /// 是否自动延期
+        /// </summary>
+        public bool? IsAutomaticDelay { get; set; }
+
+
+
+
+
+        /// <summary>
+        /// 工单编码
+        /// </summary>
+        public string? No { get; set; }
+
+        /// <summary>
+        /// 省工单
+        /// </summary>
+        public bool? IsProvinceOrder { get; set; }
+
+        /// <summary>
+        /// 工单标题
+        /// </summary>
+        public string? Title { get; set; }
+
+        /// <summary>
+        /// 延期审批状态
+        /// </summary>
+        public EDelayState? DelayState { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? Channel { get; set; }
 
         /// <summary>
         /// 受理时间(工单创建时间)
@@ -625,30 +658,84 @@ namespace Hotline.Share.Dtos.Order
         public DateTime? CreationTimeEnd { get; set; }
 
         /// <summary>
-        /// 期满时间
+        /// 受理人
         /// </summary>
-        public DateTime? ExpiredTimeStart { get; set; }
-        public DateTime? ExpiredTimeEnd { get; set; }
+        public string? AcceptorName { get; set; }
 
         /// <summary>
-        /// 来源渠道
+        /// 热点分类关键词
         /// </summary>
-        public string? Channel { get; set; }
+        public string? Hotspot { get; set; }
+
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptType { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 一级部门
+        /// </summary>
+        public string? OrgLevelOneName { get; set; }
+
+        /// <summary>
+        /// 接办部门
+        /// </summary>
+        public string? CurrentHandleOrgName { get; set; }
+
+        /// <summary>
+        /// 接办时间
+        /// </summary>
+        public DateTime? CurrentHandleTimeStart { get; set; }
+        public DateTime? CurrentHandleTimeEnd { get; set; }
+
+        /// <summary>
+        /// 延期申请时间
+        /// </summary>
+        public DateTime? ApplyTimeStart { get; set; }
+        public DateTime? ApplyTimeEnd { get; set; }
 
         /// <summary>
         /// 延期申请人
         /// </summary>
-        public string? DelayApplyName { get; set; }
+        public string? ApplyName { get; set; }
 
         /// <summary>
         /// 延期申请部门
         /// </summary>
-        public string? DelayApplyOrgName { get; set; }
+        public string? ApplyOrgName { get; set; }
 
         /// <summary>
-        /// 是否自动延期
+        /// 延期申请时限
         /// </summary>
-        public bool? IsAutomaticDelay { get; set; }
+        public int? DelayNum { get; set; }
+
+        /// <summary>
+        /// 延期申请单位
+        /// </summary>
+        public ETimeType? DelayUnit { get; set; }
+
+        /// <summary>
+        /// 工单状态
+        /// </summary>
+        public EOrderStatus? Status { get; set; }
+
+        /// <summary>
+        /// 申请理由
+        /// </summary>
+        public string? DelayReason { get; set; }
+
+        /// <summary>
+        /// 申请前期满时间
+        /// </summary>
+        public DateTime? BeforeDelayStart { get; set; }
+        public DateTime? BeforeDelayEnd { get; set; }
+
     }
 
     public record ApplySuperviseDto
@@ -663,8 +750,111 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int? SuperviseState { get; set; }
 
+
+        /// <summary>
+        /// 工单编码
+        /// </summary>
+        public string? No { get; set; }
+
+        /// <summary>
+        /// 省工单
+        /// </summary>
+        public bool? IsProvinceOrder { get; set; }
+
+        /// <summary>
+        /// 工单标题
+        /// </summary>
+        public string? Title { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? Channel { get; set; }
+
+        /// <summary>
+        /// 工单状态
+        /// </summary>
+        public EOrderStatus? Status { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 热点分类关键词
+        /// </summary>
+        public string? Hotspot { get; set; }
+
+        /// <summary>
+        /// 受理人
+        /// </summary>
+        public string? AcceptorName { get; set; }
+
+        /// <summary>
+        /// 接办部门
+        /// </summary>
+        public string? CurrentHandleOrgName { get; set; }
+
+        /// <summary>
+        /// 受理时间(工单创建时间)
+        /// </summary>
         public DateTime? CreationTimeStart { get; set; }
         public DateTime? CreationTimeEnd { get; set; }
+
+        /// <summary>
+        /// 期满时间
+        /// </summary>
+        public DateTime? ExpiredTimeStart { get; set; }
+        public DateTime? ExpiredTimeEnd { get; set; }
+
+        /// <summary>
+        /// 督办时间
+        /// </summary>
+        public DateTime? SuperviseTimeStart { get; set; }
+        public DateTime? SuperviseTimeEnd { get; set; }
+
+        /// <summary>
+        /// 督办回复时限
+        /// </summary>
+        public DateTime? ReplyLimitTimeStart { get; set; }
+        public DateTime? ReplyLimitTimeEnd { get; set; }
+
+        /// <summary>
+        /// 督办回复时间
+        /// </summary>
+        public DateTime? ReplyTimeStart { get; set; }
+        public DateTime? ReplyTimeEnd { get; set; }
+
+        /// <summary>
+        /// 督办回复内容
+        /// </summary>
+        public string? ReplyContent { get; set; }
+
+        /// <summary>
+        /// 督办人
+        /// </summary>
+        public string? CrUser { get; set; }
+
+        /// <summary>
+        /// 督办部门
+        /// </summary>
+        public string? LaunchOrgName { get; set; }
+
+        /// <summary>
+        /// 被督办部门
+        /// </summary>
+        public string? OrgName { get; set; }
+
+        /// <summary>
+        /// 督办意见
+        /// </summary>
+        public string? ApplyContent { get; set; }
+
+        /// 督办签收时间
+        /// </summary>
+        public DateTime? SignTimeStart { get; set; }
+        public DateTime? SignTimeEnd { get; set; }
     }
 
     public record ScreenListDto : PagedKeywordRequest
@@ -973,6 +1163,10 @@ namespace Hotline.Share.Dtos.Order
         /// 回复状态
         /// </summary>
         public int? UrgeState { get; set; }
+
+        /// <summary>
+        /// 受理时间(工单创建时间)
+        /// </summary>
         public DateTime? CreationTimeStart { get; set; }
         public DateTime? CreationTimeEnd { get; set; }
 
@@ -990,6 +1184,91 @@ namespace Hotline.Share.Dtos.Order
         /// 当前办理节点
         /// </summary>
         public string? CurrentStepCode { get; set; }
+
+
+        /// <summary>
+        /// 工单编码
+        /// </summary>
+        public string? No { get; set; }
+
+        /// <summary>
+        /// 省工单
+        /// </summary>
+        public bool? IsProvinceOrder { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? Channel { get; set; }
+
+        /// <summary>
+        /// 期满时间
+        /// </summary>
+        public DateTime? ExpiredTimeStart { get; set; }
+        public DateTime? ExpiredTimeEnd { get; set; }
+
+        /// <summary>
+        /// 工单状态
+        /// </summary>
+        public EOrderStatus? Status { get; set; }
+
+        /// <summary>
+        /// 工单标题
+        /// </summary>
+        public string? Title { get; set; }
+
+        /// <summary>
+        /// 接办部门
+        /// </summary>
+        public string? CurrentHandleOrgName { get; set; }
+
+        /// <summary>
+        /// 接办时间
+        /// </summary>
+        public DateTime? CurrentHandleTimeStart { get; set; }
+        public DateTime? CurrentHandleTimeEnd { get; set; }
+
+        /// <summary>
+        /// 热点分类关键词
+        /// </summary>
+        public string? Hotspot { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 催办人
+        /// </summary>
+        public string? CrUser { get; set; }
+
+        /// <summary>
+        /// 催办部门
+        /// </summary>
+        public string? CreatorOrgName { get; set; }
+
+        /// <summary>
+        /// 催办时间
+        /// </summary>
+        public DateTime? CrTimeStart { get; set; }
+        public DateTime? CrTimeEnd { get; set; }
+
+        /// <summary>
+        /// 被催办部门
+        /// </summary>
+        public string? OrgName { get; set; }
+
+        /// <summary>
+        /// 催办内容
+        /// </summary>
+        public string? ApplyContent { get; set; }
+
+        /// <summary>
+        /// 催办状态
+        /// </summary>
+        public int? CrState { get; set; }
+
     }
 
     public class QueryRepeatableEventDto
@@ -1066,15 +1345,16 @@ namespace Hotline.Share.Dtos.Order
     }
 
 
-    public record SeatSendBackStatisticsDetail : PagedKeywordRequest {
+    public record SeatSendBackStatisticsDetail : PagedKeywordRequest
+    {
 
 
         public string UserId { get; set; }
-		public string StatisticsType { get; set; }
+        public string StatisticsType { get; set; }
 
-		public string? No { get; set; }
+        public string? No { get; set; }
 
-		public string? Title { get; set; }
+        public string? Title { get; set; }
 
 
         /// <summary>
@@ -1096,7 +1376,7 @@ namespace Hotline.Share.Dtos.Order
     }
 
 
-	public enum EPublicState
+    public enum EPublicState
     {
         /// <summary>
         /// 全部

+ 261 - 200
src/Hotline.Share/Dtos/Order/SendBackDto.cs

@@ -12,207 +12,268 @@ using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Order
 {
-	public class AuditSendBackDto
-	{
-		public string Id { get; set; }
-
-		/// <summary>
-		///  审核结果
-		/// </summary>
-		public ESendBackAuditState State { get; set; }
-
-		/// <summary>
-		/// 审核意见
-		/// </summary>
-		public string? AuditContent { get; set; }
-
-
-			/// <summary>
-		/// 是否允许再次退回
-		/// </summary>
-		public bool? IsReturnAgain { get; set; }
-
-	}
-
-	public class BatchAuditSendBackDto : AuditSendBackDto {
-		public List<string> Ids { get; set; }
-	}
-	public class SendBackDto : SendBackBaseDto
-	{
-		/// <summary>
-		/// 工单ID
-		/// </summary>
-		public string OrderId { get; set; }
-
-
-		/// <summary>
-		/// 退回原因
-		/// </summary>
-		public string? Content { get; set; }
-
-		/// <summary>
-		/// 审批意见
-		/// </summary>
-		public string? AuditContent { get; set; }
-
-		/// <summary>
-		/// 工单
-		/// </summary>
-		public OrderDto Order { get; set; }
-
-		/// <summary>
-		/// 退回数据
-		/// </summary>
-		public PreviousWorkflowDto SendBackData { get; set; }
-
-		/// <summary>
-		/// 审批人ID
-		/// </summary>
-		public string? AuditId { get; set; }
-
-		public string? AuditUser { get; set; }
-
-
-		/// <summary>
-		/// 审批时间
-		/// </summary>
-		public DateTime? AuditTime { get; set; }
-
-		/// <summary>
-		/// 申请部门ID
-		/// </summary>
-		public string ApplyOrgId { get; set; }
-
-		/// <summary>
-		/// 申请部门名称
-		/// </summary>
-		public string ApplyOrgName { get; set; }
-
-		/// <summary>
-		/// 退回部门ID
-		/// </summary>
-		public string SendBackOrgId { get; set; }
-
-		/// <summary>
-		/// 退回部门名称
-		/// </summary>
-		public string SendBackOrgName { get; set; }
-
-		/// <summary>
-		///  审核结果  0  待审核  1 审核通过  2 审核不通过
-		/// </summary>
-		public ESendBackAuditState State { get; set; }
-
-		public string StateText => State.GetDescription();
-		/// <summary>
-		/// 退回节点名称
-		/// </summary>
-		public string? SendBackStepName { get; set; }
-
-		/// <summary>
-		/// 退回节点创建时间
-		/// </summary>
-		public DateTime? WorkflowStepSendBackCrTime { get; set; }
-
-		/// <summary>
-		///  退回时差
-		/// </summary>
-		public double SendBackTimeDifference => GetSendBackTimeDifference();
-
-		public double GetSendBackTimeDifference() {
-			if (WorkflowStepSendBackCrTime.HasValue)
-			{
-				TimeSpan? timeDifference = CreationTime - WorkflowStepSendBackCrTime;
-				return Math.Round(timeDifference.Value.TotalMinutes / 60, 1);
-			}
-			return 0;
-		}
-
-		public bool IsReturnAgainShow => ApplyOrgId != "001" && SendBackOrgId == "001";
-		/// <summary>
-		/// 附件列表
-		/// </summary>
-		public List<FileDto> Files { get; set; } = new();
-	}
-	public class SendBackBaseDto
-	{
-		public DateTime? LastModificationTime { get; set; }
-
-		public bool IsDeleted { get; set; }
-
-		/// <summary>
-		/// 删除时间
-		/// </summary>
-		public DateTime? DeletionTime { get; set; }
-
-
-		/// <summary>
-		/// 创建时间
-		/// </summary>
-		public DateTime CreationTime { get; set; }
-
-		public string Id { get; set; }
-
-		/// <summary>
-		/// 组织Id
-		/// </summary>
-		public string? CreatorOrgId { get; set; }
-
-
-		public string? CreatorOrgName { get; set; }
-
-		/// <summary>
-		/// 创建人
-		/// </summary>
-		public string? CreatorId { get; set; }
-
-		public string? CreatorName { get; set; }
-	}
-	public record SendBackListDto : PagedKeywordRequest
-	{
-		/// <summary>
-		/// </summary>
-		public ESendBackAuditState? State { get; set; }
-
-		/// <summary>
-		/// 1 待办  2 已办 3全部
-		/// </summary>
-		public int AuditState { get; set; }
-
-		/// <summary>
-		/// 0 全部  1 我的
-		/// </summary>
-		public int? DataScope { get; set; }
-
-		/// <summary>
-		/// 工单标题
-		/// </summary>
-		public string Title { get; set; }
-
-		/// <summary>
-		/// 工单编号
-		/// </summary>
-		public string No { get; set; }
-
-		/// <summary>
-		/// 受理类型
-		/// </summary>
-		public string? AcceptTypeCode { get; set; }
-
-		/// <summary>
-		/// 申请部门
-		/// </summary>
-		public string? OrgName { get; set; }
-
-		/// <summary>
-		/// 期满时间开始
-		/// </summary>
-		public DateTime? ExpiredTimeStart { get; set; }
-
-		/// <summary>
-		/// 期满时间结束
-		/// </summary>
+    public class AuditSendBackDto
+    {
+        public string Id { get; set; }
+
+        /// <summary>
+        ///  审核结果
+        /// </summary>
+        public ESendBackAuditState State { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string? AuditContent { get; set; }
+
+
+        /// <summary>
+        /// 是否允许再次退回
+        /// </summary>
+        public bool? IsReturnAgain { get; set; }
+
+    }
+
+    public class BatchAuditSendBackDto : AuditSendBackDto
+    {
+        public List<string> Ids { get; set; }
+    }
+    public class SendBackDto : SendBackBaseDto
+    {
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+
+        /// <summary>
+        /// 退回原因
+        /// </summary>
+        public string? Content { get; set; }
+
+        /// <summary>
+        /// 审批意见
+        /// </summary>
+        public string? AuditContent { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        public OrderDto Order { get; set; }
+
+        /// <summary>
+        /// 退回数据
+        /// </summary>
+        public PreviousWorkflowDto SendBackData { get; set; }
+
+        /// <summary>
+        /// 审批人ID
+        /// </summary>
+        public string? AuditId { get; set; }
+
+        public string? AuditUser { get; set; }
+
+
+        /// <summary>
+        /// 审批时间
+        /// </summary>
+        public DateTime? AuditTime { get; set; }
+
+        /// <summary>
+        /// 申请部门ID
+        /// </summary>
+        public string ApplyOrgId { get; set; }
+
+        /// <summary>
+        /// 申请部门名称
+        /// </summary>
+        public string ApplyOrgName { get; set; }
+
+        /// <summary>
+        /// 退回部门ID
+        /// </summary>
+        public string SendBackOrgId { get; set; }
+
+        /// <summary>
+        /// 退回部门名称
+        /// </summary>
+        public string SendBackOrgName { get; set; }
+
+        /// <summary>
+        ///  审核结果  0  待审核  1 审核通过  2 审核不通过
+        /// </summary>
+        public ESendBackAuditState State { get; set; }
+
+        public string StateText => State.GetDescription();
+        /// <summary>
+        /// 退回节点名称
+        /// </summary>
+        public string? SendBackStepName { get; set; }
+
+        /// <summary>
+        /// 退回节点创建时间
+        /// </summary>
+        public DateTime? WorkflowStepSendBackCrTime { get; set; }
+
+        /// <summary>
+        ///  退回时差
+        /// </summary>
+        public double SendBackTimeDifference => GetSendBackTimeDifference();
+
+        public double GetSendBackTimeDifference()
+        {
+            if (WorkflowStepSendBackCrTime.HasValue)
+            {
+                TimeSpan? timeDifference = CreationTime - WorkflowStepSendBackCrTime;
+                return Math.Round(timeDifference.Value.TotalMinutes / 60, 1);
+            }
+            return 0;
+        }
+
+        public bool IsReturnAgainShow => ApplyOrgId != "001" && SendBackOrgId == "001";
+        /// <summary>
+        /// 附件列表
+        /// </summary>
+        public List<FileDto> Files { get; set; } = new();
+    }
+    public class SendBackBaseDto
+    {
+        public DateTime? LastModificationTime { get; set; }
+
+        public bool IsDeleted { get; set; }
+
+        /// <summary>
+        /// 删除时间
+        /// </summary>
+        public DateTime? DeletionTime { get; set; }
+
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
+
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 组织Id
+        /// </summary>
+        public string? CreatorOrgId { get; set; }
+
+
+        public string? CreatorOrgName { get; set; }
+
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        public string? CreatorId { get; set; }
+
+        public string? CreatorName { get; set; }
+    }
+    public record SendBackListDto : PagedKeywordRequest
+    {
+        /// <summary>
+        /// </summary>
+        public ESendBackAuditState? State { get; set; }
+
+        /// <summary>
+        /// 1 待办  2 已办 3全部
+        /// </summary>
+        public int AuditState { get; set; }
+
+        /// <summary>
+        /// 0 全部  1 我的
+        /// </summary>
+        public int? DataScope { get; set; }
+
+        /// <summary>
+        /// 工单标题
+        /// </summary>
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        public string No { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 申请部门
+        /// </summary>
+        public string? ApplyOrgName { get; set; }
+
+        /// <summary>
+        /// 期满时间开始
+        /// </summary>
+        public DateTime? ExpiredTimeStart { get; set; }
+
+        /// <summary>
+        /// 期满时间结束
+        /// </summary>
         public DateTime? ExpiredTimeEnd { get; set; }
 
+        /// <summary>
+        /// 是否省工单
+        /// </summary>
+        public bool? IsProvinceOrder { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? Channel { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptType { get; set; }
+
+        /// <summary>
+        /// 热点分类关键词
+        /// </summary>
+        public string? Hotspot { get; set; }
+
+        /// <summary>
+        /// 最近派单员
+        /// </summary>
+        public string? CenterToOrgHandlerName { get; set; }
+
+        /// <summary>
+        /// 退回节点
+        /// </summary>
+        public string? SendBackStepName { get; set; }
+
+        /// <summary>
+        /// 退回时差
+        /// </summary>
+        public int? SendBackTimeDifference { get; set; }
+
+        /// <summary>
+        /// 受理人
+        /// </summary>
+        public string? NameOrNo { get; set; }
+
+        /// <summary>
+        /// 一级部门
+        /// </summary>
+        public string? OrgLevelOneName { get; set; }
+
+        /// <summary>
+        /// 受理内容
+        /// </summary>
+        public string? Content { get; set; }
+
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string? ApplyName { get; set; }
+
+        /// <summary>
+        /// 申请理由
+        /// </summary>
+        public string? Opinion { get; set; }
     }
 }

+ 54 - 1
src/Hotline.Share/Dtos/Quality/QualityDto.cs

@@ -1,5 +1,6 @@
 
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Quality;
 using Hotline.Share.Requests;
 using XF.Utility.EnumExtensions;
@@ -239,7 +240,7 @@ namespace Hotline.Share.Dtos.Quality
         public EQualityState? State { get; set; }
 
         /// <summary>
-        /// 质检状态
+        /// 质检来源
         /// </summary>
         public EQualitySource? Source { get; set; }
         public DateTime? CreationTimeStart { get; set; }
@@ -259,6 +260,58 @@ namespace Hotline.Share.Dtos.Quality
         /// 工单编码
         /// </summary>
         public string? No { get; set; }
+
+        /// <summary>
+        /// 质检方式
+        /// </summary>
+        public string? Mode { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? Channel { get; set; }
+
+        /// <summary>
+        /// 受理时间(工单创建时间)
+        /// </summary>
+        public DateTime? AcceptanceTimeStart { get; set; }
+        public DateTime? AcceptanceTimeEnd { get; set; }
+
+        /// <summary>
+        /// 工单状态
+        /// </summary>
+        public EOrderStatus? Status { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 热点分类关键词
+        /// </summary>
+        public string? Hotspot { get; set; }
+
+        /// <summary>
+        /// 受理坐席名字或工号
+        /// </summary>
+        public string? NameOrNo { get; set; }
+
+        /// <summary>
+        /// 来电号码
+        /// </summary>
+        public string? FromPhone { get; set; }
+
+        /// <summary>
+        /// 质检人
+        /// </summary>
+        public string? UserName { get; set; }
+
+        /// <summary>
+        /// 质检时间
+        /// </summary>
+        public DateTime? QualityTimeStart { get; set; }
+        public DateTime? QualityTimeEnd { get; set; }
     }
 
     public class AiQualityXTDto

+ 167 - 134
src/Hotline.Share/Dtos/Quality/QualityItemDto.cs

@@ -9,138 +9,171 @@ using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Quality
 {
-	public class QualityItemAddDto
-	{
-		/// <summary>
-		/// 质检项目名称
-		/// </summary>
-		public string Name { get; set; }
-
-		/// <summary>
-		/// 质检项目描述
-		/// </summary>
-		public string? Describe { get; set; }
-
-		/// <summary>
-		/// 质检项目分组名称
-		/// </summary>
-		public string GroupingName { get; set; }
-
-		/// <summary>
-		/// 是否智能质检项目
-		/// </summary>
-		public int IsIntelligent { get; set; }
-
-		/// <summary>
-		/// 分值
-		/// </summary>
-		public int Grade { get; set; }
-
-		/// <summary>
-		/// 启禁用
-		/// </summary>
-		public int IsEnable { get; set; }
-	}
-	public class QualityItemDeleteDto
-	{
-		public string Id { get; set; }
-	}
-	public class QualityItemBatchDeleteDto
-	{
-		public List<string> Ids { get; set; }
-	}
-	public class QualityItemUpdateDto : QualityItemAddDto
-	{
-		public string Id { get; set; }
-	}
-	public record QualityItemListDto : PagedKeywordRequest
-	{
-		/// <summary>
-		/// 质检项目名称
-		/// </summary>
-		public string? Name { get; set; }
-
-		/// <summary>
-		/// 质检项目分组名称
-		/// </summary>
-		public string? GroupingName { get; set; }
-
-		/// <summary>
-		/// 启禁用
-		/// </summary>
-		public int? IsEnable { get; set; }
-	}
-	public class QualityItemBaseDto
-	{
-		public DateTime? LastModificationTime { get; set; }
-
-		public bool IsDeleted { get; set; }
-
-		/// <summary>
-		/// 删除时间
-		/// </summary>
-		public DateTime? DeletionTime { get; set; }
-
-
-		/// <summary>
-		/// 创建时间
-		/// </summary>
-		public DateTime CreationTime { get; set; }
-
-		public string Id { get; set; }
-
-		/// <summary>
-		/// 组织Id
-		/// </summary>
-		public string? CreatorOrgId { get; set; }
-
-
-		public string? CreatorOrgName { get; set; }
-
-		/// <summary>
-		/// 创建人
-		/// </summary>
-		public string? CreatorId { get; set; }
-
-		public string? CreatorName { get; set; }
-	}
-
-	public class QualityItemDto : QualityItemBaseDto
-	{
-		/// <summary>
-		/// 质检项目名称
-		/// </summary>
-		public string Name { get; set; }
-
-		/// <summary>
-		/// 质检项目描述
-		/// </summary>
-		public string? Describe { get; set; }
-
-		/// <summary>
-		/// 质检项目分组名称
-		/// </summary>
-		public string GroupingName { get; set; }
-
-		/// <summary>
-		/// 是否智能质检项目
-		/// </summary>
-		public int IsIntelligent { get; set; }
-
-		/// <summary>
-		/// 分值
-		/// </summary>
-		public int Grade { get; set; }
-
-		/// <summary>
-		/// 启禁用
-		/// </summary>
-		public int IsEnable { get; set; }
-
-		/// <summary>
-		/// 最近更新人
-		/// </summary>
-		public string? LastModificationName { get; set; }
-
-	}
+    public class QualityItemAddDto
+    {
+        /// <summary>
+        /// 质检项目名称
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 质检项目描述
+        /// </summary>
+        public string? Describe { get; set; }
+
+        /// <summary>
+        /// 质检项目分组名称
+        /// </summary>
+        public string GroupingName { get; set; }
+
+        /// <summary>
+        /// 是否智能质检项目
+        /// </summary>
+        public int IsIntelligent { get; set; }
+
+        /// <summary>
+        /// 分值
+        /// </summary>
+        public int Grade { get; set; }
+
+        /// <summary>
+        /// 启禁用
+        /// </summary>
+        public int IsEnable { get; set; }
+    }
+    public class QualityItemDeleteDto
+    {
+        public string Id { get; set; }
+    }
+    public class QualityItemBatchDeleteDto
+    {
+        public List<string> Ids { get; set; }
+    }
+    public class QualityItemUpdateDto : QualityItemAddDto
+    {
+        public string Id { get; set; }
+    }
+    public record QualityItemListDto : PagedKeywordRequest
+    {
+        /// <summary>
+        /// 质检项目名称
+        /// </summary>
+        public string? Name { get; set; }
+
+        /// <summary>
+        /// 质检项目分组名称
+        /// </summary>
+        public string? GroupingName { get; set; }
+
+        /// <summary>
+        /// 启禁用
+        /// </summary>
+        public int? IsEnable { get; set; }
+
+        /// <summary>
+        /// 质检项目描述
+        /// </summary>
+        public string? Describe { get; set; }
+
+        /// <summary>
+        /// 分值
+        /// </summary>
+        public int? MaxGrade { get; set; }
+        public int? MinGrade { get; set; }
+
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        public string? CreatorName { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime? CreationTimeStart { get; set; }
+        public DateTime? CreationTimeEnd { get; set; }
+
+        /// <summary>
+        /// 更新人
+        /// </summary>
+        public string? LastModificationName { get; set; }
+
+        /// <summary>
+        /// 更新时间
+        /// </summary>
+        public DateTime? LastModificationTimeStart { get; set; }
+        public DateTime? LastModificationTimeEnd { get; set; }
+    }
+    public class QualityItemBaseDto
+    {
+        public DateTime? LastModificationTime { get; set; }
+
+        public bool IsDeleted { get; set; }
+
+        /// <summary>
+        /// 删除时间
+        /// </summary>
+        public DateTime? DeletionTime { get; set; }
+
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
+
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 组织Id
+        /// </summary>
+        public string? CreatorOrgId { get; set; }
+
+
+        public string? CreatorOrgName { get; set; }
+
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        public string? CreatorId { get; set; }
+
+        public string? CreatorName { get; set; }
+    }
+
+    public class QualityItemDto : QualityItemBaseDto
+    {
+        /// <summary>
+        /// 质检项目名称
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 质检项目描述
+        /// </summary>
+        public string? Describe { get; set; }
+
+        /// <summary>
+        /// 质检项目分组名称
+        /// </summary>
+        public string GroupingName { get; set; }
+
+        /// <summary>
+        /// 是否智能质检项目
+        /// </summary>
+        public int IsIntelligent { get; set; }
+
+        /// <summary>
+        /// 分值
+        /// </summary>
+        public int Grade { get; set; }
+
+        /// <summary>
+        /// 启禁用
+        /// </summary>
+        public int IsEnable { get; set; }
+
+        /// <summary>
+        /// 最近更新人
+        /// </summary>
+        public string? LastModificationName { get; set; }
+
+    }
 }

+ 23 - 1
src/Hotline.Share/Dtos/Quality/QualityTemplateDto.cs

@@ -62,7 +62,29 @@ namespace Hotline.Share.Dtos.Quality
 		/// 启禁用
 		/// </summary>
 		public int? IsEnable { get; set; }
-	}
+
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        public string? CreatorName { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime? CreationTimeStart { get; set; }
+        public DateTime? CreationTimeEnd { get; set; }
+
+        /// <summary>
+        /// 更新人
+        /// </summary>
+        public string? LastModificationName { get; set; }
+
+        /// <summary>
+        /// 更新时间
+        /// </summary>
+        public DateTime? LastModificationTimeStart { get; set; }
+        public DateTime? LastModificationTimeEnd { get; set; }
+    }
 	public class TemplateBaseDto
 	{
 		public DateTime? LastModificationTime { get; set; }

+ 0 - 1
src/Hotline.Share/Dtos/Snapshot/PointsDto.cs

@@ -115,7 +115,6 @@ public class PointsRankUserDto
     /// </summary>
     public string UserName { get; set; }
 
-
     private string _phoneNumber;
     /// <summary>
     /// 联系电话

+ 2 - 2
src/Hotline.Share/Enums/Order/ECaseType.cs

@@ -12,9 +12,9 @@ namespace Hotline.Share.Enums.Order
         General=0,
 
         /// <summary>
-        /// 特别关注个案
+        /// 重点关注个案
         /// </summary>
-        [Description("特别关注个案")]
+        [Description("重点关注个案")]
         Special=1
     }
 }

+ 8 - 0
src/Hotline/Caching/Services/SystemSettingCacheManager.cs

@@ -80,6 +80,14 @@ namespace Hotline.Caching.Services
 
                 try
                 {
+                    var targetType = typeof(T);
+                    if (targetType.IsEnum)
+                    {
+                        if (value is string strValue)
+                            return (T)Enum.Parse(targetType, strValue, ignoreCase: true);
+                        else
+                            return (T)Enum.ToObject(targetType, value);
+                    }
                     return (T)Convert.ChangeType(value, typeof(T));
                 }
                 catch (InvalidCastException e)

+ 75 - 0
src/Hotline/Tools/LocationConverter.cs

@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Tools;
+
+public static class LocationConverter
+{
+    private const double Pi = Math.PI;
+    private const double A = 6378245.0;
+    private const double Ee = 0.006693421622965943;
+
+    public static (double lat, double lon)  Wgs84ToGcj02(double lat, double lon)
+    {
+        double dLat = TransformLat(lon - 105.0, lat - 35.0);
+        double dLon = TransformLon(lon - 105.0, lat - 35.0);
+        double radLat = lat / 180.0 * Pi;
+        double magic = Math.Sin(radLat);
+        magic = 1.0 - Ee * magic * magic;
+        double sqrtMagic = Math.Sqrt(magic);
+        dLat = dLat * 180.0 / A * (1.0 - Ee) / magic * sqrtMagic * Pi;
+        dLon = dLon * 180.0 / A / sqrtMagic * Math.Cos(radLat) * Pi;
+
+        double mgLat = lat + dLat;
+        double mgLon = lon + dLon;
+
+        return (mgLat, mgLon);
+    }
+
+    public static (double lat, double lon) Gcj02ToWgs84(double lat, double lon)
+    {
+        var gps = Transform(lat, lon);
+        double lontitude = lon * 2.0 - gps.lon;
+        double latitude = lat * 2.0 - gps.lat;
+
+        return (latitude, lontitude);
+    }
+
+    private static double TransformLat(double x, double y)
+    {
+        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
+        ret += (20.0 * Math.Sin(6.0 * x * Pi) + 20.0 * Math.Sin(2.0 * x * Pi)) * 2.0 / 3.0;
+        ret += (20.0 * Math.Sin(y * Pi) + 40.0 * Math.Sin(y / 3.0 * Pi)) * 2.0 / 3.0;
+        ret += (160.0 * Math.Sin(y / 12.0 * Pi) + 320.0 * Math.Sin(y * Pi / 30.0)) * 2.0 / 3.0;
+        return ret;
+    }
+
+    private static double TransformLon(double x, double y)
+    {
+        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
+        ret += (20.0 * Math.Sin(6.0 * x * Pi) + 20.0 * Math.Sin(2.0 * x * Pi)) * 2.0 / 3.0;
+        ret += (20.0 * Math.Sin(x * Pi) + 40.0 * Math.Sin(x / 3.0 * Pi)) * 2.0 / 3.0;
+        ret += (150.0 * Math.Sin(x / 12.0 * Pi) + 300.0 * Math.Sin(x / 30.0 * Pi)) * 2.0 / 3.0;
+        return ret;
+    }
+
+    private static (double lat, double lon) Transform(double lat, double lon)
+    {
+        double dLat = TransformLat(lon - 105.0, lat - 35.0);
+        double dLon = TransformLon(lon - 105.0, lat - 35.0);
+        double radLat = lat / 180.0 * Pi;
+        double magic = Math.Sin(radLat);
+        magic = 1.0 - Ee * magic * magic;
+        double sqrtMagic = Math.Sqrt(magic);
+        dLat = dLat * 180.0 / A * (1.0 - Ee) / magic * sqrtMagic * Pi;
+        dLon = dLon * 180.0 / A / sqrtMagic * Math.Cos(radLat) * Pi;
+
+        double mgLat = lat + dLat;
+        double mgLon = lon + dLon;
+
+        return (mgLat, mgLon);
+    }
+}

+ 1 - 1
src/TianQue.Sdk/TQHttpClient.cs

@@ -104,7 +104,7 @@ public class TQHttpClient
         }
         finally
         {
-            if (_sshClient.IsConnected)
+            if (_sshClient != null && _sshClient.IsConnected)
             {
                 _sshClient.Disconnect();
             }

+ 5 - 3
test/Hotline.Tests/Application/DefaultCallApplicationTest.cs

@@ -59,9 +59,11 @@ public class DefaultCallApplicationTest : TestBase
     public async Task QueryCallsFixed_Test()
     {
         var inDto = new QueryCallsFixedDto();
-        inDto.CallStartTimeEnd = DateTime.Now;
-        inDto.CallStartTimeStart = "2024/10/01 00:00:00".ObjToDate();
-        inDto.StaffNo = "8029";
+        //inDto.CallStartTimeEnd = DateTime.Now;
+        //inDto.CallStartTimeStart = "2024/10/01 00:00:00".ObjToDate();
+        //inDto.StaffNo = "8029";
+        inDto.Type = 2;
+        inDto.ToNo = "15892228077";
 
         var items = await _defaultCallApplication.QueryCallsFixedAsync(inDto, new CancellationToken()).ToPageListWithoutTotalAsync(inDto, CancellationToken.None);
         items.ShouldNotBeNull();

+ 1 - 0
test/Hotline.Tests/Application/PointsRecordApplicationTest.cs

@@ -45,6 +45,7 @@ public class PointsRecordApplicationTest : TestBase
     [Fact]
     public async Task GetPointsRank_Test()
     {
+        SetWeiXin();
         var item = await _snapshotApplication.GetPointsRankAsync();
         item.ShouldNotBeNull();
         foreach (var a in item.Ranks)

+ 12 - 3
test/Hotline.Tests/Application/SnapshotApplicationTest.cs

@@ -93,7 +93,7 @@ public class SnapshotApplicationTest : TestBase
             IsPublished = true
         }).ToPageListAsync(0, 10);
         items.NotNullOrEmpty().ShouldBeTrue();
-        var signItems =  await _orderSnapshotApplication.GetSignOrderSnapshotItems(new SignOrderSnapshotItemsInDto()).ToListAsync();
+        var signItems = await _orderSnapshotApplication.GetSignOrderSnapshotItems(new SignOrderSnapshotItemsInDto()).ToListAsync();
     }
 
     [Fact]
@@ -265,7 +265,7 @@ public class SnapshotApplicationTest : TestBase
     [Fact]
     public async Task GetThirdToken_Test()
     {
-        var result = await _identityAppService.GetThredTokenAsync(new ThirdTokenInDto { AppType = EAppType.Snapshot, ThirdType = EThirdType.WeChat,   LoginCode = "0c3Adhll2zDMBe413rnl2KvEym2AdhlH" }, CancellationToken.None);
+        var result = await _identityAppService.GetThredTokenAsync(new ThirdTokenInDto { AppType = EAppType.Snapshot, ThirdType = EThirdType.WeChat, LoginCode = "0c3Adhll2zDMBe413rnl2KvEym2AdhlH" }, CancellationToken.None);
         result["PhoneNumber"].ToString().ShouldNotBeNullOrEmpty();
     }
 
@@ -425,7 +425,16 @@ public class SnapshotApplicationTest : TestBase
     [InlineData(ERedPackPickupStatus.Received)]
     public async Task GetRedPacksAsync(ERedPackPickupStatus status)
     {
-        var page = await _snapshotApplication.GetRedPacksAsync(new RedPacksInDto { Status = status }, CancellationToken.None);
+        try
+        {
+            var page = await _snapshotApplication.GetRedPacksAsync(new RedPacksInDto { Status = status }, CancellationToken.None);
+            page.ShouldNotBeNull();
+        }
+        catch (Exception e)
+        {
+            var msg = e.Message;
+            throw;
+        }        
         //page.Count.ShouldNotBe(0, "数据不应该为空");
     }
 

+ 2 - 2
test/Hotline.Tests/Domain/PushDomainServiceTest.cs

@@ -38,9 +38,9 @@ public class PushDomainServiceTest : TestBase
             Type = "2",
             Status = EPushStatus.Success,
             SmsReplyContent = "5",
-            ExternalId = "08dd7cd0-3179-4697-84ed-3aeb1d5130f9",
+            ExternalId = "08dd767e-2866-4f8c-8a27-90f44f8ec44d",
             IsSmsReply = true,
-            SmsReplyTime = "2025-03-19 17:14:28".ObjToDate()
+            SmsReplyTime = "2025-04-16 17:20:50".ObjToDate()
         };
         await _pushDomainService.PushMsgUpdateStateAsync(inDto, CancellationToken.None);
         Thread.Sleep(60 * 1000);