|
|
|
|
|
|
|
|
|
|
|
|
|
|
//----------SysDept开始----------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Linq.Expressions;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Admin.Core.IRepository;
|
|
|
|
|
using Admin.Core.Model;
|
|
|
|
|
using Admin.Core.Common;
|
|
|
|
|
using SqlSugar;
|
|
|
|
|
using AutoMapper;
|
|
|
|
|
using Admin.Core.IRepository.ISys;
|
|
|
|
|
using Admin.Core.IService.ISys;
|
|
|
|
|
using Admin.Core.Model.Sys;
|
|
|
|
|
|
|
|
|
|
namespace Admin.Core.Service.Sys
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 部门表Service
|
|
|
|
|
/// </summary>
|
|
|
|
|
public partial class SysDeptService : BaseServices<SysDept>, ISysDeptService
|
|
|
|
|
{
|
|
|
|
|
IBaseRepository<SysDept> dal;
|
|
|
|
|
ISysDeptRepository _sysDeptRepository;
|
|
|
|
|
ISysRoleDeptRepository _sysRoleDeptRepository;
|
|
|
|
|
ISysUserRoleRepository _sysUserRoleRepository;
|
|
|
|
|
IMapper _mapper;
|
|
|
|
|
public SysDeptService(IBaseRepository<SysDept> dal, ISysDeptRepository sysDeptRepository, ISysRoleDeptRepository sysRoleDeptRepository,
|
|
|
|
|
ISysUserRoleRepository sysUserRoleRepository, IMapper mapper)
|
|
|
|
|
{
|
|
|
|
|
this.dal = dal;
|
|
|
|
|
BaseDal = dal;
|
|
|
|
|
_sysDeptRepository = sysDeptRepository;
|
|
|
|
|
_sysRoleDeptRepository = sysRoleDeptRepository;
|
|
|
|
|
_sysUserRoleRepository = sysUserRoleRepository;
|
|
|
|
|
_mapper = mapper;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 查询部门管理数据
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="pageQuery"> 部门信息 </param>
|
|
|
|
|
/// <returns> 部门信息集合 </returns>
|
|
|
|
|
public async Task<PageModel<DeptView>> SelectDeptList(PageQuery<SysDept> pageQuery)
|
|
|
|
|
{
|
|
|
|
|
Expression<Func<SysDept, bool>> whereExpression = x => (bool)x.DelFlag == false;
|
|
|
|
|
if (pageQuery.Query.DeptName.IsNotEmptyOrNull())
|
|
|
|
|
{
|
|
|
|
|
whereExpression = whereExpression.And(x => x.DeptName.Contains(pageQuery.Query.DeptName));
|
|
|
|
|
}
|
|
|
|
|
if (pageQuery.Query.Status.IsNotEmptyOrNull())
|
|
|
|
|
{
|
|
|
|
|
whereExpression = whereExpression.And(x => x.Status == pageQuery.Query.Status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var data = await dal.QueryPageAsync(whereExpression, pageQuery.Page, pageQuery.PageSize, "OrderNum asc");
|
|
|
|
|
|
|
|
|
|
var model = _mapper.Map<PageModel<DeptView>>(data);
|
|
|
|
|
|
|
|
|
|
return model;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 构建前端所需要树结构
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="depts"> 部门列表 </param>
|
|
|
|
|
/// <returns> 树结构列表 </returns>
|
|
|
|
|
public List<DeptView> BuildDeptTree(List<DeptView> depts)
|
|
|
|
|
{
|
|
|
|
|
List<DeptView> returnList = new List<DeptView>();
|
|
|
|
|
var tempList = depts.Select(x => x.DeptID);
|
|
|
|
|
|
|
|
|
|
for (IEnumerator<DeptView> iterator = depts.GetEnumerator(); iterator.MoveNext();)
|
|
|
|
|
{
|
|
|
|
|
DeptView dept = iterator.Current;
|
|
|
|
|
// 如果是顶级节点, 遍历该父节点的所有子节点
|
|
|
|
|
if (!tempList.Contains((int)dept.ParentID))
|
|
|
|
|
{
|
|
|
|
|
RecursionFn(depts, dept);
|
|
|
|
|
returnList.Add(dept);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (returnList.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
returnList = depts;
|
|
|
|
|
}
|
|
|
|
|
return returnList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 构建前端所需要下拉树结构
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="depts"> 部门列表 </param>
|
|
|
|
|
/// <returns> 下拉树结构列表 </returns>
|
|
|
|
|
public List<TreeSelect> BuildDeptTreeSelect(List<SysDept> depts)
|
|
|
|
|
{
|
|
|
|
|
var depView = _mapper.Map<List<DeptView>>(depts);
|
|
|
|
|
var deptTrees = BuildDeptTree(depView);
|
|
|
|
|
return _mapper.Map<List<TreeSelect>>(deptTrees);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 根据角色ID查询部门树信息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="roleId"> 角色ID </param>
|
|
|
|
|
/// <returns> 选中部门列表 </returns>
|
|
|
|
|
public async Task<List<int>> SelectDeptListByRoleId(int roleId)
|
|
|
|
|
{
|
|
|
|
|
var depts = await _sysRoleDeptRepository.QueryAsync(x => x.RoleID == roleId);
|
|
|
|
|
return depts.Select(x => (int)x.DeptID).ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 根据部门ID查询信息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="deptId"> 部门ID </param>
|
|
|
|
|
/// <returns> 部门信息 </returns>
|
|
|
|
|
public async Task<SysDept> SelectDeptById(int deptId)
|
|
|
|
|
{
|
|
|
|
|
return await dal.QueryByIdAsync(deptId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 查询部门全部有效数据
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns> 部门信息 </returns>
|
|
|
|
|
public async Task<List<SysDept>> SelectDeptAll()
|
|
|
|
|
{
|
|
|
|
|
return await dal.QueryAsync(x => x.DelFlag == false && x.Status == SysConst.ENABLE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 根据ID查询所有子部门(正常状态)
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="deptId"> 部门ID </param>
|
|
|
|
|
/// <returns> 子部门数 </returns>
|
|
|
|
|
public async Task<int> SelectNormalChildrenDeptById(int deptId)
|
|
|
|
|
{
|
|
|
|
|
var children = await _sysDeptRepository.SelectChildrenDeptById(deptId);
|
|
|
|
|
var data = children.FindAll(x => x.DelFlag == false && x.Status == SysConst.ENABLE);
|
|
|
|
|
return data.Count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 根据ID查询所有子部门(正常状态)
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="deptId"> 部门ID </param>
|
|
|
|
|
/// <returns> 子部ID及当前选中节点部门ID的List </returns>
|
|
|
|
|
public async Task<List<int>> SelectNormalChildrenIDsById(int deptId)
|
|
|
|
|
{
|
|
|
|
|
return await _sysDeptRepository.SelectNormalChildrenIDsById(deptId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 是否存在子节点
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="deptId"> 部门ID </param>
|
|
|
|
|
/// <returns> 结果 </returns>
|
|
|
|
|
public async Task<bool> HasChildByDeptId(int deptId)
|
|
|
|
|
{
|
|
|
|
|
var result = await dal.QueryAsync(x => x.ParentID == deptId && x.DelFlag == false);
|
|
|
|
|
return result.Count > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 查询部门是否存在用户
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="deptId"> 部门ID </param>
|
|
|
|
|
/// <returns> 结果 true 存在 false 不存在 </returns>
|
|
|
|
|
public async Task<bool> CheckDeptExistUser(int deptId)
|
|
|
|
|
{
|
|
|
|
|
var roles = await _sysRoleDeptRepository.QueryAsync(x => x.DeptID == deptId);
|
|
|
|
|
var roleIds = roles.Select(x => x.RoleID);
|
|
|
|
|
var result = await _sysUserRoleRepository.QueryAsync(x => roleIds.Contains(x.RoleID));
|
|
|
|
|
return result.Count > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 校验部门名称是否唯一
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dept"> 部门信息 </param>
|
|
|
|
|
/// <returns> 结果 </returns>
|
|
|
|
|
public async Task<bool> CheckDeptNameUnique(SysDept dept)
|
|
|
|
|
{
|
|
|
|
|
var data = await dal.QueryAsync(x => x.DeptName == dept.DeptName && x.DeptID != dept.DeptID);
|
|
|
|
|
return data.Count == 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 新增保存部门信息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dept"> 部门信息 </param>
|
|
|
|
|
/// <returns> 结果 </returns>
|
|
|
|
|
public async Task<int> InsertDept(SysDept dept)
|
|
|
|
|
{
|
|
|
|
|
var info = await dal.QueryByIdAsync(dept.ParentID);
|
|
|
|
|
// 如果父节点不为正常状态,则不允许新增子节点
|
|
|
|
|
if (info.Status == SysConst.DISABLE)
|
|
|
|
|
{
|
|
|
|
|
return SysConst.FLAGINT;
|
|
|
|
|
}
|
|
|
|
|
dept.Ancestors = info.Ancestors + "," + dept.ParentID;
|
|
|
|
|
dept.CreateTime = DateTime.Now;
|
|
|
|
|
dept.UpdateTime = DateTime.Now;
|
|
|
|
|
dept.DelFlag = false;
|
|
|
|
|
return await dal.AddAsync(dept);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 修改保存部门信息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dept"> 部门信息 </param>
|
|
|
|
|
/// <returns> 结果 </returns>
|
|
|
|
|
public async Task<bool> UpdateDept(SysDept dept)
|
|
|
|
|
{
|
|
|
|
|
var newParentDept = await dal.QueryByIdAsync(dept.ParentID);
|
|
|
|
|
var oldDept = await dal.QueryByIdAsync(dept.DeptID);
|
|
|
|
|
if (newParentDept.IsNotEmptyOrNull() && oldDept.IsNotEmptyOrNull())
|
|
|
|
|
{
|
|
|
|
|
string newAncestors = newParentDept.Ancestors + "," + newParentDept.DeptID;
|
|
|
|
|
string oldAncestors = oldDept.Ancestors;
|
|
|
|
|
dept.Ancestors = newAncestors;
|
|
|
|
|
await UpdateDeptChildren(dept.DeptID, newAncestors, oldAncestors);
|
|
|
|
|
}
|
|
|
|
|
dept.UpdateTime = DateTime.Now;
|
|
|
|
|
var result = await dal.UpdateAsync(dept);
|
|
|
|
|
if (dept.Status == SysConst.ENABLE && dept.Ancestors.IsNotEmptyOrNull() && dept.Ancestors != "0")
|
|
|
|
|
{
|
|
|
|
|
// 如果该部门是启用状态,则启用该部门的所有上级部门
|
|
|
|
|
await UpdateParentDeptStatusNormal(dept, SysConst.ENABLE);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 修改该部门的父级部门状态
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dept"> 当前部门 </param>
|
|
|
|
|
/// <param name="status"> 修改状态 </param>
|
|
|
|
|
public async Task UpdateParentDeptStatusNormal(SysDept dept, int status)
|
|
|
|
|
{
|
|
|
|
|
var deptIds = dept.Ancestors.Split(",");
|
|
|
|
|
var depts = await dal.QueryByIDsAsync(deptIds);
|
|
|
|
|
depts.ForEach(x => x.Status = status);
|
|
|
|
|
await dal.UpdateAsync(depts);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 修改子元素关系
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="deptId"> 被修改的部门ID </param>
|
|
|
|
|
/// <param name="newAncestors"> 新的父ID集合 </param>
|
|
|
|
|
/// <param name="oldAncestors"> 旧的父ID集合 </param>
|
|
|
|
|
public async Task UpdateDeptChildren(int deptId, string newAncestors, string oldAncestors)
|
|
|
|
|
{
|
|
|
|
|
var children = await _sysDeptRepository.SelectChildrenDeptById(deptId);
|
|
|
|
|
foreach (var child in children)
|
|
|
|
|
{
|
|
|
|
|
child.Ancestors = child.Ancestors.Replace(oldAncestors, newAncestors);
|
|
|
|
|
}
|
|
|
|
|
if (children.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
await dal.UpdateAsync(children);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 删除部门管理信息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="deptId"> 部门ID </param>
|
|
|
|
|
/// <returns> 结果 </returns>
|
|
|
|
|
public async Task<bool> DeleteDeptById(int deptId, string updateBy)
|
|
|
|
|
{
|
|
|
|
|
var dept = await dal.QueryByIdAsync(deptId);
|
|
|
|
|
dept.UpdateBy = updateBy;
|
|
|
|
|
dept.UpdateTime = DateTime.Now;
|
|
|
|
|
dept.DelFlag = true;
|
|
|
|
|
return await dal.UpdateAsync(dept);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 递归列表
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void RecursionFn(List<DeptView> list, DeptView t)
|
|
|
|
|
{
|
|
|
|
|
// 得到子节点列表
|
|
|
|
|
List<DeptView> childList = GetChildList(list, t);
|
|
|
|
|
t.Children = childList;
|
|
|
|
|
foreach (var tChild in childList)
|
|
|
|
|
{
|
|
|
|
|
if (HasChild(list, tChild))
|
|
|
|
|
{
|
|
|
|
|
RecursionFn(list, tChild);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 得到子节点列表
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="list"></param>
|
|
|
|
|
/// <param name="t"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public List<DeptView> GetChildList(List<DeptView> list, DeptView t)
|
|
|
|
|
{
|
|
|
|
|
List<DeptView> tlist = new List<DeptView>();
|
|
|
|
|
IEnumerator<DeptView> it = list.GetEnumerator();
|
|
|
|
|
while (it.MoveNext())
|
|
|
|
|
{
|
|
|
|
|
var n = it.Current;
|
|
|
|
|
if (n.ParentID.IsNotEmptyOrNull() && n.ParentID == t.DeptID)
|
|
|
|
|
{
|
|
|
|
|
tlist.Add(n);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return tlist;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 判断是否有子节点
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="list"></param>
|
|
|
|
|
/// <param name="t"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public bool HasChild(List<DeptView> list, DeptView t)
|
|
|
|
|
{
|
|
|
|
|
return GetChildList(list, t).Count > 0 ? true : false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//----------SysDept结束----------
|
|
|
|
|
|