package com.thhy.usercore.modules.sys.sysusers.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.thhy.general.config.GlobalConfig;
import com.thhy.general.utils.DeepCopyUtils;
import com.thhy.general.utils.PagingUtils;
import com.thhy.general.utils.UUIDUtils;
import com.thhy.general.utils.password.PasswdUtils;
import com.thhy.general.utils.UserInfoUtils;
import com.thhy.general.common.BasicStatus;
import com.thhy.general.exception.BasicException;
import com.thhy.usercore.modules.sys.sysuserrole.entity.SysUserRole;
import com.thhy.usercore.modules.sys.sysuserrole.mapper.SysUserRoleMapper;
import com.thhy.general.config.SysUserInfo;
import com.thhy.usercore.modules.sys.sysusers.entity.CompanySu;
import com.thhy.usercore.modules.sys.sysusers.entity.SysUsers;
import com.thhy.usercore.modules.sys.sysusers.entity.UserDto;
import com.thhy.usercore.modules.sys.sysusers.entity.UserPassDto;
import com.thhy.usercore.modules.sys.sysusers.mapper.SysUsersMapper;
import com.thhy.usercore.modules.sys.sysusers.service.ISysUsersService;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
*
* 服务实现类
*
*
* @author zhang_xiao_bo
* @since 2022-03-22
*/
@Service
public class SysUsersServiceImpl implements ISysUsersService {
@Autowired
private SysUsersMapper sysUsersMapper;
@Autowired
private SysUserRoleMapper sysUserRoleMapper;
@Autowired
private RedissonClient redissonClient;
@Autowired
private GlobalConfig globalConfig;
public SysUsers get(Serializable id){
return sysUsersMapper.queryById(id);
}
public List findList(UserDto userDto,HttpServletRequest req){
SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo();
SysUsers sysUsers = sysUsersMapper.queryById(userInfo.getUserId());
PagingUtils.setPageParam(req);
if(sysUsers.getIsPlat()==1||sysUsers.getSubAdmin()==1){
if (userDto == null) userDto = new UserDto();
userDto.setCompanyId(userInfo.getCompanyId());
return sysUsersMapper.findListWithAccess(userDto);
}else {
return sysUsersMapper.findList(userDto);
}
}
@Transactional
public SysUsers addUser(UserDto userDto){
SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo();
SysUsers sysUsers = new SysUsers();
DeepCopyUtils.copy(userDto,sysUsers);
if(sysUsers.getUserId()==null){ //添加用户
SysUsers phoneUsers = sysUsersMapper.queryByPhone(userDto.getTelphone());
if(phoneUsers!=null){
throw new BasicException(BasicStatus.USER_PHONE_IS_EXIST); //手机号已存在
}
SysUsers userNameUsers = sysUsersMapper.queryByUsername(userDto.getUsername());
if(userNameUsers!=null){
throw new BasicException(BasicStatus.USER_NAME_IS_EXIST); //用户名已存在
}
sysUsers.setCreateTime(new Date());
sysUsers.setCreateUser(sysUserInfo.getUserId());
//密码加密
String newPassword = PasswdUtils.encodePassword(sysUsers.getPassword());
sysUsers.setPassword(newPassword);
if(!com.alibaba.nacos.api.utils.StringUtils.isEmpty(sysUserInfo.getCompanyId())){
sysUsers.setSubAdmin(1);
}
sysUsersMapper.insert(sysUsers);
if(!com.alibaba.nacos.api.utils.StringUtils.isEmpty(sysUserInfo.getCompanyId())){
sysUsersMapper.insertCompanyUser(new CompanySu(sysUserInfo.getCompanyId(),sysUsers.getUserId()));
}
}else{ //修改用户
//检验版本
SysUsers currentUserInfo = sysUsersMapper.queryById(sysUsers.getUserId());
//Integer curVersion = sysUsersMapper.queryVersionById(sysUsers.getUserId());
System.out.println("################################"+ sysUsers.getVersion());
System.out.println("################################"+ currentUserInfo.getVersion());
if(!currentUserInfo.getVersion().equals(sysUsers.getVersion())){
throw new BasicException(BasicStatus.SUBMIT_TIMEOUT);
}
//手机唯一
if(!currentUserInfo.getTelphone().equals(sysUsers.getTelphone())){
SysUsers phoneUsers = sysUsersMapper.queryByPhone(userDto.getTelphone());
if(phoneUsers!=null){
throw new BasicException(BasicStatus.USER_PHONE_IS_EXIST);
}
}
if(currentUserInfo.getUsername()==null||!currentUserInfo.getUsername().equals(sysUsers.getUsername())){
SysUsers userNameUsers = sysUsersMapper.queryByUsername(userDto.getUsername());
if(userNameUsers!=null){
throw new BasicException(BasicStatus.USER_NAME_IS_EXIST); //用户名已存在
}
}
sysUsersMapper.update(sysUsers);
}
return sysUsers;
}
/**
* 逻辑删除
* @param id
*/
@Transactional
public int deletelogic(Serializable id){
HashMap map = (LinkedHashMap) id;
String userId = map.get("id").toString();
SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo();
//SysUsers currentUserInfo = sysUsersMapper.queryById(id);
if(userId.equals(sysUserInfo.getUserId())){
throw new BasicException(BasicStatus.FORBIDEN_DELETE_SELF);
}
SysUsers sysUsers = sysUsersMapper.queryById(userId);
if("admin".equals(sysUsers.getUsername())){
throw new BasicException(BasicStatus.FORBIDEN_DELETE_ADMIN);
}
if(sysUsers.getIsPlat()==1|| !com.alibaba.nacos.api.utils.StringUtils.isEmpty(sysUsers.getPlatId())){
sysUsersMapper.nologin(sysUsers.getPlatId());
sysUsersMapper.deleteApplyHistory(sysUsers.getPlatId());
}
return sysUsersMapper.deletelogic(id);
}
/**
* 为用户添加角色信息
* @param userDto
* @param req
*/
@Override
@Transactional
public void updateUserRole(UserDto userDto, HttpServletRequest req) {
//先删除目前的权限
String userId = userDto.getUserId();
sysUserRoleMapper.deleteByUserId(userId);
String roleIds = userDto.getRoleIds();
if(StringUtils.isEmpty(roleIds)){
throw new BasicException(BasicStatus.ROLE_INFO_IS_NOT_NULL); //角色信息不能为空
}
String[] roleIdArray = new String[]{roleIds};
if(roleIds.contains(",")){
roleIdArray = roleIds.split(",");
}
for(String role : roleIdArray){
sysUserRoleMapper.insert(new SysUserRole(userId,role));
}
}
/*@Override
@Transactional
public void updateDepartForUser(UserDepartDto userDepartDto) {
//先删除所有
sysUserDepartMapper.deleteByUserId(userDepartDto.getUserId().toString());
if (!StringUtils.isEmpty(userDepartDto.getDepartIds())) {
String departIds = userDepartDto.getDepartIds();
String[] departIdArray = new String[]{departIds};
if(departIds.contains(",")){
departIdArray = departIds.split(",");
}
for(String departId : departIdArray){
sysUserDepartMapper.insert(new SysUserDepart(userDepartDto.getUserId().toString(),departId));
}
}
}*/
@Override
public int queryVersion(Serializable id) {
return sysUsersMapper.queryVersionById(id);
}
@Override
@Transactional
public void updatePass(UserPassDto userPassDto) {
SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo();
SysUsers sysUsers = sysUsersMapper.queryById(sysUserInfo.getUserId());
//解析并校验密码
boolean result = PasswdUtils.validatePassword(userPassDto.getOldPass(),sysUsers.getPassword());
if(!result){
throw new BasicException(BasicStatus.OLDPASS_IS_ERROR);
}
//密码加密
String newPassword = PasswdUtils.encodePassword(userPassDto.getNewPass());
sysUsers.setPassword(newPassword);
sysUsersMapper.updateUserPass(sysUsers);
}
@Override
public String getAuthCode(String param,HttpServletRequest request) {
SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo();
String code = UUIDUtils.create();
RBucket rBucket = redissonClient.getBucket(globalConfig.getFilePreKey()+":authcode:"+code);
JSONObject jsonObject = JSON.parseObject(param);
jsonObject.put("token",request.getHeader("usertoken"));
rBucket.set(jsonObject.toJSONString(),10, TimeUnit.MINUTES);
return code;
}
}