AdminRiderServiceImpl.java 10.3 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.AdminRiderAddDTO;
import com.diligrp.rider.entity.Orders;
import com.diligrp.rider.entity.Rider;
import com.diligrp.rider.entity.RiderLevel;
import com.diligrp.rider.mapper.OrdersMapper;
import com.diligrp.rider.mapper.RiderBalanceMapper;
import com.diligrp.rider.mapper.RiderLevelMapper;
import com.diligrp.rider.mapper.RiderMapper;
import com.diligrp.rider.entity.*;
import com.diligrp.rider.mapper.*;
import com.diligrp.rider.service.AdminRiderService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;

import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class AdminRiderServiceImpl implements AdminRiderService {

    private final RiderMapper riderMapper;
    private final RiderLevelMapper riderLevelMapper;
    private final OrdersMapper ordersMapper;
    private final RiderBalanceMapper balanceMapper;

    @Override
    public void add(AdminRiderAddDTO dto, Long cityId) {
        if (cityId == null || cityId < 1) {
            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.setUserNickname(dto.getUserNickname());
        rider.setMobile(dto.getMobile());
        rider.setUserPass(encryptPass(dto.getPassword()));
        rider.setCityId(cityId);
        rider.setUserStatus(1);
        rider.setStatus(1);
        rider.setType(1);
        rider.setIsRest(0);
        rider.setBalance(BigDecimal.ZERO);
        rider.setUserLogin("phone_" + System.currentTimeMillis());
        rider.setCreateTime(System.currentTimeMillis() / 1000);
        riderMapper.insert(rider);
    }

    @Override
    public List<Rider> list(String keyword, Integer userStatus, Long cityId) {
        LambdaQueryWrapper<Rider> wrapper = new LambdaQueryWrapper<Rider>()
                .orderByDesc(Rider::getId);
        if (cityId != null) {
            wrapper.eq(Rider::getCityId, cityId);
        }
        if (userStatus != null) {
            wrapper.eq(Rider::getUserStatus, userStatus);
        }
        if (keyword != null && !keyword.isBlank()) {
            wrapper.and(w -> w.like(Rider::getUserNickname, keyword)
                    .or()
                    .like(Rider::getMobile, keyword));
        }
        List<Rider> riders = riderMapper.selectList(wrapper);
        enrichLevelName(riders);
        return riders;
    }

    @Override
    public List<Rider> designateCandidates(Long orderId, Long cityId) {
        Orders order = ordersMapper.selectById(orderId);
        if (order == null) throw new BizException("订单不存在");
        if (cityId != null && !cityId.equals(order.getCityId())) {
            throw new BizException("只能查看当前租户订单的骑手");
        }

        LambdaQueryWrapper<Rider> wrapper = new LambdaQueryWrapper<Rider>()
                .eq(Rider::getCityId, order.getCityId())
                .eq(Rider::getUserStatus, 1)
                .eq(Rider::getStatus, 1)
                .orderByAsc(Rider::getIsRest)
                .orderByDesc(Rider::getId);
        if (order.getIsTrans() != null && order.getIsTrans() == 1
                && order.getOldRiderId() != null && order.getOldRiderId() > 0) {
            wrapper.ne(Rider::getId, order.getOldRiderId());
        }

        List<Rider> riders = riderMapper.selectList(wrapper);
        enrichLevelName(riders);
        return riders;
    }

    @Override
    public void setStatus(Long riderId, int status) {
        Rider rider = riderMapper.selectById(riderId);
        if (rider == null) throw new BizException("骑手不存在");
        riderMapper.update(null, new LambdaUpdateWrapper<Rider>()
                .eq(Rider::getId, riderId)
                .set(Rider::getUserStatus, status));
    }

    @Override
    public void setLevel(Long riderId, Long levelId, Long cityId) {
        Rider rider = riderMapper.selectById(riderId);
        if (rider == null) throw new BizException("骑手不存在");
        if (cityId != null && !cityId.equals(rider.getCityId())) {
            throw new BizException("只能操作当前城市骑手");
        }
        if (levelId != null && levelId > 0) {
            RiderLevel level = riderLevelMapper.selectById(levelId);
            if (level == null) throw new BizException("等级不存在");
            if (!rider.getCityId().equals(level.getCityId())) {
                throw new BizException("等级与骑手城市不匹配");
            }
        }
        riderMapper.update(null, new LambdaUpdateWrapper<Rider>()
                .eq(Rider::getId, riderId)
                .set(Rider::getLevelId, levelId != null && levelId > 0 ? levelId : null));
    }

    @Override
    public void setEnableStatus(Long riderId, int status) {
        Rider rider = riderMapper.selectById(riderId);
        if (rider == null) throw new BizException("骑手不存在");
        riderMapper.update(null, new LambdaUpdateWrapper<Rider>()
                .eq(Rider::getId, riderId)
                .set(Rider::getStatus, status));
    }

    @Override
    @Transactional
    public void setType(Long riderId, int type) {
        Rider rider = riderMapper.selectById(riderId);
        if (rider == null) throw new BizException("骑手不存在");
        if (type == 2) {
            if (rider.getBalance() != null && rider.getBalance().compareTo(BigDecimal.ZERO) > 0) {
                throw new BizException("变更为全职前要保证余额为0");
            }
        }
        LambdaUpdateWrapper<Rider> wrapper = new LambdaUpdateWrapper<Rider>()
                .eq(Rider::getId, riderId)
                .set(Rider::getType, type);
        if (type == 1) {
            wrapper.set(Rider::getBalance, BigDecimal.ZERO);
        }
        riderMapper.update(null, wrapper);
    }

    @Override
    @Transactional
    public void designate(Long orderId, Long riderId) {
        Orders order = ordersMapper.selectById(orderId);
        if (order == null) throw new BizException("订单不存在");
        if (order.getStatus() == 1) throw new BizException("订单未支付,无法指派");
        if (order.getStatus() == 10) throw new BizException("订单已取消,无法指派");
        if (order.getStatus() != 2) throw new BizException("订单已服务中,无法指派");
        if (order.getIsTrans() == 1 && riderId.equals(order.getOldRiderId())) {
            throw new BizException("此订单为该骑手转单订单,无法指派给该骑手");
        }

        long now = System.currentTimeMillis() / 1000;
        LambdaUpdateWrapper<Orders> wrapper = new LambdaUpdateWrapper<Orders>()
                .eq(Orders::getId, orderId)
                .eq(Orders::getStatus, 2)
                .eq(Orders::getRiderId, 0)
                .set(Orders::getRiderId, riderId)
                .set(Orders::getStatus, 3)
                .set(Orders::getGrapTime, now);
        if (order.getOldRiderId() == null || order.getOldRiderId() == 0) {
            wrapper.set(Orders::getOldRiderId, riderId);
        }
        int updated = ordersMapper.update(null, wrapper);
        if (updated == 0) throw new BizException("指派失败,请重试");
    }

    @Override
    @Transactional
    public void setTrans(Long orderId, int trans) {
        Orders order = ordersMapper.selectById(orderId);
        if (order == null) throw new BizException("订单不存在");
        if (order.getStatus() != 4) throw new BizException("订单状态错误,无法操作");
        if (order.getIsTrans() != 2) throw new BizException("订单未申请转单,无法操作");

        LambdaUpdateWrapper<Orders> wrapper = new LambdaUpdateWrapper<Orders>()
                .eq(Orders::getId, orderId)
                .eq(Orders::getIsTrans, 2)
                .set(Orders::getIsTrans, trans);

        if (trans == 1) {
            wrapper.set(Orders::getStatus, 2)
                    .set(Orders::getGrapTime, 0L)
                    .set(Orders::getPickTime, 0L)
                    .set(Orders::getRiderId, 0L)
                    .set(Orders::getIsIncome, 0)
                    .set(Orders::getRiderIncome, BigDecimal.ZERO)
                    .set(Orders::getSubstationIncome, BigDecimal.ZERO);
        }
        int updated = ordersMapper.update(null, wrapper);
        if (updated == 0) throw new BizException("操作失败,请重试");
    }

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

    private void enrichLevelName(List<Rider> riders) {
        if (riders == null || riders.isEmpty()) return;

        Set<Long> cityIds = riders.stream()
                .map(Rider::getCityId)
                .filter(id -> id != null && id > 0)
                .collect(Collectors.toSet());
        if (cityIds.isEmpty()) return;

        List<RiderLevel> levels = riderLevelMapper.selectList(new LambdaQueryWrapper<RiderLevel>()
                .in(RiderLevel::getCityId, cityIds));
        Map<Long, String> levelNameMap = new HashMap<>();
        Map<Long, String> defaultLevelNameMap = new HashMap<>();
        for (RiderLevel level : levels) {
            levelNameMap.put(level.getId(), level.getName());
            if (level.getIsDefault() != null && level.getIsDefault() == 1) {
                defaultLevelNameMap.put(level.getCityId(), level.getName());
            }
        }

        for (Rider rider : riders) {
            if (rider.getLevelId() != null && rider.getLevelId() > 0) {
                rider.setLevelName(levelNameMap.getOrDefault(rider.getLevelId(), "未知等级"));
            } else {
                rider.setLevelName(defaultLevelNameMap.getOrDefault(rider.getCityId(), "默认等级"));
            }
        }
    }
}