Browse Source

SystemAuthority json with type

xf 2 years ago
parent
commit
af1ba9df60

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

@@ -77,18 +77,18 @@ public class OrderController : BaseController
     {
         var (total, items) = await _orderRepository.Queryable()
             .Includes(d => d.Employee)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword) || d.No.Contains(dto.Keyword))
-            .WhereIF(!string.IsNullOrEmpty(dto.Content), d => d.Content.Contains(dto.Content))
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
+            .WhereIF(!string.IsNullOrEmpty(dto.Content), d => d.Content.Contains(dto.Content!))
             .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
             .WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.Channel))
             .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId))
-            .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone))
+            .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!))
             .WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
-            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.Employee.Name.Contains(dto.NameOrNo) || d.Employee.StaffNo.Contains(dto.NameOrNo))
+            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.Employee.Name.Contains(dto.NameOrNo!) || d.Employee.StaffNo.Contains(dto.NameOrNo!))
             .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.PhoneNo), d => d.FromPhone.Contains(dto.PhoneNo) || d.Contact.Contains(dto.PhoneNo))
+            .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.FromPhone.Contains(dto.PhoneNo!) || d.Contact.Contains(dto.PhoneNo!))
             .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode)
             .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart)
             .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd)
@@ -131,7 +131,7 @@ public class OrderController : BaseController
             .Includes(d => d.OrderReport)
             .FirstAsync(d => d.Id == id);
         if (order == null)
-            return null;
+            return new();
         if (!string.IsNullOrEmpty(order?.WorkflowId))
         {
             order.Workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withSupplements: true, withAssigns: true, cancellationToken: HttpContext.RequestAborted);
@@ -140,9 +140,9 @@ public class OrderController : BaseController
                  _sessionContext.UserName, _sessionContext.RequiredOrgCode, _sessionContext.OrgName));
         }
 
-        var dto = _mapper.Map<OrderDto>(order);
+        var dto = _mapper.Map<OrderDto>(order!);
 
-        if (order.Workflow != null)
+        if (order?.Workflow != null)
             dto.Workflow.CanHandle =
                 order.Workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode);
         return dto;
@@ -196,9 +196,9 @@ public class OrderController : BaseController
         if (order.Status != EOrderStatus.Temporary || !string.IsNullOrEmpty(order.WorkflowId))
             throw UserFriendlyException.SameMessage("工单已发起流程");
 
-        if (order.OrderComplain is not null)
+        if (order?.OrderComplain is not null)
             await _orderRepository.RemoveOrderComplainAsync(order.OrderComplain, HttpContext.RequestAborted);
-        if (order.OrderReport is not null)
+        if (order?.OrderReport is not null)
             await _orderRepository.RemoveOrderReportAsync(order.OrderReport, HttpContext.RequestAborted);
 
         _mapper.Map(dto, order);

+ 1 - 1
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -247,7 +247,7 @@ public class WorkflowController : BaseController
     {
         var (total, items) = await _workflowRepository.Queryable()
             .WhereIF(!string.IsNullOrEmpty(dto.ModuleCode), d => d.ModuleCode == dto.ModuleCode)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Id.Contains(dto.Keyword) || d.Title.Contains(dto.Keyword))
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Id.Contains(dto.Keyword!) || d.Title.Contains(dto.Keyword!))
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
         return new PagedDto<WorkflowDto>(total, _mapper.Map<IReadOnlyList<WorkflowDto>>(items));

+ 1 - 1
src/Hotline.Api/StartupExtensions.cs

@@ -102,7 +102,7 @@ internal static class StartupExtensions
         //cache
         services.AddCache(d =>
             {
-                d.ConnectionString = configuration.GetConnectionString("Redis");
+                d.ConnectionString = configuration.GetConnectionString("Redis") ?? string.Empty;
                 d.Prefix = "Hotline";
             });
 

+ 3 - 1
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -151,6 +151,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             throw new UserFriendlyException("该模板不可用");
 
         var startStep = definition.Steps.FirstOrDefault(d => d.StepType == EStepType.Start);
+        if (startStep == null)
+            throw new UserFriendlyException("未正确配置开始节点");
         var nextStepDefines = definition.FindSteps(startStep.NextSteps);
         return await GetNextStepOptionsAsync(nextStepDefines);
     }
@@ -160,7 +162,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// </summary>
     public async Task<FlowAssignMode> GetFlowAssignModeAsync(StepDefine stepDefine, bool isStartCountersign, List<IdName> handlers, CancellationToken cancellationToken)
     {
-        if (stepDefine.StepType is EStepType.Start or EStepType.End) return default;
+        if (stepDefine.StepType is EStepType.Start or EStepType.End) return new();
         switch (stepDefine.HandlerType)
         {
             case EHandlerType.Role:

+ 1 - 1
src/Hotline.CacheManager/RolePermissionsCacheManager.cs

@@ -29,7 +29,7 @@ namespace Hotline.CacheManager
                     //todo 加上全局配置,对未开启模块过滤
                     var systemAuth = _systemAuthorityRepository.GetAsync(d => d.RoleCode == role).GetAwaiter()
                         .GetResult();
-                    return systemAuth?.GetAllPermissions() ?? new();
+                    return systemAuth?.GetPermissions() ?? new();
                 }
             );
         }

+ 17 - 29
src/Hotline.Repository.SqlSugar/System/SystemAuthorityRepository.cs

@@ -1,6 +1,7 @@
 using Hotline.Repository.SqlSugar.DataPermissions;
 using Hotline.SeedData;
 using Hotline.Settings;
+using Hotline.Share.Enums.Settings;
 using SqlSugar;
 using XF.Domain.Dependency;
 
@@ -21,17 +22,18 @@ namespace Hotline.Repository.SqlSugar.System
         {
             if (roles.Contains(RoleSeedData.AdminRole))
             {
-                return await Db.Queryable<SystemMenu>().Where(x=> x.MenuType != Share.Enums.Settings.EMenuType.Button).OrderBy(x => x.DisplayOrder).ToTreeAsync(x => x.children, it => it.ParentId, "");
+                return await Db.Queryable<SystemMenu>()
+                    .Where(x => x.MenuType != EMenuType.Button)
+                    .OrderBy(x => x.DisplayOrder)
+                    .ToTreeAsync(x => x.children, it => it.ParentId, "");
             }
             var list = await Db.Queryable<SystemAuthority>()
                 .Where(x => roles.Contains(x.RoleCode)).ToListAsync();
-            var menuarr = new List<string>();
-            foreach (var item in list)
-            {
-                menuarr.AddRange(item.SystemMenuArr);
-            }
-            var newmenu = menuarr.Distinct().ToList();
-            return await Db.Queryable<SystemMenu>().Where(x => menuarr.Contains(x.PermissionCode) && x.MenuType != Share.Enums.Settings.EMenuType.Button ).OrderBy(x => x.DisplayOrder).ToTreeAsync(x => x.children, it => it.ParentId, "");
+            var codes = list.SelectMany(d => d.SystemMenuArr).Select(d => d.Code).Distinct();
+            return await Db.Queryable<SystemMenu>()
+                .Where(x => codes.Contains(x.PermissionCode) && x.MenuType != EMenuType.Button)
+                .OrderBy(x => x.DisplayOrder)
+                .ToTreeAsync(x => x.children, it => it.ParentId, "");
         }
 
         /// <summary>
@@ -47,13 +49,11 @@ namespace Hotline.Repository.SqlSugar.System
             }
             var list = await Db.Queryable<SystemAuthority>()
                 .Where(x => roles.Contains(x.RoleCode)).ToListAsync();
-            var buttonarr = new List<string>();
-            foreach (var item in list)
-            {
-                buttonarr.AddRange(item.SystemMenuArr);
-            }
-            var newbutton = buttonarr.Distinct().ToList();
-            return await Db.Queryable<SystemMenu>().Where(x => newbutton.Contains(x.PermissionCode)).Select(x => x.ForePermissionCode).ToListAsync();
+            var codes = list.SelectMany(d => d.SystemMenuArr).Select(d => d.Code).Distinct();
+            return await Db.Queryable<SystemMenu>()
+                .Where(x => codes.Contains(x.PermissionCode))
+                .Select(x => x.ForePermissionCode)
+                .ToListAsync();
         }
 
         /// <summary>
@@ -63,22 +63,10 @@ namespace Hotline.Repository.SqlSugar.System
         /// <returns></returns>
         public IReadOnlyList<string> GetPermission(List<string> roles)
         {
-            //if (roles.Contains("sysadmin_role"))
-            //{
-            //    var menucodelist = Db.Queryable<SystemMenu>().Select(x => x.PermissionCode).ToList();
-            //    var buttoncodelist = Db.Queryable<SystemButton>().Select(x => x.PermissionCode).ToList();
-            //    menucodelist.AddRange(buttoncodelist);
-            //    return menucodelist;
-            //}
             var list = Db.Queryable<SystemAuthority>()
                 .Where(x => roles.Contains(x.RoleCode)).ToList();
-            var permissionarr = new List<string>();
-            foreach (var item in list)
-            {
-                permissionarr.AddRange(item.SystemMenuArr);
-                //permissionarr.AddRange(item.SystemButtonArr);
-            }
-            return permissionarr.Distinct().ToList();
+            var codes = list.SelectMany(d => d.SystemMenuArr).Select(d => d.Code).Distinct();
+            return codes.ToList();
         }
 
     }

+ 4 - 12
src/Hotline.Repository.SqlSugar/System/SystemMenuRepository.cs

@@ -37,16 +37,12 @@ namespace Hotline.Repository.SqlSugar.System
         {
             var list = await Db.Queryable<SystemAuthority>()
                 .Where(x => roles.Contains(x.RoleCode)).ToListAsync();
-            var permissionarr = new List<string>();
-            foreach (var item in list)
-            {
-                permissionarr.AddRange(item.SystemMenuArr);
-            }
+            var codes = list.SelectMany(d => d.SystemMenuArr).Select(d => d.Code).Distinct();
             var model = await Db.Queryable<UserFastMenu>().FirstAsync(x => x.UserId == userId);
             var perList = new List<string>();
             if (model != null)
             {
-                perList = permissionarr.Except(model.FastMenuArr).ToList();
+                perList = codes.Except(model.FastMenuArr).ToList();
             }
             if (perList.Count > 0)
             {
@@ -74,15 +70,11 @@ namespace Hotline.Repository.SqlSugar.System
         {
             var list = await Db.Queryable<SystemAuthority>()
                 .Where(x => roles.Contains(x.RoleCode)).ToListAsync();
-            var permissionarr = new List<string>();
-            foreach (var item in list)
-            {
-                permissionarr.AddRange(item.SystemMenuArr);
-            }
+            var codes = list.SelectMany(d => d.SystemMenuArr).Select(d => d.Code).Distinct();
             var model = await Db.Queryable<UserFastMenu>().FirstAsync(x => x.UserId == userId);
             if (model != null)
             {
-                var perList = permissionarr.Intersect(model.FastMenuArr).ToList();
+                var perList = codes.Intersect(model.FastMenuArr).ToList();
                 return await Db.Queryable<SystemMenu>().Where(x => perList.Contains(x.PermissionCode)).ToListAsync();
             }
             return new List<SystemMenu>();

+ 2 - 2
src/Hotline.Share/Dtos/FlowEngine/BasicWorkflowDto.cs

@@ -8,7 +8,7 @@ public class BasicWorkflowDto : EndWorkflowDto
     /// <summary>
     /// 下一节点code(defineStep.code)
     /// </summary>
-    public string NextStepCode { get; set; }
+    public string NextStepCode { get; set; } = string.Empty;
 
     /// <summary>
     /// 根据办理者类型不同,此字段为不同内容
@@ -16,7 +16,7 @@ public class BasicWorkflowDto : EndWorkflowDto
     /// 部门等级/分类为:depCodes, 角色为:userIds
     /// </example>
     /// </summary>
-    public List<IdName> NextHandlers { get; set; }
+    public List<IdName> NextHandlers { get; set; } = new();
 
     /// <summary>
     /// 是否短信通知

+ 1 - 1
src/Hotline.Share/Dtos/FlowEngine/EndWorkflowDto.cs

@@ -5,7 +5,7 @@ public class EndWorkflowDto
     /// <summary>
     /// 办理意见
     /// </summary>
-    public string Opinion { get; set; }
+    public string Opinion { get; set; } = string.Empty;
 
     /// <summary>
     /// 附件

+ 3 - 3
src/Hotline.Share/Dtos/FlowEngine/NextStepOptions.cs

@@ -5,9 +5,9 @@
 /// </summary>
 public class NextStepOptions
 {
-    public string Code { get; set; }
+    public string Code { get; set; } = string.Empty;
 
-    public string Name { get; set; }
+    public string Name { get; set; } = string.Empty;
 
-    public IReadOnlyList<KeyValuePair<string, string>> NextSteps { get; set; }
+    public IReadOnlyList<KeyValuePair<string, string>> NextSteps { get; set; } = new List<KeyValuePair<string, string>>();
 }

+ 1 - 1
src/Hotline.Share/Dtos/FlowEngine/NextWorkflowDto.cs

@@ -5,5 +5,5 @@
 /// </summary>
 public class NextWorkflowDto : BasicWorkflowDto
 {
-    public string WorkflowId { get; set; }
+    public string WorkflowId { get; set; } = string.Empty;
 }

+ 1 - 1
src/Hotline.Share/Dtos/FlowEngine/RecallDto.cs

@@ -8,5 +8,5 @@ public class RecallDto : NextWorkflowDto
     /// <summary>
     /// 撤回的目标节点code
     /// </summary>
-    public string TargetStepCode { get; set; }
+    public string TargetStepCode { get; set; } = string.Empty;
 }

+ 3 - 3
src/Hotline.Share/Enums/Settings/EMenuType.cs

@@ -5,10 +5,10 @@ namespace Hotline.Share.Enums.Settings
 {
     public enum EMenuType
     {
-        [Description("目录")]
-        Catalogue = 1,
         [Description("菜单")]
-        Menu = 2,
+        Menu = 1,
+        [Description("页面")]
+        Page = 2,
         [Description("按钮")]
         Button = 3,
     }

+ 3 - 3
src/Hotline/FlowEngine/Workflows/WorkflowAssign.cs

@@ -12,11 +12,11 @@ namespace Hotline.FlowEngine.Workflows
     /// </summary>
     public class WorkflowAssign : CreationEntity
     {
-        public string WorkflowId { get; set; }
+        public string WorkflowId { get; set; } = string.Empty;
 
-        public string OrgCode { get; set; }
+        public string OrgCode { get; set; } = string.Empty;
 
-        public string OrgName { get; set; }
+        public string OrgName { get; set; } = string.Empty;
 
         public static WorkflowAssign Create(string workflowId, string orgCode, string orgName)
         {

+ 4 - 4
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -54,7 +54,7 @@ namespace Hotline.FlowEngine.Workflows
             _logger = logger;
         }
 
-        public async Task<Workflow> CreateWorkflowAsync(Definition definition, string title, string externalId, CancellationToken cancellationToken)
+        public async Task<Workflow> CreateWorkflowAsync(Definition definition, string title, string? externalId, CancellationToken cancellationToken)
         {
             var workflow = new Workflow
             {
@@ -860,7 +860,7 @@ namespace Hotline.FlowEngine.Workflows
             Workflow workflow,
             StepDefine endStepDefine,
             WorkflowStep prevStepBox,
-            WorkflowStep preveStep,
+            WorkflowStep prevStep,
             CancellationToken cancellationToken)
         {
             if (workflow.StepBoxes.Any(d => d.StepType == EStepType.End))
@@ -870,7 +870,7 @@ namespace Hotline.FlowEngine.Workflows
             await _workflowStepRepository.AddAsync(stepBox, cancellationToken);
 
             var handler = new IdName { Id = _sessionContext.RequiredUserId, Name = _sessionContext.UserName };
-            var step = await CreateEndSubStepAsync(handler, stepBox, preveStep, cancellationToken);
+            var step = await CreateEndSubStepAsync(handler, stepBox, prevStep, cancellationToken);
             return (stepBox, step);
         }
 
@@ -947,7 +947,7 @@ namespace Hotline.FlowEngine.Workflows
             subStep.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.RequiredOrgCode,
                 _sessionContext.OrgName);
             subStep.Complete(_sessionContext.RequiredUserId, _sessionContext.UserName,
-                _sessionContext.RequiredOrgCode, _sessionContext.OrgName, null);
+                _sessionContext.RequiredOrgCode, _sessionContext.OrgName, string.Empty);
 
             currentStepBox.Steps.Add(subStep);
             await _workflowStepRepository.AddAsync(subStep, cancellationToken);

+ 1 - 1
src/Hotline/FlowEngine/Workflows/WorkflowStep.cs

@@ -98,7 +98,7 @@ public class WorkflowStep : StepBasicEntity
     /// </summary>
     /// <param name="userId"></param>
     /// <param name="userName"></param>
-    public void Accept(string userId, string userName, string orgCode, string orgName)
+    public void Accept(string userId, string? userName, string orgCode, string? orgName)
     {
         AcceptUserId = userId;
         AcceptUserName = userName;

+ 10 - 22
src/Hotline/Settings/SystemAuthority.cs

@@ -1,6 +1,7 @@
 using SqlSugar;
 using System.ComponentModel;
 using Hotline.Permissions;
+using Hotline.Share.Enums.Settings;
 using XF.Domain.Entities;
 using XF.Domain.Repository;
 
@@ -23,7 +24,7 @@ namespace Hotline.Settings
         /// 菜单ID
         /// </summary>
         [SugarColumn(ColumnDataType = "json", IsJson = true)]
-        public List<string> SystemMenuArr { get; set; }
+        public List<PermissionItem> SystemMenuArr { get; set; }
 
         /// <summary>
         /// 功能点
@@ -31,29 +32,16 @@ namespace Hotline.Settings
         //[SugarColumn(ColumnDataType = "json", IsJson = true)]
         //public List<string> SystemButtonArr { get; set; }
 
-        public List<string> GetAllPermissions()
-        {
-            var permissions = new List<string>(SystemMenuArr);
-            //permissions.AddRange(SystemButtonArr);
-            return permissions.Select(d=>Enum.Parse<EPermission>(d).ToString()).Distinct().ToList();
-        }
+        public List<string> GetPermissions() => 
+            GetPermissionCodes().Select(d => Enum.Parse<EPermission>(d).ToString()).Distinct().ToList();
+
+        public List<string> GetPermissionCodes() =>
+            SystemMenuArr.Select(d => d.Code).ToList();
     }
 
-    public class SystemMenuAuth
+    public class PermissionItem
     {
-        public string mcode { get; set; }
-
-        public string mname { get; set; }
-
-        public List<SystemMenuAuth> child { get; set; }
-
-        //public List<SystemButtonAuth> btnarr { get; set; }
+        public string Code { get; set; }
+        public EMenuType Type { get; set; }
     }
-
-    //public class SystemButtonAuth
-    //{
-    //    public string bcode { get; set; }
-
-    //    public string bname { get; set; }
-    //}
 }