Browse Source

合并代码

qinchaoyue 5 months ago
parent
commit
152c4e58b7

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

@@ -6492,11 +6492,67 @@ public class OrderController : BaseController
     [HttpGet("order/about_expire/list")]
     public async Task<PagedDto<OrderDto>> AboutList([FromQuery] AboutToExpireListDto dto)
     {
+        var version = _systemSettingCacheManager.GetAboutToExpireVersion;
+        if (version == 1)
+        {
+            var (t, i) = await _orderApplication.GetAboutToExpireAsyncV1(dto)
+                .ToPagedListAsync(dto, HttpContext.RequestAborted);
+            return new PagedDto<OrderDto>(t, _mapper.Map<IReadOnlyList<OrderDto>>(i));
+        }
         var (total, items) = await _orderApplication.GetAboutToExpireAsync(dto)
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
         return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
     }
 
+    /// <summary>
+    /// 工单即将超期列表(不查总条数)
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("order/about_expire/list_items")]
+    public async Task<List<OrderDto>> AboutListAsnc([FromQuery] AboutToExpireListDto dto)
+    {
+        var version = _systemSettingCacheManager.GetAboutToExpireVersion;
+        var fixedQueryCount = _systemSettingCacheManager.FixedQueryCount;
+        if (version == 1)
+        {
+            return (await _orderApplication.GetAboutToExpireAsyncV1(dto).ToFixedListAsync(dto.QueryIndex, fixedQueryCount, HttpContext.RequestAborted))
+                .Adapt<List<OrderDto>>();
+        }
+        return (await _orderApplication.GetAboutToExpireAsync(dto).ToFixedListAsync(dto.QueryIndex, fixedQueryCount, HttpContext.RequestAborted))
+            .Adapt<List<OrderDto>>();
+    }
+
+    /// <summary>
+    /// 工单即将超期列表总条数
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+   [HttpGet("order/about_expire/list_count")]
+    public async Task<int> AboutListCountAsnc([FromQuery] AboutToExpireListDto dto)
+    {
+        var version = _systemSettingCacheManager.GetAboutToExpireVersion;
+        if (version == 1)
+        {
+            return await _orderApplication.GetAboutToExpireAsyncV1(dto).CountAsync(HttpContext.RequestAborted);
+        }
+        return await _orderApplication.GetAboutToExpireAsync(dto).CountAsync(HttpContext.RequestAborted);
+    }
+
+    /// <summary>
+    /// 工单即将超期列表(优化测试)
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    //[Permission(EPermission.OverdueOrderV1)]
+    [HttpGet("order/about_expire/list_optimize")]
+    public async Task<PagedDto<OrderDto>> GetAboutToExpireAsyncV1([FromQuery] AboutToExpireListDto dto)
+    {
+        var (t, i) = await _orderApplication.GetAboutToExpireAsyncV1(dto)
+            .ToPagedListAsync(dto, HttpContext.RequestAborted);
+        return new PagedDto<OrderDto>(t, _mapper.Map<IReadOnlyList<OrderDto>>(i));
+    }
+
     /// <summary>
     /// 工单即将超期列表导出
     /// </summary>

+ 1 - 0
src/Hotline.Application.Tests/Application/SystemSettingCacheManagerTest.cs

@@ -35,5 +35,6 @@ public class SystemSettingCacheManagerTest
         delaySecondEntity.ShouldNotBeNull("DefaultVisitSmsDelaySecond 系统设置为NULL");
 
         _systemSettingCacheManager.CallSyncUnPushDateTime.ShouldBe(DateTime.Parse("2024/11/19 18:08:00"));
+        _systemSettingCacheManager.GetAboutToExpireVersion.ShouldBe(0);
     }
 }

+ 14 - 0
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -54,7 +54,21 @@ namespace Hotline.Application.Orders
 
         ISugarQueryable<Order> GetToExpireAsync(AboutToExpireListDto dto);
         //Task<PagedDto<WorkflowOrderDto>> GetToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 即将超期列表优化V1版本
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<Order> GetAboutToExpireAsyncV1(AboutToExpireListDto dto);
+
+        /// <summary>
+        /// 即将超期列表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
         ISugarQueryable<Order> GetAboutToExpireAsync(AboutToExpireListDto dto);
+
         //Task<PagedDto<WorkflowOrderDto>> GetAboutToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken);
         Task OrderParticiple(string inputStr, string orderId, DateTime time, CancellationToken cancellationToken);
         Task OrderSensitiveParticiple(string inputStr, string orderId, CancellationToken cancellationToken);

+ 68 - 0
src/Hotline.Application/Orders/OrderApplication.cs

@@ -316,6 +316,73 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         await _orderRepository.UpdateAsync(order, cancellationToken);
     }
 
+    /// <summary>
+    /// 工单即将超期列表(优化版本v1)
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<Order> GetAboutToExpireAsyncV1(AboutToExpireListDto dto)
+    {
+        DateTime? dateTime = DateTime.Now;
+        var IsCenter = _sessionContextProvider.SessionContext.OrgIsCenter;
+        int orgLevel = _sessionContextProvider.SessionContext.OrgLevel;
+        var orgCode = _sessionContextProvider.SessionContext.OrgId;
+        var query = _orderRepository.Queryable();
+        if (IsCenter == true)
+            query = _orderRepository.Queryable(canView: !IsCenter);
+        return query
+            .Includes(d => d.OrderDelays)
+            .WhereIF(orgLevel == 3, d => SqlFunc.Subqueryable<WorkflowStep>()
+                .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
+                               ((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())
+             .WhereIF(orgLevel == 2 || orgLevel == 1, d => SqlFunc.Subqueryable<WorkflowStep>()
+                .Where(step => step.ExternalId == d.Id &&
+                               step.Status != EWorkflowStepStatus.Handled &&
+                               (!string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId.StartsWith(orgCode)))
+                .Any())
+            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No!))
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title!))
+            .WhereIF(dto.Delay.HasValue && dto.Delay == 1, d => d.OrderDelays.Any() == true)
+            .WhereIF(dto.Delay.HasValue && dto.Delay == 2, d => d.OrderDelays.Any() == false)
+            //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
+            //.Where(d => d.ExpiredTime != null &&
+            //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
+            .Where(d => d.Status < EOrderStatus.Filed && dateTime > d.NearlyExpiredTime && dateTime < d.ExpiredTime)
+            .OrderByIF(dto is { SortField: "no", SortRule: 0 }, x => x.No, OrderByType.Asc) //工单编号升序
+            .OrderByIF(dto is { SortField: "no", SortRule: 1 }, x => x.No, OrderByType.Desc) //工单编号降序
+            .OrderByIF(dto is { SortField: "isProvinceText", SortRule: 0 }, x => x.IsProvince, OrderByType.Asc)//是否省工单升序
+            .OrderByIF(dto is { SortField: "isProvinceText", SortRule: 1 }, x => x.IsProvince, OrderByType.Desc)//是否省工单降序
+            .OrderByIF(dto is { SortField: "currentStepName", SortRule: 0 }, x => x.CurrentStepName, OrderByType.Asc)//当前节点升序
+            .OrderByIF(dto is { SortField: "currentStepName", SortRule: 1 }, x => x.CurrentStepName, OrderByType.Desc)//当前节点降序
+            .OrderByIF(dto is { SortField: "delayText", SortRule: 0 }, x => x.OrderDelays.Count, OrderByType.Asc) //是否延期升序
+            .OrderByIF(dto is { SortField: "delayText", SortRule: 1 }, x => x.OrderDelays.Count, OrderByType.Desc) //是否延期升序
+            .OrderByIF(dto is { SortField: "statusText", SortRule: 0 }, x => x.Status, OrderByType.Asc) //工单状态升序
+            .OrderByIF(dto is { SortField: "statusText", SortRule: 1 }, x => x.Status, OrderByType.Desc) //工单状态升序
+            .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: "expiredTime", SortRule: 0 }, x => x.ExpiredTime, OrderByType.Asc) //期满时间升序
+            .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, x => x.ExpiredTime, OrderByType.Desc) //期满时间降序
+            .OrderByIF(dto is { SortField: "actualHandleOrgName", SortRule: 0 }, x => x.ActualHandleOrgName, OrderByType.Asc)// 接办部门升序
+            .OrderByIF(dto is { SortField: "actualHandleOrgName", SortRule: 1 }, x => x.ActualHandleOrgName, OrderByType.Desc)// 接办部门降序
+            .OrderByIF(dto is { SortField: "acceptType", SortRule: 0 }, x => x.AcceptTypeCode, OrderByType.Asc) //受理类型升序
+            .OrderByIF(dto is { SortField: "acceptType", SortRule: 1 }, x => x.AcceptTypeCode, OrderByType.Desc) //受理类型降序
+            .OrderByIF(dto is { SortField: "counterSignTypeText", SortRule: 0 }, x => x.CounterSignType, OrderByType.Asc) //是否会签升序
+            .OrderByIF(dto is { SortField: "counterSignTypeText", SortRule: 1 }, x => x.CounterSignType, OrderByType.Desc) //是否会签降序
+            .OrderByIF(dto is { SortField: "orgLevelOneName", SortRule: 0 }, x => x.OrgLevelOneName, OrderByType.Asc) //一级部门升序
+            .OrderByIF(dto is { SortField: "orgLevelOneName", SortRule: 1 }, x => x.OrgLevelOneName, OrderByType.Desc)//一级部门降序
+            .OrderByIF(dto is { SortField: "hotspotName", SortRule: 0 }, x => x.HotspotId, OrderByType.Asc) //热点升序
+            .OrderByIF(dto is { SortField: "hotspotName", SortRule: 1 }, x => x.HotspotId, OrderByType.Desc) //热点降序
+            .OrderByIF(dto is { SortField: "acceptorName", SortRule: 0 }, x => x.AcceptorName, OrderByType.Asc)// 受理人升序
+            .OrderByIF(dto is { SortField: "acceptorName", SortRule: 1 }, x => x.AcceptorName, OrderByType.Desc);// 受理人升序
+    }
+
     /// <summary>
     /// 即将超期列表
     /// </summary>
@@ -339,6 +406,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         //    query = _orderRepository.Queryable(canView: !IsCenter);
         //return query.Includes(d => d.OrderDelays)
         return _orderRepository.Queryable(canView: !IsCenter)
+            .Includes(d => d.OrderDelays)
             .WhereIF(orgLevel == 3, d => SqlFunc.Subqueryable<WorkflowStep>()
                 .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
                                ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&

+ 5 - 0
src/Hotline.Share/Dtos/Order/PublishedDto.cs

@@ -616,6 +616,11 @@ public record AboutToExpireListDto : PagedKeywordRequest
     /// 排序方式 // 0 升序 1 降序
     /// </summary>
     public int? SortRule { get; set; } = 0;
+
+    /// <summary>
+    /// 查询批次
+    /// </summary>
+    public int QueryIndex { get; set; }
 }
 
 public class PublishOrderAllDto

+ 1 - 0
src/Hotline.Share/Tools/TupleExtensions.cs

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

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

@@ -43,5 +43,10 @@ namespace Hotline.Caching.Interfaces
         /// 通话记录同步时不推送省上的时间(默认:2024/11/19 18:08)
         /// </summary>
         DateTime CallSyncUnPushDateTime { get; }
+
+        /// <summary>
+        /// 即将超期列表调用方法的版本(有优化办法和老版本)
+        /// </summary>
+        int GetAboutToExpireVersion { get; }
     }
 }

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

@@ -167,5 +167,12 @@ namespace Hotline.Caching.Services
         public DateTime CallSyncUnPushDateTime =>
             GetOrDefault("08dc9bed-41da-4074-8289-e753e8fa8ea4", SettingConstants.CallSyncUnPushDateTime, "通话记录同步时不推送省上的时间(默认:2024/11/19 18:08)",
                 DateTime.Parse("2024/11/19 18:08:00"), "通话记录同步时不推送省上的时间(默认:2024/11/19 18:08), 在兴唐数据库 callstarttime 字段时间小于设置 (默认:2024/11/19 18:08) 的时间都不会推送给省上");
+
+        /// <summary>
+        /// 即将超期列表调用方法的版本(有优化办法和老版本)
+        /// </summary>
+        public int GetAboutToExpireVersion => 
+            GetOrDefault("08dc39bd-0ead-477c-87bc-97252dd8fb26", SettingConstants.GetAboutToExpireVersion, "前调用后端超期列表时后端控制调用优化的代码还是老代码", 0, "前调用后端超期列表时后端控制调用优化的代码还是老代码, 目前只有一个优化版本. 该值为 1 调用优化过的代码.");
+
     }
 }

+ 1 - 0
src/Hotline/Orders/Order.cs

@@ -24,6 +24,7 @@ namespace Hotline.Orders
     [SugarIndex("unique_order_no", nameof(Order.No), OrderByType.Desc, true)]
     [SugarIndex("index_order_creationtime", nameof(Order.CreationTime), OrderByType.Asc)]
     [SugarIndex("index_order_startTime", nameof(Order.StartTime), OrderByType.Asc)]
+    [SugarIndex("index_order_status", nameof(Status), OrderByType.Asc)]
     [SugarIndex("index_order_expiredTime", nameof(Order.ExpiredTime), OrderByType.Asc)]
 	public partial class Order : PositionWorkflowEntity
     {

+ 5 - 0
src/Hotline/Permissions/EPermission.cs

@@ -743,6 +743,11 @@ namespace Hotline.Permissions
         [Display(GroupName = "工单超期列表", Name = "工单超期列表", Description = "工单超期列表")]
         OverdueOrder = 201002,
 
+        /// <summary>
+        /// 工单超期列表(优化)
+        /// </summary>
+        [Display(GroupName = "工单超期列表(优化)", Name = "工单超期列表(优化)", Description = "工单超期列表(优化)")]
+        OverdueOrderV1 = 201003,
         #endregion
 
         #endregion

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

@@ -612,5 +612,10 @@ namespace Hotline.Settings
         /// 通话记录同步时不推送省上的时间(默认:2024/11/19 18:08)
         /// </summary>
         public const string CallSyncUnPushDateTime = "CallSyncUnPushDateTime";
+
+        /// <summary>
+        /// 即将超期列表调用方法的版本(有优化办法和老版本)
+        /// </summary>
+        public const string GetAboutToExpireVersion = "GetAboutToExpireVersion";
     }
 }