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 | 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 | /** 最后定位时间,时间戳秒 */ | ... | ... |