Commit 5a1187de386e2733fa47b1186c6e5167737b884d

Authored by 蒋勇
1 parent a9f9dcb3

feat(rider): 更新骑手看板负载率计算逻辑

- 添加规则配置的最大接单量字段到AdminRiderDashboardVO
- 引入DispatchRuleService和DispatchRuleTemplateVO依赖
- 实现基于规则配置的最大接单量计算负载率功能
- 修改负载率计算方法参数结构
- 更新调试日志输出格式增加最大接单量信息
- 调整骑手看板数据查询逻辑以支持新的负载率计算方式
src/main/java/com/diligrp/rider/service/impl/RiderLocationServiceImpl.java
... ... @@ -6,14 +6,16 @@ import com.diligrp.rider.dto.LocationDTO;
6 6 import com.diligrp.rider.entity.Orders;
7 7 import com.diligrp.rider.entity.Rider;
8 8 import com.diligrp.rider.entity.RiderLocation;
  9 +import com.diligrp.rider.mapper.OrdersMapper;
9 10 import com.diligrp.rider.mapper.RiderLocationMapper;
10 11 import com.diligrp.rider.mapper.RiderMapper;
11   -import com.diligrp.rider.mapper.OrdersMapper;
12 12 import com.diligrp.rider.service.CityService;
  13 +import com.diligrp.rider.service.DispatchRuleService;
13 14 import com.diligrp.rider.service.RiderLocationService;
14 15 import com.diligrp.rider.util.GeoUtil;
15 16 import com.diligrp.rider.vo.AdminRiderDashboardVO;
16 17 import com.diligrp.rider.vo.AdminRiderLocationVO;
  18 +import com.diligrp.rider.vo.DispatchRuleTemplateVO;
17 19 import com.diligrp.rider.vo.NearbyRiderVO;
18 20 import com.diligrp.rider.websocket.LocationPushService;
19 21 import lombok.RequiredArgsConstructor;
... ... @@ -35,6 +37,7 @@ public class RiderLocationServiceImpl implements RiderLocationService {
35 37 private final RiderMapper riderMapper;
36 38 private final OrdersMapper ordersMapper;
37 39 private final CityService cityService;
  40 + private final DispatchRuleService dispatchRuleService;
38 41 private final LocationPushService locationPushService;
39 42  
40 43 /**
... ... @@ -143,6 +146,9 @@ public class RiderLocationServiceImpl implements RiderLocationService {
143 146 return result;
144 147 }
145 148  
  149 + DispatchRuleTemplateVO rule = dispatchRuleService.getActiveRule(cityId);
  150 + Integer maxHoldOrderCount = normalizeMaxHoldOrderCount(rule);
  151 +
146 152 List<Rider> riders = riderMapper.selectList(new LambdaQueryWrapper<Rider>()
147 153 .eq(Rider::getCityId, cityId)
148 154 .orderByDesc(Rider::getId));
... ... @@ -159,8 +165,8 @@ public class RiderLocationServiceImpl implements RiderLocationService {
159 165 .in(Orders::getStatus, List.of(3, 4))
160 166 .in(Orders::getRiderId, riderIds)
161 167 .eq(Orders::getIsDel, 0));
162   - log.debug("商铺骑手看板基础数据查询完成,cityId={} riderCount={} locationCount={} holdingOrderCount={}",
163   - cityId, riders.size(), locations.size(), holdingOrders.size());
  168 + log.debug("商铺骑手看板基础数据查询完成,cityId={} riderCount={} locationCount={} holdingOrderCount={} maxHoldOrderCount={}",
  169 + cityId, riders.size(), locations.size(), holdingOrders.size(), maxHoldOrderCount);
164 170  
165 171 java.util.Map<Long, RiderLocation> locationMap = new java.util.HashMap<>();
166 172 for (RiderLocation location : locations) {
... ... @@ -186,7 +192,8 @@ public class RiderLocationServiceImpl implements RiderLocationService {
186 192  
187 193 int holdOrderCount = holdCountMap.getOrDefault(rider.getId(), 0);
188 194 vo.setHoldOrderCount(holdOrderCount);
189   - vo.setLoadRate(calcLoadRate(rider, holdOrderCount));
  195 + vo.setMaxHoldOrderCount(maxHoldOrderCount);
  196 + vo.setLoadRate(calcLoadRate(holdOrderCount, maxHoldOrderCount));
190 197  
191 198 RiderLocation location = locationMap.get(rider.getId());
192 199 if (location != null) {
... ... @@ -283,12 +290,18 @@ public class RiderLocationServiceImpl implements RiderLocationService {
283 290 return "在线";
284 291 }
285 292  
286   - private int calcLoadRate(Rider rider, int holdOrderCount) {
287   - int maxHoldCount = rider.getType() != null && rider.getType() == 2 ? 4 : 2;
288   - if (maxHoldCount <= 0) {
289   - return 0;
  293 + private Integer normalizeMaxHoldOrderCount(DispatchRuleTemplateVO rule) {
  294 + if (rule == null || rule.getGrabMaxPerRider() == null || rule.getGrabMaxPerRider() <= 0) {
  295 + return null;
  296 + }
  297 + return rule.getGrabMaxPerRider();
  298 + }
  299 +
  300 + private Integer calcLoadRate(int holdOrderCount, Integer maxHoldOrderCount) {
  301 + if (maxHoldOrderCount == null || maxHoldOrderCount <= 0) {
  302 + return null;
290 303 }
291   - int rate = holdOrderCount * 100 / maxHoldCount;
  304 + int rate = holdOrderCount * 100 / maxHoldOrderCount;
292 305 return Math.min(rate, 100);
293 306 }
294 307 }
... ...
src/main/java/com/diligrp/rider/vo/AdminRiderDashboardVO.java
... ... @@ -21,7 +21,10 @@ public class AdminRiderDashboardVO {
21 21 /** 当前持单量 */
22 22 private Integer holdOrderCount;
23 23  
24   - /** 当前负载率,单位百分比 */
  24 + /** 规则配置的最大接单量 */
  25 + private Integer maxHoldOrderCount;
  26 +
  27 + /** 当前负载率,按持单量/规则最大接单量计算,单位百分比 */
25 28 private Integer loadRate;
26 29  
27 30 /** 最后定位时间,时间戳秒 */
... ...