sys.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { defineStore } from 'pinia'
  2. interface SysState {
  3. ScrollDown: boolean
  4. /**
  5. * 分类顶部激活id
  6. */
  7. topNavActive: string
  8. /**
  9. * 二级分类激活id
  10. */
  11. leftActive: string
  12. searchList: string[]
  13. /**
  14. * 回到顶部
  15. */
  16. backTop: boolean
  17. /**
  18. * 店铺名称
  19. */
  20. SelectShopInfo: Api.xsbShopList
  21. /**
  22. * 店铺列表
  23. */
  24. xsbShopList: Api.xsbShopList[]
  25. }
  26. export const useSysXsbStore = defineStore('system-xsb', {
  27. state: (): SysState => ({
  28. ScrollDown: false,
  29. topNavActive: '',
  30. leftActive: '',
  31. searchList: [],
  32. backTop: false,
  33. SelectShopInfo: { shopId: 0 },
  34. xsbShopList: [],
  35. }),
  36. actions: {
  37. getTabbarItemValue(name: string) {
  38. if (name === 'xsb-cart') {
  39. const { getTotalNum } = storeToRefs(useSmqjhCartStore())
  40. return getTotalNum.value
  41. }
  42. },
  43. async getAllShopList() {
  44. return new Promise((resolve, reject) => {
  45. Apis.xsb.shopList({}).then((res) => {
  46. this.xsbShopList = res.data
  47. const { Location } = storeToRefs(useAddressStore())
  48. if (Location.value.latitude == null || Location.value.longitude == null) {
  49. useAddressStore().getLocation()
  50. return
  51. }
  52. let minDistance = Infinity
  53. for (const shop of res.data) {
  54. if (shop.shopLat && shop.shopLng) {
  55. const distance = this.getDistance(
  56. Location.value.latitude,
  57. Location.value.longitude,
  58. Number(shop.shopLat),
  59. Number(shop.shopLng),
  60. )
  61. if (distance < minDistance) {
  62. minDistance = distance
  63. if (!this.SelectShopInfo) {
  64. this.SelectShopInfo = { ...shop, distance: Number(distance.toFixed(2)) }
  65. }
  66. }
  67. }
  68. }
  69. resolve(res)
  70. }).catch((err) => { reject(err) })
  71. })
  72. },
  73. /**
  74. * 计算距离
  75. * @param lat1
  76. * @param lng1
  77. * @param lat2
  78. * @param lng2
  79. * @returns 计算距离
  80. */
  81. getDistance(lat1: number, lng1: number, lat2: number, lng2: number) {
  82. const R = 6371 // 地球半径(公里)
  83. const dLat = (lat2 - lat1) * Math.PI / 180
  84. const dLng = (lng2 - lng1) * Math.PI / 180
  85. const a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
  86. + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180)
  87. * Math.sin(dLng / 2) * Math.sin(dLng / 2)
  88. const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
  89. return R * c // 距离(公里)
  90. },
  91. },
  92. })