using Hotline.FlowEngine.Workflows; using Hotline.Repository.SqlSugar.DataPermissions; using Hotline.Share.Enums.FlowEngine; using SqlSugar; using XF.Domain.Entities; namespace Hotline.Repository.SqlSugar.Extensions { public static class DataPermissionExtensions { public static ISugarQueryable DataPermissionFiltering(this ISugarQueryable queryable, IDataPermissionFilterBuilder dataPermissionFilterBuilder) where TEntity : class, IEntity, IDataPermission, new() { return queryable.Where(dataPermissionFilterBuilder.Build()); } public static ISugarQueryable WorkflowViewFiltering(this ISugarQueryable queryable, IDataPermissionFilterBuilder dataPermissionFilterBuilder) where TEntity : class, IEntity, IDataPermission, IWorkflow, new() { var session = dataPermissionFilterBuilder.SessionContext; return queryable.Where(d => SqlFunc.Subqueryable() .Where(step => step.ExternalId == d.Id && ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == session.RequiredUserId) || (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == session.RequiredOrgId) || (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && session.Roles.Contains(step.RoleId)))) .Any()); //return queryable.LeftJoin((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) || // (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && session.Roles.Contains(step.RoleId))) // .Select((d, step) => d) // ; //return queryable.Where(dataPermissionFilterBuilder.BuildWithFlowViewFilter()); } public static ISugarQueryable WorkflowHandleFiltering(this ISugarQueryable queryable, IDataPermissionFilterBuilder dataPermissionFilterBuilder, bool canHandle) where TEntity : class, IEntity, IDataPermission, IWorkflow, new() { var session = dataPermissionFilterBuilder.SessionContext; return queryable.LeftJoin((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) || (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && session.Roles.Contains(step.RoleId))) .WhereIF(canHandle, (d, step) => step.Status != EWorkflowStepStatus.Handled) .WhereIF(!canHandle, (d, step) => step.Status == EWorkflowStepStatus.Handled) .Select((d, step) => d) ; //return queryable.Where(dataPermissionFilterBuilder.BuildWithFlowHandleFilter(canHandle)); } public static TEntity InitDatePermission(this TEntity entity, IDataPermissionManager dataPermissionManager) where TEntity : class, IEntity, IDataPermission, new() { var result = dataPermissionManager.GetDataPermissionOptions(); entity.CreateDataPermission(result.creatorId, result.creatorName, result.orgId, result.orgName, result.orgLevel, result.areaId); return entity; } public static TEntity AssignToCreator(this TEntity entity, IDataPermissionManager dataPermissionManager) where TEntity : class, IEntity, IDataPermission, IWorkflow, new() { var (creatorId, _, _, _, _, _) = dataPermissionManager.GetDataPermissionOptions(); entity.Assign(EFlowAssignType.User, creatorId); return entity; } } }