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