From 4dd78acfe298217ebc5dd247c5b45c6f33deea9b Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期六, 08 十一月 2025 22:43:14 +0800
Subject: [PATCH] feat:医院选择计算
---
app/pages/task/create-emergency.vue | 348 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 327 insertions(+), 21 deletions(-)
diff --git a/app/pages/task/create-emergency.vue b/app/pages/task/create-emergency.vue
index 99fe82d..7d96be1 100644
--- a/app/pages/task/create-emergency.vue
+++ b/app/pages/task/create-emergency.vue
@@ -217,7 +217,26 @@
<view class="form-item">
<view class="form-label">杞嚭鍦板潃</view>
- <view class="form-input picker-input disabled">
+ <view class="address-input-container" v-if="taskForm.hospitalOut.name === '瀹朵腑'">
+ <input
+ class="form-input"
+ placeholder="璇疯緭鍏ヨ缁嗗湴鍧�"
+ v-model="taskForm.hospitalOut.address"
+ @input="onAddressOutInput"
+ @focus="onAddressOutFocus"
+ />
+ <view class="address-suggestions" v-if="showAddressOutSuggestions && addressOutSuggestions.length > 0">
+ <view
+ class="address-suggestion-item"
+ v-for="(item, index) in addressOutSuggestions"
+ :key="index"
+ @click="selectAddressOut(item)">
+ <view class="suggestion-name">{{ item.name }}</view>
+ <view class="suggestion-address">{{ item.district }}{{ item.address }}</view>
+ </view>
+ </view>
+ </view>
+ <view v-else class="form-input picker-input disabled">
{{ taskForm.hospitalOut.address || '閫夋嫨鍖婚櫌鍚庤嚜鍔ㄥ~鍏�' }}
</view>
</view>
@@ -268,7 +287,26 @@
<view class="form-item">
<view class="form-label">杞叆鍦板潃</view>
- <view class="form-input picker-input disabled">
+ <view class="address-input-container" v-if="taskForm.hospitalIn.name === '瀹朵腑'">
+ <input
+ class="form-input"
+ placeholder="璇疯緭鍏ヨ缁嗗湴鍧�"
+ v-model="taskForm.hospitalIn.address"
+ @input="onAddressInInput"
+ @focus="onAddressInFocus"
+ />
+ <view class="address-suggestions" v-if="showAddressInSuggestions && addressInSuggestions.length > 0">
+ <view
+ class="address-suggestion-item"
+ v-for="(item, index) in addressInSuggestions"
+ :key="index"
+ @click="selectAddressIn(item)">
+ <view class="suggestion-name">{{ item.name }}</view>
+ <view class="suggestion-address">{{ item.district }}{{ item.address }}</view>
+ </view>
+ </view>
+ </view>
+ <view v-else class="form-input picker-input disabled">
{{ taskForm.hospitalIn.address || '閫夋嫨鍖婚櫌鍚庤嚜鍔ㄥ~鍏�' }}
</view>
</view>
@@ -443,7 +481,7 @@
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 { calculateDistance, baiduDistanceByAddress } from "@/api/map"
+import { calculateDistance, baiduDistanceByAddress, baiduPlaceSuggestion } from "@/api/map"
import { searchHospitals, getFrequentOutHospitals, getFrequentInHospitals } from "@/api/hospital"
import { listUser } from "@/api/system/user"
import { searchIcd10 } from "@/api/icd10"
@@ -481,6 +519,12 @@
showHospitalInResults: false,
searchTimer: null,
defaultHospitals: [], // 榛樿鐨�100鏉″尰闄㈡暟鎹�
+ // 鍦板潃鎼滅储鎻愮ず鐩稿叧
+ addressOutSuggestions: [], // 杞嚭鍦板潃鎻愮ず鍒楄〃
+ showAddressOutSuggestions: false,
+ addressInSuggestions: [], // 杞叆鍦板潃鎻愮ず鍒楄〃
+ showAddressInSuggestions: false,
+ addressSearchTimer: null, // 鍦板潃鎼滅储闃叉姈瀹氭椂鍣�
// 浜哄憳閫夋嫨鐩稿叧
selectedStaff: [], // 宸查�夋嫨鐨勪汉鍛樺垪琛�
allStaffList: [], // 鎵�鏈変汉鍛樺垪琛�
@@ -620,7 +664,7 @@
getAvailableVehicles() {
// 鏍规嵁鐢ㄦ埛鏈夋潈闄愮鐞嗙殑鍒嗗叕鍙革紝鏌ヨ鎵�鏈夊彲鐢ㄨ溅杈�
- listAvailableVehicles(null, 'EMERGENCY').then(response => {
+ return listAvailableVehicles(null, 'EMERGENCY').then(response => {
const vehicleList = response.data || []
this.vehicleOptions = vehicleList.map(vehicle => ({
id: vehicle.vehicleId,
@@ -629,13 +673,8 @@
status: vehicle.status,
deptNames: vehicle.deptNames || [] // 杞﹁締褰掑睘鐨勫涓垎鍏徃
}))
- this.vehicles = this.vehicleOptions.map(v => {
- // 濡傛灉杞﹁締褰掑睘澶氫釜鍒嗗叕鍙革紝鍦ㄨ溅鐗屽彿鍚庨潰鏄剧ず
- if (v.deptNames && v.deptNames.length > 0) {
- return `${v.name} (${v.deptNames.join('銆�')})`
- }
- return v.name
- })
+ // 鍙樉绀鸿溅鐗屽彿锛屼笉鏄剧ず鍒嗗叕鍙�
+ this.vehicles = this.vehicleOptions.map(v => v.name)
console.log('鍔犺浇鍙敤杞﹁締鏁伴噺:', this.vehicles.length)
}).catch(error => {
console.error('鍔犺浇杞﹁締鍒楄〃澶辫触:', error)
@@ -990,9 +1029,14 @@
selectHospitalOut(hospital) {
this.taskForm.hospitalOut.id = hospital.hospId // 淇濆瓨鍖婚櫌ID
this.taskForm.hospitalOut.name = hospital.hospName
- // 鍚堝苟鐪佸競鍖� + 璇︾粏鍦板潃
- const fullAddress = this.buildFullAddress(hospital)
- this.taskForm.hospitalOut.address = fullAddress
+ // 濡傛灉閫夋嫨鐨勬槸"瀹朵腑"锛屾竻绌哄湴鍧�璁╃敤鎴锋墜鍔ㄨ緭鍏ワ紱鍚﹀垯鑷姩濉厖鍦板潃
+ if (hospital.hospName === '瀹朵腑') {
+ this.taskForm.hospitalOut.address = ''
+ } else {
+ // 鍚堝苟鐪佸競鍖� + 璇︾粏鍦板潃
+ const fullAddress = this.buildFullAddress(hospital)
+ this.taskForm.hospitalOut.address = fullAddress
+ }
this.hospitalOutSearchKeyword = hospital.hospName
this.showHospitalOutResults = false
this.hospitalOutResults = []
@@ -1000,9 +1044,15 @@
// 淇濆瓨杞嚭鍖婚櫌鐨勫煄甯備俊鎭�
this.taskForm.hospitalOut.city = hospital.hopsCity || ''
- // 濡傛灉涓や釜鍖婚櫌閮藉凡閫夋嫨锛岃嚜鍔ㄨ绠楄窛绂�
+ // 濡傛灉杞叆鍦板潃宸插~鍐�,鑷姩璁$畻璺濈
if (this.taskForm.hospitalIn.address) {
- this.calculateHospitalDistance()
+ // 濡傛灉涓や釜閮戒笉鏄�"瀹朵腑",浣跨敤鍖婚櫌璺濈璁$畻
+ if (hospital.hospName !== '瀹朵腑' && this.taskForm.hospitalIn.name !== '瀹朵腑') {
+ this.calculateHospitalDistance()
+ } else {
+ // 鏈変竴涓槸"瀹朵腑",浣跨敤鍦板潃璁$畻
+ this.calculateDistanceByManualAddress()
+ }
}
},
@@ -1100,9 +1150,14 @@
selectHospitalIn(hospital) {
this.taskForm.hospitalIn.id = hospital.hospId // 淇濆瓨鍖婚櫌ID
this.taskForm.hospitalIn.name = hospital.hospName
- // 鍚堝苟鐪佸競鍖� + 璇︾粏鍦板潃
- const fullAddress = this.buildFullAddress(hospital)
- this.taskForm.hospitalIn.address = fullAddress
+ // 濡傛灉閫夋嫨鐨勬槸"瀹朵腑"锛屾竻绌哄湴鍧�璁╃敤鎴锋墜鍔ㄨ緭鍏ワ紱鍚﹀垯鑷姩濉厖鍦板潃
+ if (hospital.hospName === '瀹朵腑') {
+ this.taskForm.hospitalIn.address = ''
+ } else {
+ // 鍚堝苟鐪佸競鍖� + 璇︾粏鍦板潃
+ const fullAddress = this.buildFullAddress(hospital)
+ this.taskForm.hospitalIn.address = fullAddress
+ }
this.hospitalInSearchKeyword = hospital.hospName
this.showHospitalInResults = false
this.hospitalInResults = []
@@ -1110,9 +1165,15 @@
// 淇濆瓨杞叆鍖婚櫌鐨勫煄甯備俊鎭�
this.taskForm.hospitalIn.city = hospital.hopsCity || ''
- // 濡傛灉涓や釜鍖婚櫌閮藉凡閫夋嫨锛岃嚜鍔ㄨ绠楄窛绂�
+ // 濡傛灉杞嚭鍦板潃宸插~鍐�,鑷姩璁$畻璺濈
if (this.taskForm.hospitalOut.address) {
- this.calculateHospitalDistance()
+ // 濡傛灉涓や釜閮戒笉鏄�"瀹朵腑",浣跨敤鍖婚櫌璺濈璁$畻
+ if (hospital.hospName !== '瀹朵腑' && this.taskForm.hospitalOut.name !== '瀹朵腑') {
+ this.calculateHospitalDistance()
+ } else {
+ // 鏈変竴涓槸"瀹朵腑",浣跨敤鍦板潃璁$畻
+ this.calculateDistanceByManualAddress()
+ }
}
},
@@ -1290,6 +1351,208 @@
addStaff() {
this.showStaffSelector()
+ },
+
+ // ==================== 鍦板潃杈撳叆鑱旀兂鐩稿叧鏂规硶 ====================
+
+ // 杞嚭鍦板潃杈撳叆鐩戝惉
+ onAddressOutInput(e) {
+ const query = e.detail.value
+ this.taskForm.hospitalOut.address = query
+
+ // 闃叉姈澶勭悊
+ if (this.addressSearchTimer) {
+ clearTimeout(this.addressSearchTimer)
+ }
+
+ // 濡傛灉杈撳叆涓虹┖锛岄殣钘忔彁绀哄垪琛�
+ if (!query || query.trim() === '') {
+ this.showAddressOutSuggestions = false
+ this.addressOutSuggestions = []
+ return
+ }
+
+ // 杈撳叆闀垮害澶т簬2鎵嶅紑濮嬫悳绱�
+ if (query.trim().length < 2) {
+ this.showAddressOutSuggestions = false
+ return
+ }
+
+ // 寤惰繜300ms鎼滅储
+ this.addressSearchTimer = setTimeout(() => {
+ this.searchAddressOut(query)
+ }, 300)
+ },
+
+ // 杞嚭鍦板潃杈撳叆妗嗚幏寰楃劍鐐�
+ onAddressOutFocus() {
+ // 濡傛灉鏈夊湴鍧�涓旀湁鎼滅储缁撴灉锛屾樉绀烘彁绀哄垪琛�
+ if (this.taskForm.hospitalOut.address && this.addressOutSuggestions.length > 0) {
+ this.showAddressOutSuggestions = true
+ }
+ },
+
+ // 鎼滅储杞嚭鍦板潃
+ searchAddressOut(query) {
+ // 鑾峰彇褰撳墠鍖哄煙锛堜紭鍏堜娇鐢ㄥ綊灞炴満鏋勭殑鍖哄煙锛�
+ const region = this.selectedRegion || '骞垮窞'
+
+ baiduPlaceSuggestion(query, region).then(response => {
+ if (response.code === 200 && response.data) {
+ this.addressOutSuggestions = response.data
+ this.showAddressOutSuggestions = true
+ } else {
+ this.addressOutSuggestions = []
+ this.showAddressOutSuggestions = false
+ }
+ }).catch(error => {
+ console.error('鎼滅储杞嚭鍦板潃澶辫触:', error)
+ this.addressOutSuggestions = []
+ this.showAddressOutSuggestions = false
+ })
+ },
+
+ // 閫夋嫨杞嚭鍦板潃
+ selectAddressOut(item) {
+ // 濉厖瀹屾暣鍦板潃
+ const fullAddress = item.district + item.address
+ this.taskForm.hospitalOut.address = fullAddress
+
+ // 淇濆瓨缁忕含搴︼紙濡傛灉鏈夛級
+ if (item.location) {
+ this.taskForm.hospitalOut.latitude = item.location.lat
+ this.taskForm.hospitalOut.longitude = item.location.lng
+ }
+
+ // 闅愯棌鎻愮ず鍒楄〃
+ this.showAddressOutSuggestions = false
+ this.addressOutSuggestions = []
+
+ // 濡傛灉杞叆鍦板潃涔熷凡濉啓,鑷姩璁$畻璺濈
+ if (this.taskForm.hospitalIn.address) {
+ this.calculateDistanceByManualAddress()
+ }
+ },
+
+ // 杞叆鍦板潃杈撳叆鐩戝惉
+ onAddressInInput(e) {
+ const query = e.detail.value
+ this.taskForm.hospitalIn.address = query
+
+ // 闃叉姈澶勭悊
+ if (this.addressSearchTimer) {
+ clearTimeout(this.addressSearchTimer)
+ }
+
+ // 濡傛灉杈撳叆涓虹┖锛岄殣钘忔彁绀哄垪琛�
+ if (!query || query.trim() === '') {
+ this.showAddressInSuggestions = false
+ this.addressInSuggestions = []
+ return
+ }
+
+ // 杈撳叆闀垮害澶т簬2鎵嶅紑濮嬫悳绱�
+ if (query.trim().length < 2) {
+ this.showAddressInSuggestions = false
+ return
+ }
+
+ // 寤惰繜300ms鎼滅储
+ this.addressSearchTimer = setTimeout(() => {
+ this.searchAddressIn(query)
+ }, 300)
+ },
+
+ // 杞叆鍦板潃杈撳叆妗嗚幏寰楃劍鐐�
+ onAddressInFocus() {
+ // 濡傛灉鏈夊湴鍧�涓旀湁鎼滅储缁撴灉锛屾樉绀烘彁绀哄垪琛�
+ if (this.taskForm.hospitalIn.address && this.addressInSuggestions.length > 0) {
+ this.showAddressInSuggestions = true
+ }
+ },
+
+ // 鎼滅储杞叆鍦板潃
+ searchAddressIn(query) {
+ // 鑾峰彇褰撳墠鍖哄煙锛堜紭鍏堜娇鐢ㄥ綊灞炴満鏋勭殑鍖哄煙锛�
+ const region = this.selectedRegion || '骞垮窞'
+
+ baiduPlaceSuggestion(query, region).then(response => {
+ if (response.code === 200 && response.data) {
+ this.addressInSuggestions = response.data
+ this.showAddressInSuggestions = true
+ } else {
+ this.addressInSuggestions = []
+ this.showAddressInSuggestions = false
+ }
+ }).catch(error => {
+ console.error('鎼滅储杞叆鍦板潃澶辫触:', error)
+ this.addressInSuggestions = []
+ this.showAddressInSuggestions = false
+ })
+ },
+
+ // 閫夋嫨杞叆鍦板潃
+ selectAddressIn(item) {
+ // 濉厖瀹屾暣鍦板潃
+ const fullAddress = item.district + item.address
+ this.taskForm.hospitalIn.address = fullAddress
+
+ // 淇濆瓨缁忕含搴︼紙濡傛灉鏈夛級
+ if (item.location) {
+ this.taskForm.hospitalIn.latitude = item.location.lat
+ this.taskForm.hospitalIn.longitude = item.location.lng
+ }
+
+ // 闅愯棌鎻愮ず鍒楄〃
+ this.showAddressInSuggestions = false
+ this.addressInSuggestions = []
+
+ // 濡傛灉杞嚭鍦板潃涔熷凡濉啓,鑷姩璁$畻璺濈
+ if (this.taskForm.hospitalOut.address) {
+ this.calculateDistanceByManualAddress()
+ }
+ },
+
+ // 鎵嬪姩杈撳叆鍦板潃鏃惰绠楄窛绂�
+ calculateDistanceByManualAddress() {
+ const fromAddress = this.taskForm.hospitalOut.address
+ const toAddress = this.taskForm.hospitalIn.address
+
+ if (!fromAddress || !toAddress) {
+ return
+ }
+
+ console.log('璁$畻鎵嬪姩杈撳叆鍦板潃璺濈:', fromAddress, '->', toAddress)
+
+ // 鏄剧ず鍔犺浇鎻愮ず
+ uni.showLoading({
+ title: '璁$畻璺濈涓�...'
+ })
+
+ // 璋冪敤鐧惧害鍦板浘API璁$畻璺濈
+ const region = this.selectedRegion || '骞垮窞'
+ baiduDistanceByAddress(fromAddress, region, toAddress, region)
+ .then(response => {
+ uni.hideLoading()
+
+ if (response.code === 200 && response.data) {
+ const distanceInMeters = response.data.distance
+ // 杞崲涓哄叕閲岋紝淇濈枡1浣嶅皬鏁�
+ const distanceInKm = (distanceInMeters / 1000).toFixed(1)
+ this.taskForm.transferDistance = distanceInKm
+
+ console.log('璺濈璁$畻鎴愬姛:', distanceInKm, 'km')
+ this.$modal.showToast(`璺濈: ${distanceInKm}鍏噷`)
+ } else {
+ console.error('璺濈璁$畻澶辫触:', response.msg)
+ this.$modal.showToast('璺濈璁$畻澶辫触,璇锋墜鍔ㄨ緭鍏�')
+ }
+ })
+ .catch(error => {
+ uni.hideLoading()
+ console.error('璺濈璁$畻澶辫触:', error)
+ this.$modal.showToast('璺濈璁$畻澶辫触,璇锋墜鍔ㄨ緭鍏�')
+ })
},
// ==================== 鐥呮儏閫夋嫨鐩稿叧鏂规硶 ====================
@@ -1753,6 +2016,49 @@
}
}
+ .address-input-container {
+ position: relative;
+
+ .address-suggestions {
+ position: absolute;
+ top: 75rpx;
+ left: 0;
+ right: 0;
+ max-height: 400rpx;
+ background-color: white;
+ border: 1rpx solid #eee;
+ border-radius: 10rpx;
+ box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
+ z-index: 100;
+ overflow-y: auto;
+
+ .address-suggestion-item {
+ padding: 20rpx 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+
+ &:last-child {
+ border-bottom: none;
+ }
+
+ &:active {
+ background-color: #f5f5f5;
+ }
+
+ .suggestion-name {
+ font-size: 28rpx;
+ color: #333;
+ font-weight: bold;
+ margin-bottom: 8rpx;
+ }
+
+ .suggestion-address {
+ font-size: 24rpx;
+ color: #999;
+ }
+ }
+ }
+ }
+
.form-input {
height: 70rpx;
padding: 0 20rpx;
--
Gitblit v1.9.1