Browse Source

工单待办、座席待办调整为includes实现

xfe 4 tháng trước cách đây
mục cha
commit
76857359f9

+ 80 - 157
src/Hotline.Api/Controllers/OrderController.cs

@@ -66,7 +66,6 @@ using XF.Utility.EnumExtensions;
 using Hotline.Application.Contracts.Validators.FlowEngine;
 using Hotline.Authentications;
 using Hotline.Share.Dtos.CallCenter;
-using Hotline.Share.Dtos.Order.WaitQuery;
 
 namespace Hotline.Api.Controllers;
 
@@ -4190,171 +4189,94 @@ public class OrderController : BaseController
 
     #region 工单待办
 
-    /// <summary>
-    /// 查询待办工单
-    /// </summary>
-    [HttpGet("waited")]
-    public async Task<PagedDto<OrderDto>> QueryWaited([FromQuery] QueryOrderWaitedDto dto)
-    {
-        var isHandledStep = dto.IsHandled.HasValue && dto.IsHandled.Value;
-        if (isHandledStep)
-            dto.QueryType = null;
-
-        var isAdmin = _orderDomainService.IsCheckAdmin();
-        var query = _orderRepository
-            .Queryable(hasHandledStep: isHandledStep, isAdmin: isAdmin)
-            .Includes(d => d.OrderSpecials);
-        if (dto.QueryType is 1 || dto.QueryType is 2)
-        {
-            query.WhereIF(dto.QueryType is 1, d => d.IsForwarded == false)
-                .WhereIF(dto.QueryType is 2, d => d.IsForwarded == true)
-                .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact)
-                    .NotAny())
-                ;
-        }
-
-        var (total, items) = await query
-            .Where(d => d.Status != EOrderStatus.WaitForAccept &&
-                        d.Status != EOrderStatus.BackToUnAccept &&
-                        d.Status != EOrderStatus.SpecialToUnAccept &&
-                        d.Status != EOrderStatus.HandOverToUnAccept)
-            .WhereIF(dto.QueryType is 3,
-                d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact).Any())
-            .Where(d => SqlFunc.Subqueryable<OrderDelay>().Where(od => od.OrderId == d.Id && od.IsDeleted == false && od.DelayState == EDelayState.Examining).NotAny())
-            .Where(d => SqlFunc.Subqueryable<OrderSendBackAudit>().Where(osba => osba.OrderId == d.Id && osba.IsDeleted == false && osba.State == ESendBackAuditState.Apply)
-                .NotAny())
-            .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(s => s.OrderId == d.Id && s.State == 0 && s.IsDeleted == false).NotAny())
-            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
-            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
-            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)
-            .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
-            .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => d.CounterSignType == null)
-            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == true,
-                d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
-                     (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
-            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false,
-                d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now) //即将超期 未办
-            .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
-            .Where(d => d.Status != EOrderStatus.BackToProvince)
-            .WhereIF(!isHandledStep || _appOptions.Value.IsYiBin,d=>d.Status < EOrderStatus.Filed)
-            //.Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id).NotAny())
-            //.Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
-            .WhereIF(dto.StartTime.HasValue, d => d.StartTime >= dto.StartTime)
-            .WhereIF(dto.EndTime.HasValue, d => d.StartTime <= dto.EndTime)
-            .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
-            .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
-            //.OrderByDescending(d => d.IsUrgent)
-            .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.StartTime, OrderByType.Desc)
-            .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
-            .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //创建时间降序
-            .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, d => d.StartTime, OrderByType.Asc) //受理时间升序
-            .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, d => d.StartTime, OrderByType.Desc) //受理时间降序
-            .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, d => d.ExpiredTime, OrderByType.Asc) //期满时间升序
-            .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, d => d.ExpiredTime, OrderByType.Desc) //期满时间降序
-            .ToPagedListAsync(dto, HttpContext.RequestAborted);
+    ///// <summary>
+    ///// 查询待办工单
+    ///// </summary>
+    //[HttpGet("waited")]
+    //public async Task<PagedDto<OrderDto>> QueryWaited([FromQuery] QueryOrderWaitedDto dto)
+    //{
+    //    var isHandledStep = dto.IsHandled.HasValue && dto.IsHandled.Value;
+    //    if (isHandledStep)
+    //        dto.QueryType = null;
+
+    //    var isAdmin = _orderDomainService.IsCheckAdmin();
+    //    var query = _orderRepository
+    //        .Queryable(hasHandledStep: isHandledStep, isAdmin: isAdmin)
+    //        .Includes(d => d.OrderSpecials);
+    //    if (dto.QueryType is 1 || dto.QueryType is 2)
+    //    {
+    //        query.WhereIF(dto.QueryType is 1, d => d.IsForwarded == false)
+    //            .WhereIF(dto.QueryType is 2, d => d.IsForwarded == true)
+    //            .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact)
+    //                .NotAny())
+    //            ;
+    //    }
 
-        return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
-    }
+    //    var (total, items) = await query
+    //        .Where(d => d.Status != EOrderStatus.WaitForAccept &&
+    //                    d.Status != EOrderStatus.BackToUnAccept &&
+    //                    d.Status != EOrderStatus.SpecialToUnAccept &&
+    //                    d.Status != EOrderStatus.HandOverToUnAccept)
+    //        .WhereIF(dto.QueryType is 3,
+    //            d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact).Any())
+    //        .Where(d => SqlFunc.Subqueryable<OrderDelay>().Where(od => od.OrderId == d.Id && od.IsDeleted == false && od.DelayState == EDelayState.Examining).NotAny())
+    //        .Where(d => SqlFunc.Subqueryable<OrderSendBackAudit>().Where(osba => osba.OrderId == d.Id && osba.IsDeleted == false && osba.State == ESendBackAuditState.Apply)
+    //            .NotAny())
+    //        .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(s => s.OrderId == d.Id && s.State == 0 && s.IsDeleted == false).NotAny())
+    //        .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+    //        .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
+    //        .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
+    //        .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)
+    //        .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
+    //        .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => d.CounterSignType == null)
+    //        .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == true,
+    //            d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
+    //                 (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
+    //        .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false,
+    //            d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now) //即将超期 未办
+    //        .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
+    //        .Where(d => d.Status != EOrderStatus.BackToProvince)
+    //        .WhereIF(!isHandledStep || _appOptions.Value.IsYiBin,d=>d.Status < EOrderStatus.Filed)
+    //        //.Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id).NotAny())
+    //        //.Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
+    //        .WhereIF(dto.StartTime.HasValue, d => d.StartTime >= dto.StartTime)
+    //        .WhereIF(dto.EndTime.HasValue, d => d.StartTime <= dto.EndTime)
+    //        .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
+    //        .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
+    //        //.OrderByDescending(d => d.IsUrgent)
+    //        .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.StartTime, OrderByType.Desc)
+    //        .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
+    //        .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //创建时间降序
+    //        .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, d => d.StartTime, OrderByType.Asc) //受理时间升序
+    //        .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, d => d.StartTime, OrderByType.Desc) //受理时间降序
+    //        .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, d => d.ExpiredTime, OrderByType.Asc) //期满时间升序
+    //        .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, d => d.ExpiredTime, OrderByType.Desc) //期满时间降序
+    //        .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+    //    return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+    //}
 
     /// <summary>
-    /// 工单待办(固定数据量)
+    /// 工单待办
     /// </summary>
-    [HttpGet("waited-fixed")]
-    public async Task<IReadOnlyList<OrderDto>> QueryWaitedFixed([FromQuery] QueryOrderWaitedFixedDto dto)
+    [HttpGet("waited")]
+    public async Task<IReadOnlyList<OrderDto>> QueryWaited([FromQuery] QueryOrderWaitedDto dto)
     {
-        var query = _orderRepository.Queryable();
-        var hasHandled = dto.IsHandled.HasValue && dto.IsHandled.Value;
-        if (hasHandled)
-            dto.QueryType = null;
-
-        var isAdmin = _orderDomainService.IsCheckAdmin();
-        if (!isAdmin)
-        {
-            query
-                .Includes(d => d.WorkflowSteps.Where(step =>
-                        ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
-                         (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-                         (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
-                         (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
-                          && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
-                    .OrderByDescending(step => step.CreationTime)
-                    .Take(1)
-                    .ToList()
-                );
-
-            if (hasHandled)
-            {
-                query.Where(d => d.WorkflowSteps
-                    .Any(step =>
-                        ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
-                         (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-                         (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
-                         (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
-                          && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
-                    && step.Status == EWorkflowStepStatus.Handled));
-            }
-            else
-            {
-                query.Where(d => d.WorkflowSteps
-                    .Any(step =>
-                        ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
-                         (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-                         (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
-                         (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
-                          && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
-                        && step.Status < EWorkflowStepStatus.Handled));
-            }
-            
-        }
-
-        var orders = await query
-            .Where(d => d.Status != EOrderStatus.WaitForAccept &&
-                        d.Status != EOrderStatus.BackToUnAccept &&
-                        d.Status != EOrderStatus.SpecialToUnAccept &&
-                        d.Status != EOrderStatus.HandOverToUnAccept)
-            .WhereIF(dto.QueryType is 3,
-                d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact).Any())
-            .Where(d => SqlFunc.Subqueryable<OrderDelay>().Where(od => od.OrderId == d.Id && od.IsDeleted == false && od.DelayState == EDelayState.Examining).NotAny())
-            .Where(d => SqlFunc.Subqueryable<OrderSendBackAudit>().Where(osba => osba.OrderId == d.Id && osba.IsDeleted == false && osba.State == ESendBackAuditState.Apply)
-                .NotAny())
-            .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(s => s.OrderId == d.Id && s.State == 0 && s.IsDeleted == false)
-                .WhereIF(dto.QueryType != null && (dto.QueryType == 1 || dto.QueryType == 2), s => s.SpecialType == ESpecialType.ReTransact)
-                //.WhereIF(dto.QueryType != null && dto.QueryType == 3, s =>  s.SpecialType != ESpecialType.ReTransact)
-                .NotAny())
-            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
-            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
-            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)
-            .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
-            .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => d.CounterSignType == null)
-            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == true,
-                d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
-                     (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
-            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false,
-                d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now) //即将超期 未办
-            .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
-            .Where(d => d.Status != EOrderStatus.BackToProvince)
-            .WhereIF(!hasHandled, d => d.Status < EOrderStatus.Filed)
-            //.Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id).NotAny())
-            //.Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
-            .WhereIF(dto.StartTime.HasValue, d => d.StartTime >= dto.StartTime)
-            .WhereIF(dto.EndTime.HasValue, d => d.StartTime <= dto.EndTime)
-            .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
-            .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
-            //.OrderByDescending(d => d.IsUrgent)
-            .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.StartTime, OrderByType.Desc)
-            .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
-            .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //创建时间降序
-            .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, d => d.StartTime, OrderByType.Asc) //受理时间升序
-            .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, d => d.StartTime, OrderByType.Desc) //受理时间降序
-            .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, d => d.ExpiredTime, OrderByType.Asc) //期满时间升序
-            .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, d => d.ExpiredTime, OrderByType.Desc) //期满时间降序
+        var orders = await _orderApplication
+            .QueryWaited(dto)
             .ToFixedListAsync(dto, HttpContext.RequestAborted);
 
         return _mapper.Map<IReadOnlyList<OrderDto>>(orders);
     }
 
+    [HttpGet("waited/count")]
+    public async Task<int> QueryWaitedCount(QueryOrderWaitedDto dto)
+    {
+        return await _orderApplication
+            .QueryWaited(dto)
+            .CountAsync(HttpContext.RequestAborted);
+    }
+
     /// <summary>
     /// 查询坐席待办
     /// </summary>
@@ -4369,7 +4291,8 @@ public class OrderController : BaseController
     [HttpGet("waited/sign/count")]
     public async Task<int> QueryWaitedForSeatCount([FromQuery] QueryOrderWaitedDto dto)
     {
-        return await _orderApplication.QueryWaitedForSeat(dto)
+        return await _orderApplication
+            .QueryWaitedForSeat(dto)
             .CountAsync(HttpContext.RequestAborted);
     }
 

+ 5 - 15
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -1,28 +1,14 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Data;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.Settings;
-using Hotline.Share.Dtos;
-using Hotline.Share.Dtos.Bi;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.FlowEngine;
-using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Order.Publish;
-using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Requests;
-using MediatR;
-using Microsoft.AspNetCore.Mvc;
 using SqlSugar;
-using XF.Domain.Authentications;
-using XF.Domain.Entities;
 
 namespace Hotline.Application.Orders
 {
@@ -346,6 +332,10 @@ namespace Hotline.Application.Orders
 
 		ISugarQueryable<OrderListOutDto> QueryWaitedForSeat(QueryOrderWaitedDto dto);
 
+
+		ISugarQueryable<Order> QueryWaited(QueryOrderWaitedDto dto);
+        
+
         /// <summary>
         /// 受理类型前10
         /// </summary>

+ 217 - 112
src/Hotline.Application/Orders/OrderApplication.cs

@@ -6,12 +6,9 @@ using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Repository.SqlSugar.Ts;
-using Hotline.Settings.TimeLimits;
-using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
-using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Enums.Order;
@@ -20,36 +17,23 @@ using Hotline.Share.Enums.Settings;
 using Hotline.Share.Requests;
 using Hotline.Tools;
 using MapsterMapper;
-using Microsoft.AspNetCore.Mvc.Formatters;
-using Microsoft.EntityFrameworkCore.Metadata.Internal;
-using Novacode;
 using SqlSugar;
 using System.Data;
 using System.Dynamic;
 using Hotline.Settings;
 using XF.Domain.Authentications;
-using XF.Domain.Constants;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
-using Hotline.Repository.SqlSugar.System;
-using Microsoft.AspNetCore.Mvc;
-using Hotline.Share.Dtos.Bi;
-using System.Net;
 using PanGu;
 using Hotline.Users;
-using PanGu.Match;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Authentications;
-using Hotline.Repository.SqlSugar;
 using MediatR;
 using Hotline.Share.Mq;
-using JiebaNet.Segmenter;
-using Microsoft.AspNetCore.Http;
 using WordInfo = PanGu.WordInfo;
 using Hotline.Schedulings;
-using NPOI.SS.Formula.Functions;
 using XF.Domain.Entities;
 using Hotline.Settings.TimeLimitDomain;
 using Hotline.FlowEngine.WorkflowModules;
@@ -60,19 +44,10 @@ using Hotline.Configurations;
 using Microsoft.Extensions.Options;
 using Mapster;
 using Hotline.Share.Dtos.Push;
-using Mapster;
-using Hotline.Share.Tools;
 using Hotline.EventBus;
 using Hotline.Orders.Notifications;
 using Hotline.OrderTranspond;
 using XF.Utility.EnumExtensions;
-using Newtonsoft.Json;
-using static NPOI.SS.Format.CellNumberFormatter;
-using System.Linq;
-using System.Linq.Dynamic.Core;
-using System.Threading;
-using Hotline.Application.CallCenter;
-using Hotline.Repository.SqlSugar.Orders;
 using Hotline.Share.Dtos.Order.Publish;
 
 namespace Hotline.Application.Orders;
@@ -119,7 +94,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly IOrderDelayRepository _orderDelayRepository;
     private readonly IRepository<OrderSecondaryHandling> _orderSecondaryHandlingRepository;
 
-	public OrderApplication(
+    public OrderApplication(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -157,7 +132,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         IOrderTerminateRepository orderTerminateRepository,
         IRepository<OrderPublishHistory> orderPublishHistoryRepository,
         IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository,
-		IOrderDelayRepository orderDelayRepository)
+        IOrderDelayRepository orderDelayRepository)
     {
         _orderDomainService = orderDomainService;
         _workflowDomainService = workflowDomainService;
@@ -197,7 +172,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _sessionContext = sessionContext;
         _orderDelayRepository = orderDelayRepository;
         _orderSecondaryHandlingRepository = orderSecondaryHandlingRepository;
-	}
+    }
 
     /// <summary>
     /// 更新工单办理期满时间(延期调用,其他不调用)
@@ -243,8 +218,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
         var orderDto = _mapper.Map<OrderDto>(order);
         await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
-	        cancellationToken: cancellationToken);
-	}
+            cancellationToken: cancellationToken);
+    }
 
     // /// <summary>
     // /// 新增工单办理流程记录
@@ -695,7 +670,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
             .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName),d=>d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
             .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
                                                                                               //.WhereIF(!string.IsNullOrEmpty(dto.PubMan),
                                                                                               //    d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
@@ -1001,7 +976,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             await _orderRepository.UpdateAsync(order, cancellationToken);
         }
 
-        
+
 
         if (dto.Data.LeaderSMSKey != null)
         {
@@ -1254,7 +1229,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
          .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
          .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
          .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
-		 .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
+         .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
          .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
                                                                                             //.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))  //紧急程度
          .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone.Contains(dto.FromPhone)) //来电号码
@@ -2632,54 +2607,54 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
     public ISugarQueryable<OrderVisitDetail> MayScreenList(MayScreenListDto dto)
     {
-	    dto.ScreenType = dto.ScreenType is null ? 0 : dto.ScreenType;
-	   var query = _orderVisitedDetailRepository.Queryable(false, true)
-            .Includes(x => x.OrderVisit)
-            .Includes(x => x.OrderVisit, y => y.Order)
-            .Includes(x => x.OrderVisit, y => y.Employee)
-            //.LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.IsDeleted == false)
-            .Includes(x => x.OrderScreens)
-            .Where(x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true) ||
-                        x.OrderScreens.Any() == false
-            //|| x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false
-            )
-            .WhereIF(dto.ScreenType == EOrderScreenType.Seat, x => x.OrderVisit.Order.IsProvince == false)
-            .WhereIF(dto.ScreenSendBack is 1,
-                x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true))
-            .WhereIF(dto.ScreenSendBack is 2,
-                x => x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply != true)) ==
-                     false)
-            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
-            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), x => x.OrderVisit.Order!.AcceptorName == dto.NameOrNo! || x.OrderVisit.Order!.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
-            .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!))
-            .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
-            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.OrderVisit.Order!.AcceptTypeCode! == dto.AcceptType!)
-            .WhereIF(!string.IsNullOrEmpty(dto.HotspotSpliceName),
-                x => x.OrderVisit.Order!.Hotspot.HotSpotFullName!.StartsWith(dto.HotspotSpliceName!))
-            .WhereIF(!string.IsNullOrEmpty(dto.SourceChannel), x => x.OrderVisit.Order!.SourceChannelCode! == dto.SourceChannel!)
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrderVisit.Order!.OrgLevelOneName!.Contains(dto.OrgLevelOneName!))
-            .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName),
-                x => x.OrderVisit.Order!.CurrentHandleOrgName!.Contains(dto.CurrentHandleOrgName!))
-            .WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!))
-            .WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue,
-                x => x.OrderVisit.Order!.CreationTime >= dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime)
-            .WhereIF(dto.CurrentHandleTime.HasValue && dto.EndCurrentHandleTime.HasValue,
-                x => x.OrderVisit.Order!.CurrentHandleTime >= dto.CurrentHandleTime &&
-                     x.OrderVisit.Order!.ActualHandleTime <= dto.EndCurrentHandleTime)
-            .WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue,
-                x => x.OrderVisit.Order!.FiledTime >= dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime)
-            .WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue,
-                x => x.OrderVisit.VisitTime >= dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
-            .WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage == true,
-                x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
-            //.WhereIF(dto.CounterSignType.HasValue, x => x.OrderVisit.Order!.CounterSignType == dto.CounterSignType)
-            //.WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults),
-            //    x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
-            //.WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude),
-            //    x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
-            //.WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason),
-            //    x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
-            .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle);
+        dto.ScreenType = dto.ScreenType is null ? 0 : dto.ScreenType;
+        var query = _orderVisitedDetailRepository.Queryable(false, true)
+             .Includes(x => x.OrderVisit)
+             .Includes(x => x.OrderVisit, y => y.Order)
+             .Includes(x => x.OrderVisit, y => y.Employee)
+             //.LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.IsDeleted == false)
+             .Includes(x => x.OrderScreens)
+             .Where(x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true) ||
+                         x.OrderScreens.Any() == false
+             //|| x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false
+             )
+             .WhereIF(dto.ScreenType == EOrderScreenType.Seat, x => x.OrderVisit.Order.IsProvince == false)
+             .WhereIF(dto.ScreenSendBack is 1,
+                 x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true))
+             .WhereIF(dto.ScreenSendBack is 2,
+                 x => x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply != true)) ==
+                      false)
+             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
+             .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), x => x.OrderVisit.Order!.AcceptorName == dto.NameOrNo! || x.OrderVisit.Order!.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
+             .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!))
+             .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
+             .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.OrderVisit.Order!.AcceptTypeCode! == dto.AcceptType!)
+             .WhereIF(!string.IsNullOrEmpty(dto.HotspotSpliceName),
+                 x => x.OrderVisit.Order!.Hotspot.HotSpotFullName!.StartsWith(dto.HotspotSpliceName!))
+             .WhereIF(!string.IsNullOrEmpty(dto.SourceChannel), x => x.OrderVisit.Order!.SourceChannelCode! == dto.SourceChannel!)
+             .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrderVisit.Order!.OrgLevelOneName!.Contains(dto.OrgLevelOneName!))
+             .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName),
+                 x => x.OrderVisit.Order!.CurrentHandleOrgName!.Contains(dto.CurrentHandleOrgName!))
+             .WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!))
+             .WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue,
+                 x => x.OrderVisit.Order!.CreationTime >= dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime)
+             .WhereIF(dto.CurrentHandleTime.HasValue && dto.EndCurrentHandleTime.HasValue,
+                 x => x.OrderVisit.Order!.CurrentHandleTime >= dto.CurrentHandleTime &&
+                      x.OrderVisit.Order!.ActualHandleTime <= dto.EndCurrentHandleTime)
+             .WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue,
+                 x => x.OrderVisit.Order!.FiledTime >= dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime)
+             .WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue,
+                 x => x.OrderVisit.VisitTime >= dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
+             .WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage == true,
+                 x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
+             //.WhereIF(dto.CounterSignType.HasValue, x => x.OrderVisit.Order!.CounterSignType == dto.CounterSignType)
+             //.WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults),
+             //    x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
+             //.WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude),
+             //    x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
+             //.WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason),
+             //    x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
+             .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle);
         if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
         {
             query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
@@ -2733,18 +2708,18 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         //var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == dto.OrderId);
         var sendBackAudit = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == dto.OrderId && x.State == ESendBackAuditState.Apply).ToListAsync(cancellationToken);
         var orderDelay = await _orderDelayRepository.Queryable().Where(x => x.OrderId == dto.OrderId && x.DelayState == EDelayState.Examining).ToListAsync(cancellationToken);
-        var orderSecondaries = await _orderSecondaryHandlingRepository.Queryable().Where(x=>x.OrderId == dto.OrderId  && x.State == ESecondaryHandlingState.Apply).ToListAsync(cancellationToken);
+        var orderSecondaries = await _orderSecondaryHandlingRepository.Queryable().Where(x => x.OrderId == dto.OrderId && x.State == ESecondaryHandlingState.Apply).ToListAsync(cancellationToken);
 
-		if (_appOptions.Value.IsYiBin)
+        if (_appOptions.Value.IsYiBin)
         {
             if (screen.Any())
             {
-               await  _orderScreenRepository.RemoveRangeAsync(screen, false, cancellationToken);
+                await _orderScreenRepository.RemoveRangeAsync(screen, false, cancellationToken);
             }
 
             if (sendBackAudit.Any())
             {
-               await _orderSendBackAuditRepository.RemoveRangeAsync(sendBackAudit, false, cancellationToken);
+                await _orderSendBackAuditRepository.RemoveRangeAsync(sendBackAudit, false, cancellationToken);
             }
 
             if (orderDelay.Any())
@@ -2754,10 +2729,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
             if (orderSecondaries.Any())
             {
-	            await _orderSecondaryHandlingRepository.RemoveRangeAsync(orderSecondaries, false, cancellationToken);
+                await _orderSecondaryHandlingRepository.RemoveRangeAsync(orderSecondaries, false, cancellationToken);
             }
 
-			if (order.Workflow.IsInCountersign)
+            if (order.Workflow.IsInCountersign)
             {
                 var workflowStep = await _workflowStepRepository.Queryable().Where(x => x.Id == order.Workflow.TopCountersignStepId).FirstAsync(cancellationToken);
                 if (workflowStep != null)
@@ -2783,13 +2758,13 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var countersign = await _workflowCountersignRepository.GetAsync(dto.CountersignId, cancellationToken);
         if (countersign is null)
             throw new UserFriendlyException("无效会签编号");
-        
+
         var order = await _orderRepository.GetAsync(d => d.WorkflowId == countersign.WorkflowId, cancellationToken);
         if (order is null)
             throw new UserFriendlyException($"工单未开启流程, workflowId: {countersign.WorkflowId}");
-        
+
         var workflow = await _workflowDomainService.TerminalCountersignAsync(countersign, order.ExpiredTime.Value, cancellationToken);
-        
+
         order.UpdateHandlingStatus(workflow.IsInCountersign);
         _mapper.Map(workflow, order);
         await _orderRepository.UpdateAsync(order, cancellationToken);
@@ -2813,12 +2788,12 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (order == null)
         {
             order = _mapper.Map<Order>(dto);
-            
+
             order.InitId();
             if (files != null && files.Any())
                 order.FileJson = await _fileRepository.AddFileAsync(files, order.Id, "", cancellationToken);
             await _orderDomainService.AddAsync(order, cancellationToken: cancellationToken);
-          
+
         }
         else
         {
@@ -2929,10 +2904,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 order.Status = EOrderStatus.WaitForAccept;
                 if (isPaiDan)
                 {
-	                order.Status = EOrderStatus.Handling;
+                    order.Status = EOrderStatus.Handling;
                 }
                 //await _orderRepository.Updateable().SetColumns(o => new Order { Status = status }).Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
-                
+
                 //处理回访和发布信息
 
                 var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == order.Id);
@@ -2961,7 +2936,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             await _orderRepository.UpdateAsync(order, cancellationToken);
             //await _workflowDomainService.RecallToStartStepAsync(order.WorkflowId, "省工单重派", current, cancellationToken);
         }
-		return _mapper.Map<AddOrderResponse>(order);
+        return _mapper.Map<AddOrderResponse>(order);
     }
 
     /// <summary>
@@ -3156,26 +3131,54 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     : d is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept or EOrderStatus.HandOverToUnAccept or EOrderStatus.Handling)
             .ToArray();
 
-        var query = _orderRepository.Queryable();
-        if (dto.IsHandled.HasValue)
-        {
-            var hasHandled = dto.IsHandled.Value;
-            query = query.Where(d => SqlFunc.Subqueryable<WorkflowTrace>()
-            .Where(step => step.ExternalId == d.Id &&
-                (hasHandled || step.Status != EWorkflowStepStatus.Handled) &&
-                (!hasHandled || step.Status == EWorkflowStepStatus.Handled &&
-                step.TraceState != EWorkflowTraceState.StepRemoveByPrevious) &&
-                ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
-                step.HandlerId == _sessionContextProvider.SessionContext.RequiredUserId) ||
-                (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) &&
-                step.HandlerOrgId == _sessionContextProvider.SessionContext.RequiredOrgId) ||
-                (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
-                _sessionContextProvider.SessionContext.Roles.Contains(step.RoleId)))).Any() ||
-                (string.IsNullOrEmpty(d.WorkflowId) &&
-                (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContextProvider.SessionContext.RequiredUserId))
+        var query = _orderRepository.Queryable()
+            .Includes(d => d.WorkflowTraces.Where(step =>
+                    ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+                     (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                     (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+                     (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+                      && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
+                .OrderByDescending(step => step.CreationTime)
+                .Take(1)
+                .ToList()
             );
+
+        var hasHandled = dto.IsHandled.HasValue && dto.IsHandled.Value;
+        if (hasHandled)
+        {
+            query.Where(d => d.WorkflowSteps
+                .Any(step =>
+                    ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+                     (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                     (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+                     (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+                      && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
+                    && step.Status == EWorkflowStepStatus.Handled));
+        }
+        else
+        {
+            query.Where(d => d.WorkflowSteps
+                .Any(step =>
+                    ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+                     (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                     (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+                     (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+                      && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
+                    && step.Status < EWorkflowStepStatus.Handled));
         }
 
+        //query = query.Where(d => SqlFunc.Subqueryable<WorkflowTrace>()
+        //.Where(step => step.ExternalId == d.Id &&
+        //    (hasHandled || step.Status != EWorkflowStepStatus.Handled) &&
+        //    (!hasHandled || step.Status == EWorkflowStepStatus.Handled &&
+        //    step.TraceState != EWorkflowTraceState.StepRemoveByPrevious) &&
+        //    ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContextProvider.SessionContext.RequiredUserId) ||
+        //    (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContextProvider.SessionContext.RequiredOrgId) ||
+        //    (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContextProvider.SessionContext.Roles.Contains(step.RoleId)))).Any() ||
+        //    (string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContextProvider.SessionContext.RequiredUserId))
+        //);
+
+
         return query
             // 交办件:已派单其他节点的工单,该选项卡下工单若办结就不显示
             .WhereIF(dto.TypeCode.HasValue == true && dto.TypeCode == 1, d => d.ProcessType == EProcessType.Jiaoban && d.Status < EOrderStatus.Filed)
@@ -3215,6 +3218,108 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Select<OrderListOutDto>();
     }
 
+    public ISugarQueryable<Order> QueryWaited(QueryOrderWaitedDto dto)
+    {
+        var query = _orderRepository.Queryable()
+            .Includes(d => d.WorkflowSteps.Where(step =>
+                    ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+                     (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                     (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+                     (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+                      && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
+                .OrderByDescending(step => step.CreationTime)
+                .Take(1)
+                .ToList()
+            );
+        var hasHandled = dto.IsHandled.HasValue && dto.IsHandled.Value;
+        if (hasHandled)
+            dto.QueryType = null;
+
+        var isAdmin = _orderDomainService.IsCheckAdmin();
+        if (!isAdmin)
+        {
+            //query.Includes(d => d.WorkflowSteps.Where(step =>
+            //            ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+            //             (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+            //             (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+            //             (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+            //              && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
+            //        .OrderByDescending(step => step.CreationTime)
+            //        .Take(1)
+            //        .ToList()
+            //    );
+
+            if (hasHandled)
+            {
+                query.Where(d => d.WorkflowSteps
+                    .Any(step =>
+                        ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+                         (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                         (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+                         (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+                          && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
+                    && step.Status == EWorkflowStepStatus.Handled));
+            }
+            else
+            {
+                query.Where(d => d.WorkflowSteps
+                    .Any(step =>
+                        ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+                         (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                         (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
+                         (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
+                          && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
+                        && step.Status < EWorkflowStepStatus.Handled));
+            }
+
+        }
+
+        query.Where(d => d.Status != EOrderStatus.WaitForAccept &&
+                         d.Status != EOrderStatus.BackToUnAccept &&
+                         d.Status != EOrderStatus.SpecialToUnAccept &&
+                         d.Status != EOrderStatus.HandOverToUnAccept)
+            .WhereIF(dto.QueryType is 3,
+                d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact).Any())
+            .Where(d => SqlFunc.Subqueryable<OrderDelay>().Where(od => od.OrderId == d.Id && od.IsDeleted == false && od.DelayState == EDelayState.Examining).NotAny())
+            .Where(d => SqlFunc.Subqueryable<OrderSendBackAudit>().Where(osba => osba.OrderId == d.Id && osba.IsDeleted == false && osba.State == ESendBackAuditState.Apply)
+                .NotAny())
+            .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(s => s.OrderId == d.Id && s.State == 0 && s.IsDeleted == false)
+                .WhereIF(dto.QueryType != null && (dto.QueryType == 1 || dto.QueryType == 2), s => s.SpecialType == ESpecialType.ReTransact)
+                //.WhereIF(dto.QueryType != null && dto.QueryType == 3, s =>  s.SpecialType != ESpecialType.ReTransact)
+                .NotAny())
+            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
+            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
+            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)
+            .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
+            .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => d.CounterSignType == null)
+            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == true,
+                d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
+                     (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
+            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false,
+                d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now) //即将超期 未办
+            .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
+            .Where(d => d.Status != EOrderStatus.BackToProvince)
+            .WhereIF(!hasHandled, d => d.Status < EOrderStatus.Filed)
+            //.Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id).NotAny())
+            //.Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
+            .WhereIF(dto.StartTime.HasValue, d => d.StartTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, d => d.StartTime <= dto.EndTime)
+            .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
+            .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
+            //.OrderByDescending(d => d.IsUrgent)
+            .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.StartTime, OrderByType.Desc)
+            .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
+            .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //创建时间降序
+            .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, d => d.StartTime, OrderByType.Asc) //受理时间升序
+            .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, d => d.StartTime, OrderByType.Desc) //受理时间降序
+            .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, d => d.ExpiredTime, OrderByType.Asc) //期满时间升序
+            .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, d => d.ExpiredTime, OrderByType.Desc) //期满时间降序
+        ;
+
+        return query;
+    }
+
     /// <summary>
     /// 受理前十
     /// </summary>

+ 0 - 71
src/Hotline.Share/Dtos/Order/WaitQuery/QueryOrderWaitedFixedDto.cs

@@ -1,71 +0,0 @@
-using Hotline.Share.Enums.Order;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Hotline.Share.Dtos.Order.WaitQuery
-{
-    public class QueryOrderWaitedFixedDto : QueryFixedDto
-    {
-        /// <summary>
-        /// 开始时间
-        /// </summary>
-        public DateTime? StartTime { get; set; }
-
-        /// <summary>
-        /// 结束时间
-        /// </summary>
-        public DateTime? EndTime { get; set; }
-
-        public string? Keyword { get; set; }
-
-        public bool? IsProvince { get; set; }
-
-        /// <summary>
-        /// true: 工单已办
-        /// false: 工单待办
-        /// </summary>
-        public bool? IsHandled { get; set; }
-        public bool? IsCounterSign { get; set; }
-        public bool? ExpiredOrAlmostOverdue { get; set; }
-        public string? No { get; set; }
-
-        /// <summary>
-        /// 是否紧急
-        /// </summary>
-        public bool? IsUrgent { get; set; }
-
-        /// <summary>
-        /// 区域
-        /// </summary>
-        public string? AreaCode { get; set; }
-
-        /// <summary>
-        /// 工单状态
-        /// </summary>
-        public EOrderStatus? Status { get; set; }
-
-        /// <summary>
-        /// 1: 交办件
-        /// 2: 办结件
-        /// </summary>
-        public int? TypeCode { get; set; }
-
-        /// <summary>
-        /// 1 中心办理  2 转单件 3 二次派发件
-        /// </summary>
-        public int? QueryType { get; set; }
-
-        /// <summary>
-        /// 排序字段
-        /// </summary>
-        public string? SortField { get; set; }
-
-        /// <summary>
-        /// 排序方式 // 0 升序 1 降序
-        /// </summary>
-        public int? SortRule { get; set; }
-    }
-}