using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using AutoMapper;
using GxPress.Common.Exceptions;
using GxPress.Common.Page;
using GxPress.Entity;
using GxPress.Repository.Interface;
using GxPress.Request.App.User;
using GxPress.Request.User;
using GxPress.Result.User;
using GxPress.Service.Interface;
using GxPress.Service.Interface.IM;
using Microsoft.AspNetCore.Hosting;
using OfficeOpenXml;
using Datory;
using GxPress.Common.Tools;
using GxPress.Result.App.User;
using GxPress.Repository.Interface.WorkFlow;
using GxPress.EnumConst;
using GxPress.Request.App.Flow;
using GxPress.Repository.Interface.WaitHandle;
namespace GxPress.Service.Implement
{
public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
private readonly IDepartmentRepository _departmentRepository;
private readonly IAddressBookGroupRepository _addressBookGroupRepository;
private IWebHostEnvironment _webHostEnvironment;
private readonly IBlacklistUserRepository _blacklistUserRepository;
private readonly IRoleRepository _roleRepository;
private readonly IIMService _imService;
private readonly IMapper _mapper;
private readonly IFlowRepository _flowRepository;
private readonly IFlowTodoRepository _flowTodoRepository;
private readonly IWaitHandleRepository waitHandleRepository;
public UserService(IUserRepository userRepository, IDepartmentRepository departmentRepository,
IAddressBookGroupRepository addressBookGroupRepository, IBlacklistUserRepository blacklistUserRepository,
IMapper mapper, IWebHostEnvironment webHostEnvironment, IRoleRepository roleRepository, IIMService imService, IFlowRepository flowRepository, IFlowTodoRepository flowTodoRepository, IWaitHandleRepository waitHandleRepository)
{
_userRepository = userRepository;
_departmentRepository = departmentRepository;
_addressBookGroupRepository = addressBookGroupRepository;
_blacklistUserRepository = blacklistUserRepository;
_mapper = mapper;
_webHostEnvironment = webHostEnvironment;
_roleRepository = roleRepository;
_imService = imService;
_flowRepository = flowRepository;
_flowTodoRepository = flowTodoRepository;
this.waitHandleRepository = waitHandleRepository;
}
///
/// 根据部门ID获取自建ID获取用户列表
///
///
///
public async Task> FindUser(FindUserRequest request)
{
var userInfoResults = new List();
if (request.TypeId == 1)
{
//获取部门
List departments = new List();
foreach (var item in request.ItemId)
{
if (item > 0)
{
var users = await _userRepository.GetUserByDepartmentIdAsync(item);
userInfoResults.AddRange(users.Select(user => _mapper.Map(user)).ToList());
}
departments = await _departmentRepository.GetDepartmentByPid(item, departments);
}
foreach (var department in departments)
{
//获取部门下面的员工
var users = await _userRepository.GetUserByDepartmentIdAsync(department.Id);
userInfoResults.AddRange(users.Select(user => _mapper.Map(user)).ToList());
}
}
//查询自建用户
if (request.TypeId == 2)
{
var users = new List();
foreach (var item in request.ItemId)
{
if (item > 0)
{
users.AddRange(await _addressBookGroupRepository.GetUserByAddressBookGroupIdAsync(item));
}
users = await _addressBookGroupRepository.GetUserByAddressBookGroupPidAsync(users, item,
request.UserId);
}
userInfoResults.AddRange(users.Select(user => _mapper.Map(user)).ToList());
}
foreach (var item in userInfoResults)
{
if (item == null)
continue;
item.AvatarUrl = StringUtils.AddDomainMin(item.AvatarUrl);
}
return userInfoResults.Distinct();
}
///
/// 根据ID查询用户数据
///
///
///
///
public async Task GetUserByIdAsync(int userId, int blackUserId)
{
var user = await _userRepository.GetAsync(blackUserId);
if (user == null)
{
throw new BusinessException("用户id有误");
}
var userDetail = _mapper.Map(user);
if (user.DepartmentId > 0)
{
var department = await _departmentRepository.GetAsync(user.DepartmentId);
userDetail.DepartmentName = department.Name;
}
userDetail.AvatarUrl = StringUtils.AddDomainMin(userDetail.AvatarUrl);
userDetail.IsBlack = await _blacklistUserRepository.FindUserIsBlack(userId, blackUserId);
return userDetail;
}
///
/// 生成excel
///
///
public async Task ExcelUserAsync(List userIds)
{
string sWebRootFolder = _webHostEnvironment.WebRootPath;
string sFileName = $"{Guid.NewGuid()}.xlsx";
FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
using (ExcelPackage package = new ExcelPackage(file))
{
// 添加worksheet
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("员工信息"); //添加头
worksheet.Cells[1, 1].Value = "姓名";
worksheet.Cells[1, 2].Value = "手机号码";
worksheet.Cells[1, 3].Value = "邮箱"; //添加值
worksheet.Cells[1, 4].Value = "性别"; //添加值
worksheet.Cells[1, 5].Value = "部门"; //添加值
worksheet.Cells[1, 6].Value = "角色"; //添加值
//获取用户
var users = await _userRepository.FindAllUserAsync(Q.WhereIn(nameof(User.Id), userIds));
var enumerable = users as User[] ?? users.ToArray();
for (int i = 0; i < enumerable.Count(); i++)
{
var index = i + 2;
worksheet.Cells["A" + index].Value = enumerable[i].Name;
worksheet.Cells["B" + index].Value = enumerable[i].Phone;
worksheet.Cells["C" + index].Value = enumerable[i].Email;
worksheet.Cells["D" + index].Value = enumerable[i].Gender == "Male" ? "男" : "女";
//获取部门
var department = await _departmentRepository.GetAsync(enumerable[i].DepartmentId);
worksheet.Cells["E" + index].Value = department == null ? "" : department.Name;
//获取角色
var role = await _roleRepository.GetAsync(enumerable[i].RoleId);
worksheet.Cells["F" + index].Value = role == null ? "" : role.Name;
}
package.Save();
}
return Path.Combine(sWebRootFolder, sFileName);
}
///
/// 用户分页列表
///
///
///
public async Task> GetPagedListAsync(UserPageSearchRequest request)
{
var pagedList = new PagedList
{
Total = await GetCountAsync(request.DepartmentId, request.RoleId, request.Keyword)
};
var list = await GetPageListAsync(request.Page, request.PerPage, request.DepartmentId, request.RoleId,
request.Keyword);
var items = list.Select(user => _mapper.Map(user)).ToList();
foreach (var item in items)
{
var departmentName = string.Empty;
//获取部门
departmentName =
await _departmentRepository.GetDepartmentFullPathAsync(item.DepartmentId, departmentName);
item.DepartmentName = departmentName;
var role = await _roleRepository.GetAsync(item.RoleId);
if (role != null)
item.RoleName = role.Name;
}
pagedList.Items = items;
return pagedList;
}
public async Task GetCountAsync(int departmentId, int roleId, string keyword)
{
var query = Q.NewQuery();
if (departmentId > 0)
{
query.Where(nameof(User.DepartmentId), departmentId);
}
if (roleId > 0)
{
query.Where(nameof(User.RoleId), roleId);
}
if (!string.IsNullOrEmpty(keyword))
{
keyword = "%" + keyword + "%";
query.Where(q =>
q.WhereLike(nameof(User.Name), keyword)
.OrWhereLike(nameof(User.Email), keyword)
.OrWhereLike(nameof(User.Phone), keyword)
);
}
return await _userRepository.CountAsync(query);
}
///
/// Set the limit and offset for a given page.
///
///
///
///
///
///
///
public async Task> GetPageListAsync(int page, int perPage, int departmentId, int roleId,
string keyword)
{
var query = Q.ForPage(page, perPage);
if (departmentId > 0)
{
query.Where(nameof(User.DepartmentId), departmentId);
}
if (roleId > 0)
{
query.Where(nameof(User.RoleId), roleId);
}
if (!string.IsNullOrEmpty(keyword))
{
keyword = "%" + keyword + "%";
query.Where(q =>
q.WhereLike(nameof(User.Name), keyword)
.OrWhereLike(nameof(User.Email), keyword)
.OrWhereLike(nameof(User.Phone), keyword)
);
}
return await _userRepository.GetAllAsync(query);
}
///
/// 删除用户
///
///
///
public async Task DeleteUsersAsync(IEnumerable userIds)
{
var enumerable = userIds as int[] ?? userIds.ToArray();
foreach (var userId in enumerable)
{
var user = await _userRepository.GetAsync(userId);
if (user != null)
{
await _imService.DeleteUserAsync(user.ImId);
}
}
return await _userRepository.DeleteUsersAsync(enumerable);
}
///
/// 获取用户未读数据
///
///
///
public async Task GetUserCountAsync(int userId)
{
var result = await _userRepository.GetUserCountAsync(userId);
//工作我的审批未操作数量
var request = new FlowListRequest();
result.FlowAuditUReadCount = await _flowTodoRepository.GetCountAsync(userId, nameof(TodoTypeConst.ApproverCheck), false,
request);
// 工作我发起的已批复未读数量
var flowState = new List { FlowState.Checked.GetValue(), FlowState.Denied.GetValue() };
result.FlowSendUReadCount = await _flowRepository.CountAsync(Q.Where(nameof(Entity.WorkFlow.Flow.UserId), userId).WhereIn(nameof(Entity.WorkFlow.Flow.State), flowState).Where(nameof(Entity.WorkFlow.Flow.IsRead), false).Where(nameof(Entity.WorkFlow.Flow.ProcessId), ">", 0));
// 工作抄送我的未读数量
result.FlowCcUReadCount = await _flowTodoRepository.FlowCcUReadCountAsync(userId);
//待办事项未执行数量
result.WaitHandleUFinishCount = await waitHandleRepository.GetUFinishAsync(userId);
return result;
}
}
}