RiderHoldLimitServiceImpl.java
2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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);
}
}
}