feat(lbs): 真实距离与按距离派单落地
- 数据库:orders/activities 新增 latitude/longitude(含存量表 ALTER 迁移) - 服务端:Haversine 计算 distanceKm/distanceText,派单池支持 lat/lng/radius 过滤并按距离升序;历史无坐标订单用腾讯地理编码兜底并回写缓存 - 新增 /api/lbs/reverse 逆地址解析(Key 仅服务端持有,登录 + 限流) - 小程序:雷达/接单大厅改用真实定位与真实距离,删除全部写死演示距离;下单页新增地图选点,组局页保存选点经纬度 - 修复接单大厅点接单会新建订单的问题,改为真正 claimOrder 认领 - 新增 lbs-distance 护栏(110 套件/729 用例全绿)
这个提交包含在:
@@ -87,6 +87,8 @@ export async function createActivity(payload) {
|
||||
title: payload.title,
|
||||
gameCategory: payload.game || payload.gameCategory || '美食陪吃',
|
||||
location: payload.location,
|
||||
latitude: payload.latitude,
|
||||
longitude: payload.longitude,
|
||||
startTime: payload.startTime,
|
||||
payType: payload.payType === 'AA' ? 1 : 2,
|
||||
totalFeeCents: Math.round((Number(payload.totalFee) || 0) * 100),
|
||||
@@ -684,16 +686,38 @@ export async function getUserFinanceRecords(userId) {
|
||||
/**
|
||||
* 获取可抢订单池 (真实读取 MySQL orders 待接单列表)
|
||||
*/
|
||||
export async function getOrdersPool() {
|
||||
export async function getOrdersPool(options = {}) {
|
||||
try {
|
||||
const res = await http.get('/orders/pool');
|
||||
if (Array.isArray(res) && res.length > 0) {
|
||||
const lat = Number(options.lat);
|
||||
const lng = Number(options.lng);
|
||||
const radius = Number(options.radius);
|
||||
const qs = [];
|
||||
if (Number.isFinite(lat) && Number.isFinite(lng) && !(lat === 0 && lng === 0)) {
|
||||
qs.push(`lat=${lat}`, `lng=${lng}`);
|
||||
if (Number.isFinite(radius) && radius > 0) qs.push(`radius=${radius}`);
|
||||
}
|
||||
const res = await http.get(`/orders/pool${qs.length ? `?${qs.join('&')}` : ''}`);
|
||||
if (Array.isArray(res)) {
|
||||
return res;
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn('[API] 获取可抢订单池异常:', err.message);
|
||||
throw err;
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* 坐标反查行政区/地址(雷达顶部定位文案)
|
||||
*/
|
||||
export async function reverseGeocode(latitude, longitude) {
|
||||
try {
|
||||
const res = await http.get(`/lbs/reverse?lat=${Number(latitude)}&lng=${Number(longitude)}`);
|
||||
return res || null;
|
||||
} catch (err) {
|
||||
console.warn('[API] 逆地址解析异常:', err.message);
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
在新工单中引用
屏蔽一个用户