千目品牌领券机
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

50 lines
1.4 KiB

import { axios } from "./libs";
let cities = [];
const cityIndexMap = { 广州市: "G", 南京市: "N" };
const init = async () => {
const [malls] = await Promise.all([axios.get("/Api/Coupon/MallList")]);
cities = Object.values(
malls.reduce((acc, nxt) => {
const mall = {
name: nxt.name,
code: nxt.mallCode,
};
if (acc[nxt.areaName]) {
acc[nxt.areaName].malls.push(mall);
} else
acc[nxt.areaName] = {
name: nxt.areaName,
malls: [mall],
index: cityIndexMap[nxt.areaName],
};
return acc;
}, {})
);
cities.sort((a, b) => a.index.charCodeAt(0) - b.index.charCodeAt(0));
};
export const getCities = async () => {
if (!cities.length) {
await init();
return cities;
} else return cities;
};
const toRadians = (lonlat) => (lonlat / 180) * Math.PI;
const ToDigits = (radian) => (radian / Math.PI) * 180;
const R = 6371;
const r = 50;
const offset = Math.asin(r / 2 / R) * 2;
const getRestrict = (lon, lat) => {
const lonR = toRadians(lon);
const latR = toRadians(lat);
return [lonR - offset, lonR + offset, latR - offset, latR + offset].map(
ToDigits
);
};
const getMall = ([minLon, maxLon, minLat, maxLat]) =>
new Promise((resolve) => {});
export const getNearMall = async ({ longitude, latitude }) => {
const restrict = getRestrict(longitude, latitude);
return (await getCities())[0];
};