From d1baa3427d3f6598b5fdbb85ef9db68c6de124d5 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期五, 06 十一月 2026 16:46:47 +0800
Subject: [PATCH] fix(attendance): 考勤规则地址搜索改走 POI 检索,修复搜公司名跳到外省同名街道
---
src/views/hrm/attendance/rule/modules/location-map-picker.vue | 74 ++++++++++++++++++++++++++++++++++++-
1 files changed, 72 insertions(+), 2 deletions(-)
diff --git a/src/views/hrm/attendance/rule/modules/location-map-picker.vue b/src/views/hrm/attendance/rule/modules/location-map-picker.vue
index 7793ee1..61f9561 100644
--- a/src/views/hrm/attendance/rule/modules/location-map-picker.vue
+++ b/src/views/hrm/attendance/rule/modules/location-map-picker.vue
@@ -319,19 +319,89 @@
message.success('鍧愭爣宸插簲鐢�');
}
+/**
+ * POI 鎼滅储锛堟寜鍦扮偣/鍏徃鍚嶇О妫�绱級
+ *
+ * Geocoder.getPoint 鍙仛銆屽湴鍧�瑙f瀽銆嶏紝鎶婂瓧绗︿覆褰撶渷甯傚尯琛楅亾澶勭悊锛屼笉璁ゅ叕鍙稿悕銆�
+ * 渚嬪鎼溿�屾柊鐤嗕腑浜胯閰嶅紡寤虹瓚鏈夐檺鍏徃銆嶏紝瀹冨彧璇嗗埆鍑恒�屾柊鐤嗐�嶈繖涓湴鍚嶏紝
+ * 鐩存帴璺冲埌鍝堝皵婊ㄥ競骞虫埧鍖恒�屾柊鐤嗚閬撱�嶃�傛墍浠ヨ繖閲屽厛鐢� LocalSearch 璧� POI 妫�绱紝
+ * 鍛戒腑涓嶄簡鍐嶅洖閫�鍦板潃瑙f瀽銆�
+ */
+function searchByPoi(keyword: string): Promise<any> {
+ return new Promise((resolve) => {
+ const LocalSearchCtor = window.BMapGL?.LocalSearch;
+ if (!map || !LocalSearchCtor) {
+ resolve(null);
+ return;
+ }
+ let settled = false;
+ const finish = (value: any) => {
+ if (settled) {
+ return;
+ }
+ settled = true;
+ resolve(value);
+ };
+ // 鍏滃簳锛歅OI 妫�绱㈠伓灏斾笉鍥炶皟锛�2.5 绉掑悗鎸夊け璐ュ鐞嗭紝閬垮厤涓�鐩磋浆鍦�
+ const timer = setTimeout(() => finish(null), 2500);
+ const search = new LocalSearchCtor(map, {
+ // 娉ㄦ剰锛欸L 鐗堢粨鏋滄槸閫氳繃鍥炶皟鍙傛暟杩斿洖鐨勶紝涓嶆槸 search.getResults()
+ onSearchComplete: (results: any) => {
+ clearTimeout(timer);
+ try {
+ if (typeof search.getStatus === 'function' && search.getStatus() !== 0) {
+ finish(null);
+ return;
+ }
+ // 鍏煎涓ょ鍙栨硶锛氭爣鍑� getPoi(0) 涓庡唴閮� _pois[0]
+ const poi = results?.getPoi?.(0) ?? results?._pois?.[0];
+ if (!poi?.point) {
+ finish(null);
+ return;
+ }
+ finish({ point: poi.point, title: poi.title, address: poi.address });
+ } catch {
+ finish(null);
+ }
+ },
+ });
+ try {
+ search.search(keyword);
+ } catch {
+ clearTimeout(timer);
+ finish(null);
+ }
+ });
+}
+
async function handleSearch() {
const keyword = searchKeyword.value.trim();
- if (!keyword || !geocoder) {
+ if (!keyword) {
return;
}
loading.value = true;
try {
+ // 1. 浼樺厛 POI 妫�绱細鑳芥悳鍏徃鍚嶃�佸湴鐐瑰悕锛屾瘮鍦板潃瑙f瀽鍑嗙‘寰楀
+ const poi = await searchByPoi(keyword);
+ if (poi?.point) {
+ await selectBaiduLocation(poi.point.lng, poi.point.lat);
+ selectedAddress.value = poi.address ?? poi.title ?? selectedAddress.value;
+ message.success(`宸插畾浣嶅埌锛�${poi.title ?? keyword}`);
+ return;
+ }
+ // 2. 鍥為��鍦板潃瑙f瀽锛堥�傜敤浜庛�孹X甯俋X鍖篨X璺疿X鍙枫�嶈繖绫荤函鍦板潃锛�
+ if (!geocoder) {
+ message.warning('鍦板浘灏氭湭灏辩华锛岃绋嶅悗閲嶈瘯');
+ return;
+ }
const point = await new Promise<any>((resolve, reject) => {
geocoder.getPoint(keyword, (result: any) => {
result
? resolve(result)
: reject(
- new Error('娌℃湁鎼滅储鍒拌鍦板潃锛岃杈撳叆鏇村畬鏁寸殑鐪佸競鍖哄拰鍦扮偣鍚嶇О'),
+ new Error(
+ '娌℃湁鎼滅储鍒拌鍦扮偣锛岃灏濊瘯杈撳叆鍏徃鍏ㄧО鎴栨洿瀹屾暣鐨勭渷甯傚尯鍦板潃',
+ ),
);
});
});
--
Gitblit v1.9.3