using System;
using System.Linq;
using Infrastructure;
using OpenAuth.App.Interface;
using OpenAuth.Repository;
using OpenAuth.Repository.Core;
using OpenAuth.Repository.Domain;
using SqlSugar;
namespace OpenAuth.App
{
///
/// SqlSugar基础类
///
///
public abstract class SqlSugarBaseApp where T : class, new()
{
protected ISqlSugarClient SugarClient;
protected SqlSugarRepository Repository;
protected IAuth _auth;
public SqlSugarBaseApp(ISqlSugarClient client, IAuth auth)
{
Repository = new SqlSugarRepository(client); //这里用new而不用注入,可以保证client和repository用的是同一个client
SugarClient = client;
_auth = auth;
}
public void Delete(string[] ids)
{
Repository.DeleteByIds(ids);
}
public T Get(string id)
{
return SugarClient.Queryable().Where("Id=@id", new {id = id}).First();
}
///
/// 获取当前登录用户的数据访问权限
///
/// linq表达式参数的名称,如u=>u.name中的"u"
///
protected ISugarQueryable GetDataPrivilege(string parametername)
{
var loginUser = _auth.GetCurrentUser();
if (loginUser.User.Account == Define.SYSTEM_USERNAME) return SugarClient.Queryable(); //超级管理员特权
var moduleName = typeof(T).Name;
var rule = SugarClient.Queryable().First(u => u.SourceCode == moduleName);
if (rule == null) return SugarClient.Queryable(); //没有设置数据规则,那么视为该资源允许被任何主体查看
if (rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINUSER) ||
rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINROLE)||
rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINORG))
{
//即把{loginUser} =='xxxxxxx'换为 loginUser.User.Id =='xxxxxxx',从而把当前登录的用户名与当时设计规则时选定的用户id对比
rule.PrivilegeRules = rule.PrivilegeRules.Replace(Define.DATAPRIVILEGE_LOGINUSER, loginUser.User.Id);
var roles = loginUser.Roles.Select(u => u.Id).ToList();
roles.Sort(); //按字母排序,这样可以进行like操作
rule.PrivilegeRules = rule.PrivilegeRules.Replace(Define.DATAPRIVILEGE_LOGINROLE,
string.Join(',',roles));
var orgs = loginUser.Orgs.Select(u => u.Id).ToList();
orgs.Sort();
rule.PrivilegeRules = rule.PrivilegeRules.Replace(Define.DATAPRIVILEGE_LOGINORG,
string.Join(',',orgs));
}
return SugarClient.Queryable().GenerateFilter(parametername,
JsonHelper.Instance.Deserialize(rule.PrivilegeRules));
}
///
/// 计算实体更新的层级信息
///
/// U必须是一个继承TreeEntity的结构
///
public void CaculateCascade(U entity) where U : TreeEntity
{
if (entity.ParentId == "") entity.ParentId = null;
string cascadeId;
int currentCascadeId = 1; //当前结点的级联节点最后一位
var sameLevels = SugarClient.Queryable().Where(o => o.ParentId == entity.ParentId && o.Id != entity.Id);
foreach (var obj in sameLevels.ToList())
{
int objCascadeId = int.Parse(obj.CascadeId.TrimEnd('.').Split('.').Last());
if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1;
}
if (!string.IsNullOrEmpty(entity.ParentId))
{
var parentOrg = SugarClient.Queryable().First(o => o.Id == entity.ParentId);
if (parentOrg != null)
{
cascadeId = parentOrg.CascadeId + currentCascadeId + ".";
entity.ParentName = parentOrg.Name;
}
else
{
throw new Exception("未能找到该组织的父节点信息");
}
}
else
{
cascadeId = ".0." + currentCascadeId + ".";
entity.ParentName = "根节点";
}
entity.CascadeId = cascadeId;
}
}
}