diff --git a/src/components/address-map-picker/main.vue b/src/components/address-map-picker/main.vue index 3e14d8a..85fcef8 100644 --- a/src/components/address-map-picker/main.vue +++ b/src/components/address-map-picker/main.vue @@ -27,8 +27,6 @@ import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search'; const AMAP_KEY = '13dcb15bc29bfe9c432d17ecd808b812'; -/** 地点搜索 v5/place/text 使用「Web 服务」类型 Key,由业务自行填写 */ -const AMAP_WEB_KEY = 'b43016a0d1f5b0c32211560392059708'; const AMAP_SECURITY_CODE = 'f9d036ef29e376e15d309e0de5c0f7ab'; let amapLoader; @@ -222,15 +220,11 @@ export default { this.$message.warning('请输入地址关键词'); return; } - if (!AMAP_WEB_KEY) { - this.$message.warning('请先配置高德 Web 服务 Key'); - return; - } if (this.searching) return; this.searchResults = []; this.searching = true; this.initMap() - .then(map => (map ? searchAmapPlaceText(keyword, { key: AMAP_WEB_KEY }) : null)) + .then(map => (map ? searchAmapPlaceText(keyword) : null)) .then(pois => { if (!pois) return; this.searchResults = normalizeMapSearchResults(pois, keyword); diff --git a/src/utils/map-search.js b/src/utils/map-search.js index 5a86624..09d1c4e 100644 --- a/src/utils/map-search.js +++ b/src/utils/map-search.js @@ -1,12 +1,15 @@ +/** 地点搜索 v5/place/text 使用的「Web 服务」类型 Key */ +export const AMAP_WEB_SERVICE_KEY = 'b43016a0d1f5b0c32211560392059708'; + /** * 高德地点关键词搜索(Web 服务 v5)。 * @see https://restapi.amap.com/v5/place/text * @param {string} keyword 地点关键字 - * @param {{ key: string, pageSize?: number, pageNum?: number, region?: string, cityLimit?: boolean }} options + * @param {{ key?: string, pageSize?: number, pageNum?: number, region?: string, cityLimit?: boolean }} options * @returns {Promise} */ export function searchAmapPlaceText(keyword, options = {}) { - const key = options.key; + const key = options.key || AMAP_WEB_SERVICE_KEY; const pageSize = options.pageSize || 20; const pageNum = options.pageNum || 1; if (!key) { diff --git a/src/views/base/common-address.vue b/src/views/base/common-address.vue index d182b28..4e8bf0b 100644 --- a/src/views/base/common-address.vue +++ b/src/views/base/common-address.vue @@ -270,7 +270,7 @@ import { createOption } from '@/option/base/common-address'; import { mapGetters } from 'vuex'; import { downloadXls } from '@/utils/util'; import { getToken } from '@/utils/auth'; -import { normalizeMapSearchResults } from '@/utils/map-search'; +import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search'; import { isMobile } from '@/utils/validate'; import NProgress from 'nprogress'; import 'nprogress/nprogress.css'; @@ -1112,31 +1112,32 @@ export default { this.$message.warning('请输入地址关键词'); return; } + if (this.mapLoading) return; + this.mapSearchResults = []; + this.mapLoading = true; this.loadAmap() - .then(() => { - this.mapLoading = true; - this.ensureAmapGeocoder() - .then(() => this.runAmapGeocode('location', keyword)) - .then(result => { - this.mapSearchResults = normalizeMapSearchResults(result, keyword); - const point = this.resolveMapPoint(result); - if (!point) { - this.mapStatus = '未找到匹配地址'; - this.$message.warning('地图搜索无匹配地址'); - return; - } - this.pickMapPoint(point, keyword); - }) - .catch(() => { - this.mapStatus = '地图搜索失败'; - this.$message.error('地图搜索失败,请稍后重试'); - }) - .finally(() => { - this.mapLoading = false; - }); + .then(() => searchAmapPlaceText(keyword)) + .then(pois => { + this.mapSearchResults = normalizeMapSearchResults(pois, keyword); + const first = this.mapSearchResults[0]; + if (!first?.location) { + this.mapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); + return; + } + return this.$nextTick().then(() => { + if (typeof this.amap?.resize === 'function') { + this.amap.resize(); + } + this.pickMapPoint(first.location, first.address || first.name || keyword); + }); }) .catch(() => { - this.$message.error('高德地图组件加载失败,请稍后重试或重新打开弹窗'); + this.mapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); + }) + .finally(() => { + this.mapLoading = false; }); }, selectMapSearchResult(item) { diff --git a/src/views/business/common-route.vue b/src/views/business/common-route.vue index 54fe158..9114d89 100644 --- a/src/views/business/common-route.vue +++ b/src/views/business/common-route.vue @@ -323,7 +323,7 @@ import { addressTypeOptions } from '@/option/base/common-address'; import { config, excelOption, option } from '@/option/business/common-route'; import { getToken } from '@/utils/auth'; import { openImportDialog } from '@/utils/import-excel'; -import { normalizeMapSearchResults } from '@/utils/map-search'; +import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search'; import { downloadXls } from '@/utils/util'; import { isMobile } from '@/utils/validate'; import { List, Search } from '@element-plus/icons-vue'; @@ -610,25 +610,29 @@ export default { this.$message.warning('请输入地址关键词'); return; } + if (this.routeMapLoading) return; + this.routeMapSearchResults = []; + this.routeMapLoading = true; this.loadAmap() - .then(() => { - this.routeMapLoading = true; - return this.ensureRouteAmapGeocoder(); - }) - .then(() => this.runAmapGeocode('location', keyword)) - .then(result => { - this.routeMapSearchResults = normalizeMapSearchResults(result, keyword); - const point = this.resolveMapPoint(result); - if (!point) { + .then(() => searchAmapPlaceText(keyword)) + .then(pois => { + this.routeMapSearchResults = normalizeMapSearchResults(pois, keyword); + const first = this.routeMapSearchResults[0]; + if (!first?.location) { this.routeMapStatus = '未找到匹配地址'; this.$message.warning('地图搜索无匹配地址'); return; } - this.pickRouteMapPoint(point, keyword); + return this.$nextTick().then(() => { + if (typeof this.routeAmap?.resize === 'function') { + this.routeAmap.resize(); + } + this.pickRouteMapPoint(first.location, first.address || first.name || keyword); + }); }) .catch(() => { - this.routeMapStatus = '地图搜索失败'; - this.$message.error('地图搜索失败,请稍后重试'); + this.routeMapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); }) .finally(() => { this.routeMapLoading = false; diff --git a/src/views/business/components/business-crud-page.vue b/src/views/business/components/business-crud-page.vue index 9378460..c0662dc 100644 --- a/src/views/business/components/business-crud-page.vue +++ b/src/views/business/components/business-crud-page.vue @@ -5243,7 +5243,7 @@ import { packageOptions } from '@/option/business/common'; import { formatUpdateUserName } from '@/utils/audit'; import { getToken } from '@/utils/auth'; import { openImportDialog } from '@/utils/import-excel'; -import { normalizeMapSearchResults } from '@/utils/map-search'; +import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search'; import { applyTableMenuWidth } from '@/utils/table-menu'; import { downloadFileByUrl, downloadXls } from '@/utils/util'; import { isMobile } from '@/utils/validate'; @@ -10214,31 +10214,32 @@ export default { this.$message.warning('请输入地址关键词'); return; } + if (this.transportMapLoading) return; + this.transportMapSearchResults = []; + this.transportMapLoading = true; this.loadAmap() - .then(() => { - this.transportMapLoading = true; - this.ensureTransportAmapGeocoder() - .then(() => this.runAmapGeocode('location', keyword)) - .then(result => { - this.transportMapSearchResults = normalizeMapSearchResults(result, keyword); - const point = this.resolveMapPoint(result); - if (!point) { - this.transportMapStatus = '未找到匹配地址'; - this.$message.warning('地图搜索无匹配地址'); - return; - } - this.pickTransportMapPoint(point, keyword); - }) - .catch(() => { - this.transportMapStatus = '地图搜索失败'; - this.$message.error('地图搜索失败,请稍后重试'); - }) - .finally(() => { - this.transportMapLoading = false; - }); + .then(() => searchAmapPlaceText(keyword)) + .then(pois => { + this.transportMapSearchResults = normalizeMapSearchResults(pois, keyword); + const first = this.transportMapSearchResults[0]; + if (!first?.location) { + this.transportMapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); + return; + } + return this.$nextTick().then(() => { + if (typeof this.transportAmap?.resize === 'function') { + this.transportAmap.resize(); + } + this.pickTransportMapPoint(first.location, first.address || first.name || keyword); + }); }) .catch(() => { - this.$message.error('高德地图组件加载失败,请稍后重试或重新打开弹窗'); + this.transportMapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); + }) + .finally(() => { + this.transportMapLoading = false; }); }, selectTransportMapSearchResult(item) { diff --git a/src/views/business/components/master-order-editor.vue b/src/views/business/components/master-order-editor.vue index 9bcff97..c9a82fd 100644 --- a/src/views/business/components/master-order-editor.vue +++ b/src/views/business/components/master-order-editor.vue @@ -612,7 +612,7 @@ let amapLoader; import { getList as getCommonRouteList } from '@/api/business/common-route'; import * as api from '@/api/business/master-order'; import { formatUpdateUserName } from '@/utils/audit'; -import { normalizeMapSearchResults } from '@/utils/map-search'; +import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search'; import { isMobile } from '@/utils/validate'; export default { components: { @@ -1313,24 +1313,31 @@ export default { .catch(() => this.$message.error('高德地图组件加载失败')); }, searchAddressMap() { - if (!this.mapKeyword.trim()) return this.$message.warning('请输入地址关键词'); + const keyword = String(this.mapKeyword || '').trim(); + if (!keyword) return this.$message.warning('请输入地址关键词'); + if (this.mapLoading) return; + this.mapSearchResults = []; + this.mapLoading = true; this.loadAmap() - .then(() => this.ensureAddressGeocoder()) - .then( - () => - new Promise((resolve, reject) => - this.addressMapGeocoder.getLocation(this.mapKeyword, (status, result) => - status === 'complete' ? resolve(result) : reject(result) - ) - ) - ) - .then(result => { - this.mapSearchResults = normalizeMapSearchResults(result, this.mapKeyword); - const point = this.mapSearchResults[0]?.location; - if (!point) return this.$message.warning('地图搜索无匹配地址'); - this.pickAddressMap(point, this.mapKeyword); + .then(() => searchAmapPlaceText(keyword)) + .then(pois => { + this.mapSearchResults = normalizeMapSearchResults(pois, keyword); + const first = this.mapSearchResults[0]; + if (!first?.location) { + this.mapStatus = '未找到匹配地址'; + return this.$message.warning('地图搜索无匹配地址'); + } + return this.$nextTick().then(() => { + this.pickAddressMap(first.location, first.address || first.name || keyword); + }); }) - .catch(() => this.$message.error('地图搜索失败')); + .catch(() => { + this.mapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); + }) + .finally(() => { + this.mapLoading = false; + }); }, selectAddressMapSearchResult(item) { if (item && item.location) { diff --git a/src/views/business/components/shipping-template-page.vue b/src/views/business/components/shipping-template-page.vue index dcc7b72..cb5c60c 100644 --- a/src/views/business/components/shipping-template-page.vue +++ b/src/views/business/components/shipping-template-page.vue @@ -1098,7 +1098,7 @@ import { import { getDictionary as getSystemDictionary } from '@/api/system/dict'; import { getDictionary } from '@/api/system/dictbiz'; import { packageOptions } from '@/option/business/common'; -import { normalizeMapSearchResults } from '@/utils/map-search'; +import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search'; import { downloadFileByUrl, downloadXls } from '@/utils/util'; import { isMobile } from '@/utils/validate'; import { Location } from '@element-plus/icons-vue'; @@ -2611,21 +2611,22 @@ export default { searchTransportMapKeyword() { const keyword = String(this.transportMapKeyword || '').trim(); if (!keyword) return this.$message.warning('请输入地址关键词'); + if (this.transportMapLoading) return; + this.transportMapSearchResults = []; this.transportMapLoading = true; this.loadAmap() - .then(() => this.ensureTransportMapGeocoder()) - .then(() => this.runTransportMapGeocode('location', keyword)) - .then(result => { - this.transportMapSearchResults = normalizeMapSearchResults(result, keyword); - const point = this.resolveTransportMapPoint(result); - if (!point) throw new Error('未找到匹配地址'); + .then(() => searchAmapPlaceText(keyword)) + .then(pois => { + this.transportMapSearchResults = normalizeMapSearchResults(pois, keyword); + const first = this.transportMapSearchResults[0]; + if (!first?.location) throw new Error('未找到匹配地址'); return this.$nextTick().then(() => { this.transportMapInstance?.resize(); - return this.pickMapPoint(point, keyword); + return this.pickMapPoint(first.location, first.address || first.name || keyword); }); }) .catch(() => { - this.transportMapStatus = '地图搜索失败'; + this.transportMapStatus = '未找到匹配地址'; this.$message.warning('地图搜索无匹配地址'); }) .finally(() => { diff --git a/src/views/business/components/transport-plan-page.vue b/src/views/business/components/transport-plan-page.vue index d9ac8ff..da90dee 100644 --- a/src/views/business/components/transport-plan-page.vue +++ b/src/views/business/components/transport-plan-page.vue @@ -2741,7 +2741,7 @@ import { addressTypeOptions } from '@/option/base/common-address'; import { packageOptions } from '@/option/business/common'; import { formatUpdateUserName } from '@/utils/audit'; import { getToken } from '@/utils/auth'; -import { normalizeMapSearchResults } from '@/utils/map-search'; +import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search'; import { applyTableMenuWidth } from '@/utils/table-menu'; import { downloadFileByUrl, downloadXls } from '@/utils/util'; import { isMobile } from '@/utils/validate'; @@ -5771,31 +5771,32 @@ export default { this.$message.warning('请输入地址关键词'); return; } + if (this.transportMapLoading) return; + this.transportMapSearchResults = []; + this.transportMapLoading = true; this.loadAmap() - .then(() => { - this.transportMapLoading = true; - this.ensureTransportAmapGeocoder() - .then(() => this.runAmapGeocode('location', keyword)) - .then(result => { - this.transportMapSearchResults = normalizeMapSearchResults(result, keyword); - const point = this.resolveMapPoint(result); - if (!point) { - this.transportMapStatus = '未找到匹配地址'; - this.$message.warning('地图搜索无匹配地址'); - return; - } - this.pickTransportMapPoint(point, keyword); - }) - .catch(() => { - this.transportMapStatus = '地图搜索失败'; - this.$message.error('地图搜索失败,请稍后重试'); - }) - .finally(() => { - this.transportMapLoading = false; - }); + .then(() => searchAmapPlaceText(keyword)) + .then(pois => { + this.transportMapSearchResults = normalizeMapSearchResults(pois, keyword); + const first = this.transportMapSearchResults[0]; + if (!first?.location) { + this.transportMapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); + return; + } + return this.$nextTick().then(() => { + if (typeof this.transportAmap?.resize === 'function') { + this.transportAmap.resize(); + } + this.pickTransportMapPoint(first.location, first.address || first.name || keyword); + }); }) .catch(() => { - this.$message.error('高德地图组件加载失败,请稍后重试或重新打开弹窗'); + this.transportMapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); + }) + .finally(() => { + this.transportMapLoading = false; }); }, selectTransportMapSearchResult(item) { diff --git a/src/views/business/components/waybill-manage-page.vue b/src/views/business/components/waybill-manage-page.vue index f1226b6..ed1bd0e 100644 --- a/src/views/business/components/waybill-manage-page.vue +++ b/src/views/business/components/waybill-manage-page.vue @@ -3101,7 +3101,7 @@ import { formatUpdateUserName } from '@/utils/audit'; import { submitMkApprovalFlow } from '@/utils/mk-approval'; import { getToken } from '@/utils/auth'; import { openImportDialog } from '@/utils/import-excel'; -import { normalizeMapSearchResults } from '@/utils/map-search'; +import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search'; import { applyTableMenuWidth } from '@/utils/table-menu'; import { downloadFileByUrl, downloadXls } from '@/utils/util'; import { isMobile } from '@/utils/validate'; @@ -7965,31 +7965,32 @@ export default { this.$message.warning('请输入地址关键词'); return; } + if (this.transportMapLoading) return; + this.transportMapSearchResults = []; + this.transportMapLoading = true; this.loadAmap() - .then(() => { - this.transportMapLoading = true; - this.ensureTransportAmapGeocoder() - .then(() => this.runAmapGeocode('location', keyword)) - .then(result => { - this.transportMapSearchResults = normalizeMapSearchResults(result, keyword); - const point = this.resolveMapPoint(result); - if (!point) { - this.transportMapStatus = '未找到匹配地址'; - this.$message.warning('地图搜索无匹配地址'); - return; - } - this.pickTransportMapPoint(point, keyword); - }) - .catch(() => { - this.transportMapStatus = '地图搜索失败'; - this.$message.error('地图搜索失败,请稍后重试'); - }) - .finally(() => { - this.transportMapLoading = false; - }); + .then(() => searchAmapPlaceText(keyword)) + .then(pois => { + this.transportMapSearchResults = normalizeMapSearchResults(pois, keyword); + const first = this.transportMapSearchResults[0]; + if (!first?.location) { + this.transportMapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); + return; + } + return this.$nextTick().then(() => { + if (typeof this.transportAmap?.resize === 'function') { + this.transportAmap.resize(); + } + this.pickTransportMapPoint(first.location, first.address || first.name || keyword); + }); }) .catch(() => { - this.$message.error('高德地图组件加载失败,请稍后重试或重新打开弹窗'); + this.transportMapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); + }) + .finally(() => { + this.transportMapLoading = false; }); }, selectTransportMapSearchResult(item) { diff --git a/src/views/business/loading-manage.vue b/src/views/business/loading-manage.vue index 963f0e5..35085f3 100644 --- a/src/views/business/loading-manage.vue +++ b/src/views/business/loading-manage.vue @@ -1727,7 +1727,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'; import { Location, Rank, Refresh, Search, Setting } from '@element-plus/icons-vue'; import dayjs from 'dayjs'; import { isMobile } from '@/utils/validate'; -import { normalizeMapSearchResults } from '@/utils/map-search'; +import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search'; const defaultTransportType = ''; const defaultCandidateTransportType = ''; @@ -3390,31 +3390,26 @@ export default { ElMessage.warning('请输入地址关键词'); return; } + if (this.routeChangeMapLoading) return; + this.routeChangeMapSearchResults = []; this.routeChangeMapLoading = true; this.loadDetailAmap() - .then(() => this.ensureRouteChangeMapGeocoder()) - .then( - () => - new Promise((resolve, reject) => { - this.routeChangeMapGeocoder.getLocation(keyword, (status, result) => { - if (status === 'complete') resolve(result); - else reject(result); - }); - }) - ) - .then(result => { - this.routeChangeMapSearchResults = normalizeMapSearchResults(result, keyword); - const point = this.routeChangeMapSearchResults[0]?.location; - if (!point) { + .then(() => searchAmapPlaceText(keyword)) + .then(pois => { + this.routeChangeMapSearchResults = normalizeMapSearchResults(pois, keyword); + const first = this.routeChangeMapSearchResults[0]; + if (!first?.location) { this.routeChangeMapStatus = '未找到匹配地址'; ElMessage.warning('地图搜索无匹配地址'); return; } - this.pickRouteChangeMap(point, keyword); + return this.$nextTick().then(() => { + this.pickRouteChangeMap(first.location, first.address || first.name || keyword); + }); }) .catch(() => { - this.routeChangeMapStatus = '地图搜索失败'; - ElMessage.error('地图搜索失败'); + this.routeChangeMapStatus = '未找到匹配地址'; + ElMessage.warning('地图搜索无匹配地址'); }) .finally(() => { this.routeChangeMapLoading = false;