using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using AutoMapper; using GxPress.Common.AppOptions; using GxPress.Common.Exceptions; using GxPress.Common.Tools; using GxPress.Entity; using GxPress.Repository.Interface; using GxPress.Request.Department; using GxPress.Result.Department; using Microsoft.Extensions.Options; using Datory; using System.Transactions; namespace GxPress.Repository.Implement { public class DepartmentRepository : IDepartmentRepository { private readonly IMapper _mapper; private readonly Repository _repository; private readonly Repository _userRepository; public DepartmentRepository(IOptionsMonitor dbOptionsAccessor, IMapper mapper) { var databaseType = StringUtils.ToEnum(dbOptionsAccessor.CurrentValue.DatabaseType, DatabaseType.MySql); var database = new Database(databaseType, dbOptionsAccessor.CurrentValue.ConnectionString); _repository = new Repository(database); _userRepository = new Repository(database); _mapper = mapper; } public IDatabase Database => _repository.Database; public string TableName => _repository.TableName; public List TableColumns => _repository.TableColumns; /// /// 是否存在下级部门 /// /// /// public async Task ExistsChildrenAsync(int parentId) { return await _repository.ExistsAsync(Q.Where(nameof(Department.ParentId), parentId)); } public async Task GetAsync(int id) { var department = await _repository.GetAsync(id); return department; } /// /// 根据部门名称查询对应的数据 /// /// /// public async Task GetAsync(string name) { return await _repository.GetAsync(Q.Where(nameof(Department.Name), name)); } public async Task GetNameAsync(int id) { if (id <= 0) return string.Empty; return await _repository.GetAsync(Q .Select(nameof(Department.Name)) .Where(nameof(Department.Id), id) ); } public async Task InsertAsync(Department department) { if (department.Sort > 0) { var exists = await _repository.ExistsAsync(Q .Where(nameof(Department.Sort), department.Sort) ); if (exists) { throw new Exception("部门顺序已存在,请更换"); } } var departmentId = await _repository.InsertAsync(department); if (departmentId > 0 && department.Sort == 0) { department = await _repository.GetAsync(departmentId); department.Sort = departmentId; await _repository.UpdateAsync(department); } return departmentId; } public async Task UpdateAsync(Department department) { if (department.Sort > 0) { var exists = await _repository.ExistsAsync(Q .WhereNot(nameof(Department.Id), department.Id) .Where(nameof(Department.Sort), department.Sort) ); if (exists) { throw new Exception("部门顺序已存在,请更换"); } } return await _repository.UpdateAsync(department); } public async Task> GetListAsync(int parentId) { return await _repository.GetAllAsync(Q.Where(nameof(Department.ParentId), parentId) .OrderBy(nameof(Department.Sort))); } /// /// 排除 /// /// /// public async Task> GetListAsync(DepartmentUserRequest request) { return await _repository.GetAllAsync(Q.Where(nameof(Department.ParentId), request.DepartmentId) .WhereNot(nameof(Department.Id), request.SourceDepartmentId).OrderBy(nameof(Department.Sort))); } /// /// 添加 /// /// /// public async Task AddAsync(Department request) { if (request.ParentId > 0) { var parent = await _repository.GetAsync(request.ParentId); if (parent == null) throw new BusinessException("上级部门不存在"); } if (request.LeaderId > 0) { var leader = await _repository.GetAsync(request.LeaderId); if (leader == null) throw new BusinessException("该主管不存在"); } var department = _mapper.Map(request); department.Id = await InsertAsync(department); return department; } /// /// 删除 /// /// /// public async Task DeleteAsync(int id) { var dep = await _repository.GetAsync(id); if (dep == null) throw new BusinessException("该部门不存在"); if (await ExistsChildrenAsync(id)) throw new BusinessException("请先删除下级部门"); //TODO 是否解散部门群 return await _repository.DeleteAsync(id); } /// /// 删除 /// /// /// public async Task DeleteAsync(SqlKata.Query query) { return await _repository.DeleteAsync(query) > 0; } /// /// 更新 /// /// /// /// public async Task UpdateAsync(int id, Department request) { var dep = await GetAsync(id); if (dep == null) throw new BusinessException("该部门不存在"); dep.LeaderId = request.LeaderId; dep.Name = request.Name; dep.Sort = request.Sort; if (request.ParentId > 0) dep.ParentId = request.ParentId; return await UpdateAsync(dep); } /// /// 获取树列表 /// /// /// public async Task> GetTreeAsync(int id) { var departments = await GetListAsync(id); var list = _mapper.Map>(departments); foreach (var item in list) { item.HasChildren = await ExistsChildrenAsync(item.Id); } return list; } /// /// 获取树列表 /// /// /// public async Task> GetTreeAsync() { var departments = await GetAllAsync(Q.Where(nameof(Department.Id), ">", 0).OrderBy(nameof(Department.Sort))); var departmentParent = departments.Where(n => n.ParentId == 0); var list = _mapper.Map>(departmentParent); foreach (var item in list) { item.HasChildren = departments.Any(n => n.ParentId == item.Id); if (item.HasChildren) { var departmentChildren = departments.Where(n => n.ParentId == item.Id); var departmentChildrenTree = departmentChildren.Select(n => _mapper.Map(n)); item.ChildrenItems = GetTreeAsync(departments.ToList(), item.Id, departmentChildrenTree.ToList()); } } return list; } /// /// 部门移动 /// /// /// public async Task SetSortAsync(DepartmentSortRequest request) { try { using (var tran = new TransactionScope()) { var startDto = await _repository.GetAsync(request.StartId); var startSort = startDto.Sort; var removeDto = await _repository.GetAsync(request.RemoveId); var removeSort = removeDto.Sort; //修改 startDto.Sort = removeSort; await _repository.UpdateAsync(startDto); removeDto.Sort = startSort; await _repository.UpdateAsync(removeDto); tran.Complete(); } } catch { return false; } return true; } public List GetTreeAsync(List departments, int id, List items) { foreach (var item in items) { item.HasChildren = departments.Any(n => n.ParentId == item.Id); if (item.HasChildren) { var departmentParent = departments.Where(n => n.ParentId == item.Id); item.ChildrenItems = _mapper.Map>(departmentParent); foreach (var childrenItem in item.ChildrenItems) { GetTreeAsync(departments, childrenItem.Id, item.ChildrenItems); } } } return items; } /// /// 根据部门ID获取成员以及下级部门 /// /// /// public async Task GetDepartmentUserResultAsync(DepartmentUserRequest request) { var result = new DepartmentUserResult(); var departments = await GetListAsync(request); result.Departments = departments; var users = await _userRepository.GetAllAsync(Q.Where(nameof(User.DepartmentId), request.DepartmentId)); result.Users = users.ToList(); for (int i = 0; i < result.Users.Count(); i++) { if (!request.IsShow) if (request.UserIds.Contains(result.Users[i].Id)) result.Users.Remove(result.Users[i]); if (request.IsShow) if (request.UserIds.Contains(result.Users[i].Id)) result.Users[i].IsDisable = true; } foreach (var user in result.Users) user.AvatarUrl = StringUtils.AddDomainMin(user.AvatarUrl); return result; } /// /// 获取所用下级部门 /// /// /// /// public async Task> GetDepartmentById(int id, List departments) { var department = await _repository.GetAsync(id); if (department != null) { departments.Add(department); var list = await _repository.GetAllAsync(Q.Where(nameof(Entity.Department.ParentId), department.Id).OrderBy(nameof(Department.Sort))); foreach (var item in list) { departments.Add(item); await GetDepartmentById(item.Id, departments); } } return departments; } /// /// 获取所用下级部门 /// /// /// /// public async Task> GetDepartmentByPid(int Pid, List departments) { var departmentList = await _repository.GetAllAsync(Q.Where(nameof(Entity.Department.ParentId), Pid).OrderBy(nameof(Department.Sort))); if (departmentList.Count == 0) return departments; foreach (var item in departmentList) { departments.Add(item); await GetDepartmentByPid(item.Id, departments); } return departments; } /// /// 根据部门ID获取全名称 /// /// /// /// public async Task GetDepartmentFullPathAsync(int departmentId, string departmentName) { var department = await _repository.GetAsync(departmentId); if (department == null) { return departmentName; } if (string.IsNullOrEmpty(departmentName)) departmentName = department.Name; else departmentName = department.Name + "/" + departmentName; return await GetDepartmentFullPathAsync(department.ParentId, departmentName); } public async Task> GetAllAsync(SqlKata.Query query) { return await _repository.GetAllAsync(query); } } }