feat(lbs): 真实距离与按距离派单落地

- 数据库:orders/activities 新增 latitude/longitude(含存量表 ALTER 迁移)

- 服务端:Haversine 计算 distanceKm/distanceText,派单池支持 lat/lng/radius 过滤并按距离升序;历史无坐标订单用腾讯地理编码兜底并回写缓存

- 新增 /api/lbs/reverse 逆地址解析(Key 仅服务端持有,登录 + 限流)

- 小程序:雷达/接单大厅改用真实定位与真实距离,删除全部写死演示距离;下单页新增地图选点,组局页保存选点经纬度

- 修复接单大厅点接单会新建订单的问题,改为真正 claimOrder 认领

- 新增 lbs-distance 护栏(110 套件/729 用例全绿)
这个提交包含在:
xcbyy
2026-10-21 14:29:33 +08:00
父节点 ecc4a116c4
当前提交 68e41ca962
共有 10 个文件被更改,包括 584 次插入 和 235 次删除

查看文件

@@ -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;
}
/**