using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Myshipping.Core.Entity;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using System;
using Myshipping.Core.Service.CommonDB.Dto;
using Microsoft.Extensions.Logging;
using Myshipping.Core.Entity.CommonDB;
using Myshipping.Core.Service.User.Dto;
namespace Myshipping.Core.Service;
///
/// 用户数据范围
///
public class SysDataUserMenuService : ISysDataUserMenu, ITransient
{
private readonly SqlSugarRepository _rep; // 用户数据范围表仓储
private readonly ISysCacheService _sysCache;//缓存
private readonly SqlSugarRepository _sysOrgRep; // 组织机构表仓储
private readonly SqlSugarRepository _sysEmpRep; // 员工表仓储
private readonly SqlSugarRepository _sysuser; // 员工表
private readonly SqlSugarRepository _sysUserDataScopeRep; // 用户数据范围表仓储
public SysDataUserMenuService(SqlSugarRepository rep, ISysCacheService sysCache, SqlSugarRepository sysuser, SqlSugarRepository sysUserDataScopeRep, SqlSugarRepository sysEmpRep, SqlSugarRepository sysOrgRep)
{
_rep = rep;
_sysCache = sysCache;
_sysuser = sysuser;
_sysUserDataScopeRep=sysUserDataScopeRep;
_sysEmpRep = sysEmpRep;
_sysOrgRep= sysOrgRep;
}
///
/// 授权用户数据
///
///
///
[SqlSugarUnitOfWork]
[HttpPost("/SysDataUserMenu/GrantData")]
public async Task GrantData(SysDataUserMenuDto input)
{
try
{
if (input.UserId == 0)
{
throw Oops.Bah("没有获取到用户id");
}
///先清理权限
await _rep.DeleteAsync(x => x.SysUserId == input.UserId);
var list = new List();
input.childrens.ForEach(u =>
{
list.Add(
new SysDataUserMenu
{
SysUserId = input.UserId,
SysMenuId = u.MenuId,
DataScopeType = u.DataScopeType
});
});
await _rep.InsertAsync(list);
var userdatalist = _rep.AsQueryable().ToListAsync();
_sysCache.Set(CommonConst.CACHE_KEY_USERDATASCOPE, userdatalist);
}
catch (System.Exception)
{
throw;
}
}
///
/// 授权用户自定义数据
///
///
///
[SqlSugarUnitOfWork]
[HttpPost("/SysDataUserMenu/GrantRightData")]
public async Task GrantRightData(RightList input)
{
try
{
if (input== null)
{
throw Oops.Bah("请上传正确数据!");
}
await _sysUserDataScopeRep.DeleteAsync(x => x.SysUserId == input.UserId);
foreach (var item in input.childrens)
{
var list = new List();
input.childrens.ForEach(u =>
{
list.Add(
new SysUserDataScope
{
SysUserId = input.UserId,
SysMenuId=u.MenuId,
SysOrgId=u.OrgId
});
});
await _sysUserDataScopeRep.InsertAsync(list);
//var userdatalist = _rep.AsQueryable().ToListAsync();
//_sysCache.Set(CommonConst.CACHE_KEY_USERDATASCOPE, userdatalist);
}
}
catch (System.Exception)
{
throw;
}
}
///
/// 获取权限集合
///
///
public async Task> GetDataScopeList(long menuid)
{
List list = new List();
List datascope = new List();
//if (_sysCache.Exists(CommonConst.CACHE_KEY_USERDATASCOPE))
//{
// list = await _sysCache.GetAsync>(CommonConst.CACHE_KEY_USERDATASCOPE);
//}
//else
//{
// list = await _rep.AsQueryable().ToListAsync();
// _sysCache.Set(CommonConst.CACHE_KEY_USERDATASCOPE, list);
//}
list = await _rep.AsQueryable().ToListAsync();
_sysCache.Set(CommonConst.CACHE_KEY_USERDATASCOPE, list);
DataScopeType _dataScopeType = list.Where(x => x.SysMenuId == menuid && x.SysUserId == UserManager.UserId).Select(x => x.DataScopeType).FirstOrDefault();
if (_dataScopeType == DataScopeType.ALL)
{
datascope = _sysuser.AsQueryable().Where(x => x.TenantId == UserManager.TENANT_ID).Select(x => x.Id).ToList();
}
if (_dataScopeType==DataScopeType.SELF) {
datascope.Add(UserManager.UserId);
}
if (_dataScopeType==DataScopeType.DEPT) {
datascope=await _sysEmpRep.AsQueryable().InnerJoin((d, t) => d.OrgId == t.OrgId && d.Id == UserManager.UserId).Select(d => d.Id).ToListAsync();
}
if (_dataScopeType == DataScopeType.DEPT_WITH_CHILD)
{
//获取本部门
long orgid= _sysEmpRep.Where(x=>x.Id==UserManager.UserId).Select(x=>x.OrgId).First();
//获取下属部门及下属部门
var orglist = await _sysOrgRep.Where(x => x.TenantId == UserManager.TENANT_ID && x.Pids.Contains(orgid.ToString())).Select(x => x.Id).ToListAsync();
orglist.Add(orgid);
datascope = await _sysEmpRep.Where(x => orglist.Contains(x.OrgId)).Select(x => x.Id).ToListAsync();
}
if (_dataScopeType == DataScopeType.DEFINE)
{
datascope=await _sysUserDataScopeRep.AsQueryable().InnerJoin((d, t) => d.SysOrgId == t.OrgId && d.SysMenuId == menuid && d.SysUserId == UserManager.UserId).Select((d, t) => t.Id).ToListAsync();
}
return datascope;
}
}