From c6e38b6c66de5f5a8df5b8b2ab03a82c3b605db8 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期三, 03 十二月 2025 00:48:44 +0800
Subject: [PATCH] feat:优化同步

---
 app/pagesTask/edit-emergency.vue |  226 +++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 167 insertions(+), 59 deletions(-)

diff --git a/app/pagesTask/edit-emergency.vue b/app/pagesTask/edit-emergency.vue
index e23f4b5..4b133bf 100644
--- a/app/pagesTask/edit-emergency.vue
+++ b/app/pagesTask/edit-emergency.vue
@@ -27,6 +27,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>
         <uni-datetime-picker 
@@ -278,6 +288,7 @@
 import OrganizationSelector from './components/OrganizationSelector.vue'
 import HospitalSelector from './components/HospitalSelector.vue'
 import DiseaseSelector from './components/DiseaseSelector.vue'
+import DepartureSelector from './components/DepartureSelector.vue'
 import distanceCalculator from '@/mixins/distanceCalculator.js'
 
 export default {
@@ -288,7 +299,8 @@
     VehicleSelector,
     OrganizationSelector,
     HospitalSelector,
-    DiseaseSelector
+    DiseaseSelector,
+    DepartureSelector
   },
   mixins: [distanceCalculator],
   data() {
@@ -300,12 +312,19 @@
       selectedOrganizationId: null,
       selectedRegion: '',
       mapSelectorType: '',
+      // 鎵╁睍 addressCoordinates 鏀寔澶氱閿悕
+      addressCoordinates: {
+        start: null,
+        end: null,
+        hospitalOutAddress: null,
+        hospitalInAddress: null
+      },
       // 鍑哄彂鍦颁俊鎭�
       departureAddress: '',
       departureLongitude: null,
       departureLatitude: null,
-      selectedDiseases: [], // 宸查�夋嫨鐨勭梾鎯呭垪琛�
-      selectedStaff: [], // 宸查�夋嫨鐨勪汉鍛樺垪琛�
+      selectedDiseases: [], // 宸查�夋嫨鐨勭梾鎯呭垪琛紙纭繚鍒濆鍖栦负绌烘暟缁勶級
+      selectedStaff: [], // 宸查�夋嫨鐨勪汉鍛樺垪琛紙纭繚鍒濆鍖栦负绌烘暟缁勶級
       allStaffList: [], // 鎵�鏈変汉鍛樺垪琛�
       filteredStaffList: [], // 杩囨护鍚庣殑浜哄憳鍒楄〃
       staffSearchKeyword: '', // 浜哄憳鎼滅储鍏抽敭璇�
@@ -403,8 +422,8 @@
           this.taskForm.patient.idCard = info.patientIdCard || ''
           this.taskForm.patient.condition = info.patientCondition || ''
           
-          // 瑙f瀽鐥呮儏淇℃伅
-          this.parseDiseaseInfo(info.patientCondition, info.diseaseIds)
+          // 瑙f瀽鐥呮儏淇℃伅锛堜慨澶嶏細浣跨敤涓庡垱寤虹晫闈竴鑷寸殑閫昏緫锛�
+          this.parseDiseaseInfo(info.patientCondition, info.diseases)
           
           // 杞嚭鍖婚櫌淇℃伅
           this.taskForm.hospitalOut.id = info.hospitalOutId || null
@@ -489,8 +508,8 @@
           console.log('璁剧疆鐩爣鍦板潗鏍�:', this.taskDetail.destinationLongitude, this.taskDetail.destinationLatitude)
         }
         
-        // 璁剧疆鎵ц浜哄憳
-        if (this.taskDetail.assignees && this.taskDetail.assignees.length > 0) {
+        // 璁剧疆鎵ц浜哄憳锛堜慨澶嶏細纭繚 assignees 涓嶄负 null锛�
+        if (this.taskDetail.assignees && Array.isArray(this.taskDetail.assignees) && this.taskDetail.assignees.length > 0) {
           console.log('鍘熷鎵ц浜哄憳鏁版嵁:', this.taskDetail.assignees)
           this.selectedStaff = this.taskDetail.assignees.map(assignee => ({
             userId: assignee.userId,
@@ -503,6 +522,8 @@
         } else {
           console.warn('浠诲姟娌℃湁鍒嗛厤鎵ц浜哄憳鎴朼ssignees涓虹┖')
           console.log('taskDetail.assignees:', this.taskDetail.assignees)
+          // 纭繚 selectedStaff 鍒濆鍖栦负绌烘暟缁�
+          this.selectedStaff = []
         }
         
         console.log('琛ㄥ崟鏁版嵁濉厖瀹屾垚:', this.taskForm)
@@ -523,9 +544,33 @@
     
     // 褰掑睘鏈烘瀯閫夋嫨鍙樺寲
     onOrganizationChange(orgData) {
-      // orgData 鍖呭惈锛歞eptId, deptName, serviceOrderClass, region
+      // orgData 鍖呭惈锛歞eptId, deptName, serviceOrderClass, region, departureAddress, departureLongitude, departureLatitude
       this.selectedOrganizationId = orgData.deptId
-      console.log('閫変腑褰掑睘鏈烘瀯:', orgData.deptName, '閮ㄩ棬ID:', orgData.deptId)
+      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.region)
+    },
+    
+    // 鍑哄彂鍦板湴鍧�閫夋嫨锛堜粠鍦板浘寤鸿涓�夋嫨锛�
+    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
     },
     
     // 杞嚭鍖婚櫌鍙樺寲
@@ -732,61 +777,101 @@
       this.selectedStaff.splice(index, 1)
     },
     
-    // 瑙f瀽鐥呮儏淇℃伅锛堜粠瀛楃涓茶В鏋愬嚭ICD-10鐤剧梾鍒楄〃锛�
-    parseDiseaseInfo(conditionText, diseaseIds) {
+    // 瑙f瀽鐥呮儏淇℃伅锛堜粠瀛楃涓茶В鏋愬嚭ICD-10鐤剧梾鍒楄〃锛�- 淇锛氫笌鍒涘缓鐣岄潰淇濇寔涓�鑷�
+    parseDiseaseInfo(conditionText, diseases) {
+      console.log('========== 寮�濮嬭В鏋愮梾鎯呬俊鎭� ==========')
+      console.log('conditionText:', conditionText)
+      console.log('diseases鏁扮粍:', diseases)
+      
       if (!conditionText) {
+        console.log('鐥呮儏鏂囨湰涓虹┖锛屾竻绌洪�変腑鐥呮儏')
         this.selectedDiseases = []
         this.taskForm.patient.otherCondition = ''
         return
       }
-      
-      // 瑙f瀽diseaseIds锛堥�楀彿鍒嗛殧鐨勫瓧绗︿覆杞负鏁扮粍锛�
-      const diseaseIdArray = diseaseIds ? diseaseIds.split(',').map(id => parseInt(id.trim())).filter(id => !isNaN(id)) : []
       
       // 濡傛灉鍖呭惈"鍏朵粬锛�"鍒嗛殧绗︼紝鎷嗗垎鐥呮儏鍜屽叾浠栨弿杩�
       if (conditionText.includes('\n鍏朵粬锛�')) {
         const parts = conditionText.split('\n鍏朵粬锛�')
         const diseasePart = parts[0]
         this.taskForm.patient.otherCondition = parts[1] || ''
+        console.log('鐥呮儏閮ㄥ垎:', diseasePart)
+        console.log('鍏朵粬鎻忚堪:', this.taskForm.patient.otherCondition)
         
         // 瑙f瀽鐥呮儏閮ㄥ垎
-        this.parseDiseaseList(diseasePart, diseaseIdArray)
+        this.parseDiseaseList(diseasePart, diseases)
       } else {
-        // 娌℃湁"鍏朵粬"閮ㄥ垎锛屽叏閮ㄤ綔涓哄叾浠栨弿杩�
-        this.taskForm.patient.otherCondition = conditionText
-        this.selectedDiseases = []
+        // 娌℃湁"鍏朵粬"閮ㄥ垎锛屽皾璇曡В鏋愭槸鍚︽湁鐤剧梾鍒楄〃
+        const hasDiseasesFormat = /([^(]+)\(([^)]+)\)/.test(conditionText)
+        console.log('鏄惁鍖呭惈鐤剧梾鏍煎紡:', hasDiseasesFormat)
+        
+        if (hasDiseasesFormat) {
+          // 鏈夌柧鐥呮牸寮忥紝瑙f瀽鐤剧梾鍒楄〃
+          this.parseDiseaseList(conditionText, diseases)
+          this.taskForm.patient.otherCondition = ''
+        } else {
+          // 娌℃湁鐤剧梾鏍煎紡锛屽叏閮ㄤ綔涓哄叾浠栨弿杩�
+          console.log('鏃犵柧鐥呮牸寮忥紝浣滀负鍏朵粬鎻忚堪')
+          this.taskForm.patient.otherCondition = conditionText
+          this.selectedDiseases = []
+        }
       }
+      
+      console.log('瑙f瀽瀹屾垚锛宻electedDiseases:', JSON.stringify(this.selectedDiseases))
+      console.log('瑙f瀽瀹屾垚锛宱therCondition:', this.taskForm.patient.otherCondition)
+      console.log('========================================\n')
     },
     
     // 瑙f瀽鐥呮儏鍒楄〃锛堟牸寮忥細鐤剧梾鍚�(缂栫爜)銆佺柧鐥呭悕(缂栫爜)锛�
-    parseDiseaseList(diseasePart, diseaseIdArray) {
+    parseDiseaseList(diseasePart, diseasesData) {
+      console.log('--- parseDiseaseList 寮�濮� ---')
+      console.log('diseasePart:', diseasePart)
+      console.log('diseasesData:', diseasesData)
+      
       if (!diseasePart) {
+        console.log('鐥呮儏閮ㄥ垎涓虹┖')
         this.selectedDiseases = []
         return
       }
       
+      // 濡傛灉鍚庣宸茬粡杩斿洖浜哾iseases鏁扮粍锛岀洿鎺ヤ娇鐢�
+      if (diseasesData && Array.isArray(diseasesData) && diseasesData.length > 0) {
+        console.log('浣跨敤鍚庣杩斿洖鐨刣iseases鏁扮粍锛屾暟閲�:', diseasesData.length)
+        this.selectedDiseases = diseasesData.map(d => ({
+          id: d.icdId || null,
+          icdCode: d.icdCode || '',
+          icdName: d.icdName || ''
+        }))
+        console.log('瑙f瀽鍚庣殑selectedDiseases:', JSON.stringify(this.selectedDiseases))
+        return
+      }
+      
+      // 鍚﹀垯锛屼粠瀛楃涓茶В鏋�
+      console.log('浠庡瓧绗︿覆瑙f瀽鐥呮儏')
       // 鍖归厤鏍煎紡锛氱柧鐥呭悕(缂栫爜)
       const regex = /([^(]+)\(([^)]+)\)/g
       const diseases = []
       let match
-      let index = 0
       
       while ((match = regex.exec(diseasePart)) !== null) {
         const icdName = match[1].replace(/[銆�,\s]+$/, '').replace(/^[銆�,\s]+/, '').trim()
         const icdCode = match[2].trim()
         
+        console.log('鍖归厤鍒扮梾鎯� - 鍚嶇О:', icdName, '缂栫爜:', icdCode)
+        
         // 鍙坊鍔犵梾鎯呭悕绉颁笉涓虹┖鐨勯」
         if (icdName) {
           diseases.push({
-            icdName: icdName,
+            id: null, // 浠庡瓧绗︿覆瑙f瀽鏃讹紝娌℃湁ID
             icdCode: icdCode,
-            id: diseaseIdArray && index < diseaseIdArray.length ? diseaseIdArray[index] : null
+            icdName: icdName
           })
-          index++
         }
       }
       
+      console.log('浠庡瓧绗︿覆瑙f瀽瀹屾垚锛屾暟閲�:', diseases.length)
       this.selectedDiseases = diseases
+      console.log('--- parseDiseaseList 缁撴潫 ---\n')
     },
     
     // 閫夋嫨杞嚭鍖婚櫌鍦板潃
@@ -889,6 +974,14 @@
     },
     
     buildSubmitData() {
+      // 纭繚 selectedDiseases 鍜� selectedStaff 涓嶄负 null锛堜慨澶嶏細闃叉杩唬 null 瀵艰嚧閿欒锛�
+      if (!this.selectedDiseases) {
+        this.selectedDiseases = []
+      }
+      if (!this.selectedStaff) {
+        this.selectedStaff = []
+      }
+      
       // 鍚堝苟鐥呮儏淇℃伅锛氶�変腑鐨処CD-10鐤剧梾 + 鍏朵粬鎻忚堪
       let conditionText = ''
       if (this.selectedDiseases.length > 0) {
@@ -909,47 +1002,46 @@
         }
       }
       
+      // 鏋勫缓鎻愪氦鏁版嵁 - 浣跨敤涓� TaskCreateVO 涓�鑷寸殑缁撴瀯
       const submitData = {
         taskId: this.taskId,
         taskType: 'EMERGENCY_TRANSFER',
         deptId: this.selectedOrganizationId,
         vehicleIds: this.selectedVehicleId ? [this.selectedVehicleId] : [],
         plannedStartTime: this.taskForm.transferTime,
-        // 鍑哄彂鍦颁娇鐢� departureAddress锛堝鏋滄湁锛夛紝鍚﹀垯浣跨敤杞嚭鍖婚櫌鍦板潃
+        
+        // 鍑哄彂鍦板湴鍧�鍜屽潗鏍囷紙浣跨敤杞嚭鍖婚櫌鍦板潃锛�
         departureAddress: this.departureAddress || this.taskForm.hospitalOut.address,
-        // 鐩爣鍦颁娇鐢ㄨ浆鍏ュ尰闄㈠湴鍧�
+        departureLongitude: this.departureLongitude || (this.addressCoordinates.hospitalOutAddress ? this.addressCoordinates.hospitalOutAddress.lng : null),
+        departureLatitude: this.departureLatitude || (this.addressCoordinates.hospitalOutAddress ? this.addressCoordinates.hospitalOutAddress.lat : null),
+        
+        // 鐩爣鍦板湴鍧�鍜屽潗鏍囷紙浣跨敤杞叆鍖婚櫌鍦板潃锛�
         destinationAddress: this.taskForm.hospitalIn.address,
+        destinationLongitude: this.addressCoordinates.hospitalInAddress ? this.addressCoordinates.hospitalInAddress.lng : null,
+        destinationLatitude: this.addressCoordinates.hospitalInAddress ? this.addressCoordinates.hospitalInAddress.lat : null,
+        
+        // 杞繍璺濈鍜屼环鏍硷紙涓讳换鍔″瓧娈碉級
+        distance: this.taskForm.transferDistance ? parseFloat(this.taskForm.transferDistance) : null,
+        price: this.taskForm.price ? parseFloat(this.taskForm.price) : null,
+        
         // 鐥呮儏ID鍒楄〃锛堢敤浜庡悓姝ヨ皟搴﹀崟鐨凮rdICD_ID鍙傛暟锛�
         diseaseIds: this.selectedDiseases.map(d => d.id).filter(id => id !== null),
-        // 鎵ц浜哄憳鍒楄〃
-        assignees: this.selectedStaff.map(staff => ({
+        
+        // 鎵ц浜哄憳鍒楄〃锛堢‘淇濅笉涓� null锛�
+        assignees: (this.selectedStaff && Array.isArray(this.selectedStaff)) ? this.selectedStaff.map(staff => ({
           userId: staff.userId,
           userName: staff.nickName,
           userType: staff.type
-        })),
-        emergencyInfo: {
-          patientContact: this.taskForm.patient.contact,
-          patientPhone: this.taskForm.patient.phone,
-          patientName: this.taskForm.patient.name,
-          patientGender: this.taskForm.patient.gender,
-          patientIdCard: this.taskForm.patient.idCard,
-          patientCondition: conditionText, // 浣跨敤鍚堝苟鍚庣殑鐥呮儏淇℃伅
-          hospitalOutName: this.taskForm.hospitalOut.name,
-          hospitalOutDepartment: this.taskForm.hospitalOut.department,
-          hospitalOutBedNumber: this.taskForm.hospitalOut.bedNumber,
-          hospitalOutAddress: this.taskForm.hospitalOut.address,
-          // 杞嚭鍖婚櫌GPS鍧愭爣锛堜繚瀛樺埌鎵╁睍琛級
-          hospitalOutLongitude: this.addressCoordinates.hospitalOutAddress ? this.addressCoordinates.hospitalOutAddress.lng : null,
-          hospitalOutLatitude: this.addressCoordinates.hospitalOutAddress ? this.addressCoordinates.hospitalOutAddress.lat : null,
-          hospitalInName: this.taskForm.hospitalIn.name,
-          hospitalInDepartment: this.taskForm.hospitalIn.department,
-          hospitalInBedNumber: this.taskForm.hospitalIn.bedNumber,
-          hospitalInAddress: this.taskForm.hospitalIn.address,
-          // 杞叆鍖婚櫌GPS鍧愭爣锛堜繚瀛樺埌鎵╁睍琛級
-          hospitalInLongitude: this.addressCoordinates.hospitalInAddress ? this.addressCoordinates.hospitalInAddress.lng : null,
-          hospitalInLatitude: this.addressCoordinates.hospitalInAddress ? this.addressCoordinates.hospitalInAddress.lat : null,
-          transferDistance: this.taskForm.transferDistance ? parseFloat(this.taskForm.transferDistance) : null,
-          transferPrice: this.taskForm.price ? parseFloat(this.taskForm.price) : null,
+        })) : [],
+        
+        // 鎮h�呬俊鎭紙宓屽瀵硅薄锛�
+        patient: {
+          contact: this.taskForm.patient.contact,
+          phone: this.taskForm.patient.phone,
+          name: this.taskForm.patient.name,
+          gender: this.taskForm.patient.gender,
+          idCard: this.taskForm.patient.idCard,
+          condition: conditionText, // 浣跨敤鍚堝苟鍚庣殑鐥呮儏淇℃伅
           // 鐥呮儏璇︾粏淇℃伅锛堣繃婊ゆ帀绌虹殑鐥呮儏鍚嶇О锛�
           diseases: this.selectedDiseases
             .filter(d => d.icdName && d.icdName.trim())
@@ -958,16 +1050,32 @@
               icdCode: d.icdCode,
               icdName: d.icdName
             }))
+        },
+        
+        // 杞嚭鍖婚櫌淇℃伅锛堝祵濂楀璞★級
+        hospitalOut: {
+          id: this.taskForm.hospitalOut.id,
+          name: this.taskForm.hospitalOut.name,
+          address: this.taskForm.hospitalOut.address,
+          longitude: this.addressCoordinates.hospitalOutAddress ? this.addressCoordinates.hospitalOutAddress.lng : null,
+          latitude: this.addressCoordinates.hospitalOutAddress ? this.addressCoordinates.hospitalOutAddress.lat : null,
+          department: this.taskForm.hospitalOut.department,
+          departmentId: this.taskForm.hospitalOut.departmentId,
+          bedNumber: this.taskForm.hospitalOut.bedNumber
+        },
+        
+        // 杞叆鍖婚櫌淇℃伅锛堝祵濂楀璞★級
+        hospitalIn: {
+          id: this.taskForm.hospitalIn.id,
+          name: this.taskForm.hospitalIn.name,
+          address: this.taskForm.hospitalIn.address,
+          longitude: this.addressCoordinates.hospitalInAddress ? this.addressCoordinates.hospitalInAddress.lng : null,
+          latitude: this.addressCoordinates.hospitalInAddress ? this.addressCoordinates.hospitalInAddress.lat : null,
+          department: this.taskForm.hospitalIn.department,
+          departmentId: this.taskForm.hospitalIn.departmentId,
+          bedNumber: this.taskForm.hospitalIn.bedNumber
         }
       }
-      
-      // 鍑哄彂鍦癎PS鍧愭爣
-      if (this.departureLongitude && this.departureLatitude) {
-        submitData.departureLongitude = this.departureLongitude
-        submitData.departureLatitude = this.departureLatitude
-      }
-      
-      // 鐩爣鍦癎PS鍧愭爣鐢卞悗绔嚜鍔ㄨ幏鍙�
       
       return submitData
     },

--
Gitblit v1.9.1