From 668e570bd1db6bd00e4293b6977e6d3d051053ce Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期四, 27 十一月 2025 00:07:46 +0800
Subject: [PATCH] feat: 修改app录入界面及车辆用户同步

---
 app/pages/task/create-emergency.vue |  176 ++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 128 insertions(+), 48 deletions(-)

diff --git a/app/pages/task/create-emergency.vue b/app/pages/task/create-emergency.vue
index ef16aec..2a6c730 100644
--- a/app/pages/task/create-emergency.vue
+++ b/app/pages/task/create-emergency.vue
@@ -30,6 +30,16 @@
         />
       </view>
       
+      <DepartureSelector
+        :address.sync="departureAddress"
+        :longitude.sync="departureLongitude"
+        :latitude.sync="departureLatitude"
+        :region="selectedRegion"
+        :required="false"
+        @address-selected="onDepartureAddressSelected"
+        @location-success="onDepartureLocationSuccess"
+      />
+      
       <view class="form-item">
         <view class="form-label required">浠诲姟绫诲瀷</view>
         <picker mode="selector" :range="emergencyTaskTypeOptions" range-key="text" @change="onEmergencyTaskTypeChange">
@@ -321,8 +331,9 @@
 import uniPopup from '@/uni_modules/uni-popup/components/uni-popup/uni-popup.vue'
 import { addTask } from "@/api/task"
 import { listAvailableVehicles, getUserBoundVehicle } from "@/api/vehicle"
+import { searchHospitals, searchHospitalsByDeptRegion } from "@/api/hospital"
+import DepartureSelector from '@/components/DepartureSelector.vue'
 import { calculateDistance, baiduDistanceByAddress, baiduPlaceSuggestion } from "@/api/map"
-import { searchHospitals, getFrequentOutHospitals, getFrequentInHospitals, searchHospitalsByDeptRegion } from "@/api/hospital"
 import { listBranchUsers } from "@/api/system/user"
 import { searchIcd10 } from "@/api/icd10"
 import { calculateTransferPrice } from "@/api/price"
@@ -343,7 +354,8 @@
     MapSelector,
     OrganizationSelector,
     HospitalSelector,
-    DiseaseSelector
+    DiseaseSelector,
+    DepartureSelector
   },
   data() {
     return {
@@ -352,6 +364,9 @@
       selectedOrganizationId: null, // 褰掑睘鏈烘瀯ID锛堥儴闂↖D锛�
       selectedOrganizationServiceOrderClass: '', // 褰掑睘鏈烘瀯鐨勬湇鍔″崟缂栫爜
       selectedRegion: '', // 浠庡綊灞炴満鏋勪腑鎻愬彇鐨勫湴鍩熶俊鎭紙濡傦細骞垮窞銆佹繁鍦崇瓑锛�
+      departureAddress: '', // 鍑哄彂鍦板湴鍧�
+      departureLongitude: null, // 鍑哄彂鍦扮粡搴�
+      departureLatitude: null, // 鍑哄彂鍦扮含搴�
       selectedEmergencyTaskType: '', // 閫変腑鐨勪换鍔$被鍨嬫枃鏈�
       selectedEmergencyTaskTypeId: null, // 閫変腑鐨勪换鍔$被鍨婭D
       selectedDocumentType: '', // 閫変腑鐨勫崟鎹被鍨嬫枃鏈�
@@ -403,10 +418,6 @@
       documentTypeOptions: [], // 鍗曟嵁绫诲瀷閫夐」锛堢敤浜巔icker鏄剧ず锛�
       departmentOptions: [], // 绉戝瀛楀吀鏁版嵁
       loading: false,
-      addressCoordinates: {
-        hospitalOutAddress: null,
-        hospitalInAddress: null
-      },
       // 鏅鸿兘璇嗗埆鐩稿叧
       rawText: '',
       parseLoading: false
@@ -517,10 +528,18 @@
     },
     
     onOrganizationChange(orgData) {
-      // orgData 鍖呭惈锛歞eptId, deptName, serviceOrderClass, region
+      // orgData 鍖呭惈锛歞eptId, deptName, serviceOrderClass, region, departureAddress, departureLongitude, departureLatitude
       this.selectedOrganizationId = orgData.deptId
       this.selectedOrganizationServiceOrderClass = orgData.serviceOrderClass
       this.selectedRegion = orgData.region
+      
+      // 鑷姩濉厖鍑哄彂鍦颁俊鎭紙鏈烘瀯鐨勫湴鍧�鍜屽潗鏍囷級
+      if (orgData.departureAddress) {
+        this.departureAddress = orgData.departureAddress
+        this.departureLongitude = orgData.departureLongitude || null
+        this.departureLatitude = orgData.departureLatitude || null
+        console.log('鑷姩濉厖鏈烘瀯鍑哄彂鍦�:', this.departureAddress, '鍧愭爣:', this.departureLongitude, this.departureLatitude)
+      }
       
       console.log('閫変腑褰掑睘鏈烘瀯:', orgData.deptName, '閮ㄩ棬ID:', orgData.deptId, '鏈嶅姟鍗曠紪鐮�:', orgData.serviceOrderClass, '鍦板煙:', orgData.region)
     },
@@ -635,16 +654,10 @@
       }
     },
     
-    // 杞嚭鍖婚櫌鍦板潃閫夋嫨锛堝綋閫夋嫨"瀹朵腑"鏃朵娇鐢ㄧ櫨搴﹀湴鍥惧湴鍧�寤鸿锛�
+    // 杞嚭鍖婚櫌鍦板潃閫夋嫨浜嬩欢锛堢畝鍖栵紝绉婚櫎GPS澶勭悊锛�
     onHospitalOutAddressSelected(data) {
-      // data 鍖呭惈锛歛ddress, location
-      if (data.location) {
-        this.addressCoordinates.hospitalOutAddress = data.location
-        
-        // 濡傛灉杞叆鍦板潃涔熷凡濉啓,鑷姩璁$畻璺濈
-        if (this.taskForm.hospitalIn.address) {
-          this.calculateDistanceByManualAddress()
-        }
+      if (this.taskForm.hospitalIn.address) {
+        this.calculateDistanceByManualAddress()
       }
     },
     
@@ -665,16 +678,10 @@
       }
     },
     
-    // 杞叆鍖婚櫌鍦板潃閫夋嫨锛堝綋閫夋嫨"瀹朵腑"鏃朵娇鐢ㄧ櫨搴﹀湴鍥惧湴鍧�寤鸿锛�
+    // 杞叆鍖婚櫌鍦板潃閫夋嫨浜嬩欢锛堢畝鍖栵紝绉婚櫎GPS澶勭悊锛�  
     onHospitalInAddressSelected(data) {
-      // data 鍖呭惈锛歛ddress, location
-      if (data.location) {
-        this.addressCoordinates.hospitalInAddress = data.location
-        
-        // 濡傛灉杞嚭鍦板潃涔熷凡濉啓,鑷姩璁$畻璺濈
-        if (this.taskForm.hospitalOut.address) {
-          this.calculateDistanceByManualAddress()
-        }
+      if (this.taskForm.hospitalOut.address) {
+        this.calculateDistanceByManualAddress()
       }
     },
     
@@ -1072,7 +1079,7 @@
         // 鐥呮儏ID鍒楄〃锛堢敤浜庡悓姝ヨ皟搴﹀崟鐨凮rdICD_ID鍙傛暟锛�
         diseaseIds: this.selectedDiseases.filter(d => d.id !== null).map(d => d.id),
         // 灏嗚浆鍑哄尰闄㈠湴鍧�浣滀负鍑哄彂鍦帮紝杞叆鍖婚櫌鍦板潃浣滀负鐩殑鍦�
-        departureAddress: this.taskForm.hospitalOut.address || '',
+        departureAddress: this.departureAddress || this.taskForm.hospitalOut.address || '',
         destinationAddress: this.taskForm.hospitalIn.address || '',
         patient: {
           ...this.taskForm.patient,
@@ -1085,34 +1092,27 @@
               icdName: d.icdName
             }))
         },
-        // 鍖婚櫌淇℃伅锛堝寘鍚尰闄D銆佺瀹ゅ悕绉般�佺瀹D绛夊畬鏁翠俊鎭級
-        hospitalOut: this.taskForm.hospitalOut,  // 鍖呭惈: id, name, department, departmentId, bedNumber, address
-        hospitalIn: this.taskForm.hospitalIn,    // 鍖呭惈: id, name, department, departmentId, bedNumber, address
+        // 鍖婚櫌淇℃伅锛堝寘鍚尰闄D銆佺瀹ゅ悕绉般�佺瀹D銆丟PS鍧愭爣绛夊畬鏁翠俊鎭級
+        hospitalOut: {
+          ...this.taskForm.hospitalOut
+          // GPS鍧愭爣鐢卞悗绔嚜鍔ㄨ幏鍙�
+        },
+        hospitalIn: {
+          ...this.taskForm.hospitalIn
+          // GPS鍧愭爣鐢卞悗绔嚜鍔ㄨ幏鍙�
+        },
+        
         transferDistance: this.taskForm.transferDistance ? parseFloat(this.taskForm.transferDistance) : null,
         price: this.taskForm.price ? parseFloat(this.taskForm.price) : null
       }
       
-      if (this.addressCoordinates.hospitalOutAddress) {
-        // 杞嚭鍖婚櫌GPS鍧愭爣鍐欏叆鎵╁睍琛�
-        if (!submitData.hospitalOut) submitData.hospitalOut = {}
-        submitData.hospitalOut.longitude = this.addressCoordinates.hospitalOutAddress.lng
-        submitData.hospitalOut.latitude = this.addressCoordinates.hospitalOutAddress.lat
-        
-        // 鍚屾椂鍐欏叆涓讳换鍔¤〃鐨勫嚭鍙戝湴缁忕含搴�
-        submitData.departureLongitude = this.addressCoordinates.hospitalOutAddress.lng
-        submitData.departureLatitude = this.addressCoordinates.hospitalOutAddress.lat
+      // 鍑哄彂鍦癎PS鍧愭爣锛堜紭鍏堜娇鐢ㄨ嚜瀹氫箟鐨勫嚭鍙戝湴鍧愭爣锛�
+      if (this.departureLongitude && this.departureLatitude) {
+        submitData.departureLongitude = this.departureLongitude
+        submitData.departureLatitude = this.departureLatitude
       }
       
-      if (this.addressCoordinates.hospitalInAddress) {
-        // 杞叆鍖婚櫌GPS鍧愭爣鍐欏叆鎵╁睍琛�
-        if (!submitData.hospitalIn) submitData.hospitalIn = {}
-        submitData.hospitalIn.longitude = this.addressCoordinates.hospitalInAddress.lng
-        submitData.hospitalIn.latitude = this.addressCoordinates.hospitalInAddress.lat
-        
-        // 鍚屾椂鍐欏叆涓讳换鍔¤〃鐨勭洰鐨勫湴缁忕含搴�
-        submitData.destinationLongitude = this.addressCoordinates.hospitalInAddress.lng
-        submitData.destinationLatitude = this.addressCoordinates.hospitalInAddress.lat
-      }
+      // 鐩爣鍦癎PS鍧愭爣鐢卞悗绔牴鎹浆鍏ュ尰闄㈠湴鍧�鑷姩鑾峰彇
       
       return submitData
     },
@@ -1151,6 +1151,79 @@
     
    goBack() {
       uni.navigateBack()
+    },
+    
+    // 鑾峰彇褰撳墠浣嶇疆
+    getCurrentLocation() {
+      uni.showLoading({
+        title: '鑾峰彇浣嶇疆涓�...'
+      })
+      
+      // 浣跨敤uni-app鐨凣PS瀹氫綅鍔熻兘
+      uni.getLocation({
+        type: 'gcj02', // 杩斿洖鍥芥祴灞�鍧愭爣锛岄�傜敤浜庡浗鍐呭湴鍥�
+        success: (res) => {
+          console.log('鑾峰彇鍒癎PS鍧愭爣:', res)
+          const latitude = res.latitude
+          const longitude = res.longitude
+          
+          // 淇濆瓨GPS鍧愭爣
+          this.departureLatitude = latitude
+          this.departureLongitude = longitude
+          
+          // 璋冪敤閫嗗湴鐞嗙紪鐮佹帴鍙o紝灏嗗潗鏍囪浆鎹负鍦板潃
+          reverseGeocoder(latitude, longitude)
+            .then(response => {
+              uni.hideLoading()
+              
+              if (response.code === 200 && response.data) {
+                // 鑾峰彇璇︾粏鍦板潃
+                const address = response.data.address || response.data.formattedAddress || ''
+                this.departureAddress = address
+                
+                console.log('閫嗗湴鐞嗙紪鐮佹垚鍔�:', address)
+                this.$modal.showToast('宸茶幏鍙栧綋鍓嶄綅缃�')
+              } else {
+                console.error('閫嗗湴鐞嗙紪鐮佸け璐�:', response.msg)
+                this.$modal.showToast('浣嶇疆瑙f瀽澶辫触锛岃鎵嬪姩杈撳叆鍦板潃')
+              }
+            })
+            .catch(error => {
+              uni.hideLoading()
+              console.error('閫嗗湴鐞嗙紪鐮佸け璐�:', error)
+              // 鍗充娇鍦板潃瑙f瀽澶辫触锛屼篃淇濈暀GPS鍧愭爣
+              this.$modal.showToast('浣嶇疆瑙f瀽澶辫触锛屼絾GPS鍧愭爣宸蹭繚瀛�')
+            })
+        },
+        fail: (err) => {
+          uni.hideLoading()
+          console.error('鑾峰彇浣嶇疆澶辫触:', err)
+          
+          // 鎻愮ず鐢ㄦ埛鍙兘鐨勫師鍥�
+          let errorMsg = '鑾峰彇浣嶇疆澶辫触'
+          if (err.errMsg && err.errMsg.includes('auth deny')) {
+            errorMsg = '璇峰湪璁剧疆涓紑鍚綅缃潈闄�'
+          } else if (err.errMsg && err.errMsg.includes('timeout')) {
+            errorMsg = '瀹氫綅瓒呮椂锛岃绋嶅悗閲嶈瘯'
+          }
+          
+          this.$modal.showToast(errorMsg)
+        }
+      })
+    },
+    
+    // 鍑哄彂鍦板湴鍧�閫夋嫨锛堜粠鍦板浘寤鸿涓�夋嫨锛�
+    onDepartureAddressSelected(data) {
+      // data 鍖呭惈: address, longitude, latitude, location
+      console.log('鍑哄彂鍦板湴鍧�閫夋嫨:', data)
+      // 缁勪欢宸茬粡閫氳繃 .sync 鏇存柊浜� departureAddress, departureLongitude, departureLatitude
+    },
+    
+    // 鍑哄彂鍦癎PS瀹氫綅鎴愬姛
+    onDepartureLocationSuccess(data) {
+      // data 鍖呭惈: address, longitude, latitude
+      console.log('鍑哄彂鍦癎PS瀹氫綅鎴愬姛:', data)
+      // 缁勪欢宸茬粡閫氳繃 .sync 鏇存柊浜� departureAddress, departureLongitude, departureLatitude
     },
     
     // ==================== 鏅鸿兘璇嗗埆鐩稿叧鏂规硶 ====================
@@ -1781,6 +1854,13 @@
         font-size: 28rpx;
       }
       
+      .form-tip {
+        margin-top: 10rpx;
+        font-size: 24rpx;
+        color: #999;
+        line-height: 1.5;
+      }
+      
       .disease-container {
         .disease-tags {
           display: flex;

--
Gitblit v1.9.1