package cn.lili.modules.im.serviceimpl; import cn.lili.cache.Cache; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.token.Token; import cn.lili.common.utils.StringUtils; import cn.lili.modules.im.entity.dos.Seat; import cn.lili.modules.im.entity.enums.OnlineStatusEnum; import cn.lili.modules.im.entity.vo.SeatVO; import cn.lili.modules.im.mapper.SeatMapper; import cn.lili.modules.im.service.SeatService; import cn.lili.modules.im.token.SeatTokenGenerate; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; /** * 坐席业务层实现 * * @author pikachu * @since 2020-02-18 16:18:56 */ @Service @Transactional(rollbackFor = Exception.class) public class SeatServiceImpl extends ServiceImpl implements SeatService { @Autowired private SeatTokenGenerate seatTokenGenerate; @Autowired private Cache cache; /** * 快捷登录缓存前缀 */ private static String prefix = "{quick_login}_"; @Override public List seatVoList(String storeId) { LambdaQueryWrapper seatLambdaQueryWrapper = new LambdaQueryWrapper<>(); seatLambdaQueryWrapper.eq(Seat::getTenantId, storeId); List list = this.list(seatLambdaQueryWrapper); //转换模型为VO List results = list.stream().map(item -> (SeatVO) item).collect(Collectors.toList()); //填充坐席当前状态 //todo results.forEach(item -> { item.setOnlineStatus(OnlineStatusEnum.ONLINE.name()); }); return results; } @Override public Token usernameLogin(String username, String password) { Seat seat = this.findByUsername(username); //判断用户是否存在 if (seat == null || !seat.getDisabled()) { throw new ServiceException(ResultCode.ERROR); } //判断密码是否输入正确 if (!new BCryptPasswordEncoder().matches(password, seat.getPassword())) { throw new ServiceException(ResultCode.ERROR); } return seatTokenGenerate.createToken(seat, true); } @Override public String createQuickLoginCode(String username) { String code = UUID.randomUUID().toString(); cache.put(prefix + code, username, 20L); return code; } @Override public Token quickLogin(String code) { String username = cache.get(prefix + code); cache.remove(prefix + code); if (StringUtils.isEmpty(username)) { throw new ServiceException(ResultCode.ERROR); } return seatTokenGenerate.createToken(findByUsername(username), true); } /** * 查询坐席 * * @param username * @return */ @Override public Seat findByUsername(String username) { LambdaQueryWrapper seatLambdaQueryWrapper = new LambdaQueryWrapper<>(); seatLambdaQueryWrapper.eq(Seat::getUsername, username); return this.getOne(seatLambdaQueryWrapper); } }