using JNPF.Common.Core.Manager;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Filter;
using JNPF.Common.Models.User;
using JNPF.Common.Security;
using JNPF.DatabaseAccessor;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.FriendlyException;
using JNPF.Systems.Entitys.Dto.OrganizeAdministrator;
using JNPF.Systems.Entitys.Dto.Permission.OrganizeAdministrator;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Interfaces.Permission;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace JNPF.Systems;
///
/// 分级管理
/// 版 本:V3.2.0
/// 版 权:拓通智联科技有限公司(http://www.tuotong-tech.com)
/// 日 期:2021.09.27.
///
[ApiDescriptionSettings(Tag = "Permission", Name = "OrganizeAdministrator", Order = 166)]
[Route("api/permission/[controller]")]
public class OrganizeAdministratorService : IOrganizeAdministratorService, IDynamicApiController, ITransient
{
///
/// 基础仓储 .
///
private readonly ISqlSugarRepository _repository;
///
/// 组织管理.
///
private readonly IOrganizeService _organizeService;
///
/// 用户管理器.
///
private readonly IUserManager _userManager;
///
/// 初始化一个类型的新实例.
///
public OrganizeAdministratorService(
ISqlSugarRepository organizeAdministratorRepository,
IUserManager userManager,
IOrganizeService organizeService)
{
_repository = organizeAdministratorRepository;
_userManager = userManager;
_organizeService = organizeService;
}
#region GET
///
/// 拉取机构分级管理.
///
///
///
[HttpGet("")]
public async Task GetList([FromQuery] PageInputBase input)
{
// 处理组织树 名称
List? orgTreeNameList = GetOrgListTreeName();
// 获取有查看权限的组织
var dataScope = _repository.AsSugarClient().Queryable()
.Where(it => SqlFunc.ToString(it.UserId) == _userManager.UserId && it.DeleteMark == null)
.Where(it => it.ThisLayerSelect.Equals(1) || it.ThisLayerSelect.Equals(1) || it.SubLayerSelect.Equals(1)).ToList();
List? orgIds = dataScope.Where(x => x.ThisLayerSelect.Equals(1)).Select(x => x.OrganizeId).ToList();
if (dataScope.Any(x => x.SubLayerSelect.Equals(1)))
{
dataScope.Where(x => x.SubLayerSelect.Equals(1)).ToList().ForEach(item =>
{
var resList = _repository.AsSugarClient().Queryable().Where(o => !o.Id.Equals(item.OrganizeId) && o.OrganizeIdTree.Contains(item.OrganizeId) && o.DeleteMark == null && o.EnabledMark == 1).Select(x => x.Id).ToList();
orgIds.AddRange(resList);
});
}
var userIdList = await _repository.AsSugarClient().Queryable().Where(x => x.ObjectType.Equals("Organize") && orgIds.Contains(x.ObjectId)).Select(x => x.UserId).ToListAsync();
var organizeAdmin = await _repository.AsSugarClient().Queryable().Where(x => !SqlFunc.ToString(x.UserId).Equals(_userManager.UserId))
.WhereIF(!_userManager.IsAdministrator, x => orgIds.Contains(x.OrganizeId) && userIdList.Contains(x.UserId))
.Select(x => new { x.UserId, x.CreatorTime }).ToListAsync();
var data = await _repository.AsSugarClient().Queryable()
.Where(x => organizeAdmin.Select(xx => xx.UserId).Contains(x.Id) && x.DeleteMark == null)
.WhereIF(input.keyword.IsNotEmptyOrNull(), x => x.Account.Contains(input.keyword) || x.RealName.Contains(input.keyword))
.Select(x => new OrganizeAdministratorListOutput()
{
id = x.Id,
account = x.Account,
gender = SqlFunc.ToString(x.Gender),
realName = x.RealName,
mobilePhone = x.MobilePhone,
creatorTime = x.CreatorTime
}).ToPagedListAsync(input.currentPage, input.pageSize);
List? orgUserIdAll = await _repository.AsSugarClient().Queryable()
.Where(x => x.ObjectType.Equals("Organize") && data.list.Select(x => x.id).Contains(x.UserId)).ToListAsync();
foreach (var item in data.list)
{
// 获取用户组织集合
List? roleOrgList = orgUserIdAll.Where(x => x.UserId == item.id).Select(x => x.ObjectId).ToList();
item.organizeId = string.Join(" , ", orgTreeNameList.Where(x => roleOrgList.Contains(x.Id)).Select(x => x.Description));
item.creatorTime = organizeAdmin.Find(x => x.UserId.Equals(item.id)).CreatorTime;
}
return PageResult.SqlSugarPageResult(data);
}
///
/// 获取下拉框.
///
///
[HttpGet("Selector")]
public async Task GetSelector(string userId)
{
if (userId.IsNullOrEmpty()) userId = _userManager.UserId;
// 处理组织树 名称
List orgTreeNameList = GetOrgListTreeName();
// 获取当前有权限的组织
var currList = await _repository.AsSugarClient().Queryable().Where(x => orgTreeNameList.Select(xx => xx.Id).Contains(x.OrganizeId)).ToListAsync();
var result = new List();
// 管理员
if (_userManager.IsAdministrator)
{
orgTreeNameList.ForEach(orgItem =>
{
var addItem = new OrganizeAdministratorSelectorOutput();
addItem.id = orgItem.Id;
addItem.fullName = orgItem.FullName;
addItem.organizeId = orgItem.Id;
addItem.parentId = orgItem.ParentId;
addItem.category = orgItem.Category;
addItem.icon = orgItem.Category.Equals("company") ? "icon-ym icon-ym-tree-organization3" : "icon-ym icon-ym-tree-department1";
addItem.organizeIdTree = orgItem.OrganizeIdTree;
var item = currList.FirstOrDefault(x => x.OrganizeId.Equals(orgItem.Id) && x.UserId.Equals(userId));
if (item != null && userId != _userManager.UserId)
{
addItem.thisLayerSelect = item.ThisLayerSelect;
addItem.thisLayerAdd = item.ThisLayerAdd;
addItem.thisLayerEdit = item.ThisLayerEdit;
addItem.thisLayerDelete = item.ThisLayerDelete;
addItem.subLayerSelect = item.SubLayerSelect;
addItem.subLayerAdd = item.SubLayerAdd;
addItem.subLayerEdit = item.SubLayerEdit;
addItem.subLayerDelete = item.SubLayerDelete;
}
else
{
addItem.thisLayerSelect = 0;
addItem.thisLayerAdd = 0;
addItem.thisLayerEdit = 0;
addItem.thisLayerDelete = 0;
addItem.subLayerSelect = 0;
addItem.subLayerAdd = 0;
addItem.subLayerEdit = 0;
addItem.subLayerDelete = 0;
}
result.Add(addItem);
});
return new { list = result.ToTree("-1") };
}
currList = currList.WhereIF(userId.Equals(_userManager.UserId), x => x.UserId.Equals(_userManager.UserId))
.WhereIF(!userId.Equals(_userManager.UserId), x => x.UserId == _userManager.UserId || x.UserId == userId).ToList();
// 捞取编辑用户权限
var userList = currList.Where(x => x.ThisLayerAdd.Equals(1) || x.ThisLayerEdit.Equals(1) || x.ThisLayerDelete.Equals(1) || x.ThisLayerSelect.Equals(1) ||
x.SubLayerAdd.Equals(1) || x.SubLayerEdit.Equals(1) || x.SubLayerDelete.Equals(1) || x.SubLayerSelect.Equals(1)).Where(x => x.UserId.Equals(userId)).ToList().Copy();
userList.Where(x => x.SubLayerAdd.Equals(1) || x.SubLayerEdit.Equals(1) || x.SubLayerDelete.Equals(1) || x.SubLayerSelect.Equals(1)).ToList().ForEach(item =>
{
var orgIds = orgTreeNameList.Where(x => x.OrganizeIdTree.Contains(item.OrganizeId) && !x.Id.Equals(item.OrganizeId)).Select(x => x.Id).ToList();
var subList = currList.Where(x => orgIds.Contains(x.OrganizeId) && x.UserId.Equals(_userManager.UserId)).ToList().Copy();
subList.ForEach(it =>
{
var userIt = userList.Find(x => x.OrganizeId.Equals(it.OrganizeId));
if (userIt == null)
{
it.ThisLayerAdd = item.SubLayerAdd.Equals(1) ? 3 : 0;
it.ThisLayerEdit = item.SubLayerEdit.Equals(1) ? 3 : 0;
it.ThisLayerDelete = item.SubLayerDelete.Equals(1) ? 3 : 0;
it.ThisLayerSelect = item.SubLayerSelect.Equals(1) ? 3 : 0;
it.SubLayerAdd = item.SubLayerAdd.Equals(1) ? 3 : 0;
it.SubLayerEdit = item.SubLayerEdit.Equals(1) ? 3 : 0;
it.SubLayerDelete = item.SubLayerDelete.Equals(1) ? 3 : 0;
it.SubLayerSelect = item.SubLayerSelect.Equals(1) ? 3 : 0;
}
else
{
it.ThisLayerAdd = userIt.ThisLayerAdd.Equals(1) || userIt.ThisLayerAdd.Equals(3) ? userIt.ThisLayerAdd : item.SubLayerAdd.Equals(1) ? 3 : 0;
it.ThisLayerEdit = userIt.ThisLayerEdit.Equals(1) || userIt.ThisLayerEdit.Equals(3) ? userIt.ThisLayerEdit : item.SubLayerEdit.Equals(1) ? 3 : 0;
it.ThisLayerDelete = userIt.ThisLayerDelete.Equals(1) || userIt.ThisLayerDelete.Equals(3) ? userIt.ThisLayerDelete : item.SubLayerDelete.Equals(1) ? 3 : 0;
it.ThisLayerSelect = userIt.ThisLayerSelect.Equals(1) || userIt.ThisLayerSelect.Equals(3) ? userIt.ThisLayerSelect : item.SubLayerSelect.Equals(1) ? 3 : 0;
it.SubLayerAdd = userIt.SubLayerAdd.Equals(1) || userIt.SubLayerAdd.Equals(3) ? userIt.SubLayerAdd : item.SubLayerAdd.Equals(1) ? 3 : 0;
it.SubLayerEdit = userIt.SubLayerEdit.Equals(1) || userIt.SubLayerEdit.Equals(3) ? userIt.SubLayerEdit : item.SubLayerEdit.Equals(1) ? 3 : 0;
it.SubLayerDelete = userIt.SubLayerDelete.Equals(1) || userIt.SubLayerDelete.Equals(3) ? userIt.SubLayerDelete : item.SubLayerDelete.Equals(1) ? 3 : 0;
it.SubLayerSelect = userIt.SubLayerSelect.Equals(1) || userIt.SubLayerSelect.Equals(3) ? userIt.SubLayerSelect : item.SubLayerSelect.Equals(1) ? 3 : 0;
userList.Remove(userIt);
}
});
userList.AddRange(subList);
});
// 捞取管理员权限
var adminList = currList.Where(x => x.ThisLayerAdd.Equals(1) || x.ThisLayerEdit.Equals(1) || x.ThisLayerDelete.Equals(1) || x.ThisLayerSelect.Equals(1) ||
x.SubLayerAdd.Equals(1) || x.SubLayerEdit.Equals(1) || x.SubLayerDelete.Equals(1) || x.SubLayerSelect.Equals(1)).Where(x => x.UserId.Equals(_userManager.UserId)).ToList().Copy();
adminList.Where(x => x.SubLayerAdd.Equals(1) || x.SubLayerEdit.Equals(1) || x.SubLayerDelete.Equals(1) || x.SubLayerSelect.Equals(1)).ToList().ForEach(item =>
{
var orgIds = orgTreeNameList.Where(x => x.OrganizeIdTree.Contains(item.OrganizeId) && !x.Id.Equals(item.OrganizeId)).Select(x => x.Id).ToList();
var subList = currList.Where(x => orgIds.Contains(x.OrganizeId) && x.UserId.Equals(_userManager.UserId)).ToList().Copy();
subList.ForEach(it =>
{
var adminIt = adminList.Find(x => x.OrganizeId.Equals(it.OrganizeId));
if (adminIt == null)
{
it.ThisLayerAdd = item.SubLayerAdd.Equals(1) ? 3 : 0;
it.ThisLayerEdit = item.SubLayerEdit.Equals(1) ? 3 : 0;
it.ThisLayerDelete = item.SubLayerDelete.Equals(1) ? 3 : 0;
it.ThisLayerSelect = item.SubLayerSelect.Equals(1) ? 3 : 0;
it.SubLayerAdd = item.SubLayerAdd.Equals(1) ? 3 : 0;
it.SubLayerEdit = item.SubLayerEdit.Equals(1) ? 3 : 0;
it.SubLayerDelete = item.SubLayerDelete.Equals(1) ? 3 : 0;
it.SubLayerSelect = item.SubLayerSelect.Equals(1) ? 3 : 0;
}
else
{
it.ThisLayerAdd = adminIt.ThisLayerAdd.Equals(1) || adminIt.ThisLayerAdd.Equals(3) ? adminIt.ThisLayerAdd : item.SubLayerAdd.Equals(1) ? 3 : 0;
it.ThisLayerEdit = adminIt.ThisLayerEdit.Equals(1) || adminIt.ThisLayerEdit.Equals(3) ? adminIt.ThisLayerEdit : item.SubLayerEdit.Equals(1) ? 3 : 0;
it.ThisLayerDelete = adminIt.ThisLayerDelete.Equals(1) || adminIt.ThisLayerDelete.Equals(3) ? adminIt.ThisLayerDelete : item.SubLayerDelete.Equals(1) ? 3 : 0;
it.ThisLayerSelect = adminIt.ThisLayerSelect.Equals(1) || adminIt.ThisLayerSelect.Equals(3) ? adminIt.ThisLayerSelect : item.SubLayerSelect.Equals(1) ? 3 : 0;
it.SubLayerAdd = adminIt.SubLayerAdd.Equals(1) || adminIt.SubLayerAdd.Equals(3) ? adminIt.SubLayerAdd : item.SubLayerAdd.Equals(1) ? 3 : 0;
it.SubLayerEdit = adminIt.SubLayerEdit.Equals(1) || adminIt.SubLayerEdit.Equals(3) ? adminIt.SubLayerEdit : item.SubLayerEdit.Equals(1) ? 3 : 0;
it.SubLayerDelete = adminIt.SubLayerDelete.Equals(1) || adminIt.SubLayerDelete.Equals(3) ? adminIt.SubLayerDelete : item.SubLayerDelete.Equals(1) ? 3 : 0;
it.SubLayerSelect = adminIt.SubLayerSelect.Equals(1) || adminIt.SubLayerSelect.Equals(3) ? adminIt.SubLayerSelect : item.SubLayerSelect.Equals(1) ? 3 : 0;
adminList.Remove(adminIt);
}
});
adminList.AddRange(subList);
});
adminList.ForEach(item =>
{
var user = userList.Find(x => x.OrganizeId.Equals(item.OrganizeId));
var orgItem = orgTreeNameList.Find(x => x.Id.Equals(item.OrganizeId));
var resultItem = new OrganizeAdministratorSelectorOutput();
resultItem.id = orgItem.Id;
resultItem.organizeId = orgItem.Id;
resultItem.fullName = orgItem.Description;
resultItem.parentId = orgItem.ParentId;
resultItem.category = orgItem.Category;
resultItem.icon = orgItem.Category.Equals("company") ? "icon-ym icon-ym-tree-organization3" : "icon-ym icon-ym-tree-department1";
resultItem.organizeIdTree = orgItem.OrganizeIdTree;
if (user != null && userId != _userManager.UserId)
{
if (item.ThisLayerAdd.Equals(0) && user.ThisLayerAdd.Equals(0)) resultItem.thisLayerAdd = -1;
else if ((item.ThisLayerAdd.Equals(1) || item.ThisLayerAdd.Equals(3)) && user.ThisLayerAdd.Equals(1)) resultItem.thisLayerAdd = 1;
else if ((item.ThisLayerAdd.Equals(1) || item.ThisLayerAdd.Equals(3)) && user.ThisLayerAdd.Equals(0)) resultItem.thisLayerAdd = 0;
else if (item.ThisLayerAdd.Equals(0) && user.ThisLayerAdd.Equals(1)) resultItem.thisLayerAdd = 2;
else if (item.ThisLayerAdd.Equals(0) && user.ThisLayerAdd.Equals(3)) resultItem.thisLayerAdd = 3;
if (item.ThisLayerEdit.Equals(0) && user.ThisLayerEdit.Equals(0)) resultItem.thisLayerEdit = -1;
else if ((item.ThisLayerEdit.Equals(1) || item.ThisLayerEdit.Equals(3)) && user.ThisLayerEdit.Equals(1)) resultItem.thisLayerEdit = 1;
else if ((item.ThisLayerEdit.Equals(1) || item.ThisLayerEdit.Equals(3)) && user.ThisLayerEdit.Equals(0)) resultItem.thisLayerEdit = 0;
else if (item.ThisLayerEdit.Equals(0) && user.ThisLayerEdit.Equals(1)) resultItem.thisLayerEdit = 2;
else if (item.ThisLayerEdit.Equals(0) && user.ThisLayerEdit.Equals(3)) resultItem.thisLayerEdit = 3;
if (item.ThisLayerDelete.Equals(0) && user.ThisLayerDelete.Equals(0)) resultItem.thisLayerDelete = -1;
else if ((item.ThisLayerDelete.Equals(1) || item.ThisLayerDelete.Equals(3)) && user.ThisLayerDelete.Equals(1)) resultItem.thisLayerDelete = 1;
else if ((item.ThisLayerDelete.Equals(1) || item.ThisLayerDelete.Equals(3)) && user.ThisLayerDelete.Equals(0)) resultItem.thisLayerDelete = 0;
else if (item.ThisLayerDelete.Equals(0) && user.ThisLayerDelete.Equals(1)) resultItem.thisLayerDelete = 2;
else if (item.ThisLayerDelete.Equals(0) && user.ThisLayerDelete.Equals(3)) resultItem.thisLayerDelete = 3;
if (item.ThisLayerSelect.Equals(0) && user.ThisLayerSelect.Equals(0)) resultItem.thisLayerSelect = -1;
else if ((item.ThisLayerSelect.Equals(1) || item.ThisLayerSelect.Equals(3)) && user.ThisLayerSelect.Equals(1)) resultItem.thisLayerSelect = 1;
else if ((item.ThisLayerSelect.Equals(1) || item.ThisLayerSelect.Equals(3)) && user.ThisLayerSelect.Equals(0)) resultItem.thisLayerSelect = 0;
else if (item.ThisLayerSelect.Equals(0) && user.ThisLayerSelect.Equals(1)) resultItem.thisLayerSelect = 2;
else if (item.ThisLayerSelect.Equals(0) && user.ThisLayerSelect.Equals(3)) resultItem.thisLayerSelect = 3;
if (item.SubLayerAdd.Equals(0) && user.SubLayerAdd.Equals(0)) resultItem.subLayerAdd = -1;
else if ((item.SubLayerAdd.Equals(1) || item.SubLayerAdd.Equals(3)) && user.SubLayerAdd.Equals(1)) resultItem.subLayerAdd = 1;
else if ((item.SubLayerAdd.Equals(1) || item.SubLayerAdd.Equals(3)) && user.SubLayerAdd.Equals(0)) resultItem.subLayerAdd = 0;
else if (item.SubLayerAdd.Equals(0) && user.SubLayerAdd.Equals(1)) resultItem.subLayerAdd = 2;
else if (item.SubLayerAdd.Equals(0) && user.SubLayerAdd.Equals(3)) resultItem.subLayerAdd = 3;
if (item.SubLayerEdit.Equals(0) && user.SubLayerEdit.Equals(0)) resultItem.subLayerEdit = -1;
else if ((item.SubLayerEdit.Equals(1) || item.SubLayerEdit.Equals(3)) && user.SubLayerEdit.Equals(1)) resultItem.subLayerEdit = 1;
else if ((item.SubLayerEdit.Equals(1) || item.SubLayerEdit.Equals(3)) && user.SubLayerEdit.Equals(0)) resultItem.subLayerEdit = 0;
else if (item.SubLayerEdit.Equals(0) && user.SubLayerEdit.Equals(1)) resultItem.subLayerEdit = 2;
else if (item.SubLayerEdit.Equals(0) && user.SubLayerEdit.Equals(3)) resultItem.subLayerEdit = 3;
if (item.SubLayerDelete.Equals(0) && user.SubLayerDelete.Equals(0)) resultItem.subLayerDelete = -1;
else if ((item.SubLayerDelete.Equals(1) || item.SubLayerDelete.Equals(3)) && user.SubLayerDelete.Equals(1)) resultItem.subLayerDelete = 1;
else if ((item.SubLayerDelete.Equals(1) || item.SubLayerDelete.Equals(3)) && user.SubLayerDelete.Equals(0)) resultItem.subLayerDelete = 0;
else if (item.SubLayerDelete.Equals(0) && user.SubLayerDelete.Equals(1)) resultItem.subLayerDelete = 2;
else if (item.SubLayerDelete.Equals(0) && user.SubLayerDelete.Equals(3)) resultItem.subLayerDelete = 3;
if (item.SubLayerSelect.Equals(0) && user.SubLayerSelect.Equals(0)) resultItem.subLayerSelect = -1;
else if ((item.SubLayerSelect.Equals(1) || item.SubLayerSelect.Equals(3)) && user.SubLayerSelect.Equals(1)) resultItem.subLayerSelect = 1;
else if ((item.SubLayerSelect.Equals(1) || item.SubLayerSelect.Equals(3)) && user.SubLayerSelect.Equals(0)) resultItem.subLayerSelect = 0;
else if (item.SubLayerSelect.Equals(0) && user.SubLayerSelect.Equals(1)) resultItem.subLayerSelect = 2;
else if (item.SubLayerSelect.Equals(0) && user.SubLayerSelect.Equals(3)) resultItem.subLayerSelect = 3;
}
else
{
resultItem.thisLayerAdd = item.ThisLayerAdd.Equals(1) || item.ThisLayerAdd.Equals(3) ? resultItem.thisLayerAdd = 0 : resultItem.thisLayerAdd = -1;
resultItem.thisLayerEdit = item.ThisLayerEdit.Equals(1) || item.ThisLayerEdit.Equals(3) ? resultItem.thisLayerEdit = 0 : resultItem.thisLayerEdit = -1;
resultItem.thisLayerDelete = item.ThisLayerDelete.Equals(1) || item.ThisLayerDelete.Equals(3) ? resultItem.thisLayerDelete = 0 : resultItem.thisLayerDelete = -1;
resultItem.thisLayerSelect = item.ThisLayerSelect.Equals(1) || item.ThisLayerSelect.Equals(3) ? resultItem.thisLayerSelect = 0 : resultItem.thisLayerSelect = -1;
resultItem.subLayerAdd = item.SubLayerAdd.Equals(1) || item.SubLayerAdd.Equals(3) ? resultItem.subLayerAdd = 0 : resultItem.subLayerAdd = -1;
resultItem.subLayerEdit = item.SubLayerEdit.Equals(1) || item.SubLayerEdit.Equals(3) ? resultItem.subLayerEdit = 0 : resultItem.subLayerEdit = -1;
resultItem.subLayerDelete = item.SubLayerDelete.Equals(1) || item.SubLayerDelete.Equals(3) ? resultItem.subLayerDelete = 0 : resultItem.subLayerDelete = -1;
resultItem.subLayerSelect = item.SubLayerSelect.Equals(1) || item.SubLayerSelect.Equals(3) ? resultItem.subLayerSelect = 0 : resultItem.subLayerSelect = -1;
}
result.Add(resultItem);
});
userList.ForEach(userItem =>
{
var adminItem = adminList.Find(x => x.OrganizeId.Equals(userItem.OrganizeId));
if (adminItem == null)
{
var orgItem = orgTreeNameList.Find(x => x.Id.Equals(userItem.OrganizeId));
var resultItem = new OrganizeAdministratorSelectorOutput();
resultItem.id = orgItem.Id;
resultItem.organizeId = orgItem.Id;
resultItem.fullName = orgItem.Description;
resultItem.parentId = orgItem.ParentId;
resultItem.category = orgItem.Category;
resultItem.icon = orgItem.Category.Equals("company") ? "icon-ym icon-ym-tree-organization3" : "icon-ym icon-ym-tree-department1";
resultItem.organizeIdTree = orgItem.OrganizeIdTree;
if (userItem.ThisLayerAdd.Equals(0)) resultItem.thisLayerAdd = -1;
else if (userItem.ThisLayerAdd.Equals(1)) resultItem.thisLayerAdd = 2;
else if (userItem.ThisLayerAdd.Equals(3) || userItem.ThisLayerAdd.Equals(1)) resultItem.thisLayerAdd = 3;
if (userItem.ThisLayerEdit.Equals(0)) resultItem.thisLayerEdit = -1;
else if (userItem.ThisLayerEdit.Equals(1)) resultItem.thisLayerEdit = 2;
else if (userItem.ThisLayerEdit.Equals(3) || userItem.ThisLayerEdit.Equals(1)) resultItem.thisLayerEdit = 3;
if (userItem.ThisLayerDelete.Equals(0)) resultItem.thisLayerDelete = -1;
else if (userItem.ThisLayerDelete.Equals(1)) resultItem.thisLayerDelete = 2;
else if (userItem.ThisLayerDelete.Equals(3) || userItem.ThisLayerDelete.Equals(1)) resultItem.thisLayerDelete = 3;
if (userItem.ThisLayerSelect.Equals(0)) resultItem.thisLayerSelect = -1;
else if (userItem.ThisLayerSelect.Equals(1)) resultItem.thisLayerSelect = 2;
else if (userItem.ThisLayerSelect.Equals(3) || userItem.ThisLayerSelect.Equals(1)) resultItem.thisLayerSelect = 3;
if (userItem.SubLayerAdd.Equals(0)) resultItem.subLayerAdd = -1;
else if (userItem.SubLayerAdd.Equals(1)) resultItem.subLayerAdd = 2;
else if (userItem.SubLayerAdd.Equals(3) || userItem.SubLayerAdd.Equals(1)) resultItem.subLayerAdd = 3;
if (userItem.SubLayerEdit.Equals(0)) resultItem.subLayerEdit = -1;
else if (userItem.SubLayerEdit.Equals(1)) resultItem.subLayerEdit = 2;
else if (userItem.SubLayerEdit.Equals(3) || userItem.SubLayerEdit.Equals(1)) resultItem.subLayerEdit = 3;
if (userItem.SubLayerDelete.Equals(0)) resultItem.subLayerDelete = -1;
else if (userItem.SubLayerDelete.Equals(1)) resultItem.subLayerDelete = 2;
else if (userItem.SubLayerDelete.Equals(3) || userItem.SubLayerDelete.Equals(1)) resultItem.subLayerDelete = 3;
if (userItem.SubLayerSelect.Equals(0)) resultItem.subLayerSelect = -1;
else if (userItem.SubLayerSelect.Equals(1)) resultItem.subLayerSelect = 2;
else if (userItem.SubLayerSelect.Equals(3) || userItem.SubLayerSelect.Equals(1)) resultItem.subLayerSelect = 3;
if (!result.Any(x => x.organizeId.Equals(resultItem.organizeId))) result.Add(resultItem);
}
});
// 组织断层处理
result.Where(x => x.parentId != "-1").OrderByDescending(x => x.organizeIdTree.Length).ToList().ForEach(item =>
{
if (!result.Any(x => x.id.Equals(item.parentId)))
{
var pItem = result.Find(x => x.id != item.id && item.organizeIdTree.Contains(x.organizeIdTree));
if (pItem != null)
{
item.parentId = pItem.id;
item.fullName = item.fullName.Replace(pItem.fullName + "/", string.Empty);
}
else
{
item.parentId = "-1";
}
}
else
{
var pItem = result.Find(x => x.id.Equals(item.parentId));
item.fullName = item.fullName.Replace(pItem.fullName + "/", string.Empty);
}
});
var res = result.ToTree("-1");
res.ToObject>>().ForEach(item =>
{
if (item.ContainsValue(-1))
foreach (var key in item.Where(x => x.Value.Equals(-1))) item.Remove(key.Key);
});
return new { list = res };
}
#endregion
#region POST
///
/// 更新机构分级管理.
///
///
[HttpPut("{id}")]
[UnitOfWork]
public async Task Update([FromBody] OrganizeAdminIsTratorUpInput input)
{
if (!_userManager.DataScope.Any(it => it.organizeId == input.organizeId && it.Edit) && !_userManager.IsAdministrator)
throw Oops.Oh(ErrorCode.D1013);
List? oldUserIds = await _repository.AsQueryable().Where(it => it.OrganizeId == input.organizeId && it.DeleteMark == null).Select(it => it.UserId).ToListAsync();
// 计算旧用户数组与新用户数组差
List? addList = input.userId.Split(',').Except(oldUserIds).ToList();
List? editList = input.userId.Split(',').Intersect(oldUserIds).ToList();
List? delList = oldUserIds.Except(input.userId.Split(',')).ToList();
// 创建新数据
if (addList.Count > 0)
{
List? addEntityList = new List();
addList.ForEach(it =>
{
OrganizeAdministratorEntity entity = input.Adapt();
entity.UserId = it;
addEntityList.Add(entity);
});
await _repository.AsSugarClient().Insertable(addEntityList).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
}
// 修改旧数据
if (editList.Count > 0)
{
List? editEntityList = await _repository.AsQueryable().Where(it => it.OrganizeId == input.organizeId && editList.Contains(SqlFunc.ToString(it.UserId))).ToListAsync();
editEntityList.ForEach(it =>
{
it.ThisLayerAdd = Convert.ToInt32(input.thisLayerAdd);
it.ThisLayerEdit = Convert.ToInt32(input.thisLayerEdit);
it.ThisLayerDelete = Convert.ToInt32(input.thisLayerDelete);
it.SubLayerAdd = Convert.ToInt32(input.subLayerAdd);
it.SubLayerEdit = Convert.ToInt32(input.subLayerEdit);
it.SubLayerDelete = Convert.ToInt32(input.subLayerDelete);
it.LastModifyTime = DateTime.Now;
it.LastModifyUserId = _userManager.UserId;
});
await _repository.AsSugarClient().Updateable(editEntityList).UpdateColumns(it => new
{
it.ThisLayerAdd,
it.ThisLayerEdit,
it.ThisLayerDelete,
it.SubLayerAdd,
it.SubLayerEdit,
it.SubLayerDelete,
it.LastModifyTime,
it.LastModifyUserId
}).ExecuteCommandAsync();
}
// 删除旧数据
if (delList.Count > 0)
{
await _repository.AsSugarClient().Updateable().SetColumns(it => new OrganizeAdministratorEntity()
{
EnabledMark = 0,
DeleteMark = 1,
DeleteTime = SqlFunc.GetDate(),
DeleteUserId = _userManager.UserId
}).Where(it => delList.Contains(SqlFunc.ToString(it.UserId)) && it.OrganizeId == input.organizeId).ExecuteCommandAsync();
}
}
///
/// 更新机构分级管理.
///
///
[HttpPost("")]
[UnitOfWork]
public async Task Save([FromBody] OrganizeAdminIsTratorUpInput input)
{
if (input.userId.Equals(_userManager.UserId)) throw Oops.Oh(ErrorCode.D2304);
// 处理组织树 名称
List orgTreeNameList = GetOrgListTreeName();
// 获取当前有权限的组织
var currList = await _repository.AsSugarClient().Queryable().Where(x => orgTreeNameList.Select(xx => xx.Id).Contains(x.OrganizeId)).ToListAsync();
// 用户旧权限
var oldList = currList.Where(x => x.ThisLayerAdd.Equals(1) || x.ThisLayerEdit.Equals(1) || x.ThisLayerDelete.Equals(1) || x.ThisLayerSelect.Equals(1) ||
x.SubLayerAdd.Equals(1) || x.SubLayerEdit.Equals(1) || x.SubLayerDelete.Equals(1) || x.SubLayerSelect.Equals(1)).Where(x => x.UserId.Equals(input.userId)).ToList().Copy();
oldList.Where(x => x.SubLayerAdd.Equals(1) || x.SubLayerEdit.Equals(1) || x.SubLayerDelete.Equals(1) || x.SubLayerSelect.Equals(1)).ToList().ForEach(item =>
{
var orgIds = orgTreeNameList.Where(x => x.OrganizeIdTree.Contains(item.OrganizeId) && !x.Id.Equals(item.OrganizeId)).Select(x => x.Id).ToList();
var subList = currList.Where(x => orgIds.Contains(x.OrganizeId) && x.UserId.Equals(_userManager.UserId)).ToList().Copy();
subList.ForEach(it =>
{
var userIt = oldList.Find(x => x.OrganizeId.Equals(it.OrganizeId));
if (userIt == null)
{
it.ThisLayerAdd = item.SubLayerAdd.Equals(1) ? 3 : 0;
it.ThisLayerEdit = item.SubLayerEdit.Equals(1) ? 3 : 0;
it.ThisLayerDelete = item.SubLayerDelete.Equals(1) ? 3 : 0;
it.ThisLayerSelect = item.SubLayerSelect.Equals(1) ? 3 : 0;
it.SubLayerAdd = item.SubLayerAdd.Equals(1) ? 3 : 0;
it.SubLayerEdit = item.SubLayerEdit.Equals(1) ? 3 : 0;
it.SubLayerDelete = item.SubLayerDelete.Equals(1) ? 3 : 0;
it.SubLayerSelect = item.SubLayerSelect.Equals(1) ? 3 : 0;
}
else
{
it.ThisLayerAdd = userIt.ThisLayerAdd.Equals(1) ? 1 : item.SubLayerAdd.Equals(1) ? 3 : 0;
it.ThisLayerEdit = userIt.ThisLayerEdit.Equals(1) ? 1 : item.SubLayerEdit.Equals(1) ? 3 : 0;
it.ThisLayerDelete = userIt.ThisLayerDelete.Equals(1) ? 1 : item.SubLayerDelete.Equals(1) ? 3 : 0;
it.ThisLayerSelect = userIt.ThisLayerSelect.Equals(1) ? 1 : item.SubLayerSelect.Equals(1) ? 3 : 0;
it.SubLayerAdd = userIt.SubLayerAdd.Equals(1) ? 1 : item.SubLayerAdd.Equals(1) ? 3 : 0;
it.SubLayerEdit = userIt.SubLayerEdit.Equals(1) ? 1 : item.SubLayerEdit.Equals(1) ? 3 : 0;
it.SubLayerDelete = userIt.SubLayerDelete.Equals(1) ? 1 : item.SubLayerDelete.Equals(1) ? 3 : 0;
it.SubLayerSelect = userIt.SubLayerSelect.Equals(1) ? 1 : item.SubLayerSelect.Equals(1) ? 3 : 0;
oldList.Remove(userIt);
}
});
oldList.AddRange(subList);
});
// 管理员权限
var adminList = currList.Where(x => x.ThisLayerAdd.Equals(1) || x.ThisLayerEdit.Equals(1) || x.ThisLayerDelete.Equals(1) || x.ThisLayerSelect.Equals(1) ||
x.SubLayerAdd.Equals(1) || x.SubLayerEdit.Equals(1) || x.SubLayerDelete.Equals(1) || x.SubLayerSelect.Equals(1)).Where(x => x.UserId.Equals(_userManager.UserId)).ToList().Copy();
adminList.Where(x => x.SubLayerAdd.Equals(1) || x.SubLayerEdit.Equals(1) || x.SubLayerDelete.Equals(1) || x.SubLayerSelect.Equals(1)).ToList().ForEach(item =>
{
var orgIds = orgTreeNameList.Where(x => x.OrganizeIdTree.Contains(item.OrganizeId) && !x.Id.Equals(item.OrganizeId)).Select(x => x.Id).ToList();
var subList = currList.Where(x => orgIds.Contains(x.OrganizeId) && x.UserId.Equals(_userManager.UserId)).ToList().Copy();
subList.ForEach(it =>
{
var adminIt = adminList.Find(x => x.OrganizeId.Equals(it.OrganizeId));
if (adminIt == null)
{
it.ThisLayerAdd = item.SubLayerAdd.Equals(1) ? 3 : 0;
it.ThisLayerEdit = item.SubLayerEdit.Equals(1) ? 3 : 0;
it.ThisLayerDelete = item.SubLayerDelete.Equals(1) ? 3 : 0;
it.ThisLayerSelect = item.SubLayerSelect.Equals(1) ? 3 : 0;
it.SubLayerAdd = item.SubLayerAdd.Equals(1) ? 3 : 0;
it.SubLayerEdit = item.SubLayerEdit.Equals(1) ? 3 : 0;
it.SubLayerDelete = item.SubLayerDelete.Equals(1) ? 3 : 0;
it.SubLayerSelect = item.SubLayerSelect.Equals(1) ? 3 : 0;
}
else
{
it.ThisLayerAdd = adminIt.ThisLayerAdd.Equals(1) ? 1 : item.SubLayerAdd.Equals(1) ? 3 : 0;
it.ThisLayerEdit = adminIt.ThisLayerEdit.Equals(1) ? 1 : item.SubLayerEdit.Equals(1) ? 3 : 0;
it.ThisLayerDelete = adminIt.ThisLayerDelete.Equals(1) ? 1 : item.SubLayerDelete.Equals(1) ? 3 : 0;
it.ThisLayerSelect = adminIt.ThisLayerSelect.Equals(1) ? 1 : item.SubLayerSelect.Equals(1) ? 3 : 0;
it.SubLayerAdd = adminIt.SubLayerAdd.Equals(1) ? 1 : item.SubLayerAdd.Equals(1) ? 3 : 0;
it.SubLayerEdit = adminIt.SubLayerEdit.Equals(1) ? 1 : item.SubLayerEdit.Equals(1) ? 3 : 0;
it.SubLayerDelete = adminIt.SubLayerDelete.Equals(1) ? 1 : item.SubLayerDelete.Equals(1) ? 3 : 0;
it.SubLayerSelect = adminIt.SubLayerSelect.Equals(1) ? 1 : item.SubLayerSelect.Equals(1) ? 3 : 0;
oldList.Remove(adminIt);
}
});
adminList.AddRange(subList);
});
var itemList = GetOrganizeAdministrators(input.orgAdminModel, input.userId, oldList, adminList);
try
{
await _repository.AsSugarClient().Deleteable().Where(x => SqlFunc.ToString(x.UserId).Equals(input.userId)).ExecuteCommandAsync();
if (itemList.Any()) await _repository.AsSugarClient().Insertable(itemList).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
}
catch
{
if (input.id.IsNotEmptyOrNull()) throw Oops.Oh(ErrorCode.D2300);
else throw Oops.Oh(ErrorCode.D2301);
}
}
///
/// 删除.
///
/// 主键.
///
[HttpDelete("{id}")]
public async Task Delete(string id)
{
var entityList = await _repository.GetListAsync(r => r.UserId == id && r.DeleteMark == null);
_ = entityList ?? throw Oops.Oh(ErrorCode.D2302);
await _repository.AsSugarClient().Deleteable(entityList).ExecuteCommandAsync();
}
#endregion
#region PublicMethod
///
/// 获取用户数据范围.
///
///
///
[NonAction]
public async Task> GetUserDataScopeModel(string userId)
{
List data = new List();
List subData = new List();
List inteList = new List();
List? list = await _repository.AsQueryable().Where(it => SqlFunc.ToString(it.UserId) == userId && it.DeleteMark == null).ToListAsync();
// 填充数据
foreach (OrganizeAdministratorEntity? item in list)
{
if (item.SubLayerAdd.ParseToBool() || item.SubLayerEdit.ParseToBool() || item.SubLayerDelete.ParseToBool())
{
List? subsidiary = await _organizeService.GetSubsidiary(item.OrganizeId);
subsidiary.Remove(item.OrganizeId);
subsidiary.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*/
List? intersection = data.Select(it => it.organizeId).Intersect(subData.Select(it => it.organizeId)).ToList();
intersection.ForEach(it =>
{
UserDataScopeModel? parent = data.Find(item => item.organizeId == it);
UserDataScopeModel? child = subData.Find(item => item.organizeId == it);
bool add = false;
bool edit = false;
bool 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();
}
#endregion
#region PrivateMethod
///
/// 处理组织树 名称.
///
///
private List GetOrgListTreeName()
{
List? orgTreeNameList = new List();
List? orgList = _repository.AsSugarClient().Queryable().Where(x => x.DeleteMark == null && x.EnabledMark == 1).ToList();
orgList.ForEach(item =>
{
if (item.OrganizeIdTree.IsNullOrEmpty()) item.OrganizeIdTree = item.Id;
OrganizeEntity? newItem = item.Adapt();
newItem.Id = item.Id;
var orgNameList = new List();
item.OrganizeIdTree.Split(",").ToList().ForEach(it =>
{
var org = orgList.Find(x => x.Id == it);
if (org != null) orgNameList.Add(org.FullName);
});
newItem.Description = string.Join("/", orgNameList);
orgTreeNameList.Add(newItem);
});
return orgTreeNameList;
}
///
/// 递归处理 获取所有组织权限,根据前端参数 orgAdminList.
///
///
///
///
///
///
private List GetOrganizeAdministrators(List orgAdminList, string userId, List oldList, List adminList)
{
if (!_userManager.IsAdministrator)
{
var addItems = new List();
orgAdminList.ForEach(item =>
{
var oldItem = oldList.Find(x => x.OrganizeId.Equals(item.organizeId));
var adminItem = adminList.Find(x => x.OrganizeId.Equals(item.organizeId));
if (oldItem != null)
{
if (adminItem != null)
{
item.thisLayerAdd = adminItem.ThisLayerAdd.Equals(1) ? item.thisLayerAdd : oldItem.ThisLayerAdd;
item.thisLayerDelete = adminItem.ThisLayerDelete.Equals(1) ? item.thisLayerDelete : oldItem.ThisLayerDelete;
item.thisLayerEdit = adminItem.ThisLayerEdit.Equals(1) ? item.thisLayerEdit : oldItem.ThisLayerEdit;
item.thisLayerSelect = adminItem.ThisLayerSelect.Equals(1) ? item.thisLayerSelect : oldItem.ThisLayerSelect;
item.subLayerAdd = adminItem.SubLayerAdd.Equals(1) ? item.subLayerAdd : oldItem.SubLayerAdd;
item.subLayerDelete = adminItem.SubLayerDelete.Equals(1) ? item.subLayerDelete : oldItem.SubLayerDelete;
item.subLayerEdit = adminItem.SubLayerEdit.Equals(1) ? item.subLayerEdit : oldItem.SubLayerEdit;
item.subLayerSelect = adminItem.SubLayerSelect.Equals(1) ? item.subLayerSelect : oldItem.SubLayerSelect;
}
else
{
item.thisLayerAdd = oldItem.ThisLayerAdd.Equals(1) || oldItem.ThisLayerAdd.Equals(2) ? 1 : item.thisLayerAdd;
item.thisLayerDelete = oldItem.ThisLayerDelete.Equals(1) || oldItem.ThisLayerDelete.Equals(2) ? 1 : item.thisLayerDelete;
item.thisLayerEdit = oldItem.ThisLayerEdit.Equals(1) || oldItem.ThisLayerEdit.Equals(2) ? 1 : item.thisLayerEdit;
item.thisLayerSelect = oldItem.ThisLayerSelect.Equals(1) || oldItem.ThisLayerSelect.Equals(2) ? 1 : item.thisLayerSelect;
item.subLayerAdd = oldItem.SubLayerAdd.Equals(1) || oldItem.SubLayerAdd.Equals(2) ? 1 : item.subLayerAdd;
item.subLayerDelete = oldItem.SubLayerDelete.Equals(1) || oldItem.SubLayerDelete.Equals(2) ? 1 : item.subLayerDelete;
item.subLayerEdit = oldItem.SubLayerEdit.Equals(1) || oldItem.SubLayerEdit.Equals(2) ? 1 : item.subLayerEdit;
item.subLayerSelect = oldItem.SubLayerSelect.Equals(1) || oldItem.SubLayerSelect.Equals(2) ? 1 : item.subLayerSelect;
}
}
});
oldList.ForEach(item =>
{
if (!orgAdminList.Any(x => x.organizeId.Equals(item.OrganizeId)) && !adminList.Any(x => x.OrganizeId.Equals(item.OrganizeId)))
{
addItems.Add(new OrganizeAdminCrInput()
{
userId = item.UserId,
organizeId = item.OrganizeId,
thisLayerAdd = item.ThisLayerAdd,
thisLayerDelete = item.ThisLayerDelete,
thisLayerEdit = item.ThisLayerEdit,
thisLayerSelect = item.ThisLayerSelect,
subLayerAdd = item.SubLayerAdd,
subLayerDelete = item.SubLayerDelete,
subLayerEdit = item.SubLayerEdit,
subLayerSelect = item.SubLayerSelect,
});
}
});
orgAdminList.AddRange(addItems);
}
var resList = new List();
orgAdminList.ForEach(item =>
{
resList.Add(new OrganizeAdministratorEntity()
{
UserId = userId,
OrganizeId = item.organizeId,
ThisLayerAdd = item.thisLayerAdd.Equals(1) || item.thisLayerAdd.Equals(2) ? 1 : 0,
ThisLayerDelete = item.thisLayerDelete.Equals(1) || item.thisLayerDelete.Equals(2) ? 1 : 0,
ThisLayerEdit = item.thisLayerEdit.Equals(1) || item.thisLayerEdit.Equals(2) ? 1 : 0,
ThisLayerSelect = item.thisLayerSelect.Equals(1) || item.thisLayerSelect.Equals(2) ? 1 : 0,
SubLayerAdd = item.subLayerAdd.Equals(1) || item.subLayerAdd.Equals(2) ? 1 : 0,
SubLayerDelete = item.subLayerDelete.Equals(1) || item.subLayerDelete.Equals(2) ? 1 : 0,
SubLayerEdit = item.subLayerEdit.Equals(1) || item.subLayerEdit.Equals(2) ? 1 : 0,
SubLayerSelect = item.subLayerSelect.Equals(1) || item.subLayerSelect.Equals(2) ? 1 : 0
});
if (item.children != null && item.children.Any())
{
var children = GetOrganizeAdministrators(item.children.ToObject>(), userId, oldList, adminList);
resList.AddRange(children);
}
});
return resList;
}
#endregion
}