881 lines
36 KiB
C#
881 lines
36 KiB
C#
using AutoMapper;
|
|
using AutoMapper.QueryableExtensions;
|
|
using IRaCIS.Application.ExpressionExtend;
|
|
using IRaCIS.Application.Interfaces;
|
|
using IRaCIS.Application.ViewModels;
|
|
using IRaCIS.Core.Application.Contracts.RequestAndResponse;
|
|
using IRaCIS.Core.Domain.Interfaces;
|
|
using IRaCIS.Core.Domain.Models;
|
|
using IRaCIS.Core.Domain.Share;
|
|
using IRaCIS.Core.Infrastructure;
|
|
using IRaCIS.Infra.Data.ExpressionExtend;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Linq.Expressions;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading.Tasks;
|
|
using IRaCIS.Core.Domain.Share.AuthUser;
|
|
|
|
namespace IRaCIS.Application.Services
|
|
{
|
|
|
|
public class UserService : IUserService
|
|
{
|
|
private readonly IUserRepository _userRepository;
|
|
private readonly IUserRoleRepository _userRoleRepository;
|
|
private readonly IRoleMenuFunctionRepository _roleMenuRepository;
|
|
private readonly IRoleRepository _roleRepository;
|
|
private readonly IMenuFunctionRepository _menuRepository;
|
|
private readonly IDictionaryRepository _dictionaryRepository;
|
|
private readonly IMailVerificationService _mailVerificationService;
|
|
private readonly IVerificationCodeRepository _verificationCodeRepository;
|
|
private readonly IDoctorRepository _doctorRepository;
|
|
private readonly IUserInfo _userInfo;
|
|
private readonly IMapper _mapper;
|
|
|
|
public UserService(IUserRepository userRepository,
|
|
IUserRoleRepository userRoleRepository,
|
|
IRoleMenuFunctionRepository roleMenuRepository,
|
|
IRoleRepository roleRepository,
|
|
IMenuFunctionRepository menuRepository,
|
|
IDictionaryRepository dictionaryRepository,
|
|
IMailVerificationService mailVerificationService,
|
|
IVerificationCodeRepository verificationCodeRepository,
|
|
IDoctorRepository doctorRepository,
|
|
IUserInfo userInfo,
|
|
IMapper mapper)
|
|
{
|
|
_userRepository = userRepository;
|
|
_userRoleRepository = userRoleRepository;
|
|
_roleMenuRepository = roleMenuRepository;
|
|
_roleRepository = roleRepository;
|
|
_menuRepository = menuRepository;
|
|
_dictionaryRepository = dictionaryRepository;
|
|
_mailVerificationService = mailVerificationService;
|
|
_verificationCodeRepository = verificationCodeRepository;
|
|
_doctorRepository = doctorRepository;
|
|
_userInfo = userInfo;
|
|
_mapper = mapper;
|
|
}
|
|
|
|
public async Task<IResponseOutput> SendVerificationCode(string emailOrPhone, int verificationType, bool isReviewer = false)
|
|
{
|
|
if (string.IsNullOrEmpty(emailOrPhone))
|
|
{
|
|
return ResponseOutput.NotOk(verificationType == 0 ? "Please input email" : "Please input Phone");
|
|
|
|
}
|
|
//防止输入前后有空格
|
|
var emailOrPhoneStr = emailOrPhone.Trim();
|
|
|
|
//检查手机或者邮箱是否有效
|
|
if (!Regex.IsMatch(emailOrPhoneStr, @"/^1[34578]\d{9}$/") && !Regex.IsMatch(emailOrPhoneStr, @"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$"))
|
|
{
|
|
|
|
return ResponseOutput.NotOk(verificationType == 0
|
|
? "Please input a legal email"
|
|
: "Please input a legal phone");
|
|
|
|
}
|
|
|
|
//医生登录
|
|
if (isReviewer)
|
|
{
|
|
var exist = _doctorRepository.GetAll().Any(t => t.EMail == emailOrPhoneStr || t.Phone == emailOrPhoneStr);
|
|
|
|
if (!exist)
|
|
{
|
|
return ResponseOutput.NotOk(verificationType == 0
|
|
? "No user has this email"
|
|
: "No user has this phone");
|
|
|
|
}
|
|
|
|
var user = _doctorRepository.GetAll().First(t => t.EMail == emailOrPhoneStr || t.Phone == emailOrPhoneStr);
|
|
//邮箱
|
|
if (verificationType == 0)
|
|
{
|
|
//验证码 6位
|
|
int verificationCode = new Random().Next(100000, 1000000);
|
|
|
|
await _mailVerificationService.SendMail(user.Id, user.ChineseName, emailOrPhoneStr,
|
|
verificationCode);
|
|
}
|
|
//手机短信
|
|
else
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
else//管理用户登录
|
|
{
|
|
//查找改邮箱或者手机的用户
|
|
var exist = _userRepository.GetAll().Any(t => t.EMail == emailOrPhoneStr || t.Phone == emailOrPhoneStr);
|
|
|
|
if (!exist)
|
|
{
|
|
return ResponseOutput.NotOk(verificationType == 0
|
|
? "No user has this email"
|
|
: "No user has this phone");
|
|
|
|
}
|
|
var user = _userRepository.GetAll().First(t => t.EMail == emailOrPhoneStr || t.Phone == emailOrPhoneStr);
|
|
//邮箱
|
|
if (verificationType == 0)
|
|
{
|
|
//验证码 6位
|
|
int verificationCode = new Random().Next(100000, 1000000);
|
|
|
|
await _mailVerificationService.SendMail(user.Id, user.RealName, emailOrPhoneStr,
|
|
verificationCode);
|
|
}
|
|
//手机短信
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
return ResponseOutput.Ok();
|
|
}
|
|
|
|
public IResponseOutput SetNewPassword(string emailOrPhone, int verificationType,
|
|
string verificationCode, string newPwd, bool isReviewer)
|
|
{
|
|
if (isReviewer)
|
|
{
|
|
var emailOrPhoneStr = emailOrPhone.Trim();
|
|
var verificationCodeStr = verificationCode.Trim();
|
|
var user = _doctorRepository.GetAll().First(t => t.EMail == emailOrPhoneStr || t.Phone == emailOrPhoneStr);
|
|
|
|
var verificationRecord = _verificationCodeRepository
|
|
.GetAll().FirstOrDefault(t => t.UserId == user.Id && t.Code == verificationCodeStr && t.CodeType == verificationType);
|
|
|
|
//检查数据库是否存在该验证码
|
|
if (verificationRecord == null)
|
|
{
|
|
|
|
return ResponseOutput.NotOk("Verification code error");
|
|
|
|
}
|
|
else
|
|
{
|
|
//检查验证码是否失效
|
|
if (verificationRecord.ExpirationTime < DateTime.Now)
|
|
{
|
|
return ResponseOutput.NotOk("Verification code time has expired");
|
|
|
|
}
|
|
else //验证码正确 并且 没有超时
|
|
{
|
|
//更新密码
|
|
var success = _doctorRepository.Update(t => t.Id == user.Id, u => new Doctor()
|
|
{
|
|
Password = newPwd
|
|
});
|
|
|
|
//删除验证码历史记录
|
|
_verificationCodeRepository.Delete(t => t.UserId == user.Id && t.CodeType == verificationType);
|
|
|
|
return ResponseOutput.Result(success, "database update failed");
|
|
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var emailOrPhoneStr = emailOrPhone.Trim();
|
|
var verificationCodeStr = verificationCode.Trim();
|
|
|
|
var user = _userRepository.GetAll().First(t => t.EMail == emailOrPhoneStr || t.Phone == emailOrPhoneStr);
|
|
|
|
|
|
var verificationRecord = _verificationCodeRepository
|
|
.GetAll().FirstOrDefault(t => t.UserId == user.Id && t.Code == verificationCodeStr && t.CodeType == verificationType);
|
|
|
|
//检查数据库是否存在该验证码
|
|
if (verificationRecord == null)
|
|
{
|
|
|
|
return ResponseOutput.NotOk("Verification code error");
|
|
|
|
}
|
|
else
|
|
{
|
|
//检查验证码是否失效
|
|
if (verificationRecord.ExpirationTime < DateTime.Now)
|
|
{
|
|
return ResponseOutput.NotOk("Verification code time has expired");
|
|
|
|
}
|
|
else //验证码正确 并且 没有超时
|
|
{
|
|
//更新密码
|
|
//var pwd = MD5Helper.Md5(newPwd);
|
|
//var count = _doctorRepository.Update<Doctor>().Where(t => t.Id == doctor.Id).Set(d => d.Password == pwd).ExecuteAffrows();
|
|
|
|
var success = _userRepository.Update(t => t.Id == user.Id, u => new User()
|
|
{
|
|
Password = newPwd
|
|
});
|
|
|
|
//删除验证码历史记录
|
|
_verificationCodeRepository.Delete(t => t.UserId == user.Id && t.CodeType == verificationType);
|
|
|
|
return ResponseOutput.Result(success, "database update failed");
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public IResponseOutput<LoginReturnDTO> Login(string userName, string password)
|
|
{
|
|
var name = userName.Trim();
|
|
var passwordMd5 = password.Trim();
|
|
|
|
var user = _userRepository.GetAll().FirstOrDefault(u => u.UserName == name && u.Password == passwordMd5);
|
|
|
|
if (user != null)
|
|
{
|
|
if (user.Status == 0)
|
|
{
|
|
return ResponseOutput.NotOk("用户已被禁用!", new LoginReturnDTO());
|
|
}
|
|
|
|
var userLoginReturnModel = new LoginReturnDTO();
|
|
userLoginReturnModel.BasicInfo = new UserBasicInfo()
|
|
{
|
|
Id = user.Id,
|
|
UserName = user.UserName,
|
|
RealName = user.RealName,
|
|
Sex = user.Sex
|
|
};
|
|
|
|
if (user.SuperAdmin)
|
|
{
|
|
userLoginReturnModel.BasicInfo.IsAdmin = true;
|
|
userLoginReturnModel.MenuTree = GetAdminMenuTree().FirstOrDefault()?.Childrens;
|
|
userLoginReturnModel.FuncDictionary = DealFunction(GetAdminFunctionTree().FirstOrDefault()?.Childrens);
|
|
}
|
|
else
|
|
{
|
|
var menuTree = GetUserMenuTreeNew(userLoginReturnModel.BasicInfo.Id)
|
|
.FirstOrDefault()?.Childrens;
|
|
userLoginReturnModel.MenuTree = menuTree ?? new List<MenuFuncTreeNodeView>();
|
|
userLoginReturnModel.FuncDictionary = DealFunction(GetUserFuncTreeNew(userLoginReturnModel.BasicInfo.Id)?.First().Childrens);
|
|
}
|
|
return ResponseOutput.Ok(userLoginReturnModel);
|
|
}
|
|
|
|
|
|
//此处下面 代码 为了支持医生也能登录 而且前端不加选择到底是管理用户 还是医生用户
|
|
|
|
var doctor = _doctorRepository.GetAll().FirstOrDefault(u => u.Phone == name && u.Password == passwordMd5);
|
|
|
|
if (doctor != null)
|
|
{
|
|
var userLoginReturnModel = new LoginReturnDTO();
|
|
userLoginReturnModel.BasicInfo = new UserBasicInfo()
|
|
{
|
|
Id = doctor.Id,
|
|
UserName = doctor.LastName + " / " + doctor.FirstName,
|
|
RealName = doctor.ChineseName,
|
|
Sex = doctor.Sex,
|
|
IsReviewer = true,
|
|
ReviewerCode = doctor.Code
|
|
};
|
|
|
|
var menuTree = GetUserMenuTreeNew(userLoginReturnModel.BasicInfo.Id, true)
|
|
.FirstOrDefault()?.Childrens;
|
|
|
|
userLoginReturnModel.MenuTree = menuTree ?? new List<MenuFuncTreeNodeView>();
|
|
userLoginReturnModel.FuncDictionary = DealFunction(GetUserFuncTreeNew(userLoginReturnModel.BasicInfo.Id, true)?.FirstOrDefault()?.Childrens);
|
|
return ResponseOutput.Ok(userLoginReturnModel);
|
|
}
|
|
|
|
return ResponseOutput.NotOk("Please check the user name or password.", new LoginReturnDTO());
|
|
}
|
|
|
|
|
|
public IResponseOutput<bool> VerifySignature(string userName, string password)
|
|
{
|
|
var name = userName.Trim();
|
|
var passwordMd5 = password.Trim();
|
|
|
|
var user = _userRepository.GetAll().FirstOrDefault(u => u.UserName == name && u.Password == passwordMd5);
|
|
|
|
if (user != null)
|
|
{
|
|
if (user.Status == 0)
|
|
{
|
|
return ResponseOutput.NotOk("用户已被禁用!", false);
|
|
}
|
|
|
|
return ResponseOutput.Ok(true);
|
|
}
|
|
return ResponseOutput.NotOk("Password error!", false);
|
|
}
|
|
|
|
public Dictionary<string, List<string>> DealFunction(List<FunctionTreeNodeDTO> functionTreeNodes)
|
|
{
|
|
Dictionary<string, List<string>> returnDictionary = new Dictionary<string, List<string>>();
|
|
functionTreeNodes?.ForEach(t =>
|
|
{
|
|
List<string> functionNames = new List<string>();
|
|
returnDictionary.Add(t.RouteName, Test(t.Childrens, functionNames));
|
|
});
|
|
|
|
return returnDictionary;
|
|
}
|
|
|
|
public List<string> Test(List<FunctionTreeNodeDTO> functionTreeNodes, List<string> functionNames)
|
|
{
|
|
functionTreeNodes?.ForEach(t =>
|
|
{
|
|
if (!string.IsNullOrEmpty(t.FunctionName))
|
|
{
|
|
functionNames.Add(t.FunctionName);
|
|
}
|
|
else
|
|
{
|
|
Test(t.Childrens, functionNames);
|
|
}
|
|
});
|
|
|
|
return functionNames;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 管理员获取菜单树
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public List<MenuFuncTreeNodeView> GetAdminMenuTree()
|
|
{
|
|
var allMenuList = _menuRepository.GetAll().Where(t => t.Status == 1 && t.IsFunction == false && t.SuperAdmin).Select(menu => new MenuFuncTreeNodeView()
|
|
{
|
|
Id = menu.Id,
|
|
ParentId = menu.ParentId,
|
|
component = menu.Component,
|
|
meta = new Meta
|
|
{
|
|
MetaActiveMenu = menu.MetaActiveMenu,
|
|
MetaBreadcrumb = menu.MetaBreadcrumb,
|
|
MetaIcon = menu.MetaIcon,
|
|
MetaTitle = menu.MetaTitle,
|
|
},
|
|
|
|
hidden = menu.Hidden,
|
|
redirect = menu.Redirect,
|
|
routeName = menu.RouteName,
|
|
path = menu.Path,
|
|
ShowOrder = menu.ShowOrder
|
|
|
|
}).ToList();
|
|
|
|
return GetMenuTree(Guid.Empty, allMenuList);
|
|
}
|
|
|
|
public List<MenuFuncTreeNodeView> GetUserMenuTreeNew(Guid userId, bool isReviewer = false)
|
|
{
|
|
if (!isReviewer)
|
|
{
|
|
var allMenuList = (from menuId in (from userRole in _userRoleRepository.GetAll()
|
|
.Where(t => t.UserId == userId)
|
|
join roleMenu in _roleMenuRepository.GetAll() on userRole.RoleId equals roleMenu.RoleId
|
|
select roleMenu.MenuFunctionId).Distinct()
|
|
join menu in _menuRepository.GetAll().Where(t => t.IsFunction == false) on menuId equals menu.Id
|
|
select new MenuFuncTreeNodeView()
|
|
{
|
|
Id = menu.Id,
|
|
ParentId = menu.ParentId,
|
|
component = menu.Component,
|
|
hidden = menu.Hidden,
|
|
redirect = menu.Redirect,
|
|
routeName = menu.RouteName,
|
|
path = menu.Path,
|
|
ShowOrder = menu.ShowOrder,
|
|
meta = new Meta
|
|
{
|
|
MetaActiveMenu = menu.MetaActiveMenu,
|
|
MetaBreadcrumb = menu.MetaBreadcrumb,
|
|
MetaIcon = menu.MetaIcon,
|
|
MetaTitle = menu.MetaTitle,
|
|
},
|
|
}).Distinct().ToList();
|
|
|
|
return GetMenuTree(Guid.Empty, allMenuList);
|
|
}
|
|
else
|
|
{
|
|
//内置角色Id 不允许删除
|
|
var roleId = Guid.Parse("4062ECFF-C6D4-4C22-2CAF-08D85F6F9A95");
|
|
|
|
var allMenuList = (from roleMenu in _roleMenuRepository.GetAll().Where(t => t.RoleId == roleId)
|
|
join menu in _menuRepository.GetAll().Where(t => t.IsFunction == false) on roleMenu.MenuFunctionId equals menu.Id
|
|
select new MenuFuncTreeNodeView()
|
|
{
|
|
Id = menu.Id,
|
|
ParentId = menu.ParentId,
|
|
component = menu.Component,
|
|
hidden = menu.Hidden,
|
|
redirect = menu.Redirect,
|
|
routeName = menu.RouteName,
|
|
path = menu.Path,
|
|
ShowOrder = menu.ShowOrder,
|
|
meta = new Meta
|
|
{
|
|
MetaActiveMenu = menu.MetaActiveMenu,
|
|
MetaBreadcrumb = menu.MetaBreadcrumb,
|
|
MetaIcon = menu.MetaIcon,
|
|
MetaTitle = menu.MetaTitle,
|
|
},
|
|
}).Distinct().ToList();
|
|
return GetMenuTree(Guid.Empty, allMenuList);
|
|
}
|
|
}
|
|
|
|
public List<MenuFuncTreeNodeView> GetMenuTree(Guid parentId, List<MenuFuncTreeNodeView> allMenuList)
|
|
{
|
|
//树节点集合 每个节点包含一个菜单项 和一个子菜单集合
|
|
List<MenuFuncTreeNodeView> treeList = new List<MenuFuncTreeNodeView>();
|
|
|
|
// 根据父菜单节点获取子菜单节点 并且进行排序
|
|
List<MenuFuncTreeNodeView> menuList = allMenuList.Where(x => x.ParentId == parentId).OrderBy(t => t.ShowOrder).ToList();
|
|
|
|
foreach (var menuItem in menuList)
|
|
{
|
|
MenuFuncTreeNodeView treeItem = new MenuFuncTreeNodeView()
|
|
{
|
|
Id = menuItem.Id,
|
|
|
|
component = menuItem.component,
|
|
hidden = menuItem.hidden,
|
|
routeName = menuItem.routeName,
|
|
path = menuItem.path,
|
|
ParentId = menuItem.ParentId,
|
|
ShowOrder = menuItem.ShowOrder,
|
|
redirect = menuItem.redirect,
|
|
meta = new Meta
|
|
{
|
|
MetaActiveMenu = menuItem.meta.MetaActiveMenu,
|
|
MetaBreadcrumb = menuItem.meta.MetaBreadcrumb,
|
|
MetaIcon = menuItem.meta.MetaIcon,
|
|
MetaTitle = menuItem.meta.MetaTitle,
|
|
},
|
|
|
|
Childrens = GetMenuTree(menuItem.Id, allMenuList)
|
|
};
|
|
|
|
treeList.Add(treeItem);
|
|
}
|
|
return treeList;
|
|
}
|
|
|
|
public List<FunctionTreeNodeDTO> GetFuncTree(Guid parentId, List<FunctionTreeNodeDTO> allFuncList)
|
|
{
|
|
//树节点集合 每个节点包含一个菜单项 和一个子菜单集合
|
|
List<FunctionTreeNodeDTO> treeList = new List<FunctionTreeNodeDTO>();
|
|
|
|
// 根据父菜单节点获取子菜单节点 并且进行排序
|
|
List<FunctionTreeNodeDTO> menuList = allFuncList.Where(x => x.ParentId == parentId).OrderBy(t => t.ShowOrder).ToList();
|
|
|
|
foreach (var menuItem in menuList)
|
|
{
|
|
FunctionTreeNodeDTO treeItem = new FunctionTreeNodeDTO()
|
|
{
|
|
Id = menuItem.Id,
|
|
FunctionName = menuItem.FunctionName,
|
|
RouteName = menuItem.RouteName,
|
|
ParentId = menuItem.ParentId,
|
|
ShowOrder = menuItem.ShowOrder,
|
|
|
|
Childrens = GetFuncTree(menuItem.Id, allFuncList)
|
|
};
|
|
|
|
treeList.Add(treeItem);
|
|
}
|
|
return treeList;
|
|
}
|
|
|
|
public List<FunctionTreeNodeDTO> GetAdminFunctionTree()
|
|
{
|
|
var allFuncList = _menuRepository.GetAll().Where(t => t.Status == 1).Select(menu => new FunctionTreeNodeDTO()
|
|
{
|
|
Id = menu.Id,
|
|
ParentId = menu.ParentId,
|
|
FunctionName = menu.FunctionName,
|
|
RouteName = menu.RouteName,
|
|
ShowOrder = menu.ShowOrder
|
|
|
|
}).ToList();
|
|
|
|
|
|
//var root = _menuRepository.GetAll().Where(t => t.Status == 1 && t.RouteName == "Root").Select(menu =>
|
|
// new FunctionTreeNodeView()
|
|
// {
|
|
// Id = menu.Id,
|
|
// ParentId = menu.ParentId,
|
|
// FunctionName = menu.FunctionName,
|
|
// RouteName = menu.RouteName,
|
|
// ShowOrder = menu.ShowOrder
|
|
|
|
// }).First();
|
|
//allFuncList.Add(root);
|
|
|
|
return GetFuncTree(Guid.Empty, allFuncList);
|
|
}
|
|
public List<FunctionTreeNodeDTO> GetUserFuncTreeNew(Guid userId, bool isReviewer = false)
|
|
{
|
|
if (!isReviewer)
|
|
{
|
|
var allFuncList = (from menuId in (from userRole in _userRoleRepository.GetAll()
|
|
.Where(t => t.UserId == userId)
|
|
join roleMenu in _roleMenuRepository.GetAll() on userRole.RoleId equals roleMenu.RoleId
|
|
select roleMenu.MenuFunctionId).Distinct()
|
|
join menu in _menuRepository.GetAll() on menuId equals menu.Id
|
|
select new FunctionTreeNodeDTO()
|
|
{
|
|
Id = menu.Id,
|
|
ParentId = menu.ParentId,
|
|
RouteName = menu.RouteName,
|
|
FunctionName = menu.FunctionName,
|
|
ShowOrder = menu.ShowOrder
|
|
|
|
}).Distinct().ToList();
|
|
return GetFuncTree(Guid.Empty, allFuncList);
|
|
}
|
|
else
|
|
{
|
|
//内置角色Id 不允许删除
|
|
var roleId = Guid.Parse("4062ECFF-C6D4-4C22-2CAF-08D85F6F9A95");
|
|
|
|
var allFuncList = (from menuId in _roleMenuRepository.GetAll().Where(t => t.RoleId == roleId)
|
|
.Select(t => t.MenuFunctionId)
|
|
join menu in _menuRepository.GetAll() on menuId equals menu.Id
|
|
select new FunctionTreeNodeDTO()
|
|
{
|
|
Id = menu.Id,
|
|
ParentId = menu.ParentId,
|
|
RouteName = menu.RouteName,
|
|
FunctionName = menu.FunctionName,
|
|
ShowOrder = menu.ShowOrder
|
|
|
|
}).Distinct().ToList();
|
|
|
|
return GetFuncTree(Guid.Empty, allFuncList);
|
|
}
|
|
}
|
|
|
|
public IEnumerable<UserDetailDTO> GetAllUser()
|
|
{
|
|
return _userRepository.GetAll().ProjectTo<UserDetailDTO>(_mapper.ConfigurationProvider).ToList();
|
|
}
|
|
|
|
private Expression<Func<User, bool>> GetUserSearchLambda(UserListQueryDTO userQueryModel)
|
|
{
|
|
Expression<Func<User, bool>> userLambda = x => x.SuperAdmin == false;
|
|
if (!string.IsNullOrWhiteSpace(userQueryModel.UserName))
|
|
{
|
|
userLambda = userLambda.And(t => t.UserName.Contains(userQueryModel.UserName.Trim()));
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(userQueryModel.Phone))
|
|
{
|
|
userLambda = userLambda.And(t => t.Phone.Contains(userQueryModel.Phone.Trim()));
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(userQueryModel.OrganizationName))
|
|
{
|
|
userLambda = userLambda.And(t => t.OrganizationName.Contains(userQueryModel.OrganizationName.Trim()));
|
|
}
|
|
if (Guid.Empty != userQueryModel.UserType && userQueryModel.UserType != null)
|
|
{
|
|
userLambda = userLambda.And(t => t.UserTypeId == userQueryModel.UserType);
|
|
}
|
|
|
|
if (userQueryModel.UserState != null)
|
|
{
|
|
switch (userQueryModel.UserState)
|
|
{
|
|
case 1:
|
|
userLambda = userLambda.And(t => t.Status == 1);//可用
|
|
break;
|
|
case 0:
|
|
userLambda = userLambda.And(t => t.Status == 0);//禁用
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return userLambda;
|
|
}
|
|
|
|
|
|
/// <summary> 获取用户列表 </summary>
|
|
public PageOutput<UserListDTO> GetUserList(UserListQueryDTO param)
|
|
{
|
|
|
|
var userLambda = GetUserSearchLambda(param);
|
|
IQueryable<UserListDTO> userQueryable = default;
|
|
userQueryable = from user in _userRepository.GetAll().Where(userLambda)
|
|
join dicItem in _dictionaryRepository.GetAll() on user.UserTypeId equals dicItem.Id into d
|
|
from userType in d.DefaultIfEmpty()
|
|
select new UserListDTO()
|
|
{
|
|
Id = user.Id,
|
|
Password = user.Password,
|
|
RealName = user.RealName,
|
|
Sex = user.Sex,
|
|
UserName = user.UserName,
|
|
Status = user.Status,
|
|
Phone = user.Phone,
|
|
EMail = user.EMail,
|
|
UserTypeId = userType == null ? Guid.Empty : userType.Id,
|
|
UserType = userType == null ? string.Empty : userType.Value,
|
|
OrganizationName = user.OrganizationName,
|
|
Code = user.Code,
|
|
};
|
|
var count = userQueryable.Count();
|
|
var propName = param.SortField == string.Empty ? "UserName" : param.SortField;
|
|
userQueryable = param.Asc ? userQueryable.OrderBy(propName) : userQueryable.OrderByDescending(propName);
|
|
userQueryable = userQueryable.Skip((param.PageIndex - 1) * param.PageSize).Take(param.PageSize);
|
|
var userList = userQueryable.ToList();
|
|
|
|
var userIds = userList.Select(t => t.Id).ToList();
|
|
|
|
|
|
var userRoleList = (from userRole in _userRoleRepository.GetAll().Where(t => userIds.Contains(t.UserId))
|
|
join role in _roleRepository.GetAll() on userRole.RoleId equals role.Id
|
|
select new UserIdRoleName
|
|
{
|
|
RoleName = role.RoleName,
|
|
RoleDescription = role.RoleDescription,
|
|
UserId = userRole.UserId
|
|
}).ToList().GroupBy(t => t.UserId).Select(u =>
|
|
new UserIdRoleNameList
|
|
{
|
|
UserId = u.Key,
|
|
RoleList = u.Select(t =>
|
|
new RoleDTO()
|
|
{
|
|
RoleName = t.RoleName,
|
|
RoleDescription = t.RoleDescription
|
|
})
|
|
});
|
|
|
|
|
|
|
|
userList.ForEach(t =>
|
|
{
|
|
var temp = userRoleList.FirstOrDefault(u => u.UserId == t.Id);
|
|
if (temp != null)
|
|
{
|
|
t.RoleNameList = temp.RoleList;
|
|
}
|
|
});
|
|
return new PageOutput<UserListDTO>(param.PageIndex, param.PageSize, count, userList);
|
|
}
|
|
|
|
public UserDetailDTO GetUserById(Guid id)
|
|
{
|
|
|
|
var temp = _userRepository.GetAll().ProjectTo<UserDetailDTO>(_mapper.ConfigurationProvider).FirstOrDefault(t => t.Id == id);
|
|
var dicItem = _dictionaryRepository.FindSingleOrDefault(u => u.Id == temp.UserTypeId);
|
|
temp.UserTypeName = dicItem == null ? string.Empty : dicItem.Value;
|
|
return temp;
|
|
}
|
|
|
|
|
|
public IResponseOutput<UserAddedReturnDTO> AddUser(UserCommand userAddModel, Guid userId)
|
|
{
|
|
if (_userRepository.GetAll().Any(t => t.UserName == userAddModel.UserName || t.EMail == userAddModel.EMail))
|
|
{
|
|
return ResponseOutput.NotOk("User name or email already exist.", new UserAddedReturnDTO());
|
|
}
|
|
|
|
var saveItem = _mapper.Map<User>(userAddModel);
|
|
|
|
#region 处理code
|
|
var last = _userRepository.GetAll().OrderByDescending(c => c.Code).FirstOrDefault();
|
|
if (last != null)
|
|
{
|
|
var num = 0;
|
|
if (int.TryParse(last.Code.Substring(1, 4), out num))
|
|
{
|
|
saveItem.Code = SystemConfig.UserCodePrefix + (++num).ToString().PadLeft(4, '0');
|
|
}
|
|
else
|
|
{
|
|
return ResponseOutput.NotOk("Generated Code failed.", new UserAddedReturnDTO());
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
saveItem.Code = SystemConfig.UserCodePrefix + 1.ToString().PadLeft(4, '0');
|
|
}
|
|
|
|
if (userAddModel.OrganizationName.ToUpper().Contains(StaticData.MainCompany))
|
|
{
|
|
saveItem.IsZhiZhun = true;
|
|
}
|
|
else
|
|
{
|
|
saveItem.IsZhiZhun = false;
|
|
}
|
|
|
|
#endregion
|
|
|
|
saveItem.Password = MD5Helper.Md5(StaticData.DefaultPassword);
|
|
saveItem.CreateUserId = Guid.Empty;
|
|
|
|
_userRepository.Add(saveItem);
|
|
var success = _userRepository.SaveChanges();
|
|
|
|
return ResponseOutput.Result(success, new UserAddedReturnDTO { Id = saveItem.Id, Code = saveItem.Code });
|
|
|
|
}
|
|
|
|
|
|
public IResponseOutput UpdateUser(UserCommand model, Guid userId)
|
|
{
|
|
var userType = _dictionaryRepository.FindSingleOrDefault(u => u.Id == model.UserTypeId);
|
|
if (userType == null)
|
|
{
|
|
return ResponseOutput.NotOk("selected wrong user type.");
|
|
|
|
}
|
|
// 判断当前用户名是否已经存在
|
|
if (_userRepository.GetAll().Any(t => (t.UserName == model.UserName && t.Id != model.Id) || (t.EMail == model.EMail && t.Id != model.Id)
|
|
))
|
|
{
|
|
return ResponseOutput.NotOk("User name or enmail already exist.");
|
|
|
|
}
|
|
if (model.OrganizationName.ToUpper().Contains(StaticData.MainCompany))
|
|
{
|
|
model.IsZhiZhun = true;
|
|
}
|
|
else
|
|
{
|
|
model.IsZhiZhun = false;
|
|
}
|
|
|
|
|
|
#region 方式一 直接更新需要的字段 字段多 很麻烦 容易掉
|
|
|
|
//var success = _userRepository.Update(t => t.Id == model.Id, u => new User()
|
|
//{
|
|
// Status = model.Status,
|
|
// UpdateTime = DateTime.Now,
|
|
// UpdateUserId = userId,
|
|
// RealName = model.RealName,
|
|
// UserName = model.UserName,
|
|
// Phone = model.Phone,
|
|
// EMail = model.EMail,
|
|
// Sex = model.Sex,
|
|
// UserTypeId = model.UserTypeId,
|
|
// UserType = model.UserType,
|
|
// OrganizationId = model.OrganizationId,
|
|
// OrganizationName = model.OrganizationName,
|
|
// OrganizationType = model.OrganizationType,
|
|
// OrganizationTypeId = model.OrganizationTypeId,
|
|
// DepartmentName = model.DepartmentName,
|
|
// PositionName = model.PositionName,
|
|
// IsZhiZhun = model.IsZhiZhun
|
|
//});
|
|
|
|
#endregion
|
|
|
|
var user = _userRepository.GetAll().First(t => t.Id == model.Id);
|
|
|
|
_mapper.Map(model, user);
|
|
_userRepository.Update(user);
|
|
var success = _userRepository.SaveChanges();
|
|
|
|
return ResponseOutput.Result(success);
|
|
|
|
}
|
|
|
|
public IResponseOutput UpdateUserState(Guid userId, int state)
|
|
{
|
|
var success = _userRepository.Update(u => u.Id == userId, t => new User
|
|
{
|
|
Status = state
|
|
});
|
|
return ResponseOutput.Result(success);
|
|
}
|
|
|
|
public IResponseOutput ResetPassword(Guid userId)
|
|
{
|
|
var success = _userRepository.Update(t => t.Id == userId, u => new User()
|
|
{
|
|
Password = MD5Helper.Md5(StaticData.DefaultPassword)
|
|
});
|
|
|
|
return ResponseOutput.Result(success);
|
|
}
|
|
|
|
public IResponseOutput ModifyPassword(EditPasswordCommand editPwModel)
|
|
{
|
|
if (_userRepository.GetAll().FirstOrDefault(t => t.Id == _userInfo.Id && t.Password == editPwModel.OldPassWord) != null)
|
|
{
|
|
var success = _userRepository.Update(t => t.Id == _userInfo.Id, u => new User()
|
|
{
|
|
Password = editPwModel.NewPassWord
|
|
});
|
|
|
|
return ResponseOutput.Result(success);
|
|
}
|
|
|
|
if (_doctorRepository.GetAll().Any(t => t.Id == _userInfo.Id && t.Password == editPwModel.OldPassWord))
|
|
{
|
|
var success = _doctorRepository.Update(t => t.Id == _userInfo.Id, u => new Doctor()
|
|
{
|
|
Password = editPwModel.NewPassWord
|
|
});
|
|
|
|
return ResponseOutput.Result(success);
|
|
}
|
|
|
|
return ResponseOutput.NotOk("Old password is wrong.");
|
|
|
|
}
|
|
|
|
public List<string> GetUserRolesById(Guid userId)
|
|
{
|
|
var query = from userRole in _userRoleRepository.Find(u => u.UserId == userId)
|
|
join role in _roleRepository.GetAll() on userRole.RoleId equals role.Id into t
|
|
from userRoleItem in t.DefaultIfEmpty()
|
|
select userRoleItem.RoleName;
|
|
return query.ToList();
|
|
}
|
|
|
|
public int GetUserRoleMaxPrivilegeLevel(Guid userId)
|
|
{
|
|
var user = _userRepository.FindSingleOrDefault(u => u.Id == userId);
|
|
if (user.SuperAdmin)
|
|
{
|
|
return 9999;
|
|
}
|
|
var query = from userRole in _userRoleRepository.Find(u => u.UserId == userId)
|
|
join role in _roleRepository.GetAll() on userRole.RoleId equals role.Id into t
|
|
from userRoleItem in t.DefaultIfEmpty()
|
|
select userRoleItem.PrivilegeLevel;
|
|
var list = query.ToList();
|
|
if (list.Count == 0)
|
|
{
|
|
return 0;
|
|
}
|
|
return list.Max();
|
|
}
|
|
}
|
|
}
|