Browse Source

合并冲突

qinchaoyue 6 months ago
parent
commit
41f0afbcd4

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

@@ -3910,64 +3910,18 @@ public class OrderController : BaseController
     /// 查询坐席待办
     /// </summary>
     [HttpGet("waited/sign")]
-    public async Task<PagedDto<OrderDto>> QueryWaitedForSeat([FromQuery] QueryOrderWaitedDto dto)
+    public async Task<List<OrderListOutDto>> QueryWaitedForSeat([FromQuery] QueryOrderWaitedDto dto)
     {
-        EOrderStatus[] handleStatuses = EnumExts.GetFields<EOrderStatus>().Select(d => (EOrderStatus)d.Key).ToArray();
-        handleStatuses = handleStatuses.WhereIF(dto.IsHandled.HasValue,
-                d => dto.IsHandled!.Value
-                    ? d is not EOrderStatus.WaitForAccept and not EOrderStatus.BackToUnAccept and not EOrderStatus.SpecialToUnAccept
-                        and not EOrderStatus.HandOverToUnAccept
-                    : d is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept
-                        or EOrderStatus.HandOverToUnAccept)
-            .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 == _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)))).Any() ||
-                                     (string.IsNullOrEmpty(d.WorkflowId) &&
-                                      (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId))
-            );
-        }
-
-        var (total, items) = await query
-            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
-            .WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status))
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!))
-            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
-            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)
-            .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) //即将超期 未办
-            .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
-            .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
-            //.Where(d => (string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)))
-            //.Where(d => string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)
-            .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent.Value)
-            .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
-            .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
-            .Where(x => x.Status != EOrderStatus.BackToProvince && x.Status < EOrderStatus.Filed)
-            .OrderBy(d => d.Status)
-            .OrderByIF(dto.IsHandled == true, d => d.StartTime, OrderByType.Desc)
-            .OrderByIF(dto.IsHandled == false, d => new { IsUrgent = d.IsUrgent, CreationTime = d.CreationTime }, OrderByType.Desc)
-            .ToPagedListAsync(dto, HttpContext.RequestAborted);
+        return await _orderApplication
+            .QueryWaitedForSeat(dto)
+            .ToFixedListAsync(dto, HttpContext.RequestAborted);
+    }
 
-        return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+    [HttpGet("waited/sign/count")]
+    public async Task<int> QueryWaitedForSeatCount([FromQuery] QueryOrderWaitedDto dto)
+    {
+        return await _orderApplication.QueryWaitedForSeat(dto)
+            .CountAsync(HttpContext.RequestAborted);
     }
 
     /// <summary>

+ 2 - 1
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -313,5 +313,6 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         ISugarQueryable<OrderTerminate> OrderTerminateList(OrderTerminateListDto dto);
 
-	}
+        ISugarQueryable<OrderListOutDto> QueryWaitedForSeat(QueryOrderWaitedDto dto);
+    }
 }

+ 93 - 37
src/Hotline.Application/Orders/OrderApplication.cs

@@ -65,6 +65,7 @@ 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;
 
@@ -436,7 +437,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var seg = new Segment();
         ICollection<WordInfo> splitWords = seg.DoSegment(inputStr);
         var words = new List<string>();
-        for (int i = 0; i < splitWords.Count; i++)
+        for (int i = 0;i < splitWords.Count;i++)
         {
             var word = splitWords.ElementAt(i);
             if (word is { WordType: WordType.SimplifiedChinese, Word.Length: > 1 })
@@ -663,7 +664,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             visit.VisitTime = dto.VisitTime;
             visit.VisitType = dto.VisitType;
 
-            for (int i = 0; i < visit.OrderVisitDetails.Count; i++)
+            for (int i = 0;i < visit.OrderVisitDetails.Count;i++)
             {
                 var detail = visit.OrderVisitDetails[i];
                 var detaildto = dto.OrderVisitDetailDto.FirstOrDefault(x => x.Id == detail.Id);
@@ -861,7 +862,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             visit.JudgeState = EJudgeState.Judging;
         }
 
-        for (int i = 0; i < visit.OrderVisitDetails.Count; i++)
+        for (int i = 0;i < visit.OrderVisitDetails.Count;i++)
         {
             var detail = visit.OrderVisitDetails[i];
             var detaildto = dto.VisitDetails.FirstOrDefault(x => x.Id == detail.Id);
@@ -1347,9 +1348,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (IsCenter && list != null)
         {
             data = await list.GroupBy(x => new
-                {
-                    VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
-                })
+            {
+                VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+            })
                 .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
                 {
                     OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
@@ -1398,9 +1399,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         else
         {
             data = await list.GroupBy(x => new
-                {
-                    x.VisitOrgCode
-                })
+            {
+                x.VisitOrgCode
+            })
                 .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
                 {
                     OrgCode = x.VisitOrgCode,
@@ -1664,10 +1665,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             dt.Columns.Remove("Column1");
 
         //计算小计
-        for (int i = 0; i < dt.Rows.Count; i++)
+        for (int i = 0;i < dt.Rows.Count;i++)
         {
             int sumcount = 0;
-            for (int j = 1; j < dt.Columns.Count - 1; j++)
+            for (int j = 1;j < dt.Columns.Count - 1;j++)
             {
                 sumcount += Convert.ToInt32(dt.Rows[i][j].ToString());
             }
@@ -1679,10 +1680,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         DataRow totalRow = dt.NewRow();
         if (dt.Columns[0].ColumnName == "HotspotName") totalRow["HotspotName"] = "合计";
         else totalRow["一级热点"] = "合计";
-        for (int i = 1; i < dt.Columns.Count; i++)
+        for (int i = 1;i < dt.Columns.Count;i++)
         {
             int sumcount = 0;
-            for (int j = 0; j < dt.Rows.Count; j++)
+            for (int j = 0;j < dt.Rows.Count;j++)
             {
                 sumcount += Convert.ToInt32(dt.Rows[j][i].ToString());
             }
@@ -1836,10 +1837,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (IsCenter && list != null)
         {
             data = await list.GroupBy((x, h) => new
-                {
-                    HotspotName = h.HotSpotName,
-                    HotspotId = h.Id
-                })
+            {
+                HotspotName = h.HotSpotName,
+                HotspotId = h.Id
+            })
                 .Select((x, h) => new VisitAndHotspotSatisfactionStatisticsDto()
                 {
                     HotspotName = h.HotSpotName,
@@ -1874,10 +1875,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         else
         {
             data = await list.GroupBy((x, h) => new
-                {
-                    HotspotName = h.HotSpotName,
-                    HotspotId = h.Id
-                })
+            {
+                HotspotName = h.HotSpotName,
+                HotspotId = h.Id
+            })
                 .Select((x, h) => new VisitAndHotspotSatisfactionStatisticsDto()
                 {
                     HotspotName = h.HotSpotName,
@@ -2492,20 +2493,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             }).ToListAsync();
 
         var res = (from t1 in items
-            join t2 in items2 on t1.UserId equals t2.UserId into t1_t2
-            from item in t1_t2.DefaultIfEmpty()
-            select new SendOrderReportOutDto
-            {
-                UserId = t1.UserId,
-                UserName = t1.UserName,
-                SendOrderNum = t1.SendOrderNum,
-                NoSendOrderNum = t1.NoSendOrderNum,
-                ReSendOrderNum = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault(),
-                ChainRate = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault() > 0
-                    ? ((double.Parse(t1.SendOrderNum.ToString()) - double.Parse(t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault().ToString())) /
-                        double.Parse(t1.SendOrderNum.ToString()) * 100).ToString("F2") + "%"
-                    : "100.00%",
-            }).ToList();
+                   join t2 in items2 on t1.UserId equals t2.UserId into t1_t2
+                   from item in t1_t2.DefaultIfEmpty()
+                   select new SendOrderReportOutDto
+                   {
+                       UserId = t1.UserId,
+                       UserName = t1.UserName,
+                       SendOrderNum = t1.SendOrderNum,
+                       NoSendOrderNum = t1.NoSendOrderNum,
+                       ReSendOrderNum = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault(),
+                       ChainRate = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault() > 0
+                           ? ((double.Parse(t1.SendOrderNum.ToString()) - double.Parse(t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault().ToString())) /
+                               double.Parse(t1.SendOrderNum.ToString()) * 100).ToString("F2") + "%"
+                           : "100.00%",
+                   }).ToList();
         return res;
     }
 
@@ -2598,7 +2599,62 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue, d => d.Order.StartTime >= dto.StartTime && d.Order.StartTime <= dto.EndTime)
             .OrderByDescending(d => d.CreationTime);
 
-	}
-	#endregion
+    public ISugarQueryable<OrderListOutDto> QueryWaitedForSeat(QueryOrderWaitedDto dto)
+    {
+        EOrderStatus[] handleStatuses = EnumExts.GetFields<EOrderStatus>().Select(d => (EOrderStatus)d.Key).ToArray();
+        handleStatuses = handleStatuses.WhereIF(dto.IsHandled.HasValue,
+                d => dto.IsHandled!.Value
+                    ? d is not EOrderStatus.WaitForAccept and not EOrderStatus.BackToUnAccept and not EOrderStatus.SpecialToUnAccept and not EOrderStatus.HandOverToUnAccept
+                    : d is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept or EOrderStatus.HandOverToUnAccept)
+            .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 == _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)))).Any() || 
+                (string.IsNullOrEmpty(d.WorkflowId) && 
+                (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId))
+            );
+        }
 
+        return query
+            // 交办件:已派单其他节点的工单,该选项卡下工单若办结就不显示
+            .WhereIF(dto.TypeCode.HasValue && dto.TypeCode == 1, d => d.ProcessType == EProcessType.Jiaoban && d.Status < EOrderStatus.Filed)
+            // 办结件:当前登录坐席作为最初受理人已办结的工单
+            .WhereIF(dto.TypeCode.HasValue && dto.TypeCode == 2, d=> d.Status >= EOrderStatus.Filed && d.AcceptorId == _sessionContext.RequiredUserId)
+            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince) 
+            .WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status)) 
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!)) 
+            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No) 
+            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode) 
+            .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) //即将超期 未办
+            .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
+           //.Where(d => (string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)))
+           //.Where(d => string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)
+            .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent.Value)
+            .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
+            .Where(x => x.Status != EOrderStatus.BackToProvince && x.Status < EOrderStatus.Filed)
+            .OrderBy(d => d.Status)
+            .OrderByIF(dto.IsHandled == true, d => d.StartTime, OrderByType.Desc)
+            .OrderByIF(dto.IsHandled == false, d => new { IsUrgent = d.IsUrgent, CreationTime = d.CreationTime }, OrderByType.Desc)
+            .Select<OrderListOutDto>();
+    }
 }

+ 2 - 1
src/Hotline.Repository.SqlSugar/Extensions/SqlSugarRepositoryExtensions.cs

@@ -6,6 +6,7 @@ using System.Text;
 using System.Threading.Tasks;
 using Hotline.Share;
 using Hotline.Share.Requests;
+using Hotline.Share.Tools;
 using Microsoft.AspNetCore.Http;
 using SqlSugar;
 using XF.Domain.Entities;
@@ -34,7 +35,7 @@ namespace Hotline.Repository.SqlSugar.Extensions
         /// 分批次查询固定数量
         /// </summary>
         /// <returns></returns>
-        public static Task<List<TEntity>> ToFixedListAsync<TEntity>(this ISugarQueryable<TEntity> query, QueryFixedDto dto, CancellationToken cancellationToken)
+        public static Task<List<TEntity>> ToFixedListAsync<TEntity>(this ISugarQueryable<TEntity> query, IQueryFixedDto dto, CancellationToken cancellationToken)
         where TEntity : class, new()
         {
             if (dto.QueryCount == 0) dto.QueryCount = 50;

+ 1 - 0
src/Hotline.Share/Dtos/CallCenter/QueryCallsFixedDto.cs

@@ -4,6 +4,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using Hotline.Share.Enums.CallCenter;
+using Hotline.Share.Tools;
 
 namespace Hotline.Share.Dtos.CallCenter
 {

+ 2 - 1
src/Hotline.Share/Dtos/CallCenter/QueryTelOperationsFixedDto.cs

@@ -1,4 +1,5 @@
-using System;
+using Hotline.Share.Tools;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;

+ 238 - 0
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -1196,4 +1196,242 @@ namespace Hotline.Share.Dtos.Order
 	    public string OrderId { get; set; }
     }
 
+
+    public class OrderListOutDto
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 工单状态
+        /// </summary>
+        public EOrderStatus Status { get; set; }
+
+        public string StatusText => Status.GetDescription();
+
+        /// <summary>
+        /// 过期状态
+        /// </summary>
+        public EExpiredStatus? ExpiredStatus => CalculateExpiredState();
+
+        /// <summary>
+        /// 归档时间(暂为流程结束时间,因流程结束自动归档)
+        /// </summary>
+        public DateTime? FiledTime { get; set; }
+
+        /// <summary>
+        /// 过期时间
+        /// </summary>
+        public DateTime? ExpiredTime { get; set; }
+
+        /// <summary>
+        /// 即将超期时间
+        /// </summary>
+        public DateTime? NearlyExpiredTime { get; set; }
+
+        /// <summary>
+        /// 即将超期第一级
+        /// </summary>
+        public DateTime? NearlyExpiredTimeOne { get; set; }
+
+
+        public EExpiredStatus? CalculateExpiredState()
+        {
+            DateTime? dateTime = DateTime.Now;
+            if (Status >= EOrderStatus.Filed)
+            {
+                dateTime = FiledTime;
+            }
+            //ExpiredStatus
+            if (ExpiredTime.HasValue)
+            {
+                if (NearlyExpiredTimeOne.HasValue && dateTime < NearlyExpiredTimeOne)
+                {
+                    return EExpiredStatus.Normal;
+                }
+                else if (!NearlyExpiredTimeOne.HasValue && dateTime < NearlyExpiredTime)
+                {
+                    return EExpiredStatus.Normal;
+                }
+                else if (NearlyExpiredTimeOne.HasValue && dateTime > NearlyExpiredTimeOne && dateTime < NearlyExpiredTime)
+                {
+                    return EExpiredStatus.GoingToExpiredOne;
+                }
+                else if (dateTime > NearlyExpiredTime && dateTime < ExpiredTime)
+                {
+                    return EExpiredStatus.GoingToExpired;
+                }
+                else
+                {
+                    return EExpiredStatus.Expired;
+                }
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 过期状态
+        /// </summary>
+        public string ExpiredStatusText => ExpiredStatus?.GetDescription() ?? string.Empty;
+
+        /// <summary>
+        /// 工单编码(20220101000001)
+        /// </summary>
+        public string No { get; set; }
+
+
+        /// <summary>
+        /// 会签类型
+        /// </summary>
+        public ECounterSignType? CounterSignType { get; set; }
+
+        public string? CounterSignTypeText => CounterSignType?.GetDescription() ?? "未会签";
+
+        /// <summary>
+        /// 签收人id
+        /// </summary>
+        public string? SignerId { get; set; }
+
+        /// <summary>
+        /// 签收人名称
+        /// </summary>
+        public string? SignerName { get; set; }
+
+        public DateTime CreationTime { get; set; }
+
+        public string? ContactMask { get; set; }
+
+
+        /// <summary>
+        /// 紧急程度
+        /// </summary>
+        public EEmergencyLevel EmergencyLevel => IsUrgent
+            ? EEmergencyLevel.Emergency
+            : EEmergencyLevel.UnEmergency;
+
+        /// <summary>
+        /// 是否可签收
+        /// </summary>
+        public bool CanSign => string.IsNullOrEmpty(SignerId);
+
+        /// <summary>
+        /// 待结束会签编号
+        /// </summary>
+        public string? CountersignId { get; set; }
+
+        /// <summary>
+        /// 是否可以延期
+        /// </summary>
+        public bool IsCanDelay { get; set; }
+
+        /// <summary>
+        /// 是否可以取消延期
+        /// </summary>
+        public bool IsCanCancelDelay { get; set; }
+
+        /// <summary>
+        /// 最后一次延期天数
+        /// </summary>
+        public string? DelayString { get; set; }
+
+        /// <summary>
+        /// 是否可退回
+        /// </summary>
+        public bool CanPrevious { get; set; }
+
+        /// <summary>
+        /// 是否可办理
+        /// </summary>
+        public bool CanHandle { get; set; }
+
+        /// <summary>
+        /// 退回意见
+        /// </summary>
+        public string? PreviousOpinion { get; set; }
+
+        /// <summary>
+        /// 是否可代办
+        /// </summary>
+        public bool CanInsteadHandle { get; set; }
+
+        /// <summary>
+        /// 是否紧急
+        /// </summary>
+        public bool IsUrgent { get; set; }
+
+        public string IsUrgentText => IsUrgent ? "紧急" : "";
+
+        /// <summary>
+        /// 发布范围
+        /// </summary>
+        public bool? PublishState { get; set; }
+
+        /// <summary>
+        /// 实际办理节点code(会签状态此字段保存最外层会签发起节点code)
+        /// </summary>
+        public string? ActualHandleStepCode { get; set; }
+
+        /// <summary>
+        /// 实际办理节点名称(会签状态此字段保存最外层会签发起节点名称)
+        /// </summary>
+        public string? ActualHandleStepName { get; set; }
+
+        /// <summary>
+        /// 重办次数
+        /// </summary>
+        public int ReTransactNum { get; set; }
+
+        /// <summary>
+        /// 热点分类
+        /// </summary>
+        public string HotspotName { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string SourceChannel { get; set; }
+
+        public string SourceChannelCode { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string AcceptType { get; set; }
+        public string AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 是否为省工单
+        /// </summary>
+        public bool IsProvince { get; set; }
+
+        public string IsProvinceText => IsProvince ? "省工单" : "市工单";
+
+        /// <summary>
+        /// 工单标题
+        /// </summary>
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 工单开始时间(受理/接办时间=流程开启时间)
+        /// </summary>
+        public DateTime? StartTime { get; set; }
+
+        /// <summary>
+        /// 受理人id
+        /// </summary>
+        public string AcceptorId { get; set; }
+
+        /// <summary>
+        /// 受理人名称
+        /// </summary>
+        public string AcceptorName { get; set; }
+
+        /// <summary>
+        /// 是否可编辑
+        /// </summary>
+        public bool CanEdit => !string.IsNullOrEmpty(SignerId) &&
+                               (Status is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept or EOrderStatus.HandOverToUnAccept);
+    }
 }

+ 41 - 25
src/Hotline.Share/Dtos/Order/OrderWaitedDto.cs

@@ -5,6 +5,7 @@ using System.Text;
 using System.Threading.Tasks;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
+using Hotline.Share.Tools;
 
 namespace Hotline.Share.Dtos.Order
 {
@@ -24,12 +25,17 @@ namespace Hotline.Share.Dtos.Order
         public DateTime? StepExpiredTime { get; set; }
     }
 
-    public record QueryOrderWaitedDto : PagedKeywordRequest 
+    public record QueryOrderWaitedDto : PagedKeywordRequest, IQueryFixedDto
     {
-	    public bool? IsProvince { get; set; }
-	    public bool? IsHandled { get; set; }
-	    public bool? IsCounterSign { get; set; }
-	    public bool? ExpiredOrAlmostOverdue { 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>
@@ -42,6 +48,16 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string? AreaCode { get; set; }
 
+        public int QueryIndex { get; set; }
+
+        public int QueryCount { get; set; }
+
+        /// <summary>
+        /// 1: 交办件
+        /// 2: 直办件
+        /// </summary>
+        public int? TypeCode { get; set; }
+
         /// <summary>
         /// 工单状态
         /// </summary>
@@ -52,17 +68,17 @@ namespace Hotline.Share.Dtos.Order
     /// 中心待办
     /// </summary>
     public record QueryOrderWaitedCenterDto : PagedKeywordRequest
-	{
-		/// <summary>
-		/// 编号
-		/// </summary>
-		public string? No { get; set; }
+    {
+        /// <summary>
+        /// 编号
+        /// </summary>
+        public string? No { get; set; }
 
         /// <summary>
         /// 标题
         /// </summary>
         public string? Title { get; set; }
-        
+
         /// <summary>
         /// 开始生成时间
         /// </summary>
@@ -73,16 +89,16 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public DateTime? EndCreationTime { get; set; }
 
-		/// <summary>
-		/// 结束受理时间
-		/// </summary>
-		public DateTime? StartTimeEnd { get; set; }
+        /// <summary>
+        /// 结束受理时间
+        /// </summary>
+        public DateTime? StartTimeEnd { get; set; }
+
+        /// <summary>
+        /// 开始受理时间
+        /// </summary>
+        public DateTime? StartTimeSt { get; set; }
 
-		/// <summary>
-		/// 开始受理时间
-		/// </summary>
-		public DateTime? StartTimeSt { get; set; }
-        
         /// <summary>
         /// 当前节点名称
         /// </summary>
@@ -108,15 +124,15 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string? CenterToOrgHandlerName { get; set; }
 
-		/// <summary>
-		/// 过期状态
-		/// </summary>
-		public EExpiredStatus? ExpiredStatus { get; set; }
+        /// <summary>
+        /// 过期状态
+        /// </summary>
+        public EExpiredStatus? ExpiredStatus { get; set; }
 
         /// <summary>
         /// 是否紧急
         /// </summary>
         public bool? IsUrgent { get; set; }
 
-	}
+    }
 }

+ 3 - 2
src/Hotline.Share/QueryFixedDto.cs

@@ -1,4 +1,5 @@
-using System;
+using Hotline.Share.Tools;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -6,7 +7,7 @@ using System.Threading.Tasks;
 
 namespace Hotline.Share
 {
-    public class QueryFixedDto
+    public class QueryFixedDto : IQueryFixedDto
     {
         /// <summary>
         /// 查询批次

+ 19 - 0
src/Hotline.Share/Tools/IQueryFixedDto.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Tools;
+public interface IQueryFixedDto
+{
+    /// <summary>
+    /// 查询批次
+    /// </summary>
+    int QueryIndex { get; set; }
+
+    /// <summary>
+    /// 单次总数据量
+    /// </summary>
+    int QueryCount { get; set; }
+}

+ 1 - 0
src/Hotline/Caching/Interfaces/ISystemSettingCacheManager.cs

@@ -19,5 +19,6 @@ namespace Hotline.Caching.Interfaces
         /// 根据禅道 自贡需求 Id_361, 第一条, 3小条需求;
         /// </summary>
         string DefaultVisitEmployeeId { get; }
+        int FixedQueryCount { get; }
     }
 }

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

@@ -53,5 +53,7 @@ namespace Hotline.Caching.Services
         public string RecordPrefix => GetSetting(SettingConstants.RecordPrefix)?.SettingValue[0].Trim().ToString();
 
         public string DefaultVisitEmployeeId => GetSetting(SettingConstants.DefaultVisitEmployeeId)?.SettingValue[0].Trim().ToString();
+
+        public int FixedQueryCount => int.Parse(GetSetting(SettingConstants.FixedQueryCount)?.SettingValue[0]);
     }
 }