Просмотр исходного кода

骑手新任务列表增加距商家距离过滤,阈值从字典获取

- PosOrderQsOprateController.orderList newTask 分支:骑手传经纬度时,从字典 sys_qs_newtask_distance 取距离上限(公里)转米,用 ST_Distance_Sphere 在 DB 端过滤距商家超过阈值的订单(PosOrder 经纬度=商家位置)
- 新增 getNewTaskDistanceLimit() 读字典,未配置/非法返回 null 不过滤,保持原行为
- updatesql/sql.md 增 sys_qs_newtask_distance 字典类型及默认值 30(公里) INSERT

Co-Authored-By: Claude <noreply@anthropic.com>
qmj 7 часов назад
Родитель
Сommit
1fec8f9c93

+ 23 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/order/PosOrderQsOprateController.java

@@ -15,6 +15,8 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.MessageUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.framework.manager.AsyncManager;
 import com.ruoyi.system.domain.InfoUser;
 import com.ruoyi.system.domain.PosOrder;
@@ -282,6 +284,20 @@ public class PosOrderQsOprateController extends BaseController {
         }
     }
 
+    /**
+     * newTask 距离上限(公里),从字典 sys_qs_newtask_distance 取;未配置/非法返回 null(不过滤)。
+     */
+    private Integer getNewTaskDistanceLimit() {
+        try {
+            List<SysDictData> list = DictUtils.getDictCache("sys_qs_newtask_distance");
+            if (list != null && !list.isEmpty()) {
+                return Integer.parseInt(list.get(0).getDictValue());
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
     /**
      * 骑手端订单列表(Tab分页)
      */
@@ -299,6 +315,13 @@ public class PosOrderQsOprateController extends BaseController {
             case "newTask":
                 wrapper.eq(PosOrder::getType, 0L).eq(PosOrder::getDeliveryStatus, 0L).eq(PosOrder::getState, 2L).eq(PosOrder::getAfterSaleStatus, 0L);
                 if (longitude != null && latitude != null) {
+                    // 距离上限(公里)从字典取,未配置则不过滤
+                    Integer limitKm = getNewTaskDistanceLimit();
+                    if (limitKm != null) {
+                        long limitMeters = limitKm.longValue() * 1000L;
+                        wrapper.apply("ST_Distance_Sphere(point(longitude, latitude), point({0}, {1})) <= {2}",
+                                longitude, latitude, limitMeters);
+                    }
                     wrapper.last("ORDER BY ST_Distance_Sphere(point(longitude, latitude), point(" + longitude + ", " + latitude + ")) ASC");
                 } else {
                     wrapper.orderByDesc(PosOrder::getCretim);

+ 11 - 0
updatesql/sql.md

@@ -462,3 +462,14 @@ CREATE TABLE info_user_oauth (
   KEY idx_user_id (user_id)
 ) COMMENT='三方账号绑定(Apple/Google/LINE)';
 ```
+
+## 2026-08-03 骑手 newTask 距离上限字典
+
+```sql
+-- 骑手 newTask 距离上限(PosOrderQsOprateController.orderList newTask 分支:距商家超过该值的订单不显示给骑手)
+INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
+VALUES ('骑手新任务距离上限', 'sys_qs_newtask_distance', '0', 'admin', NOW(), '骑手 newTask 列表只显示距商家该距离(公里)内的订单');
+
+INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
+VALUES (1, '30公里', '30', 'sys_qs_newtask_distance', '', 'default', 'Y', '0', 'admin', NOW(), '骑手新任务距商家距离上限(公里),超过不显示');
+```