RiderHoldLimitServiceImpl.java 2.86 KB
package com.diligrp.rider.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.diligrp.rider.common.exception.BizException;
import com.diligrp.rider.entity.Orders;
import com.diligrp.rider.entity.Rider;
import com.diligrp.rider.mapper.OrdersMapper;
import com.diligrp.rider.service.RiderHoldLimitService;
import com.diligrp.rider.vo.DispatchRuleTemplateVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@RequiredArgsConstructor
public class RiderHoldLimitServiceImpl implements RiderHoldLimitService {

    private final OrdersMapper ordersMapper;

    @Override
    public int countCurrentLoad(Long riderId) {
        if (riderId == null || riderId < 1) {
            return 0;
        }
        return Math.toIntExact(ordersMapper.selectCount(new LambdaQueryWrapper<Orders>()
                .eq(Orders::getRiderId, riderId)
                .eq(Orders::getIsDel, 0)
                .in(Orders::getStatus, List.of(3, 4))));
    }

    @Override
    public Map<Long, Integer> getCurrentLoadMap(List<Long> riderIds) {
        Map<Long, Integer> map = new HashMap<>();
        if (riderIds == null || riderIds.isEmpty()) {
            return map;
        }
        List<Orders> inProgress = ordersMapper.selectList(new LambdaQueryWrapper<Orders>()
                .in(Orders::getRiderId, riderIds)
                .eq(Orders::getIsDel, 0)
                .in(Orders::getStatus, List.of(3, 4))
                .select(Orders::getRiderId));
        for (Orders order : inProgress) {
            map.merge(order.getRiderId(), 1, Integer::sum);
        }
        return map;
    }

    @Override
    public Integer resolveHoldOrderLimit(Rider rider) {
        if (rider == null || rider.getHoldOrderLimit() == null || rider.getHoldOrderLimit() <= 0) {
            return null;
        }
        return rider.getHoldOrderLimit();
    }

    @Override
    public Integer resolveGrabLimit(Rider rider, DispatchRuleTemplateVO rule) {
        Integer personalLimit = resolveHoldOrderLimit(rider);
        Integer templateLimit = null;
        if (rule != null && rule.getGrabEnabled() != null && rule.getGrabEnabled() == 1
                && rule.getGrabMaxPerRider() != null && rule.getGrabMaxPerRider() > 0) {
            templateLimit = rule.getGrabMaxPerRider();
        }
        if (personalLimit == null) {
            return templateLimit;
        }
        if (templateLimit == null) {
            return personalLimit;
        }
        return Math.min(personalLimit, templateLimit);
    }

    @Override
    public void assertWithinLimit(Long riderId, Integer limit, String message) {
        if (limit == null) {
            return;
        }
        if (countCurrentLoad(riderId) >= limit) {
            throw new BizException(message);
        }
    }
}