| package com.xcong.excoin.system.service.impl; | 
|   | 
| import com.xcong.excoin.common.authentication.ShiroRealm; | 
| import com.xcong.excoin.common.entity.FebsConstant; | 
| import com.xcong.excoin.common.entity.QueryRequest; | 
| import com.xcong.excoin.common.exception.FebsException; | 
| import com.xcong.excoin.common.utils.FebsUtil; | 
| import com.xcong.excoin.common.utils.Md5Util; | 
| import com.xcong.excoin.common.utils.SortUtil; | 
| import com.xcong.excoin.system.entity.User; | 
| import com.xcong.excoin.system.entity.UserDataPermission; | 
| import com.xcong.excoin.system.entity.UserRole; | 
| import com.xcong.excoin.system.mapper.UserMapper; | 
| import com.xcong.excoin.system.service.IUserDataPermissionService; | 
| import com.xcong.excoin.system.service.IUserRoleService; | 
| import com.xcong.excoin.system.service.IUserService; | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
| import com.baomidou.mybatisplus.core.metadata.IPage; | 
| import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | 
| import com.baomidou.mybatisplus.core.toolkit.StringPool; | 
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
| import lombok.RequiredArgsConstructor; | 
| import org.apache.commons.lang3.ArrayUtils; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.transaction.annotation.Propagation; | 
| import org.springframework.transaction.annotation.Transactional; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.Arrays; | 
| import java.util.Date; | 
| import java.util.List; | 
|   | 
| /** | 
|  * @author MrBird | 
|  */ | 
| @Service | 
| @RequiredArgsConstructor | 
| @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) | 
| public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { | 
|   | 
|     private final IUserRoleService userRoleService; | 
|     private final IUserDataPermissionService userDataPermissionService; | 
|     private final ShiroRealm shiroRealm; | 
|   | 
|     @Override | 
|     public User findByName(String username) { | 
|         return this.baseMapper.findByName(username); | 
|     } | 
|   | 
|     @Override | 
|     public IPage<User> findUserDetailList(User user, QueryRequest request) { | 
|         if (StringUtils.isNotBlank(user.getCreateTimeFrom()) && | 
|                 StringUtils.equals(user.getCreateTimeFrom(), user.getCreateTimeTo())) { | 
|             user.setCreateTimeFrom(user.getCreateTimeFrom() + " 00:00:00"); | 
|             user.setCreateTimeTo(user.getCreateTimeTo() + " 23:59:59"); | 
|         } | 
|         Page<User> page = new Page<>(request.getPageNum(), request.getPageSize()); | 
|         page.setSearchCount(false); | 
|         page.setTotal(baseMapper.countUserDetail(user)); | 
|         SortUtil.handlePageSort(request, page, "userId", FebsConstant.ORDER_ASC, false); | 
|         return this.baseMapper.findUserDetailPage(page, user); | 
|     } | 
|   | 
|     @Override | 
|     public User findUserDetailList(String username) { | 
|         User param = new User(); | 
|         param.setUsername(username); | 
|         List<User> users = this.baseMapper.findUserDetail(param); | 
|         return CollectionUtils.isNotEmpty(users) ? users.get(0) : null; | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void updateLoginTime(String username) { | 
|         User user = new User(); | 
|         user.setLastLoginTime(new Date()); | 
|         this.baseMapper.update(user, new LambdaQueryWrapper<User>().eq(User::getUsername, username)); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void createUser(User user) { | 
|         user.setCreateTime(new Date()); | 
|         user.setStatus(User.STATUS_VALID); | 
|         user.setAvatar(User.DEFAULT_AVATAR); | 
|         user.setTheme(User.THEME_BLACK); | 
|         user.setIsTab(User.TAB_OPEN); | 
|         user.setPassword(Md5Util.encrypt(user.getUsername(), User.DEFAULT_PASSWORD)); | 
|         save(user); | 
|         // 保存用户角色 | 
|         String[] roles = user.getRoleId().split(StringPool.COMMA); | 
|         setUserRoles(user, roles); | 
|         // 保存用户数据权限关联关系 | 
|         String[] deptIds = StringUtils.splitByWholeSeparatorPreserveAllTokens(user.getDeptIds(), StringPool.COMMA); | 
|         if (ArrayUtils.isNotEmpty(deptIds)) { | 
|             setUserDataPermissions(user, deptIds); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void deleteUsers(String[] userIds) { | 
|         List<String> list = Arrays.asList(userIds); | 
|         // 删除用户 | 
|         this.removeByIds(list); | 
|         // 删除关联角色 | 
|         this.userRoleService.deleteUserRolesByUserId(list); | 
|         // 删除关联数据权限 | 
|         this.userDataPermissionService.deleteByUserIds(userIds); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void updateUser(User user) { | 
|         String username = user.getUsername(); | 
|         // 更新用户 | 
|         user.setPassword(null); | 
|         user.setUsername(null); | 
|         user.setModifyTime(new Date()); | 
|         updateById(user); | 
|   | 
|         String[] userId = {String.valueOf(user.getUserId())}; | 
|         this.userRoleService.deleteUserRolesByUserId(Arrays.asList(userId)); | 
|         String[] roles = StringUtils.splitByWholeSeparatorPreserveAllTokens(user.getRoleId(), StringPool.COMMA); | 
|         setUserRoles(user, roles); | 
|   | 
|         userDataPermissionService.deleteByUserIds(userId); | 
|         String[] deptIds = StringUtils.splitByWholeSeparatorPreserveAllTokens(user.getDeptIds(), StringPool.COMMA); | 
|         if (ArrayUtils.isNotEmpty(deptIds)) { | 
|             setUserDataPermissions(user, deptIds); | 
|         } | 
|   | 
|         User currentUser = FebsUtil.getCurrentUser(); | 
|         if (StringUtils.equalsIgnoreCase(currentUser.getUsername(), username)) { | 
|             shiroRealm.clearCache(); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void resetPassword(String[] usernames) { | 
|         Arrays.stream(usernames).forEach(username -> { | 
|             User user = new User(); | 
|             user.setPassword(Md5Util.encrypt(username, User.DEFAULT_PASSWORD)); | 
|             this.baseMapper.update(user, new LambdaQueryWrapper<User>().eq(User::getUsername, username)); | 
|         }); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void regist(String username, String password) { | 
|         User user = new User(); | 
|         user.setPassword(Md5Util.encrypt(username, password)); | 
|         user.setUsername(username); | 
|         user.setCreateTime(new Date()); | 
|         user.setStatus(User.STATUS_VALID); | 
|         user.setSex(User.SEX_UNKNOW); | 
|         user.setAvatar(User.DEFAULT_AVATAR); | 
|         user.setTheme(User.THEME_BLACK); | 
|         user.setIsTab(User.TAB_OPEN); | 
|         user.setDescription("注册用户"); | 
|         this.save(user); | 
|   | 
|         UserRole ur = new UserRole(); | 
|         ur.setUserId(user.getUserId()); | 
|         ur.setRoleId(FebsConstant.REGISTER_ROLE_ID); | 
|         this.userRoleService.save(ur); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void updatePassword(String username, String password) { | 
|         User user = new User(); | 
|         user.setPassword(Md5Util.encrypt(username, password)); | 
|         user.setModifyTime(new Date()); | 
|         this.baseMapper.update(user, new LambdaQueryWrapper<User>().eq(User::getUsername, username)); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void updateAvatar(String username, String avatar) { | 
|         User user = new User(); | 
|         user.setAvatar(avatar); | 
|         user.setModifyTime(new Date()); | 
|         this.baseMapper.update(user, new LambdaQueryWrapper<User>().eq(User::getUsername, username)); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void updateTheme(String username, String theme, String isTab) { | 
|         User user = new User(); | 
|         user.setTheme(theme); | 
|         user.setIsTab(isTab); | 
|         user.setModifyTime(new Date()); | 
|         this.baseMapper.update(user, new LambdaQueryWrapper<User>().eq(User::getUsername, username)); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void updateProfile(User user) { | 
|         user.setUsername(null); | 
|         user.setRoleId(null); | 
|         user.setPassword(null); | 
|         if (isCurrentUser(user.getId())) { | 
|             updateById(user); | 
|         } else { | 
|             throw new FebsException("您无权修改别人的账号信息!"); | 
|         } | 
|     } | 
|   | 
|     private void setUserRoles(User user, String[] roles) { | 
|         List<UserRole> userRoles = new ArrayList<>(); | 
|         Arrays.stream(roles).forEach(roleId -> { | 
|             UserRole userRole = new UserRole(); | 
|             userRole.setUserId(user.getUserId()); | 
|             userRole.setRoleId(Long.valueOf(roleId)); | 
|             userRoles.add(userRole); | 
|         }); | 
|         userRoleService.saveBatch(userRoles); | 
|     } | 
|   | 
|     private void setUserDataPermissions(User user, String[] deptIds) { | 
|         List<UserDataPermission> userDataPermissions = new ArrayList<>(); | 
|         Arrays.stream(deptIds).forEach(deptId -> { | 
|             UserDataPermission permission = new UserDataPermission(); | 
|             permission.setDeptId(Long.valueOf(deptId)); | 
|             permission.setUserId(user.getUserId()); | 
|             userDataPermissions.add(permission); | 
|         }); | 
|         userDataPermissionService.saveBatch(userDataPermissions); | 
|     } | 
|   | 
|     private boolean isCurrentUser(Long id) { | 
|         User currentUser = FebsUtil.getCurrentUser(); | 
|         return currentUser.getUserId().equals(id); | 
|     } | 
| } |