Commit 5a1187de386e2733fa47b1186c6e5167737b884d
1 parent
a9f9dcb3
feat(rider): 更新骑手看板负载率计算逻辑
- 添加规则配置的最大接单量字段到AdminRiderDashboardVO - 引入DispatchRuleService和DispatchRuleTemplateVO依赖 - 实现基于规则配置的最大接单量计算负载率功能 - 修改负载率计算方法参数结构 - 更新调试日志输出格式增加最大接单量信息 - 调整骑手看板数据查询逻辑以支持新的负载率计算方式
Showing
2 changed files
with
26 additions
and
10 deletions
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 | /** 最后定位时间,时间戳秒 */ |