You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

340 lines
12 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//----------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结束----------