package com.gkhy.assess.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.assess.common.api.CommonPage;
import com.gkhy.assess.common.constant.CacheConstant;
import com.gkhy.assess.common.domain.vo.AccountVO;
import com.gkhy.assess.common.domain.vo.LoginBody;
import com.gkhy.assess.common.enums.UserIdentityEnum;
import com.gkhy.assess.common.enums.UserTypeEnum;
import com.gkhy.assess.common.exception.ApiException;
import com.gkhy.assess.common.utils.BeanValidators;
import com.gkhy.assess.common.utils.JwtTokenUtil;
import com.gkhy.assess.common.utils.PageUtil;
import com.gkhy.assess.common.utils.RedisUtils;
import com.gkhy.assess.system.domain.*;
import com.gkhy.assess.system.mapper.SysAgencyMapper;
import com.gkhy.assess.system.mapper.SysUserMapper;
import com.gkhy.assess.system.service.SysConfigService;
import com.gkhy.assess.system.utils.ShiroUtils;
import com.gkhy.assess.system.service.SysUserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Validator;
import java.util.List;
/**
*
* 用户表 服务实现类
*
*
* @author kzy
* @since 2023-10-17 14:26:29
*/
@Service
public class SysUserServiceImpl extends ServiceImpl implements SysUserService {
@Autowired
private RedisUtils redisUtils;
@Autowired
private SysConfigService configService;
@Autowired
private Validator validator;
@Autowired
private HttpServletRequest request;
@Autowired
private SysAgencyMapper agencyMapper;
@Override
public AccountVO login(LoginBody loginBody) {
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), loginBody.getPassword(), false);
Subject subject= SecurityUtils.getSubject();
String msg ;
try {
subject.login(usernamePasswordToken);
SysUser sysUser = (SysUser) subject.getPrincipal();
AccountVO accountVO = new AccountVO();
BeanUtils.copyProperties(sysUser, accountVO);
String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword());
accountVO.setToken(token);
String key= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(token));
// 设置超时时间
redisUtils.set(key,token);
redisUtils.expire(key,JwtTokenUtil.EXPIRATION*2/1000);
return accountVO;
}catch (UnknownAccountException | IncorrectCredentialsException uae){
throw new ApiException("用户名/密码错误,请重新输入");
} catch (LockedAccountException lae) { // 账号已被锁定
msg = "账号已被锁定";
throw new ApiException(msg);
} catch (AuthenticationException ae) { // 其他身份验证异常
msg = "用户认证失败";
throw new ApiException(msg);
}
}
@Override
public void logout() {
String jwtToken = request.getHeader(JwtTokenUtil.USER_LOGIN_TOKEN);
String key= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(jwtToken));
//删除redis缓存
redisUtils.del(key);
}
@Override
public CommonPage monitorList(SysUser user) {
PageUtil.startPage();
List users=baseMapper.monitorList(user);
return CommonPage.restPage(users);
}
@Override
public CommonPage agencyList(SysUser user) {
PageUtil.startPage();
List users=baseMapper.agencyList(user);
return CommonPage.restPage(users);
}
@Override
public CommonPage expertList(SysUser user) {
PageUtil.startPage();
List users=baseMapper.expertList(user);
return CommonPage.restPage(users);
}
@Override
public SysUser getUserByUsername(String username) {
String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
SysUser sysUser =null;
if(redisUtils.hasKey(key)){
sysUser= (SysUser) redisUtils.get(key);
}else {
sysUser = baseMapper.getUserByUsername(username);
redisUtils.set(key,sysUser,10*60);
}
return sysUser;
}
@Override
public SysUser getUserByUsernamePhone(String username) {
String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
SysUser sysUser =null;
if(redisUtils.hasKey(key)){
sysUser= (SysUser) redisUtils.get(key);
}else {
sysUser = baseMapper.getUserByUsernamePhone(username);
redisUtils.set(key,sysUser,10*60);
}
return sysUser;
}
@Override
@Transactional(rollbackFor = RuntimeException.class)
public int agencyRegister(SysUser user) {
//校验用户信息
if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
throw new ApiException("用户名已存在");
}
if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
throw new ApiException("手机号已存在");
}
SysAgency agency=user.getAgency();
if(ObjectUtil.isNull(agency)){
throw new ApiException("机构信息不能为空");
}
//查询机构信息是否存在
if(ObjectUtil.isNotNull(agencyMapper.checkAgencyNameUnique(agency.getName()))){
throw new ApiException("机构名称已存在");
}
int i=agencyMapper.insert(agency);
if(i<1){
throw new ApiException("保存机构信息失败");
}
user.setAgencyId(agency.getId());
user.setUserType(UserIdentityEnum.AGENCY.getCode());
boolean b=save(user);
if(!b){
throw new ApiException("创建机构用户信息失败");
}
return 1;
}
@Override
public int addExpert(SysUser user) {
//校验用户信息
if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
throw new ApiException("用户名已存在");
}
if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
throw new ApiException("手机号已存在");
}
user.setUserType(UserIdentityEnum.EXPERT.getCode());
user.setCreateBy(ShiroUtils.getSysUser().getUsername());
boolean b=save(user);
if(!b){
throw new ApiException("创建专家信息失败");
}
return 1;
}
@Override
public SysUser getUserByPhone(String phone) {
return baseMapper.getUserByPhone(phone);
}
@Override
public SysUser getUserById(Long userId) {
return baseMapper.getUserById(userId);
}
@Override
@Transactional(rollbackFor = RuntimeException.class)
public int deleteUserById(Long userId) {
SysUser user=getUserById(userId);
//机构用户,将机构信息设置成删除状态
if(user.getUserType().equals(UserIdentityEnum.AGENCY.getCode())){
agencyMapper.deleteAgencyById(user.getAgencyId());
}
return baseMapper.deleteUserById(userId);
}
@Override
@Transactional(rollbackFor = RuntimeException.class)
public int editAgency(SysUser user) {
//校验用户信息
if(!checkUsernameUnique(user)){
throw new ApiException("用户名已存在");
}
if(!checkPhoneUnique(user)){
throw new ApiException("手机号已存在");
}
SysAgency agency=user.getAgency();
if(ObjectUtil.isNull(agency)){
throw new ApiException("机构信息不能为空");
}
//查询机构信息是否存在
if(ObjectUtil.isNotNull(agency)){
throw new ApiException("机构名称已存在");
}
agencyMapper.updateById(agency);
boolean b=updateById(user);
if(!b){
throw new ApiException("更新用户失败");
}
return 1;
}
@Override
public int editExpert(SysUser user) {
//校验用户信息
if(!checkUsernameUnique(user)){
throw new ApiException("用户名已存在");
}
if(!checkPhoneUnique(user)){
throw new ApiException("手机号已存在");
}
boolean b=updateById(user);
if(!b){
throw new ApiException("更新专家信息失败");
}
return 1;
}
@Override
public boolean resetUserPwd(SysUser user) {
return updateById(user);
}
@Override
public boolean checkUsernameUnique(SysUser user) {
Long userId = user.getId()==null? -1L : user.getId();
SysUser info = baseMapper.checkLoginNameUnique(user.getUsername());
if (info!=null && info.getId().longValue() != userId.longValue())
{
return false;
}
return true;
}
@Override
public boolean checkPhoneUnique(SysUser user) {
Long userId = user.getId()==null ? -1L : user.getId();
SysUser info = baseMapper.checkPhoneUnique(user.getPhone());
if (info!=null && info.getId().longValue() != userId.longValue())
{
return false;
}
return true;
}
@Override
public boolean checkEmailUnique(SysUser user) {
Long userId = user.getId()==null ? -1L : user.getId();
SysUser info = baseMapper.checkEmailUnique(user.getEmail());
if (info!=null && info.getId().longValue() != userId.longValue())
{
return false;
}
return true;
}
@Override
public void checkUserAllowed(SysUser user) {
}
@Override
public void checkUserDataScope(Long userId) {
SysUser user = baseMapper.getUserById(userId);
if (ObjectUtil.isNull(user))
{
throw new ApiException("用户数据不存在!");
}
}
@Override
public String importUser(List userList,Boolean isUpdateSupport) {
if(ObjectUtil.isEmpty(userList)||userList.size()==0){
throw new ApiException("导入用户数据不能为空");
}
int successNum=0;
int failureNum=0;
StringBuilder successMsg=new StringBuilder();
StringBuilder failureMsg=new StringBuilder();
String password=configService.getConfigByKey("sys.user.initPassword");
for(SysUser user:userList){
try {
SysUser u = baseMapper.getUserByUsername(user.getUsername());
if (ObjectUtil.isNull(u)) {
BeanValidators.validateWithException(validator, user);
user.setPassword(JwtTokenUtil.md5Encode(user.getUsername() + password));
user.setCreateBy("");
save(user);
successNum++;
successMsg.append("
" + successNum + "、账号 " + user.getUsername() + " 导入成功");
} else if (isUpdateSupport) {
BeanValidators.validateWithException(validator, user);
checkUserAllowed(u);
checkUserDataScope(u.getId());
user.setId(u.getId());
user.setUpdateBy("");
updateById(user);
successNum++;
successMsg.append("
" + successNum + "、账号 " + user.getUsername() + " 更新成功");
} else {
failureNum++;
failureMsg.append("
" + failureNum + "、账号 " + user.getUsername() + " 已存在");
}
}catch (Exception e){
failureNum++;
String msg = "
" + failureNum + "、账号 " + user.getUsername() + " 导入失败:";
failureMsg.append(msg + e.getMessage());
log.error(msg, e);
}
}
if (failureNum > 0){
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ApiException(failureMsg.toString());
}else{
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
@Override
public boolean changeUserStatus(SysUser user) {
checkUserAllowed(user);
checkUserDataScope(user.getId());
return updateById(user);
}
@Override
public boolean changeApprove(SysUser user) {
checkUserAllowed(user);
checkUserDataScope(user.getId());
return updateById(user);
}
}