瀏覽代碼

修改管理员查看甄别、延期全部

tangjiang 8 月之前
父節點
當前提交
037ab30970

+ 19 - 43
src/Hotline.Api/Controllers/OrderController.cs

@@ -1585,13 +1585,9 @@ public class OrderController : BaseController
     [HttpGet("delay")]
     public async Task<PagedDto<OrderDelayDto>> DelayList([FromQuery] DelayListDto dto)
     {
-        bool canView = true;
-        var systemAdministrator = _systemSettingCacheManager.GetSetting(SettingConstants.SystemAdministrator)?.SettingValue[0];
 
-        if (!string.IsNullOrEmpty(systemAdministrator) && (_sessionContext.Roles.Contains(systemAdministrator) || _sessionContext.Roles.Contains(RoleSeedData.AdminRole)))
-            canView = false;
-
-        var (total, items) = await _orderDelayRepository.Queryable(canView: canView)
+        var isAdmin = _orderDomainService.IsCheckAdmin();
+        var (total, items) = await _orderDelayRepository.Queryable(canView: true, isAdmin: isAdmin)
             .Includes(d => d.Order)
             .Includes(d => d.Workflow)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
@@ -1613,44 +1609,24 @@ public class OrderController : BaseController
     [HttpGet("wait_delay")]
     public async Task<PagedDto<OrderDelayDto>> WaitDelayList([FromQuery] DelayListDto dto)
     {
-        bool canView = true;
-        var systemAdministrator = _systemSettingCacheManager.GetSetting(SettingConstants.SystemAdministrator)?.SettingValue[0];
 
-        if (!string.IsNullOrEmpty(systemAdministrator) && (_sessionContext.Roles.Contains(systemAdministrator) || _sessionContext.Roles.Contains(RoleSeedData.AdminRole)))
-        {
-            var (total, items) = await _orderDelayRepository
-           .Queryable(false, false, false)
-           .Includes(d => d.Order)
-           .Includes(d => d.Workflow)
-           .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-               d => d.Order.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
-           //.WhereIF(dto.IsApply == true, d => d.DelayState != EDelayState.Examining)
-           .WhereIF(dto.IsApply == false, d => d.DelayState == EDelayState.Examining)
-           //.WhereIF(dto.DelayState != null, x => x.DelayState == dto.DelayState)
-           //.Where(x=>x.DelayState == EDelayState.Examining)
-           .OrderByDescending(d => d.ApplyDelayTime)
-           .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+        var isAdmin = _orderDomainService.IsCheckAdmin();
+        var isHandled = dto.IsApply.HasValue && dto.IsApply.Value;
+        var (total, items) = await _orderDelayRepository
+            .Queryable(hasHandled: isHandled, isAdmin: isAdmin)
+            .Includes(d => d.Order)
+            .Includes(d => d.Workflow)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+                d => d.Order.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
+            //.WhereIF(dto.IsApply == true, d => d.DelayState != EDelayState.Examining)
+            .WhereIF(dto.IsApply == false, d => d.DelayState == EDelayState.Examining)
+            //.WhereIF(dto.DelayState != null, x => x.DelayState == dto.DelayState)
+            //.Where(x=>x.DelayState == EDelayState.Examining)
+            .OrderByDescending(d => d.ApplyDelayTime)
+            .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
-            return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
-        }
-        else
-        {
-            var isHandled = dto.IsApply.HasValue && dto.IsApply.Value;
-            var (total, items) = await _orderDelayRepository
-                .Queryable(hasHandled: isHandled)
-                .Includes(d => d.Order)
-                .Includes(d => d.Workflow)
-                .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                    d => d.Order.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
-                //.WhereIF(dto.IsApply == true, d => d.DelayState != EDelayState.Examining)
-                .WhereIF(dto.IsApply == false, d => d.DelayState == EDelayState.Examining)
-                //.WhereIF(dto.DelayState != null, x => x.DelayState == dto.DelayState)
-                //.Where(x=>x.DelayState == EDelayState.Examining)
-                .OrderByDescending(d => d.ApplyDelayTime)
-                .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+        return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
 
-            return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
-        }
     }
 
     /// <summary>
@@ -1834,8 +1810,8 @@ public class OrderController : BaseController
     {
         var view = dto.source == 1;
         var handler = dto.source == 1 && dto.Status is EScreenStatus.Apply;
-
-        var query = _orderScreenRepository.Queryable(hasHandled: !handler)
+        var isAdmin = _orderDomainService.IsCheckAdmin();
+        var query = _orderScreenRepository.Queryable(hasHandled: !handler, isAdmin: isAdmin)
             .Includes(d => d.Order)
             .Includes(d => d.VisitDetail)
             .Includes(d => d.Visit, v => v.Order)

+ 4 - 4
src/Hotline.Repository.SqlSugar/BaseRepositoryWorkflow.cs

@@ -17,7 +17,7 @@ public class BaseRepositoryWorkflow<TEntity> : BaseRepository<TEntity>, IReposit
         _dataPermissionFilterBuilder = dataPermissionFilterBuilder;
     }
 
-    public ISugarQueryable<TEntity> Queryable(bool permissionVerify = false, bool includeDeleted = false, bool canView = true, bool? hasHandled = null)
+    public ISugarQueryable<TEntity> Queryable(bool permissionVerify = false, bool includeDeleted = false, bool canView = true, bool? hasHandled = null, bool? isAdmin=false)
     {
         if (includeDeleted)
             Db.QueryFilter.Clear();
@@ -26,12 +26,12 @@ public class BaseRepositoryWorkflow<TEntity> : BaseRepository<TEntity>, IReposit
         if (permissionVerify)
             query = query.DataPermissionFiltering(_dataPermissionFilterBuilder);
 
-        if (canView)
+        if (canView && isAdmin != true)
             query = query.WorkflowViewFiltering(_dataPermissionFilterBuilder);
 
         if (hasHandled.HasValue)
-            query = query.WorkflowHandleFiltering(_dataPermissionFilterBuilder, hasHandled.Value);
-        
+            query = query.WorkflowHandleFiltering(_dataPermissionFilterBuilder, hasHandled.Value,isAdmin);
+
         return query.Clone();
     }
 

+ 15 - 3
src/Hotline.Repository.SqlSugar/Extensions/DataPermissionExtensions.cs

@@ -38,14 +38,27 @@ namespace Hotline.Repository.SqlSugar.Extensions
         }
 
         public static ISugarQueryable<TEntity> WorkflowHandleFiltering<TEntity>(this ISugarQueryable<TEntity> queryable,
-            IDataPermissionFilterBuilder dataPermissionFilterBuilder, bool hasHandled)
+            IDataPermissionFilterBuilder dataPermissionFilterBuilder, bool hasHandled, bool? isAdmin = false)
             where TEntity : class, IEntity<string>, IDataPermission, IWorkflow, new()
         {
+            //如果是管理员,只查询已办待办
+            if (isAdmin.HasValue && isAdmin.Value)
+            {
+                return queryable.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.TraceState != EWorkflowTraceState.StepRemoveByRecall))
+                    .Any()
+                );
+            }
+
             var session = dataPermissionFilterBuilder.SessionContext;
+            //非管理员按照常规逻辑
             return queryable.Where(d => SqlFunc.Subqueryable<WorkflowTrace>()
                 .Where(step => step.ExternalId == d.Id &&
                                (hasHandled || step.Status != EWorkflowStepStatus.Handled) &&
-                               (!hasHandled || step.Status == EWorkflowStepStatus.Handled && 
+                               (!hasHandled || step.Status == EWorkflowStepStatus.Handled &&
                                    step.TraceState != EWorkflowTraceState.StepRemoveByPrevious &&
                                    step.TraceState != EWorkflowTraceState.StepRemoveByRecall) &&
                                ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == session.RequiredUserId) ||
@@ -53,7 +66,6 @@ namespace Hotline.Repository.SqlSugar.Extensions
                                 (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && session.Roles.Contains(step.RoleId))))
                 .Any()
             );
-
             //return queryable.LeftJoin<WorkflowStep>((d, step) => d.Id == step.ExternalId)
             //        .Where((d, step) => (step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == session.RequiredUserId) ||
             //                                 (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == session.RequiredOrgId) ||

+ 19 - 13
src/Hotline/Orders/IOrderDomainService.cs

@@ -1,5 +1,4 @@
 using Hotline.Schedulings;
-using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Order;
 
@@ -62,14 +61,14 @@ namespace Hotline.Orders
         Task<string> AddOrderComplementAsync(AddOrderComplementDto dto, CancellationToken cancellationToken);
 
         #endregion
-        
+
         #region 平均派单
         /// <summary>
         /// 平均派单
         /// </summary>
         /// <returns></returns>
         Task<FlowStepHandler> AverageOrder(CancellationToken cancellationToken);
-        
+
         /// <summary>
         /// 登录平均派单
         /// </summary>
@@ -82,14 +81,21 @@ namespace Hotline.Orders
         /// </summary>
         /// <returns></returns>
         Task TriggerAverageOrder(CancellationToken cancellationToken);
-		#endregion
-
-		#region  工单校验- 交通类工单
-		/// <summary>
-		/// 工单校验  - 交通类工单
-		/// </summary>
-		/// <returns></returns>
-		Task<OrderValidation> OrderValidation(AddOrderDto dto, CancellationToken cancellationToken);
-		#endregion
-	}
+        #endregion
+
+        #region  工单校验- 交通类工单
+        /// <summary>
+        /// 工单校验  - 交通类工单
+        /// </summary>
+        /// <returns></returns>
+        Task<OrderValidation> OrderValidation(AddOrderDto dto, CancellationToken cancellationToken);
+        #endregion
+
+        /// <summary>
+        /// 验证是否是管理员
+        /// </summary>
+        /// <returns></returns>
+        bool IsCheckAdmin();
+
+    }
 }

+ 28 - 14
src/Hotline/Orders/OrderDomainService.cs

@@ -19,6 +19,7 @@ using Hotline.Share.Dtos;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos.FlowEngine;
 using Microsoft.AspNetCore.Http;
+using Hotline.Settings;
 
 namespace Hotline.Orders;
 
@@ -106,9 +107,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     {
         if (autoAccept)
         {
-	        order.AutoAccept(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.StaffNo);
+            order.AutoAccept(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.StaffNo);
             order.Sign(_sessionContext.RequiredUserId, _sessionContext.UserName);
-		}
+        }
         order.Init();
         order.No = GenerateNewOrderNo();
         order.Password = Random.Shared.Next(100000, 1000000).ToString();
@@ -176,7 +177,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     {
         var complement = _mapper.Map<OrderComplement>(dto);
         complement.InitId();
-        complement.IsProComplement = true;  
+        complement.IsProComplement = true;
         if (dto.Files.Any()) complement.FileJson = await _fileRepository.AddFileAsync(dto.Files, complement.Id, "", cancellationToken);
         return await _orderComplementRepository.AddAsync(complement, cancellationToken);
     }
@@ -184,6 +185,19 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
 
     #endregion
 
+    /// <summary>
+    /// 验证是否是管理员
+    /// </summary>
+    /// <returns></returns>
+    public bool IsCheckAdmin()
+    {
+        var systemAdministrator = _systemSettingCacheManager.GetSetting(SettingConstants.SystemAdministrator)?.SettingValue[0];
+        if (!string.IsNullOrEmpty(systemAdministrator) && (_sessionContext.Roles.Contains(systemAdministrator) || _sessionContext.Roles.Contains(RoleSeedData.AdminRole)))
+            return true;
+        else
+            return false;
+    }
+
     #region 平均派单
     /// <summary>
     /// 平均派单
@@ -204,7 +218,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                 Username = "待派单池",
                 OrgId = OrgSeedData.CenterId,
                 OrgName = "市民热线服务中心"
-			};
+            };
         scheduling.SendOrderNum++;
         await _schedulingRepository.UpdateAsync(scheduling, cancellationToken);
         var user = scheduling.SchedulingUser;
@@ -244,9 +258,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             var sendNum = steps.Count / schedulings;
             scheduling.SendOrderNum += sendNum;
             await _schedulingRepository.Updateable()
-	            .SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum, AtWork = scheduling.AtWork })
-	            .Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
-			if (sendNum <= 0) return;
+                .SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum, AtWork = scheduling.AtWork })
+                .Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
+            if (sendNum <= 0) return;
             var sendSteps = steps.Take(sendNum).ToList();
             await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)>
             {
@@ -255,7 +269,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         }
 
     }
-        
+
     /// <summary>
     /// 触发平均派单
     /// </summary>
@@ -276,7 +290,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                 cancellationToken);
             if (steps.Any())
             {
-                List<(string userId, string username, string orgId, string orgName,string? roleId,string? roleName, ICollection<WorkflowStep> steps)> handlers = new();
+                List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)> handlers = new();
                 var avg = steps.Count / schedulings.Count;
                 var remaining = steps.Count % schedulings.Count;
                 for (var i = 0; i < schedulings.Count; i++)
@@ -288,13 +302,13 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                         scheduling.SchedulingUser.UserName,
                         scheduling.SchedulingUser.OrgId,
                         scheduling.SchedulingUser.OrgIdName,
-                        null,null,
+                        null, null,
                         steps.Take(size).ToList()));
                     scheduling.SendOrderNum += size;
-					await _schedulingRepository.Updateable()
-	                    .SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum })
-	                    .Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
-				}
+                    await _schedulingRepository.Updateable()
+                        .SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum })
+                        .Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
+                }
                 if (handlers.Any())
                     await _workflowDomainService.ChangeHandlerBatchAsync(handlers, cancellationToken);
             }

+ 2 - 1
src/XF.Domain.Repository/IRepositoryWorkflow.cs

@@ -29,7 +29,8 @@ namespace XF.Domain.Repository
         /// <param name="includeDeleted"></param>
         /// <param name="canView">是否可查看</param>
         /// <param name="hasHandled">是否已办理,null: 不过滤</param>
+        /// <param name="isAdmin">是否是管理员</param>
         /// <returns></returns>
-        ISugarQueryable<TEntity> Queryable(bool permissionVerify = false, bool includeDeleted = false, bool canView = false, bool? hasHandled = null);
+        ISugarQueryable<TEntity> Queryable(bool permissionVerify = false, bool includeDeleted = false, bool canView = false, bool? hasHandled = null, bool? isAdmin = false);
     }
 }