MrShi
7 天以前 e685b58fd40cf28a20844643d70cc5f5b46ca037
server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,585 @@
package com.doumee.service.business.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.config.jwt.JwtTokenUtil;
import com.doumee.core.utils.Secure;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.DriverInfoMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.MultifileMapper;
import com.doumee.dao.business.SmsrecordMapper;
import com.doumee.dao.business.CategoryMapper;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.DriverInfo;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Multifile;
import com.doumee.dao.business.model.Smsrecord;
import com.doumee.dao.vo.AccountResponse;
import com.doumee.dao.dto.AuditDTO;
import com.doumee.dao.dto.DriverLoginRequest;
import com.doumee.dao.dto.DriverRegisterRequest;
import com.doumee.dao.dto.DriverVerifyRequest;
import com.doumee.service.business.AliSmsService;
import com.doumee.service.business.DriverInfoService;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * å¸æœºæ³¨å†Œä¿¡æ¯Service实现
 * @author rk
 * @date 2026/04/08
 */
@Service
public class DriverInfoServiceImpl implements DriverInfoService {
    @Autowired
    private DriverInfoMapper driverInfoMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private SmsrecordMapper smsrecordMapper;
    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    @Autowired
    private Secure secure;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private MultifileMapper multifileMapper;
    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    public Integer create(DriverInfo driverInfo) {
        driverInfoMapper.insert(driverInfo);
        return driverInfo.getId();
    }
    @Override
    public void deleteById(Integer id) {
        driverInfoMapper.deleteById(id);
    }
    @Override
    public void delete(DriverInfo driverInfo) {
        UpdateWrapper<DriverInfo> deleteWrapper = new UpdateWrapper<>(driverInfo);
        driverInfoMapper.delete(deleteWrapper);
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        driverInfoMapper.deleteBatchIds(ids);
    }
    @Override
    public void updateById(DriverInfo driverInfo) {
        driverInfoMapper.updateById(driverInfo);
    }
    @Override
    public void updateByIdInBatch(List<DriverInfo> driverInfos) {
        if (CollectionUtils.isEmpty(driverInfos)) {
            return;
        }
        for (DriverInfo driverInfo : driverInfos) {
            this.updateById(driverInfo);
        }
    }
    @Override
    public DriverInfo findById(Integer id) {
        DriverInfo driverInfo = driverInfoMapper.selectById(id);
        if (Objects.isNull(driverInfo)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        return driverInfo;
    }
    @Override
    public DriverInfo findOne(DriverInfo driverInfo) {
        QueryWrapper<DriverInfo> wrapper = new QueryWrapper<>(driverInfo);
        return driverInfoMapper.selectOne(wrapper);
    }
    @Override
    public List<DriverInfo> findList(DriverInfo driverInfo) {
        QueryWrapper<DriverInfo> wrapper = new QueryWrapper<>(driverInfo);
        return driverInfoMapper.selectList(wrapper);
    }
    @Override
    public PageData<DriverInfo> findPage(PageWrap<DriverInfo> pageWrap) {
        IPage<DriverInfo> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<DriverInfo> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setDeleted(Constants.ZERO);
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(DriverInfo::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getDeleted() != null) {
            queryWrapper.lambda().eq(DriverInfo::getDeleted, pageWrap.getModel().getDeleted());
        }
        if (pageWrap.getModel().getCreateUser() != null) {
            queryWrapper.lambda().eq(DriverInfo::getCreateUser, pageWrap.getModel().getCreateUser());
        }
        if (pageWrap.getModel().getCreateTime() != null) {
            queryWrapper.lambda().ge(DriverInfo::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
            queryWrapper.lambda().le(DriverInfo::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
        }
        if (pageWrap.getModel().getUpdateUser() != null) {
            queryWrapper.lambda().eq(DriverInfo::getUpdateUser, pageWrap.getModel().getUpdateUser());
        }
        if (pageWrap.getModel().getUpdateTime() != null) {
            queryWrapper.lambda().ge(DriverInfo::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
            queryWrapper.lambda().le(DriverInfo::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
        }
        if (pageWrap.getModel().getRemark() != null) {
            queryWrapper.lambda().eq(DriverInfo::getRemark, pageWrap.getModel().getRemark());
        }
        if (pageWrap.getModel().getName() != null) {
            queryWrapper.lambda().like(DriverInfo::getName, pageWrap.getModel().getName());
        }
        if (pageWrap.getModel().getTelephone() != null) {
            queryWrapper.lambda().like(DriverInfo::getTelephone, pageWrap.getModel().getTelephone());
        }
        if (pageWrap.getModel().getIdcard() != null) {
            queryWrapper.lambda().eq(DriverInfo::getIdcard, pageWrap.getModel().getIdcard());
        }
        if (pageWrap.getModel().getMaritalStatus() != null) {
            queryWrapper.lambda().eq(DriverInfo::getMaritalStatus, pageWrap.getModel().getMaritalStatus());
        }
        if (pageWrap.getModel().getCarType() != null) {
            queryWrapper.lambda().eq(DriverInfo::getCarType, pageWrap.getModel().getCarType());
        }
        if (pageWrap.getModel().getCarCode() != null) {
            queryWrapper.lambda().like(DriverInfo::getCarCode, pageWrap.getModel().getCarCode());
        }
        if (pageWrap.getModel().getCardStartDate() != null) {
            queryWrapper.lambda().ge(DriverInfo::getCardStartDate, Utils.Date.getStart(pageWrap.getModel().getCardStartDate()));
            queryWrapper.lambda().le(DriverInfo::getCardStartDate, Utils.Date.getEnd(pageWrap.getModel().getCardStartDate()));
        }
        if (pageWrap.getModel().getCardEndDate() != null) {
            queryWrapper.lambda().ge(DriverInfo::getCardEndDate, Utils.Date.getStart(pageWrap.getModel().getCardEndDate()));
            queryWrapper.lambda().le(DriverInfo::getCardEndDate, Utils.Date.getEnd(pageWrap.getModel().getCardEndDate()));
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(DriverInfo::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getAuditTime() != null) {
            queryWrapper.lambda().ge(DriverInfo::getAuditTime, Utils.Date.getStart(pageWrap.getModel().getAuditTime()));
            queryWrapper.lambda().le(DriverInfo::getAuditTime, Utils.Date.getEnd(pageWrap.getModel().getAuditTime()));
        }
        if (pageWrap.getModel().getAuditUser() != null) {
            queryWrapper.lambda().eq(DriverInfo::getAuditUser, pageWrap.getModel().getAuditUser());
        }
        if (pageWrap.getModel().getMemberId() != null) {
            queryWrapper.lambda().eq(DriverInfo::getMemberId, pageWrap.getModel().getMemberId());
        }
        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(driverInfoMapper.selectPage(page, queryWrapper));
    }
    @Override
    public long count(DriverInfo driverInfo) {
        QueryWrapper<DriverInfo> wrapper = new QueryWrapper<>(driverInfo);
        return driverInfoMapper.selectCount(wrapper);
    }
    /***************司机验证码登录业务*************/
    @Override
    public void sendRegisterCode(String telephone) {
        if (StringUtils.isBlank(telephone)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        // ç”Ÿæˆ6位数字验证码
        String code = RandomStringUtils.randomNumeric(6);
        // å‘送短信
        String templateParam = "{\"code\":\"" + code + "\"}";
        AliSmsService.sendSms(telephone, "SMS_491325122", templateParam);
        // ä¿å­˜çŸ­ä¿¡è®°å½•
        Smsrecord smsrecord = new Smsrecord();
        smsrecord.setDeleted(Constants.ZERO);
        smsrecord.setCreateTime(new Date());
        smsrecord.setUpdateTime(new Date());
        smsrecord.setPhone(telephone);
        smsrecord.setContent("司机验证码登录:" + code);
        smsrecord.setType(Constants.ZERO);
        smsrecord.setCode(code);
        smsrecord.setStatus(Constants.ZERO);
        // æœ‰æ•ˆæœŸ15分钟
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.MINUTE, 15);
        smsrecord.setValidDate(calendar.getTime());
        smsrecordMapper.insert(smsrecord);
    }
    @Override
    @Transactional
    public AccountResponse register(DriverRegisterRequest request) {
        String telephone = request.getTelephone();
        String code = request.getCode();
        if (StringUtils.isAnyBlank(telephone, code)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        // 1. éªŒè¯çŸ­ä¿¡éªŒè¯ç 
        QueryWrapper<Smsrecord> smsWrapper = new QueryWrapper<>();
        smsWrapper.lambda().eq(Smsrecord::getPhone, telephone)
                .eq(Smsrecord::getCode, code)
                .eq(Smsrecord::getType, Constants.ZERO)
                .eq(Smsrecord::getStatus, Constants.ZERO)
                .ge(Smsrecord::getValidDate, new Date())
                .orderByDesc(Smsrecord::getCreateTime)
                .last("limit 1");
        Smsrecord smsrecord = smsrecordMapper.selectOne(smsWrapper);
        if (Objects.isNull(smsrecord)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "验证码错误或已过期");
        }
        // æ ‡è®°éªŒè¯ç å·²ä½¿ç”¨
        smsrecord.setStatus(Constants.ONE);
        smsrecord.setUpdateTime(new Date());
        smsrecordMapper.updateById(smsrecord);
        // 2. æŸ¥è¯¢æ˜¯å¦å·²æœ‰å¸æœºè´¦å·
        Member existMember = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                .eq(Member::getTelephone, telephone)
                .eq(Member::getUserType, Constants.ONE)
                .ne(Member::getStatus, Constants.TWO)
                .last("limit 1"));
        Date now = new Date();
        Member member;
        if (Objects.nonNull(existMember)) {
            // å·²æœ‰å¸æœºè´¦å·ï¼Œç›´æŽ¥ç™»å½•
            if (!Constants.equalsInteger(existMember.getStatus(), Constants.ZERO)) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "账号已停用,请联系管理员");
            }
            // æ›´æ–°ç™»å½•信息
            memberMapper.update(new UpdateWrapper<Member>().lambda()
                    .set(Member::getLoginTime, now)
                    .setSql("login_times = login_times + 1")
                    .eq(Member::getId, existMember.getId()));
            // æ›´æ–°å†…存中的登录信息
            existMember.setLoginTime(now);
            existMember.setLoginTimes(existMember.getLoginTimes() + 1);
            member = existMember;
        } else {
            // æ²¡æœ‰å¸æœºè´¦å·ï¼Œæ³¨å†Œæ–°ç”¨æˆ·ï¼Œé»˜è®¤å¯†ç ä¸ºæ‰‹æœºå·åŽå…­ä½
            String salt = RandomStringUtils.randomAlphanumeric(6);
            String defaultPassword = telephone.substring(telephone.length() - 6);
            member = new Member();
            member.setDeleted(Constants.ZERO);
            member.setCreateTime(now);
            member.setUpdateTime(now);
            member.setTelephone(telephone);
            member.setNickName(telephone);
            member.setName(telephone);
            member.setUserType(Constants.ONE);
            member.setBusinessStatus(Constants.ZERO);
            member.setPassword(secure.encryptPassword(defaultPassword, salt));
            member.setSalt(salt);
            member.setWorkerIdentity(Constants.ZERO);
            member.setDriverIdentity(Constants.ZERO);
            member.setChefIdentity(Constants.ZERO);
            member.setAmount(Constants.ZERO.longValue());
            member.setTotalAmount(Constants.ZERO.longValue());
            member.setStatus(Constants.ZERO);
            member.setLoginTime(now);
            member.setLoginTimes(Constants.ONE.longValue());
            member.setReceiveNum(Constants.ZERO.longValue());
            member.setPublishNum(Constants.ZERO.longValue());
            member.setAutoReceiveStatus(Constants.ONE);
            member.setUseIdentity(Constants.ZERO);
            memberMapper.insert(member);
            // åˆ›å»ºå¸æœºåŸºç¡€ä¿¡æ¯ï¼ˆstatus=0,注册状态)
            DriverInfo driverInfo = new DriverInfo();
            driverInfo.setDeleted(Constants.ZERO);
            driverInfo.setCreateTime(now);
            driverInfo.setUpdateTime(now);
            driverInfo.setTelephone(telephone);
            driverInfo.setMemberId(member.getId());
            driverInfo.setStatus(Constants.ZERO);
            driverInfoMapper.insert(driverInfo);
        }
        // 3. ç”Ÿæˆtoken返回
        AccountResponse accountResponse = new AccountResponse();
        accountResponse.setToken(JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ONE, JSONObject.toJSONString(member), redisTemplate));
        accountResponse.setMember(member);
        return accountResponse;
    }
    @Override
    public AccountResponse login(DriverLoginRequest request) {
        String telephone = request.getTelephone();
        String password = request.getPassword();
        if (StringUtils.isAnyBlank(telephone, password)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        // æŸ¥è¯¢å¸æœºä¼šå‘˜
        Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                .eq(Member::getTelephone, telephone)
                .eq(Member::getUserType, Constants.ONE)
                .ne(Member::getStatus, Constants.TWO)
                .last("limit 1"));
        if (Objects.isNull(member)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "账号不存在");
        }
        if (!Constants.equalsInteger(member.getStatus(), Constants.ZERO)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "账号已停用,请联系管理员");
        }
        // æ ¡éªŒå¯†ç 
        String encryptPwd = secure.encryptPassword(password, member.getSalt());
        if (!encryptPwd.equals(member.getPassword())) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "密码错误");
        }
        // æ›´æ–°ç™»å½•信息
        memberMapper.update(new UpdateWrapper<Member>().lambda()
                .set(Member::getLoginTime, new Date())
                .setSql("login_times = login_times + 1")
                .eq(Member::getId, member.getId()));
        AccountResponse accountResponse = new AccountResponse();
        accountResponse.setToken(JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ONE, JSONObject.toJSONString(member), redisTemplate));
        accountResponse.setMember(member);
        return accountResponse;
    }
    /***************司机实名认证业务*************/
    @Override
    @Transactional
    public void submitVerify(Integer memberId, DriverVerifyRequest request) {
        // å‚数基础校验
        if (StringUtils.isAnyBlank(request.getName(), request.getIdcard(), request.getLivePlace(),
                request.getCarCode(), request.getIdcardImg(), request.getIdcardImgBack())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if (request.getMaritalStatus() == null || request.getCarType() == null) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        // èº«ä»½è¯å·æ ¼å¼æ ¡éªŒï¼ˆ18位,最后一位可为X)
        if (!request.getIdcard().matches("^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$")) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "身份证号格式不正确");
        }
        // æŸ¥è¯¢å¸æœºä¿¡æ¯
        DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
                .eq(DriverInfo::getMemberId, memberId)
                .eq(DriverInfo::getDeleted, Constants.ZERO)
                .last("limit 1"));
        if (Objects.isNull(driverInfo)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        // çŠ¶æ€æ ¡éªŒï¼šstatus=0(注册)或status=3(审批驳回)可提交认证
        if (driverInfo.getStatus() != null
                && !Constants.equalsInteger(driverInfo.getStatus(), Constants.ZERO)
                && !Constants.equalsInteger(driverInfo.getStatus(), Constants.THREE)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "当前状态不允许提交认证");
        }
        // æ ¹æ®è½¦è¾†ç±»åž‹åˆ¤æ–­æ˜¯å¦éœ€è¦é©¾é©¶è¯
        Category category = categoryMapper.selectById(request.getCarType());
        if (Objects.isNull(category) || !Constants.equalsInteger(category.getType(), Constants.ONE)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "车辆类型不存在");
        }
        boolean needLicense = Constants.equalsInteger(Integer.valueOf(category.getOtherField()), Constants.ONE);
        if (needLicense) {
            if (request.getCardStartDate() == null || request.getCardEndDate() == null) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "该车辆类型需要填写驾驶证有效期");
            }
            if (request.getLicenseImgUrls() == null || request.getLicenseImgUrls().isEmpty()) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "该车辆类型需要上传驾驶证照片");
            }
        }
        // è½¦è¾†ç…§ç‰‡å¿…å¡«
        if (request.getCarImgUrls() == null || request.getCarImgUrls().isEmpty()) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "请上传车辆照片");
        }
        // ç…§ç‰‡æ•°é‡æ ¡éªŒ
        if (request.getCarImgUrls().size() > 3) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "车辆照片最多上传3å¼ ");
        }
        if (request.getLicenseImgUrls() != null && request.getLicenseImgUrls().size() > 3) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "驾驶证照片最多上传3å¼ ");
        }
        if (request.getOtherImgUrls() != null && request.getOtherImgUrls().size() > 3) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "其他资料照片最多上传3å¼ ");
        }
        // æ›´æ–°å¸æœºä¿¡æ¯
        Date now = new Date();
        driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
                .set(DriverInfo::getName, request.getName())
                .set(DriverInfo::getIdcard, request.getIdcard())
                .set(DriverInfo::getMaritalStatus, request.getMaritalStatus())
                .set(DriverInfo::getAreaId, request.getAreaId())
                .set(DriverInfo::getLivePlace, request.getLivePlace())
                .set(DriverInfo::getCarCode, request.getCarCode())
                .set(DriverInfo::getCarType, request.getCarType())
                .set(DriverInfo::getCarColor, request.getCarColor())
                .set(DriverInfo::getCardStartDate, request.getCardStartDate())
                .set(DriverInfo::getCardEndDate, request.getCardEndDate())
                .set(DriverInfo::getIdcardImg, request.getIdcardImg())
                .set(DriverInfo::getIdcardImgBack, request.getIdcardImgBack())
                .set(DriverInfo::getStatus, Constants.ONE)
                .set(DriverInfo::getUpdateTime, now)
                .set(DriverInfo::getAuditRemark, null)
                .set(DriverInfo::getAuditTime, null)
                .eq(DriverInfo::getId, driverInfo.getId()));
        // åˆ é™¤æ—§çš„照片记录
        multifileMapper.delete(new QueryWrapper<Multifile>().lambda()
                .eq(Multifile::getObjId, driverInfo.getId())
                .in(Multifile::getObjType, 6, 7, 8));
        // ä¿å­˜è½¦è¾†ç…§ç‰‡ objType=6
        saveMultifileList(driverInfo.getId(), 6, request.getCarImgUrls(), now);
        // ä¿å­˜é©¾é©¶è¯ç…§ç‰‡ objType=7
        if (!CollectionUtils.isEmpty(request.getLicenseImgUrls())) {
            saveMultifileList(driverInfo.getId(), 7, request.getLicenseImgUrls(), now);
        }
        // ä¿å­˜å…¶ä»–资料照片 objType=8
        if (!CollectionUtils.isEmpty(request.getOtherImgUrls())) {
            saveMultifileList(driverInfo.getId(), 8, request.getOtherImgUrls(), now);
        }
        // æ›´æ–°ä¼šå‘˜å¸æœºè®¤è¯çŠ¶æ€ä¸ºè®¤è¯ä¸­
        memberMapper.update(new UpdateWrapper<Member>().lambda()
                .set(Member::getBusinessStatus, Constants.ONE)
                .set(Member::getUpdateTime, now)
                .eq(Member::getId, memberId));
    }
    @Override
    public DriverInfo getVerifyDetail(Integer memberId) {
        DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
                .eq(DriverInfo::getMemberId, memberId)
                .eq(DriverInfo::getDeleted, Constants.ZERO)
                .last("limit 1"));
        if (Objects.isNull(driverInfo)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        // æŸ¥è¯¢è½¦è¾†ç±»åž‹åç§°å’Œæ˜¯å¦éœ€è¦é©¾é©¶è¯
        if (driverInfo.getCarType() != null) {
            Category category = categoryMapper.selectById(driverInfo.getCarType());
            if (Objects.nonNull(category)) {
                driverInfo.setCarTypeName(category.getName());
                driverInfo.setNeedLicense(Constants.equalsInteger(Integer.valueOf(category.getOtherField()), Constants.ONE) ? Constants.ONE : Constants.ZERO);
            }
        }
        // æŸ¥è¯¢ç…§ç‰‡åˆ—表
        List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
                .eq(Multifile::getObjId, driverInfo.getId())
                .in(Multifile::getObjType, 6, 7, 8)
                .orderByAsc(Multifile::getSortnum));
        if (!CollectionUtils.isEmpty(multifileList)) {
            for (Multifile mf : multifileList) {
                if (Constants.equalsInteger(mf.getObjType(), 6)) {
                    driverInfo.getCarImgList().add(mf);
                } else if (Constants.equalsInteger(mf.getObjType(), 7)) {
                    driverInfo.getLicenseImgList().add(mf);
                } else if (Constants.equalsInteger(mf.getObjType(), 8)) {
                    driverInfo.getOtherImgList().add(mf);
                }
            }
        }
        return driverInfo;
    }
    @Override
    @Transactional
    public void auditVerify(AuditDTO auditDTO) {
        if (Objects.isNull(auditDTO.getId()) || Objects.isNull(auditDTO.getAuditStatus())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        DriverInfo driverInfo = driverInfoMapper.selectById(auditDTO.getId());
        if (Objects.isNull(driverInfo)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        // åªæœ‰çŠ¶æ€ä¸º1(待审批)且已填写认证信息才能审批
        if (!Constants.equalsInteger(driverInfo.getStatus(), Constants.ONE)
                || StringUtils.isBlank(driverInfo.getIdcard())) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "当前状态不允许审批");
        }
        Date now = new Date();
        // å®¡æ‰¹ç»“果:auditDTO.auditStatus 0=通过→driverInfo.status=2,1=拒绝→driverInfo.status=3
        Integer newStatus;
        if (Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ZERO)) {
            newStatus = Constants.TWO;  // å®¡æ‰¹é€šè¿‡
        } else if (Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ONE)) {
            newStatus = Constants.THREE;  // å®¡æ‰¹é©³å›ž
        } else {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "审批状态参数错误");
        }
        // æ›´æ–°å¸æœºçŠ¶æ€
        driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
                .set(DriverInfo::getStatus, newStatus)
                .set(DriverInfo::getAuditTime, now)
                .set(DriverInfo::getAuditRemark, auditDTO.getAuditRemark())
                .set(DriverInfo::getAuditUser, auditDTO.getAuditUser())
                .set(DriverInfo::getUpdateTime, now)
                .eq(DriverInfo::getId, auditDTO.getId()));
        // æ›´æ–°ä¼šå‘˜å¸æœºè®¤è¯çŠ¶æ€ï¼šé€šè¿‡=2,驳回=3
        Integer driverStatus = Constants.equalsInteger(newStatus, Constants.TWO) ? Constants.TWO : Constants.THREE;
        memberMapper.update(new UpdateWrapper<Member>().lambda()
                .set(Member::getBusinessStatus, driverStatus)
                .set(Member::getUpdateTime, now)
                .eq(Member::getId, driverInfo.getMemberId()));
    }
    /**
     * æ‰¹é‡ä¿å­˜é™„件记录
     */
    private void saveMultifileList(Integer objId, Integer objType, List<String> urls, Date now) {
        int sortNum = 0;
        for (String url : urls) {
            Multifile multifile = new Multifile();
            multifile.setObjId(objId);
            multifile.setObjType(objType);
            multifile.setType(Constants.ZERO);
            multifile.setFileurl(url);
            multifile.setIsdeleted(Constants.ZERO);
            multifile.setCreateDate(now);
            multifile.setSortnum(sortNum++);
            multifileMapper.insert(multifile);
        }
    }
}