RiderAuthServiceImpl.java 4.7 KB
package com.diligrp.rider.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.diligrp.rider.common.exception.BizException;
import com.diligrp.rider.dto.ApplyDTO;
import com.diligrp.rider.dto.LoginDTO;
import com.diligrp.rider.entity.Rider;
import com.diligrp.rider.mapper.RiderMapper;
import com.diligrp.rider.service.RiderAuthService;
import com.diligrp.rider.config.JwtUtil;
import com.diligrp.rider.vo.RiderVO;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;

@Service
@RequiredArgsConstructor
public class RiderAuthServiceImpl implements RiderAuthService {

    private final RiderMapper riderMapper;
    private final JwtUtil jwtUtil;
    private final StringRedisTemplate redisTemplate;

    private static final String SMS_KEY_PREFIX = "rider_sms_apply_";

    @Override
    public void apply(ApplyDTO dto) {
        // 校验验证码
        String cacheCode = redisTemplate.opsForValue().get(SMS_KEY_PREFIX + dto.getMobile());
        if (cacheCode == null || !cacheCode.equals(dto.getCode())) {
            throw new BizException("验证码错误或已过期");
        }

        // 手机号唯一校验
        Long exists = riderMapper.selectCount(new LambdaQueryWrapper<Rider>()
                .eq(Rider::getMobile, dto.getMobile()));
        if (exists > 0) {
            throw new BizException("该手机号已申请,请更换");
        }

        Rider rider = new Rider();
        rider.setMobile(dto.getMobile());
        rider.setUserNickname(dto.getName());
        rider.setUserPass(encryptPass(dto.getPass()));
        rider.setIdNo(dto.getIdNo());
        rider.setThumb(dto.getThumb());
        rider.setCityId(dto.getCityId());
        rider.setUserStatus(2); // 待审核
        rider.setType(1);       // 默认兼职
        rider.setIsRest(0);
        rider.setUserLogin("phone_" + System.currentTimeMillis());
        rider.setCreateTime(System.currentTimeMillis() / 1000);
        riderMapper.insert(rider);

        // 删除验证码
        redisTemplate.delete(SMS_KEY_PREFIX + dto.getMobile());
    }

    @Override
    public RiderVO loginByPass(LoginDTO dto) {
        Rider rider = riderMapper.selectOne(new LambdaQueryWrapper<Rider>()
                .eq(Rider::getMobile, dto.getUsername()));
        if (rider == null) {
            throw new BizException("手机号或密码错误");
        }
        if (!encryptPass(dto.getPass()).equals(rider.getUserPass())) {
            throw new BizException("手机号或密码错误");
        }
        if (rider.getUserStatus() == 2) {
            throw new BizException("账号审核中,请耐心等待");
        }
        if (rider.getUserStatus() == 0) {
            throw new BizException("账号审核未通过,请联系客服");
        }
        if (rider.getStatus() != null && rider.getStatus() == 0) {
            throw new BizException("账号已被禁用");
        }
        return buildVO(rider);
    }

    @Override
    public RiderVO getInfo(Long riderId) {
        Rider rider = riderMapper.selectById(riderId);
        if (rider == null) throw new BizException("骑手信息不存在");
        return buildVO(rider);
    }

    @Override
    public void toggleRest(Long riderId) {
        Rider rider = riderMapper.selectById(riderId);
        if (rider == null) throw new BizException("骑手信息不存在");
        int newRest = rider.getIsRest() == 1 ? 0 : 1;
        riderMapper.update(null, new LambdaUpdateWrapper<Rider>()
                .eq(Rider::getId, riderId)
                .set(Rider::getIsRest, newRest));
    }

    private RiderVO buildVO(Rider rider) {
        RiderVO vo = new RiderVO();
        vo.setId(rider.getId());
        vo.setMobile(rider.getMobile());
        vo.setUserNickname(rider.getUserNickname());
        vo.setAvatar(rider.getAvatar());
        vo.setType(rider.getType());
        vo.setTypeName(rider.getType() == 1 ? "兼职" : "全职");
        vo.setUserStatus(rider.getUserStatus());
        vo.setStatus(rider.getStatus() == null ? 1 : rider.getStatus());
        vo.setStatusName((rider.getStatus() == null || rider.getStatus() == 1) ? "正常" : "禁用");
        vo.setBalance(rider.getBalance());
        vo.setIsRest(rider.getIsRest());
        vo.setCityId(rider.getCityId());
        vo.setToken(jwtUtil.generateRiderToken(rider.getId(), rider.getCityId()));
        return vo;
    }

    private String encryptPass(String pass) {
        return DigestUtils.md5DigestAsHex(pass.getBytes(StandardCharsets.UTF_8));
    }
}