package cc.mrbird.febs.system.service.impl; 
 | 
  
 | 
import cc.mrbird.febs.common.authentication.ShiroRealm; 
 | 
import cc.mrbird.febs.common.entity.FebsConstant; 
 | 
import cc.mrbird.febs.common.entity.QueryRequest; 
 | 
import cc.mrbird.febs.common.exception.FebsException; 
 | 
import cc.mrbird.febs.common.utils.FebsUtil; 
 | 
import cc.mrbird.febs.common.utils.Md5Util; 
 | 
import cc.mrbird.febs.common.utils.SortUtil; 
 | 
import cc.mrbird.febs.system.entity.User; 
 | 
import cc.mrbird.febs.system.entity.UserDataPermission; 
 | 
import cc.mrbird.febs.system.entity.UserRole; 
 | 
import cc.mrbird.febs.system.mapper.UserMapper; 
 | 
import cc.mrbird.febs.system.service.IUserDataPermissionService; 
 | 
import cc.mrbird.febs.system.service.IUserRoleService; 
 | 
import cc.mrbird.febs.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); 
 | 
    } 
 | 
} 
 |