AdminRiderLevelServiceImpl.java 5.42 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.AdminRiderLevelSaveDTO;
import com.diligrp.rider.entity.Rider;
import com.diligrp.rider.entity.RiderLevel;
import com.diligrp.rider.mapper.RiderLevelMapper;
import com.diligrp.rider.mapper.RiderMapper;
import com.diligrp.rider.service.AdminRiderLevelService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;

@Service
@RequiredArgsConstructor
public class AdminRiderLevelServiceImpl implements AdminRiderLevelService {

    private final RiderLevelMapper riderLevelMapper;
    private final RiderMapper riderMapper;

    @Override
    public List<RiderLevel> list(Long cityId) {
        return riderLevelMapper.selectList(new LambdaQueryWrapper<RiderLevel>()
                .eq(RiderLevel::getCityId, cityId)
                .orderByAsc(RiderLevel::getLevelId)
                .orderByDesc(RiderLevel::getIsDefault));
    }

    @Override
    public void add(AdminRiderLevelSaveDTO dto, Long cityId) {
        validateCity(cityId);
        ensureLevelIdUnique(cityId, dto.getLevelId(), null);

        RiderLevel level = new RiderLevel();
        fillLevel(level, dto, cityId);
        level.setIsDefault(hasDefault(cityId) ? 0 : 1);
        riderLevelMapper.insert(level);
    }

    @Override
    public void edit(AdminRiderLevelSaveDTO dto, Long cityId) {
        validateCity(cityId);
        RiderLevel existing = getOwnedLevel(dto.getId(), cityId);
        ensureLevelIdUnique(cityId, dto.getLevelId(), existing.getId());
        fillLevel(existing, dto, cityId);
        riderLevelMapper.updateById(existing);
    }

    @Override
    public void setDefault(Long id, Long cityId) {
        validateCity(cityId);
        RiderLevel existing = getOwnedLevel(id, cityId);
        riderLevelMapper.update(null, new LambdaUpdateWrapper<RiderLevel>()
                .eq(RiderLevel::getCityId, cityId)
                .set(RiderLevel::getIsDefault, 0));
        riderLevelMapper.update(null, new LambdaUpdateWrapper<RiderLevel>()
                .eq(RiderLevel::getId, existing.getId())
                .set(RiderLevel::getIsDefault, 1));
    }

    @Override
    public void delete(Long id, Long cityId) {
        validateCity(cityId);
        RiderLevel existing = getOwnedLevel(id, cityId);
        if (existing.getIsDefault() != null && existing.getIsDefault() == 1) {
            throw new BizException("默认等级不能删除");
        }
        Long riderCount = riderMapper.selectCount(new LambdaQueryWrapper<Rider>()
                .eq(Rider::getLevelId, existing.getId()));
        if (riderCount != null && riderCount > 0) {
            throw new BizException("该等级已有骑手使用,不能删除");
        }
        riderLevelMapper.deleteById(existing.getId());
    }

    private void fillLevel(RiderLevel level, AdminRiderLevelSaveDTO dto, Long cityId) {
        level.setCityId(cityId);
        level.setLevelId(dto.getLevelId());
        level.setName(dto.getName());
        level.setTransNums(dto.getTransNums());
        level.setRunFeeMode(dto.getRunFeeMode());
        level.setRunFixMoney(nvl(dto.getRunFixMoney()));
        level.setRunRate(nvl(dto.getRunRate()));
        level.setDistanceBasic(dto.getDistanceBasic() == null ? 0 : dto.getDistanceBasic());
        level.setDistanceBasicMoney(nvl(dto.getDistanceBasicMoney()));
        level.setDistanceMoreMoney(nvl(dto.getDistanceMoreMoney()));
        level.setDistanceMaxMoney(nvl(dto.getDistanceMaxMoney()));
        level.setWorkFeeMode(level.getWorkFeeMode() == null ? 1 : level.getWorkFeeMode());
        level.setWorkFixMoney(level.getWorkFixMoney() == null ? BigDecimal.ZERO : level.getWorkFixMoney());
        level.setWorkRate(level.getWorkRate() == null ? BigDecimal.ZERO : level.getWorkRate());
    }

    private RiderLevel getOwnedLevel(Long id, Long cityId) {
        RiderLevel level = riderLevelMapper.selectById(id);
        if (level == null) throw new BizException("等级不存在");
        if (!cityId.equals(level.getCityId())) {
            throw new BizException("等级不属于当前城市");
        }
        return level;
    }

    private void ensureLevelIdUnique(Long cityId, Integer levelId, Long excludeId) {
        LambdaQueryWrapper<RiderLevel> wrapper = new LambdaQueryWrapper<RiderLevel>()
                .eq(RiderLevel::getCityId, cityId)
                .eq(RiderLevel::getLevelId, levelId);
        if (excludeId != null) {
            wrapper.ne(RiderLevel::getId, excludeId);
        }
        Long exists = riderLevelMapper.selectCount(wrapper);
        if (exists != null && exists > 0) {
            throw new BizException("同城市下等级编号不能重复");
        }
    }

    private boolean hasDefault(Long cityId) {
        Long count = riderLevelMapper.selectCount(new LambdaQueryWrapper<RiderLevel>()
                .eq(RiderLevel::getCityId, cityId)
                .eq(RiderLevel::getIsDefault, 1));
        return count != null && count > 0;
    }

    private void validateCity(Long cityId) {
        if (cityId == null || cityId < 1) {
            throw new BizException("城市不能为空");
        }
    }

    private BigDecimal nvl(BigDecimal value) {
        return value == null ? BigDecimal.ZERO : value;
    }
}