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,14 +6,16 @@ import com.diligrp.rider.dto.LocationDTO;
6 import com.diligrp.rider.entity.Orders; 6 import com.diligrp.rider.entity.Orders;
7 import com.diligrp.rider.entity.Rider; 7 import com.diligrp.rider.entity.Rider;
8 import com.diligrp.rider.entity.RiderLocation; 8 import com.diligrp.rider.entity.RiderLocation;
  9 +import com.diligrp.rider.mapper.OrdersMapper;
9 import com.diligrp.rider.mapper.RiderLocationMapper; 10 import com.diligrp.rider.mapper.RiderLocationMapper;
10 import com.diligrp.rider.mapper.RiderMapper; 11 import com.diligrp.rider.mapper.RiderMapper;
11 -import com.diligrp.rider.mapper.OrdersMapper;  
12 import com.diligrp.rider.service.CityService; 12 import com.diligrp.rider.service.CityService;
  13 +import com.diligrp.rider.service.DispatchRuleService;
13 import com.diligrp.rider.service.RiderLocationService; 14 import com.diligrp.rider.service.RiderLocationService;
14 import com.diligrp.rider.util.GeoUtil; 15 import com.diligrp.rider.util.GeoUtil;
15 import com.diligrp.rider.vo.AdminRiderDashboardVO; 16 import com.diligrp.rider.vo.AdminRiderDashboardVO;
16 import com.diligrp.rider.vo.AdminRiderLocationVO; 17 import com.diligrp.rider.vo.AdminRiderLocationVO;
  18 +import com.diligrp.rider.vo.DispatchRuleTemplateVO;
17 import com.diligrp.rider.vo.NearbyRiderVO; 19 import com.diligrp.rider.vo.NearbyRiderVO;
18 import com.diligrp.rider.websocket.LocationPushService; 20 import com.diligrp.rider.websocket.LocationPushService;
19 import lombok.RequiredArgsConstructor; 21 import lombok.RequiredArgsConstructor;
@@ -35,6 +37,7 @@ public class RiderLocationServiceImpl implements RiderLocationService { @@ -35,6 +37,7 @@ public class RiderLocationServiceImpl implements RiderLocationService {
35 private final RiderMapper riderMapper; 37 private final RiderMapper riderMapper;
36 private final OrdersMapper ordersMapper; 38 private final OrdersMapper ordersMapper;
37 private final CityService cityService; 39 private final CityService cityService;
  40 + private final DispatchRuleService dispatchRuleService;
38 private final LocationPushService locationPushService; 41 private final LocationPushService locationPushService;
39 42
40 /** 43 /**
@@ -143,6 +146,9 @@ public class RiderLocationServiceImpl implements RiderLocationService { @@ -143,6 +146,9 @@ public class RiderLocationServiceImpl implements RiderLocationService {
143 return result; 146 return result;
144 } 147 }
145 148
  149 + DispatchRuleTemplateVO rule = dispatchRuleService.getActiveRule(cityId);
  150 + Integer maxHoldOrderCount = normalizeMaxHoldOrderCount(rule);
  151 +
146 List<Rider> riders = riderMapper.selectList(new LambdaQueryWrapper<Rider>() 152 List<Rider> riders = riderMapper.selectList(new LambdaQueryWrapper<Rider>()
147 .eq(Rider::getCityId, cityId) 153 .eq(Rider::getCityId, cityId)
148 .orderByDesc(Rider::getId)); 154 .orderByDesc(Rider::getId));
@@ -159,8 +165,8 @@ public class RiderLocationServiceImpl implements RiderLocationService { @@ -159,8 +165,8 @@ public class RiderLocationServiceImpl implements RiderLocationService {
159 .in(Orders::getStatus, List.of(3, 4)) 165 .in(Orders::getStatus, List.of(3, 4))
160 .in(Orders::getRiderId, riderIds) 166 .in(Orders::getRiderId, riderIds)
161 .eq(Orders::getIsDel, 0)); 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 java.util.Map<Long, RiderLocation> locationMap = new java.util.HashMap<>(); 171 java.util.Map<Long, RiderLocation> locationMap = new java.util.HashMap<>();
166 for (RiderLocation location : locations) { 172 for (RiderLocation location : locations) {
@@ -186,7 +192,8 @@ public class RiderLocationServiceImpl implements RiderLocationService { @@ -186,7 +192,8 @@ public class RiderLocationServiceImpl implements RiderLocationService {
186 192
187 int holdOrderCount = holdCountMap.getOrDefault(rider.getId(), 0); 193 int holdOrderCount = holdCountMap.getOrDefault(rider.getId(), 0);
188 vo.setHoldOrderCount(holdOrderCount); 194 vo.setHoldOrderCount(holdOrderCount);
189 - vo.setLoadRate(calcLoadRate(rider, holdOrderCount)); 195 + vo.setMaxHoldOrderCount(maxHoldOrderCount);
  196 + vo.setLoadRate(calcLoadRate(holdOrderCount, maxHoldOrderCount));
190 197
191 RiderLocation location = locationMap.get(rider.getId()); 198 RiderLocation location = locationMap.get(rider.getId());
192 if (location != null) { 199 if (location != null) {
@@ -283,12 +290,18 @@ public class RiderLocationServiceImpl implements RiderLocationService { @@ -283,12 +290,18 @@ public class RiderLocationServiceImpl implements RiderLocationService {
283 return "在线"; 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 return Math.min(rate, 100); 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,7 +21,10 @@ public class AdminRiderDashboardVO {
21 /** 当前持单量 */ 21 /** 当前持单量 */
22 private Integer holdOrderCount; 22 private Integer holdOrderCount;
23 23
24 - /** 当前负载率,单位百分比 */ 24 + /** 规则配置的最大接单量 */
  25 + private Integer maxHoldOrderCount;
  26 +
  27 + /** 当前负载率,按持单量/规则最大接单量计算,单位百分比 */
25 private Integer loadRate; 28 private Integer loadRate;
26 29
27 /** 最后定位时间,时间戳秒 */ 30 /** 最后定位时间,时间戳秒 */