Files
tnb.server/common/Tnb.Common.Core/Manager/User/UserManager.cs
2023-03-13 15:00:34 +08:00

1801 lines
96 KiB
C#

using JNPF.Common.Const;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Manager;
using JNPF.Common.Models.Authorize;
using JNPF.Common.Models.User;
using JNPF.Common.Net;
using JNPF.Common.Security;
using JNPF.DataEncryption;
using JNPF.DependencyInjection;
using JNPF.Systems.Entitys.Entity.Permission;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Entitys.System;
using Microsoft.AspNetCore.Http;
using SqlSugar;
using System.Net.Http;
using System.Security.Claims;
namespace JNPF.Common.Core.Manager;
/// <summary>
/// 用户管理 .
/// </summary>
public class UserManager : IUserManager, IScoped
{
/// <summary>
/// 用户表仓储.
/// </summary>
private readonly ISqlSugarRepository<UserEntity> _repository;
/// <summary>
/// 缓存管理.
/// </summary>
private readonly ICacheManager _cacheManager;
/// <summary>
/// 当前Http请求.
/// </summary>
private readonly HttpContext _httpContext;
/// <summary>
/// 用户Claim主体.
/// </summary>
private readonly ClaimsPrincipal _user;
/// <summary>
/// 初始化一个<see cref="UserManager"/>类型的新实例.
/// </summary>
/// <param name="repository">用户仓储.</param>
/// <param name="cacheManager">缓存管理.</param>
public UserManager(
ISqlSugarRepository<UserEntity> repository,
ICacheManager cacheManager)
{
_repository = repository;
_cacheManager = cacheManager;
_httpContext = App.HttpContext;
_user = _httpContext?.User;
if (!string.IsNullOrEmpty(_httpContext?.Request.Query["token"].ToString()))
{
var token = _httpContext.Request.Query["token"].ToString();
var claims = JWTEncryption.ReadJwtToken(token.Replace("Bearer ", string.Empty).Replace("bearer ", string.Empty))?.Claims;
ClaimsIdentity toKen = new ClaimsIdentity();
foreach (Claim item in claims)
{
toKen.AddClaim(item);
}
_user = new ClaimsPrincipal(toKen);
}
}
/// <summary>
/// 用户信息.
/// </summary>
public UserEntity User
{
get => _repository.GetSingle(u => u.Id == UserId);
}
/// <summary>
/// 用户ID.
/// </summary>
public string UserId
{
get => _user.FindFirst(ClaimConst.CLAINMUSERID)?.Value;
}
/// <summary>
/// 获取用户角色.
/// </summary>
public List<string> Roles
{
get
{
var user = _repository.GetSingle(u => u.Id == UserId);
return GetUserRoleIds(user.RoleId, user.OrganizeId);
}
}
/// <summary>
/// 用户账号.
/// </summary>
public string Account
{
get => _user.FindFirst(ClaimConst.CLAINMACCOUNT)?.Value;
}
/// <summary>
/// 用户昵称.
/// </summary>
public string RealName
{
get => _user.FindFirst(ClaimConst.CLAINMREALNAME)?.Value;
}
/// <summary>
/// 当前用户 token.
/// </summary>
public string ToKen
{
get => String.IsNullOrEmpty(App.HttpContext?.Request.Headers["Authorization"]) ? App.HttpContext?.Request.Query["token"] : App.HttpContext?.Request.Headers["Authorization"];
}
/// <summary>
/// 数据库连接.
/// </summary>
public ConnectionConfigOptions ConnectionConfig
{
get => _user.FindFirst(ClaimConst.CONNECTIONCONFIG)?.Value.ToObject<ConnectionConfigOptions>();
}
/// <summary>
/// 租户ID.
/// </summary>
public string TenantId
{
get => ConnectionConfig.ConfigId;
}
/// <summary>
/// 租户数据库名称.
/// </summary>
public string TenantDbName
{
get => ConnectionConfig.ConfigList.Find(it => it.IsMaster.Equals(true)).ServiceName;
}
/// <summary>
/// 是否是管理员.
/// </summary>
public bool IsAdministrator
{
get => _user.FindFirst(ClaimConst.CLAINMADMINISTRATOR)?.Value == ((int)AccountType.Administrator).ToString();
}
/// <summary>
/// 获取用户的数据范围.
/// </summary>
public List<UserDataScopeModel> DataScope
{
get
{
return GetUserDataScope(UserId);
}
}
/// <summary>
/// 用户当前组织及子组织.
/// </summary>
public List<string> Subsidiary
{
get
{
List<string> list = new List<string>();
list.AddRange(GetSubsidiary(User.OrganizeId, IsAdministrator).ToObject<List<string>>());
return list;
}
}
/// <summary>
/// 当前用户下属.
/// </summary>
public List<string> Subordinates
{
get
{
return this.GetSubordinates(UserId).ToList();
}
}
/// <summary>
/// 获取请求端类型 pc 、 app.
/// </summary>
public string UserOrigin
{
get => _httpContext?.Request.Headers["jnpf-origin"];
}
/// <summary>
/// 获取用户登录信息.
/// </summary>
/// <returns></returns>
public async Task<UserInfoModel> GetUserInfo()
{
UserAgent userAgent = new UserAgent(_httpContext);
var data = new UserInfoModel();
var ipAddress = NetHelper.Ip;
var ipAddressName = await NetHelper.GetLocation(ipAddress);
var userDataScope = await GetUserDataScopeAsync(UserId);
var sysConfigInfo = await _repository.AsSugarClient().Queryable<SysConfigEntity>().FirstAsync(s => s.Category.Equals("SysConfig") && s.Key.ToLower().Equals("tokentimeout"));
data = await _repository.AsQueryable().Where(it => it.Id == UserId)
.Select(a => new UserInfoModel
{
userId = a.Id,
headIcon = SqlFunc.MergeString("/api/File/Image/userAvatar/", a.HeadIcon),
userAccount = a.Account,
userName = a.RealName,
gender = a.Gender,
organizeId = a.OrganizeId,
departmentId = a.OrganizeId,
departmentName = SqlFunc.Subqueryable<OrganizeEntity>().Where(o => o.Id == SqlFunc.ToString(a.OrganizeId) && o.Category.Equals("department")).Select(o => o.FullName),
organizeName = SqlFunc.Subqueryable<OrganizeEntity>().Where(o => o.Id == SqlFunc.ToString(a.OrganizeId)).Select(o => o.OrganizeIdTree),
managerId = a.ManagerId,
isAdministrator = SqlFunc.IIF(a.IsAdministrator == 1, true, false),
portalId = a.PortalId,
positionId = a.PositionId,
roleId = a.RoleId,
prevLoginTime = a.PrevLogTime,
prevLoginIPAddress = a.PrevLogIP,
landline = a.Landline,
telePhone = a.TelePhone,
manager = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == a.ManagerId).Select(u => SqlFunc.MergeString(u.RealName, "/", u.Account)),
mobilePhone = a.MobilePhone,
email = a.Email,
birthday = a.Birthday,
systemId = a.SystemId,
signImg = SqlFunc.Subqueryable<SignImgEntity>().Where(a => a.CreatorUserId == UserId && a.IsDefault == 1).Select(a => a.SignImg),
}).FirstAsync();
if (data.portalId.IsNullOrWhiteSpace()) data.portalId = string.Empty;
if (data != null && data.organizeName.IsNotEmptyOrNull())
{
var orgIdTree = data?.organizeName?.Split(',');
var organizeName = await _repository.AsSugarClient().Queryable<OrganizeEntity>().Where(x => orgIdTree.Contains(x.Id)).OrderBy(x => x.SortCode).OrderBy(x => x.CreatorTime).Select(x => x.FullName).ToListAsync();
data.organizeName = string.Join("/", organizeName);
}
else
{
data.organizeName = data.departmentName;
}
data.loginTime = DateTime.Now;
data.prevLogin = (await _repository.AsSugarClient().Queryable<SysConfigEntity>().FirstAsync(x => x.Category.Equals("SysConfig") && x.Key.ToLower().Equals("lastlogintimeswitch"))).Value.ParseToInt();
data.loginIPAddress = ipAddress;
data.loginIPAddressName = ipAddressName;
data.prevLoginIPAddressName = await NetHelper.GetLocation(data.prevLoginIPAddress);
data.loginPlatForm = userAgent.RawValue;
data.subsidiary = await GetSubsidiaryAsync(data.organizeId, data.isAdministrator);
data.subordinates = await this.GetSubordinatesAsync(UserId);
data.positionIds = data.positionId == null ? null : await GetPosition(data.positionId);
data.positionName = data.positionIds == null ? null : string.Join(",", data.positionIds.Select(it => it.name));
var roleList = await GetUserOrgRoleIds(data.roleId, data.organizeId);
data.roleName = await GetRoleNameByIds(string.Join(",", roleList));
data.roleIds = roleList.ToArray();
if (!data.isAdministrator && data.roleIds.Any())
{
var portalIds = await _repository.AsSugarClient().Queryable<AuthorizeEntity>().In(a => a.ObjectId, data.roleIds).Where(a => a.ItemType == "portal").GroupBy(it => new { it.ItemId }).Select(it => it.ItemId).ToListAsync();
if (portalIds.Any())
{
if (!portalIds.Any(x => x == data.portalId)) data.portalId = portalIds.FirstOrDefault()?.ToString();
}
else data.portalId = string.Empty;
}
data.overdueTime = TimeSpan.FromMinutes(sysConfigInfo.Value.ParseToDouble());
data.dataScope = userDataScope;
data.tenantId = TenantId;
data.tenantDbName = TenantDbName;
// 根据系统配置过期时间自动过期
await SetUserInfo(string.Format("{0}{1}_{2}", CommonConst.CACHEKEYUSER, TenantId, UserId), data, TimeSpan.FromMinutes(sysConfigInfo.Value.ParseToDouble()));
return data;
}
/// <summary>
/// 获取用户数据范围.
/// </summary>
/// <param name="userId">用户ID.</param>
/// <returns></returns>
private async Task<List<UserDataScopeModel>> GetUserDataScopeAsync(string userId)
{
List<UserDataScopeModel> data = new List<UserDataScopeModel>();
List<UserDataScopeModel> subData = new List<UserDataScopeModel>();
List<UserDataScopeModel> inteList = new List<UserDataScopeModel>();
var list = await _repository.AsSugarClient().Queryable<OrganizeAdministratorEntity>().Where(it => SqlFunc.ToString(it.UserId) == userId && it.DeleteMark == null).ToListAsync();
// 填充数据
foreach (var item in list)
{
if (item.SubLayerAdd.ParseToBool() || item.SubLayerEdit.ParseToBool() || item.SubLayerDelete.ParseToBool())
{
var subsidiary = (await GetSubsidiaryAsync(item.OrganizeId, false)).ToList();
subsidiary.Remove(item.OrganizeId);
subsidiary.ToList().ForEach(it =>
{
subData.Add(new UserDataScopeModel()
{
organizeId = it,
Add = item.SubLayerAdd.ParseToBool(),
Edit = item.SubLayerEdit.ParseToBool(),
Delete = item.SubLayerDelete.ParseToBool()
});
});
}
if (item.ThisLayerAdd.ParseToBool() || item.ThisLayerEdit.ParseToBool() || item.ThisLayerDelete.ParseToBool())
{
data.Add(new UserDataScopeModel()
{
organizeId = item.OrganizeId,
Add = item.ThisLayerAdd.ParseToBool(),
Edit = item.ThisLayerEdit.ParseToBool(),
Delete = item.ThisLayerDelete.ParseToBool()
});
}
}
/* 比较数据
所有分级数据权限以本级权限为主 子级为辅
将本级数据与子级数据对比 对比出子级数据内组织ID存在本级数据的组织ID*/
var intersection = data.Select(it => it.organizeId).Intersect(subData.Select(it => it.organizeId)).ToList();
intersection.ForEach(it =>
{
var parent = data.Find(item => item.organizeId == it);
var child = subData.Find(item => item.organizeId == it);
var add = false;
var edit = false;
var delete = false;
if (parent.Add || child.Add)
add = true;
if (parent.Edit || child.Edit)
edit = true;
if (parent.Delete || child.Delete)
delete = true;
inteList.Add(new UserDataScopeModel()
{
organizeId = it,
Add = add,
Edit = edit,
Delete = delete
});
data.Remove(parent);
subData.Remove(child);
});
return data.Union(subData).Union(inteList).ToList();
}
/// <summary>
/// 获取用户数据范围.
/// </summary>
/// <param name="userId">用户ID.</param>
/// <returns></returns>
private List<UserDataScopeModel> GetUserDataScope(string userId)
{
List<UserDataScopeModel> data = new List<UserDataScopeModel>();
List<UserDataScopeModel> subData = new List<UserDataScopeModel>();
List<UserDataScopeModel> inteList = new List<UserDataScopeModel>();
// 填充数据
foreach (var item in _repository.AsSugarClient().Queryable<OrganizeAdministratorEntity>()
.Where(it => SqlFunc.ToString(it.UserId) == userId && it.DeleteMark == null).ToList())
{
if (item.SubLayerSelect.ParseToBool() || item.SubLayerAdd.ParseToBool() || item.SubLayerEdit.ParseToBool() || item.SubLayerDelete.ParseToBool())
{
var subsidiary = GetSubsidiary(item.OrganizeId, false).ToList();
subsidiary.Remove(item.OrganizeId);
subsidiary.ToList().ForEach(it =>
{
subData.Add(new UserDataScopeModel()
{
organizeId = it,
Add = item.SubLayerAdd.ParseToBool(),
Edit = item.SubLayerEdit.ParseToBool(),
Delete = item.SubLayerDelete.ParseToBool(),
Select = item.SubLayerSelect.ParseToBool()
});
});
}
if (item.ThisLayerSelect.ParseToBool() || item.ThisLayerAdd.ParseToBool() || item.ThisLayerEdit.ParseToBool() || item.ThisLayerDelete.ParseToBool())
{
data.Add(new UserDataScopeModel()
{
organizeId = item.OrganizeId,
Add = item.ThisLayerAdd.ParseToBool(),
Edit = item.ThisLayerEdit.ParseToBool(),
Delete = item.ThisLayerDelete.ParseToBool(),
Select = item.ThisLayerSelect.ParseToBool()
});
}
}
/* 比较数据
所有分级数据权限以本级权限为主 子级为辅
将本级数据与子级数据对比 对比出子级数据内组织ID存在本级数据的组织ID*/
var intersection = data.Select(it => it.organizeId).Intersect(subData.Select(it => it.organizeId)).ToList();
intersection.ForEach(it =>
{
var parent = data.Find(item => item.organizeId == it);
var child = subData.Find(item => item.organizeId == it);
var add = false;
var edit = false;
var delete = false;
var select = false;
if (parent.Add || child.Add) add = true;
if (parent.Edit || child.Edit) edit = true;
if (parent.Delete || child.Delete) delete = true;
if (parent.Select || child.Select) select = true;
inteList.Add(new UserDataScopeModel()
{
organizeId = it,
Add = add,
Edit = edit,
Delete = delete,
Select = select
});
data.Remove(parent);
subData.Remove(child);
});
return data.Union(subData).Union(inteList).ToList();
}
/// <summary>
/// 获取数据条件.
/// </summary>
/// <typeparam name="T">实体.</typeparam>
/// <param name="moduleId">模块ID.</param>
/// <param name="primaryKey">表主键.</param>
/// <param name="isDataPermissions">是否开启数据权限.</param>
/// <param name="tableNumber">联表编号.</param>
/// <returns></returns>
public async Task<List<IConditionalModel>> GetConditionAsync<T>(string moduleId, string primaryKey = "F_Id", bool isDataPermissions = true, string tableNumber = "")
where T : new()
{
var userInfo = await GetUserInfo();
var conModels = new List<IConditionalModel>();
if (IsAdministrator) return conModels;
var items = await _repository.AsSugarClient().Queryable<AuthorizeEntity, RoleEntity>((a, b) => new JoinQueryInfos(JoinType.Left, b.Id == a.ObjectId && b.EnabledMark == 1 && b.DeleteMark == null))
.In((a, b) => b.Id, userInfo.roleIds)
.Where(a => a.ItemType == "resource")
.GroupBy(a => new { a.ItemId }).Select(a => a.ItemId).ToListAsync();
if (!isDataPermissions)
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = string.Format("{0}{1}", tableNumber, primaryKey), ConditionalType = ConditionalType.NoEqual, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
return conModels;
}
else if (items.Count == 0 && isDataPermissions)
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = string.Format("{0}{1}", tableNumber, primaryKey), ConditionalType = ConditionalType.Equal, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
return conModels;
}
var resourceList = _repository.AsSugarClient().Queryable<ModuleDataAuthorizeSchemeEntity>().In(it => it.Id, items).Where(it => it.ModuleId == moduleId && it.DeleteMark == null).ToList();
if (resourceList.Any(x => x.AllData == 1 || "jnpf_alldata".Equals(x.EnCode)))
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>() {
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = string.Format("{0}{1}", tableNumber, primaryKey), ConditionalType = ConditionalType.NoEqual, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
}
else
{
var allList = new List<object>(); // 构造任何层级的条件
var resultList = new List<object>();
foreach (var item in resourceList)
{
var groupsList = new List<object>();
foreach (var conditionItem in item.ConditionJson.ToList<AuthorizeModuleResourceConditionModel>())
{
var conditionalList = new List<object>();
foreach (var fieldItem in conditionItem.Groups)
{
var itemField = string.Format("{0}{1}", tableNumber, fieldItem.Field);
var itemValue = fieldItem.Value;
var itemMethod = (QueryType)System.Enum.Parse(typeof(QueryType), fieldItem.Op);
switch (itemValue)
{
case "@userId": // 当前用户
{
var cmodel = GetConditionalModel(itemMethod, itemField, userInfo.userId);
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = userInfo.userId, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = userInfo.userId, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
break;
case "@userAraSubordinates": // 当前用户集下属
{
var ids = new List<string>() { userInfo.userId };
ids.AddRange(userInfo.subordinates);
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", ids));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
break;
case "@organizeId": // 当前组织
{
if (!string.IsNullOrEmpty(userInfo.organizeId))
{
var cmodel = GetConditionalModel(itemMethod, itemField, userInfo.organizeId);
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = userInfo.organizeId, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = userInfo.organizeId, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
case "@organizationAndSuborganization": // 当前组织及子组织
{
if (!string.IsNullOrEmpty(userInfo.organizeId))
{
var ids = new List<string>() { userInfo.organizeId };
ids.AddRange(userInfo.subsidiary);
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", ids));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
case "@branchManageOrganize": // 当前分管组织
{
var orgId = DataScope.Where(x => x.Select).Select(x => x.organizeId).ToList();
if (orgId != null)
{
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", orgId));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", orgId), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", orgId), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
case "@branchManageOrganizeAndSub": // 当前分管组织及子组织
{
var subOrgIds = new List<string>();
DataScope.Where(x => x.Select).Select(x => x.organizeId).ToList()
.ForEach(item => subOrgIds.AddRange(_repository.AsSugarClient().Queryable<OrganizeEntity>().Where(x => x.OrganizeIdTree.Contains(item)).Select(x => x.Id).ToList()));
if (subOrgIds.Any())
{
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", subOrgIds));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", subOrgIds), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", subOrgIds), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
default:
{
if (!string.IsNullOrEmpty(itemValue))
{
var cmodel = GetConditionalModel(itemMethod, itemField, itemValue, fieldItem.Type);
if (cmodel.ConditionalType.Equals(ConditionalType.In)) cmodel.ConditionalType = ConditionalType.Like;
if (cmodel.ConditionalType.Equals(ConditionalType.NotIn)) cmodel.ConditionalType = ConditionalType.NoLike;
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = itemValue, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = itemValue, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
}
}
if (conditionalList.Any())
{
var firstItem = conditionalList.First().ToObject<dynamic>();
firstItem.Key = 0;
conditionalList[0] = firstItem;
groupsList.Add(new { Key = (int)WhereType.And, Value = new { ConditionalList = conditionalList } });
}
}
if (groupsList.Any()) allList.Add(new { Key = (int)WhereType.And, Value = new { ConditionalList = groupsList } });
}
if (allList.Any()) resultList.Add(new { ConditionalList = allList });
if (resultList.Any()) conModels.AddRange(_repository.AsSugarClient().Utilities.JsonToConditionalModels(resultList.ToJsonString()));
}
if (resourceList.Count == 0)
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = string.Format("{0}{1}", tableNumber, primaryKey), ConditionalType = ConditionalType.Equal, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
}
return conModels;
}
/// <summary>
/// 获取数据条件.
/// </summary>
/// <typeparam name="T">实体.</typeparam>
/// <param name="moduleId">模块ID.</param>
/// <param name="primaryKey">表主键.</param>
/// <param name="isDataPermissions">是否开启数据权限.</param>
/// <returns></returns>
public async Task<List<IConditionalModel>> GetDataConditionAsync<T>(string moduleId, string primaryKey, bool isDataPermissions = true)
where T : new()
{
var userInfo = await GetUserInfo();
var conModels = new List<IConditionalModel>();
if (IsAdministrator) return conModels;
var items = await _repository.AsSugarClient().Queryable<AuthorizeEntity, RoleEntity>((a, b) => new JoinQueryInfos(JoinType.Left, b.Id == a.ObjectId && b.EnabledMark == 1 && b.DeleteMark == null))
.In((a, b) => b.Id, userInfo.roleIds)
.Where(a => a.ItemType == "resource")
.GroupBy(a => new { a.ItemId }).Select(a => a.ItemId).ToListAsync();
if (!isDataPermissions)
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.NoEqual, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
return conModels;
}
else if (items.Count == 0 && isDataPermissions)
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.Equal, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
return conModels;
}
var resourceList = _repository.AsSugarClient().Queryable<ModuleDataAuthorizeSchemeEntity>().In(it => it.Id, items).Where(it => it.ModuleId == moduleId && it.DeleteMark == null).ToList();
if (resourceList.Any(x => x.AllData == 1 || x.EnCode.Equals("jnpf_alldata")))
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>() {
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.NoEqual, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
}
else
{
var allList = new List<object>(); // 构造任何层级的条件
var resultList = new List<object>();
foreach (var item in resourceList)
{
var groupsList = new List<object>();
foreach (var conditionItem in item.ConditionJson.ToList<AuthorizeModuleResourceConditionModel>())
{
var conditionalList = new List<object>();
foreach (var fieldItem in conditionItem.Groups)
{
var itemField = string.IsNullOrEmpty(fieldItem.BindTable) ? fieldItem.Field : string.Format("{0}.{1}", fieldItem.BindTable, fieldItem.Field);
var itemValue = fieldItem.Value;
var itemMethod = (QueryType)System.Enum.Parse(typeof(QueryType), fieldItem.Op);
switch (itemValue)
{
case "@userId": // 当前用户
{
var cmodel = GetConditionalModel(itemMethod, itemField, userInfo.userId);
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = userInfo.userId, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = userInfo.userId, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
break;
case "@userAraSubordinates": // 当前用户集下属
{
var ids = new List<string>() { userInfo.userId };
ids.AddRange(userInfo.subordinates);
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", ids));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
break;
case "@organizeId": // 当前组织
{
if (!string.IsNullOrEmpty(userInfo.organizeId))
{
var cmodel = GetConditionalModel(itemMethod, itemField, userInfo.organizeId);
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = userInfo.organizeId, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = userInfo.organizeId, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
case "@organizationAndSuborganization": // 当前组织及子组织
{
if (!string.IsNullOrEmpty(userInfo.organizeId))
{
var ids = new List<string>() { userInfo.organizeId };
ids.AddRange(userInfo.subsidiary);
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", ids));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
case "@branchManageOrganize": // 当前分管组织
{
var orgId = DataScope.Where(x => x.Select).Select(x => x.organizeId).ToList();
if (orgId != null)
{
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", orgId));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", orgId), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", orgId), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
else
{
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = "jnpf", ConditionalType = (int)ConditionalType.Equal } });
}
}
break;
case "@branchManageOrganizeAndSub": // 当前分管组织及子组织
{
var subOrgIds = new List<string>();
DataScope.Where(x => x.Select).Select(x => x.organizeId).ToList()
.ForEach(item => subOrgIds.AddRange(_repository.AsSugarClient().Queryable<OrganizeEntity>().Where(x => x.OrganizeIdTree.Contains(item)).Select(x => x.Id).ToList()));
if (subOrgIds.Any())
{
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", subOrgIds));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", subOrgIds), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", subOrgIds), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
else
{
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = "jnpf", ConditionalType = (int)ConditionalType.Equal } });
}
}
break;
default:
{
if (!string.IsNullOrEmpty(itemValue))
{
var cmodel = GetConditionalModel(itemMethod, itemField, itemValue, fieldItem.Type);
if (cmodel.ConditionalType.Equals(ConditionalType.In)) cmodel.ConditionalType = ConditionalType.Like;
if (cmodel.ConditionalType.Equals(ConditionalType.NotIn)) cmodel.ConditionalType = ConditionalType.NoLike;
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = itemValue, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = itemValue, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
}
}
if (conditionalList.Any())
{
var firstItem = conditionalList.First().ToObject<dynamic>();
firstItem.Key = 0;
conditionalList[0] = firstItem;
groupsList.Add(new { Key = (int)WhereType.And, Value = new { ConditionalList = conditionalList } });
}
}
if (groupsList.Any()) allList.Add(new { Key = (int)WhereType.And, Value = new { ConditionalList = groupsList } });
}
if (allList.Any()) resultList.Add(new { ConditionalList = allList });
if (resultList.Any()) conModels.AddRange(_repository.AsSugarClient().Utilities.JsonToConditionalModels(resultList.ToJsonString()));
}
if (resourceList.Count == 0)
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.Equal, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
}
return conModels;
}
/// <summary>
/// 获取代码生成数据条件.
/// </summary>
/// <typeparam name="T">实体.</typeparam>
/// <param name="moduleId">模块ID.</param>
/// <param name="primaryKey">表主键.</param>
/// <param name="isDataPermissions">是否开启数据权限.</param>
/// <returns></returns>
public async Task<List<CodeGenAuthorizeModuleResourceModel>> GetCodeGenAuthorizeModuleResource<T>(string moduleId, string primaryKey, bool isDataPermissions = true)
where T : new()
{
var codeGenConditional = new List<CodeGenAuthorizeModuleResourceModel>()
{
new CodeGenAuthorizeModuleResourceModel
{
FieldRule = 0,
conditionalModel = new List<IConditionalModel>()
}
};
if (IsAdministrator) return codeGenConditional; // 管理员全部放开
var items = await _repository.AsSugarClient().Queryable<AuthorizeEntity, RoleEntity>((a, b) => new JoinQueryInfos(JoinType.Left, b.Id == a.ObjectId && b.EnabledMark == 1 && b.DeleteMark == null))
.In((a, b) => b.Id, Roles)
.Where(a => a.ItemType == "resource")
.GroupBy(a => new { a.ItemId }).Select(a => a.ItemId).ToListAsync();
switch (isDataPermissions)
{
case true:
// 开启权限 但是没有权限资源.
switch (items.Count)
{
case 0:
codeGenConditional.Find(it => it.FieldRule.Equals(0)).conditionalModel.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.Equal, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
break;
}
break;
default:
// 未开启数据权限
codeGenConditional.Find(it => it.FieldRule.Equals(0)).conditionalModel.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.NoEqual, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
break;
}
var resourceList = await _repository.AsSugarClient().Queryable<ModuleDataAuthorizeSchemeEntity>().In(it => it.Id, items).Where(it => it.ModuleId == moduleId && it.DeleteMark == null).ToListAsync();
// 权限资源是否为全部数据.
switch (resourceList?.Any(x => x.AllData == 1 || x.EnCode.Equals("jnpf_alldata")))
{
case true:
codeGenConditional.Find(it => it.FieldRule.Equals(0)).conditionalModel.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.NoEqual, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
break;
case false:
switch (resourceList.Count)
{
case 0:
codeGenConditional.Find(it => it.FieldRule.Equals(0)).conditionalModel.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.Equal, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
break;
default:
codeGenConditional = new List<CodeGenAuthorizeModuleResourceModel>();
var allList = new List<object>(); // 构造任何层级的条件
var resultList = new List<object>();
var codeGenConditionalObject = new List<CodeGenAuthorizeModuleResource>();
foreach (var item in resourceList)
{
var groupsList = new List<object>();
var fieldRule = 0;
var tableName = string.Empty;
foreach (var conditionItem in item.ConditionJson.ToList<AuthorizeModuleResourceConditionModel>())
{
var conditionalList = new List<object>();
foreach (var fieldItem in conditionItem.Groups)
{
fieldRule = fieldItem.FieldRule;
tableName = string.IsNullOrEmpty(fieldItem.BindTable) ? fieldItem.Field.Split('.').First() : fieldItem.BindTable;
if (!codeGenConditionalObject.Any(it => it.FieldRule == fieldRule && it.TableName == tableName))
{
codeGenConditionalObject.Add(new CodeGenAuthorizeModuleResource()
{
FieldRule = fieldRule,
TableName = tableName,
conditionalModel = new List<object>()
});
}
var itemField = fieldRule == 0 ? fieldItem.Field : (string.IsNullOrEmpty(fieldItem.BindTable) ? fieldItem.Field.Split('.').Last() : fieldItem.Field);
var itemValue = fieldItem.Value;
var itemMethod = (QueryType)System.Enum.Parse(typeof(QueryType), fieldItem.Op);
switch (itemValue)
{
case "@userId": // 当前用户
{
var cmodel = GetConditionalModel(itemMethod, itemField, UserId);
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = UserId, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = UserId, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
break;
case "@userAraSubordinates": // 当前用户集下属
{
var ids = new List<string>() { UserId };
var subordinates = await this.GetSubordinatesAsync(UserId);
ids.AddRange(subordinates);
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", ids));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
break;
case "@organizeId": // 当前组织
{
if (!string.IsNullOrEmpty(User.OrganizeId))
{
var cmodel = GetConditionalModel(itemMethod, itemField, User.OrganizeId);
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = User.OrganizeId, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = User.OrganizeId, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
case "@organizationAndSuborganization": // 当前组织及子组织
{
var userInfo = User;
if (!string.IsNullOrEmpty(userInfo.OrganizeId))
{
var subsidiary = await GetSubsidiaryAsync(userInfo.OrganizeId, userInfo.IsAdministrator.Equals(1));
var ids = new List<string>() { userInfo.OrganizeId };
ids.AddRange(subsidiary);
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", ids));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
case "@branchManageOrganize": // 当前分管组织
{
var orgId = DataScope.Where(x => x.Select).Select(x => x.organizeId).ToList();
if (orgId != null)
{
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", orgId));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", orgId), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", orgId), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
else
{
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = "jnpf", ConditionalType = (int)ConditionalType.Equal } });
}
}
break;
case "@branchManageOrganizeAndSub": // 当前分管组织及子组织
{
var subOrgIds = new List<string>();
DataScope.Where(x => x.Select).Select(x => x.organizeId).ToList()
.ForEach(item => subOrgIds.AddRange(_repository.AsSugarClient().Queryable<OrganizeEntity>().Where(x => x.OrganizeIdTree.Contains(item)).Select(x => x.Id).ToList()));
if (subOrgIds.Any())
{
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", subOrgIds));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", subOrgIds), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", subOrgIds), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
else
{
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = "jnpf", ConditionalType = (int)ConditionalType.Equal } });
}
}
break;
default:
{
if (!string.IsNullOrEmpty(itemValue))
{
var cmodel = GetConditionalModel(itemMethod, itemField, itemValue, fieldItem.Type);
if (cmodel.ConditionalType.Equals(ConditionalType.In)) cmodel.ConditionalType = ConditionalType.Like;
if (cmodel.ConditionalType.Equals(ConditionalType.NotIn)) cmodel.ConditionalType = ConditionalType.NoLike;
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = itemValue, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = itemValue, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
}
codeGenConditionalObject.Find(it => it.FieldRule == fieldRule && it.TableName.Equals(tableName)).conditionalModel.AddRange(conditionalList);
}
if (codeGenConditionalObject.Any())
{
var firstItem = codeGenConditionalObject.Find(it => it.FieldRule.Equals(fieldRule) && it.TableName.Equals(tableName)).conditionalModel.First().ToObject<dynamic>();
firstItem.Key = 0;
conditionalList[0] = firstItem;
groupsList.Add(new { Key = (int)WhereType.And, Value = new { ConditionalList = codeGenConditionalObject.Find(it => it.FieldRule == fieldRule && it.TableName.Equals(tableName)).conditionalModel } });
codeGenConditionalObject.Find(it => it.FieldRule.Equals(fieldRule) && it.TableName.Equals(tableName)).conditionalModel = groupsList;
groupsList = new List<object>();
}
}
if (codeGenConditionalObject.Any())
{
allList.Add(new { Key = (int)WhereType.And, Value = new { ConditionalList = codeGenConditionalObject.Find(it => it.FieldRule.Equals(fieldRule) && it.TableName.Equals(tableName)).conditionalModel } });
codeGenConditionalObject.Find(it => it.FieldRule.Equals(fieldRule) && it.TableName.Equals(tableName)).conditionalModel = allList;
allList = new List<object>();
}
}
if (codeGenConditionalObject.Any())
{
foreach (var conditional in codeGenConditionalObject)
{
resultList.Add(new { ConditionalList = conditional.conditionalModel });
conditional.conditionalModel = resultList;
resultList = new List<object>();
}
}
if (codeGenConditionalObject.Any())
{
foreach (var conditional in codeGenConditionalObject)
{
if (!codeGenConditional.Any(it => it.FieldRule == conditional.FieldRule && it.TableName.Equals(conditional.TableName)))
{
codeGenConditional.Add(new CodeGenAuthorizeModuleResourceModel
{
FieldRule = conditional.FieldRule,
TableName = conditional.TableName,
conditionalModel = new List<IConditionalModel>()
});
}
codeGenConditional.Find(it => it.FieldRule.Equals(conditional.FieldRule) && it.TableName.Equals(conditional.TableName)).conditionalModel = _repository.AsSugarClient().Utilities.JsonToConditionalModels(conditional.conditionalModel.ToJsonString());
}
}
break;
}
break;
}
return codeGenConditional.FindAll(it => it.conditionalModel.Count > 0);
}
/// <summary>
/// 获取数据条件(在线开发专用) .
/// </summary>
/// <typeparam name="T">实体.</typeparam>
/// <param name="primaryKey">表主键.</param>
/// <param name="moduleId">模块ID.</param>
/// <param name="isDataPermissions">是否开启数据权限.</param>
/// <returns></returns>
public async Task<List<IConditionalModel>> GetCondition<T>(string primaryKey, string moduleId, bool isDataPermissions = true)
where T : new()
{
var conModels = new List<IConditionalModel>();
if (IsAdministrator) return conModels; // 管理员全部放开
var items = _repository.AsSugarClient().Queryable<AuthorizeEntity, RoleEntity>((a, b) => new JoinQueryInfos(JoinType.Left, b.Id == a.ObjectId && b.EnabledMark == 1 && b.DeleteMark == null))
.In((a, b) => b.Id, Roles)
.Where(a => a.ItemType == "resource")
.GroupBy(a => new { a.ItemId }).Select(a => a.ItemId).ToList();
if (!isDataPermissions)
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.NoEqual, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
return conModels;
}
else if (items.Count == 0 && isDataPermissions)
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.Equal, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
return conModels;
}
var resourceList = _repository.AsSugarClient().Queryable<ModuleDataAuthorizeSchemeEntity>().In(it => it.Id, items).Where(it => it.ModuleId == moduleId && it.DeleteMark == null).ToList();
if (resourceList.Any(x => x.AllData == 1 || x.EnCode.Equals("jnpf_alldata")))
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>() {
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.NoEqual, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
}
else
{
var allList = new List<object>(); // 构造任何层级的条件
var resultList = new List<object>();
foreach (var item in resourceList)
{
var groupsList = new List<object>();
foreach (var conditionItem in item.ConditionJson.ToList<AuthorizeModuleResourceConditionModel>())
{
var conditionalList = new List<object>();
foreach (var fieldItem in conditionItem.Groups)
{
var itemField = fieldItem.BindTable.IsNullOrWhiteSpace() ? fieldItem.Field : string.Format("{0}.{1}", fieldItem.BindTable, fieldItem.Field);
var itemValue = fieldItem.Value;
var itemMethod = (QueryType)System.Enum.Parse(typeof(QueryType), fieldItem.Op);
switch (itemValue)
{
case "@userId": // 当前用户
{
var cmodel = GetConditionalModel(itemMethod, itemField, UserId);
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = UserId, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = UserId, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
break;
case "@userAraSubordinates": // 当前用户集下属
{
var ids = new List<string>() { UserId };
ids.AddRange(Subordinates);
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", ids));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
break;
case "@organizeId": // 当前组织
{
if (!string.IsNullOrEmpty(User.OrganizeId))
{
var cmodel = GetConditionalModel(itemMethod, itemField, User.OrganizeId);
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = User.OrganizeId, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = User.OrganizeId, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
case "@organizationAndSuborganization": // 当前组织及子组织
{
if (!string.IsNullOrEmpty(User.OrganizeId))
{
var ids = new List<string>() { User.OrganizeId };
ids.AddRange(Subsidiary);
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", ids));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", ids), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
case "@branchManageOrganize": // 当前分管组织
{
var orgId = DataScope.Where(x => x.Select).Select(x => x.organizeId).ToList();
if (orgId != null)
{
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", orgId));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", orgId), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", orgId), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
else
{
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = "jnpf", ConditionalType = (int)ConditionalType.Equal } });
}
}
break;
case "@branchManageOrganizeAndSub": // 当前分管组织及子组织
{
var subOrgIds = new List<string>();
DataScope.Where(x => x.Select).Select(x => x.organizeId).ToList()
.ForEach(item => subOrgIds.AddRange(_repository.AsSugarClient().Queryable<OrganizeEntity>().Where(x => x.OrganizeIdTree.Contains(item)).Select(x => x.Id).ToList()));
if (subOrgIds.Any())
{
var cmodel = GetConditionalModel(itemMethod, itemField, string.Join(",", subOrgIds));
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = string.Join(",", subOrgIds), ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = string.Join(",", subOrgIds), ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
else
{
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = "jnpf", ConditionalType = (int)ConditionalType.Equal } });
}
}
break;
default:
{
if (!string.IsNullOrEmpty(itemValue))
{
var cmodel = GetConditionalModel(itemMethod, itemField, itemValue, fieldItem.Type);
if (cmodel.ConditionalType.Equals(ConditionalType.In)) cmodel.ConditionalType = ConditionalType.Like;
if (cmodel.ConditionalType.Equals(ConditionalType.NotIn)) cmodel.ConditionalType = ConditionalType.NoLike;
switch (conditionItem.Logic)
{
case "and":
conditionalList.Add(new { Key = (int)WhereType.And, Value = new { FieldName = itemField, FieldValue = itemValue, ConditionalType = (int)cmodel.ConditionalType } });
break;
case "or":
conditionalList.Add(new { Key = (int)WhereType.Or, Value = new { FieldName = itemField, FieldValue = itemValue, ConditionalType = (int)cmodel.ConditionalType } });
break;
}
}
}
break;
}
}
if (conditionalList.Any())
{
var firstItem = conditionalList.First().ToObject<dynamic>();
firstItem.Key = 0;
conditionalList[0] = firstItem;
groupsList.Add(new { Key = (int)WhereType.And, Value = new { ConditionalList = conditionalList } });
}
}
if (groupsList.Any()) allList.Add(new { Key = (int)WhereType.And, Value = new { ConditionalList = groupsList } });
}
if (allList.Any()) resultList.Add(new { ConditionalList = allList });
if (resultList.Any()) conModels.AddRange(_repository.AsSugarClient().Utilities.JsonToConditionalModels(resultList.ToJsonString()));
}
if (resourceList.Count == 0)
{
conModels.Add(new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And, new ConditionalModel() { FieldName = primaryKey, ConditionalType = ConditionalType.Equal, FieldValue = "0", FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(string)) })
}
});
}
return conModels;
}
/// <summary>
/// 下属机构.
/// </summary>
/// <param name="organizeId">机构ID.</param>
/// <param name="isAdmin">是否管理员.</param>
/// <returns></returns>
private async Task<string[]> GetSubsidiaryAsync(string organizeId, bool isAdmin)
{
var data = await _repository.AsSugarClient().Queryable<OrganizeEntity>().Where(it => it.DeleteMark == null && it.EnabledMark.Equals(1)).ToListAsync();
if (!isAdmin)
data = data.TreeChildNode(organizeId, t => t.Id, t => t.ParentId);
return data.Select(m => m.Id).ToArray();
}
/// <summary>
/// 下属机构.
/// </summary>
/// <param name="organizeId">机构ID.</param>
/// <param name="isAdmin">是否管理员.</param>
/// <returns></returns>
private string[] GetSubsidiary(string organizeId, bool isAdmin)
{
var data = _repository.AsSugarClient().Queryable<OrganizeEntity>().Where(it => it.DeleteMark == null && it.EnabledMark.Equals(1)).ToList();
if (!isAdmin)
data = data.TreeChildNode(organizeId, t => t.Id, t => t.ParentId);
return data.Select(m => m.Id).ToArray();
}
/// <summary>
/// 获取下属.
/// </summary>
/// <param name="managerId">主管Id.</param>
/// <returns></returns>
private async Task<string[]> GetSubordinatesAsync(string managerId)
{
List<string> data = new List<string>();
var userIds = await _repository.AsQueryable().Where(m => m.ManagerId == managerId && m.DeleteMark == null).Select(m => m.Id).ToListAsync();
data.AddRange(userIds);
// 关闭无限级我的下属
// data.AddRange(await GetInfiniteSubordinats(userIds.ToArray()));
return data.ToArray();
}
/// <summary>
/// 获取下属.
/// </summary>
/// <param name="managerId">主管Id.</param>
/// <returns></returns>
private string[] GetSubordinates(string managerId)
{
List<string> data = new List<string>();
var userIds = _repository.AsQueryable().Where(m => m.ManagerId == managerId && m.DeleteMark == null).Select(m => m.Id).ToList();
data.AddRange(userIds);
// 关闭无限级我的下属
// data.AddRange(await GetInfiniteSubordinats(userIds.ToArray()));
return data.ToArray();
}
/// <summary>
/// 获取下属无限极.
/// </summary>
/// <param name="parentIds"></param>
/// <returns></returns>
private async Task<List<string>> GetInfiniteSubordinats(string[] parentIds)
{
List<string> data = new List<string>();
if (parentIds.ToList().Count > 0)
{
var userIds = await _repository.AsQueryable().In(it => it.ManagerId, parentIds).Where(it => it.DeleteMark == null).OrderBy(it => it.SortCode).Select(it => it.Id).ToListAsync();
data.AddRange(userIds);
data.AddRange(await GetInfiniteSubordinats(userIds.ToArray()));
}
return data;
}
/// <summary>
/// 获取当前用户岗位信息.
/// </summary>
/// <param name="PositionIds"></param>
/// <returns></returns>
private async Task<List<PositionInfoModel>> GetPosition(string PositionIds)
{
return await _repository.AsSugarClient().Queryable<PositionEntity>().In(it => it.Id, PositionIds.Split(",")).Select(it => new PositionInfoModel { id = it.Id, name = it.FullName }).ToListAsync();
}
/// <summary>
/// 获取条件模型.
/// </summary>
/// <returns></returns>
private ConditionalModel GetConditionalModel(QueryType expressType, string fieldName, string fieldValue, string dataType = "string")
{
switch (expressType)
{
// 模糊
case QueryType.Contains:
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.Like, FieldValue = fieldValue };
// 等于
case QueryType.Equal:
switch (dataType)
{
case "Double":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.Equal, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(double)) };
case "Int32":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.Equal, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(int)) };
default:
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.Equal, FieldValue = fieldValue };
}
// 不等于
case QueryType.NotEqual:
switch (dataType)
{
case "Double":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.NoEqual, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(double)) };
case "Int32":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.NoEqual, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(int)) };
default:
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.NoEqual, FieldValue = fieldValue };
}
// 小于
case QueryType.LessThan:
switch (dataType)
{
case "Double":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.LessThan, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(double)) };
case "Int32":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.LessThan, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(int)) };
default:
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.LessThan, FieldValue = fieldValue };
}
// 小于等于
case QueryType.LessThanOrEqual:
switch (dataType)
{
case "Double":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.LessThanOrEqual, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(double)) };
case "Int32":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.LessThanOrEqual, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(int)) };
default:
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.LessThanOrEqual, FieldValue = fieldValue };
}
// 大于
case QueryType.GreaterThan:
switch (dataType)
{
case "Double":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.GreaterThan, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(double)) };
case "Int32":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.GreaterThan, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(int)) };
default:
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.GreaterThan, FieldValue = fieldValue };
}
// 大于等于
case QueryType.GreaterThanOrEqual:
switch (dataType)
{
case "Double":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.GreaterThanOrEqual, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(double)) };
case "Int32":
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.GreaterThanOrEqual, FieldValue = fieldValue, FieldValueConvertFunc = it => SqlSugar.UtilMethods.ChangeType2(it, typeof(int)) };
default:
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.GreaterThanOrEqual, FieldValue = fieldValue };
}
// 包含
case QueryType.In:
case QueryType.Included:
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.In, FieldValue = fieldValue };
// 不包含
case QueryType.NotIn:
case QueryType.NotIncluded:
return new ConditionalModel() { FieldName = fieldName, ConditionalType = ConditionalType.NotIn, FieldValue = fieldValue };
}
return new ConditionalModel();
}
/// <summary>
/// 获取角色名称 根据 角色Ids.
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public async Task<string> GetRoleNameByIds(string ids)
{
if (ids.IsNullOrEmpty())
return string.Empty;
var idList = ids.Split(",").ToList();
var nameList = new List<string>();
var roleList = await _repository.AsSugarClient().Queryable<RoleEntity>().Where(x => x.DeleteMark == null && x.EnabledMark == 1).ToListAsync();
foreach (var item in idList)
{
var info = roleList.Find(x => x.Id == item);
if (info != null && info.FullName.IsNotEmptyOrNull())
{
nameList.Add(info.FullName);
}
}
return string.Join(",", nameList);
}
/// <summary>
/// 根据角色Ids和组织Id 获取组织下的角色以及全局角色.
/// </summary>
/// <param name="roleIds">角色Id集合.</param>
/// <param name="organizeId">组织Id.</param>
/// <returns></returns>
public async Task<List<string>> GetUserOrgRoleIds(string roleIds, string organizeId)
{
if (roleIds.IsNotEmptyOrNull())
{
var userRoleIds = roleIds.Split(",");
// 当前组织下的角色Id 集合
var roleList = await _repository.AsSugarClient().Queryable<OrganizeRelationEntity>()
.Where(x => x.OrganizeId == organizeId && x.ObjectType == "Role" && userRoleIds.Contains(x.ObjectId)).Select(x => x.ObjectId).ToListAsync();
// 全局角色Id 集合
var gRoleList = await _repository.AsSugarClient().Queryable<RoleEntity>().Where(x => userRoleIds.Contains(x.Id) && x.GlobalMark == 1)
.Where(r => r.EnabledMark == 1 && r.DeleteMark == null).Select(x => x.Id).ToListAsync();
roleList.AddRange(gRoleList); // 组织角色 + 全局角色
return roleList;
}
else
{
return new List<string>();
}
}
/// <summary>
/// 根据角色Ids和组织Id 获取组织下的角色以及全局角色.
/// </summary>
/// <param name="roleIds">角色Id集合.</param>
/// <param name="organizeId">组织Id.</param>
/// <returns></returns>
public List<string> GetUserRoleIds(string roleIds, string organizeId)
{
if (roleIds.IsNotEmptyOrNull())
{
var userRoleIds = roleIds.Split(",");
// 当前组织下的角色Id 集合
var roleList = _repository.AsSugarClient().Queryable<OrganizeRelationEntity>()
.Where(x => x.OrganizeId == organizeId && x.ObjectType == "Role" && userRoleIds.Contains(x.ObjectId)).Select(x => x.ObjectId).ToList();
// 全局角色Id 集合
var gRoleList = _repository.AsSugarClient().Queryable<RoleEntity>().Where(x => userRoleIds.Contains(x.Id) && x.GlobalMark == 1)
.Where(r => r.EnabledMark == 1 && r.DeleteMark == null).Select(x => x.Id).ToList();
roleList.AddRange(gRoleList); // 组织角色 + 全局角色
return roleList;
}
else
{
return new List<string>();
}
}
/// <summary>
/// 保存用户登录信息.
/// </summary>
/// <param name="cacheKey">key.</param>
/// <param name="userInfo">用户信息.</param>
/// <param name="timeSpan">过期时间.</param>
/// <returns></returns>
private async Task<bool> SetUserInfo(string cacheKey, UserInfoModel userInfo, TimeSpan timeSpan)
{
return await _cacheManager.SetAsync(cacheKey, userInfo, timeSpan);
}
}