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/edit-emergency.vue |  554 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 508 insertions(+), 46 deletions(-)

diff --git a/app/pages/task/edit-emergency.vue b/app/pages/task/edit-emergency.vue
index 2dd9009..3aafe37 100644
--- a/app/pages/task/edit-emergency.vue
+++ b/app/pages/task/edit-emergency.vue
@@ -37,6 +37,28 @@
         />
       </view>
       
+      <view class="form-item">
+        <view class="form-label">鎵ц浠诲姟浜哄憳</view>
+        <view class="staff-list">
+          <view class="staff-item" v-for="(staff, index) in selectedStaff" :key="staff.userId">
+            <view class="staff-info">
+              <text class="staff-name">{{ staff.nickName }}</text>
+              <text class="staff-role">({{ getUserTypeName(staff.type) || '鏈煡鑱屼綅' }})</text>
+            </view>
+            <uni-icons 
+              type="closeempty" 
+              size="20" 
+              color="#ff4d4f"
+              @click="removeStaff(index)"
+            ></uni-icons>
+          </view>
+          <view class="add-staff" @click="showStaffSelector">
+            <uni-icons type="plusempty" size="20" color="#007AFF"></uni-icons>
+            <text>娣诲姞浜哄憳</text>
+          </view>
+        </view>
+      </view>
+      
       <view class="form-section-title">鎮h�呬俊鎭�</view>
       <view class="form-item">
         <view class="form-label required">鑱旂郴浜�</view>
@@ -166,6 +188,80 @@
         ></map-selector>
       </view>
     </uni-popup>
+    
+    <!-- 浜哄憳閫夋嫨鍣ㄥ脊绐� -->
+    <uni-popup ref="staffPopup" type="bottom" :mask-click="false">
+      <view class="staff-popup-container">
+        <view class="popup-header">
+          <view class="popup-title">閫夋嫨鎵ц浜哄憳</view>
+          <view class="close-btn" @click="closeStaffSelector">
+            <uni-icons type="closeempty" size="20" color="#999"></uni-icons>
+          </view>
+        </view>
+        
+        <view class="search-bar">
+          <input 
+            class="search-input" 
+            placeholder="鎼滅储濮撳悕鎴栫數璇�" 
+            v-model="staffSearchKeyword"
+            @input="onStaffSearch"
+          />
+        </view>
+        
+        <view class="filter-tabs">
+          <view 
+            class="filter-tab" 
+            :class="{ active: staffFilterType === 'driver' }"
+            @click="filterStaff('driver')"
+          >
+            鍙告満
+          </view>
+          <view 
+            class="filter-tab" 
+            :class="{ active: staffFilterType === 'doctor' }"
+            @click="filterStaff('doctor')"
+          >
+            鍖荤敓
+          </view>
+          <view 
+            class="filter-tab" 
+            :class="{ active: staffFilterType === 'nurse' }"
+            @click="filterStaff('nurse')"
+          >
+            鎶ゅ+
+          </view>
+        </view>
+        
+        <scroll-view class="staff-list-scroll" scroll-y="true">
+          <view 
+            class="staff-list-item" 
+            v-for="staff in filteredStaffList" 
+            :key="staff.userId"
+            @click="toggleStaffSelection(staff)"
+          >
+            <view class="staff-item-info">
+              <text class="staff-item-name">{{ staff.nickName }}</text>
+              <text class="staff-item-dept">{{ staff.deptName }}</text>
+            </view>
+            <view class="staff-item-check">
+              <uni-icons 
+                v-if="isStaffSelected(staff.userId)" 
+                type="checkmarkempty" 
+                size="24" 
+                color="#007AFF"
+              ></uni-icons>
+            </view>
+          </view>
+          <view v-if="filteredStaffList.length === 0" class="empty-tip">
+            鏆傛棤浜哄憳鏁版嵁
+          </view>
+        </scroll-view>
+        
+        <view class="popup-footer">
+          <button class="confirm-btn" @click="confirmStaffSelection">纭畾(宸查�墈{ selectedStaff.length }})</button>
+        </view>
+      </view>
+    </uni-popup>
   </scroll-view>
 </template>
 
@@ -174,6 +270,7 @@
 import uniDatetimePicker from '@/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue'
 import uniPopup from '@/uni_modules/uni-popup/components/uni-popup/uni-popup.vue'
 import { getTask, updateTask } from "@/api/task"
+import { listBranchUsers } from "@/api/system/user"
 import { baiduDistanceByAddress } from "@/api/map"
 import { calculateTransferPrice } from "@/api/price"
 import MapSelector from '@/components/map-selector.vue'
@@ -196,18 +293,23 @@
   mixins: [distanceCalculator],
   data() {
     return {
+      loading: false,
       taskId: null,
       taskDetail: null,
       selectedVehicleId: null,
       selectedOrganizationId: null,
       selectedRegion: '',
       mapSelectorType: '',
-      // 鍦板潃鍧愭爣锛堢敤浜庢墜鍔ㄨ緭鍏ュ湴鍧�鏃惰绠楄窛绂伙級
-      addressCoordinates: {
-        hospitalOutAddress: null,
-        hospitalInAddress: null
-      },
+      // 鍑哄彂鍦颁俊鎭�
+      departureAddress: '',
+      departureLongitude: null,
+      departureLatitude: null,
       selectedDiseases: [], // 宸查�夋嫨鐨勭梾鎯呭垪琛�
+      selectedStaff: [], // 宸查�夋嫨鐨勪汉鍛樺垪琛�
+      allStaffList: [], // 鎵�鏈変汉鍛樺垪琛�
+      filteredStaffList: [], // 杩囨护鍚庣殑浜哄憳鍒楄〃
+      staffSearchKeyword: '', // 浜哄憳鎼滅储鍏抽敭璇�
+      staffFilterType: 'driver', // 浜哄憳绛涢�夌被鍨�
       taskForm: {
         transferTime: '',
         patient: {
@@ -237,8 +339,7 @@
         },
         transferDistance: '',
         price: ''
-      },
-      loading: false
+      }
     }
   },
   computed: {
@@ -255,6 +356,7 @@
     if (options.id) {
       this.taskId = options.id
       this.loadTaskDetail()
+      this.loadDeptStaff() // 鍔犺浇浜哄憳鍒楄〃
     } else {
       this.$modal.showToast('浠诲姟ID涓嶈兘涓虹┖')
       setTimeout(() => {
@@ -311,12 +413,30 @@
           this.taskForm.hospitalOut.bedNumber = info.hospitalOutBedNumber || ''
           this.taskForm.hospitalOut.address = info.hospitalOutAddress || ''
           
+          // 鍔犺浇杞嚭鍖婚櫌GPS鍧愭爣锛堜笉鏄剧ず锛屼絾淇濆瓨鍦ㄦ暟鎹腑锛�
+          if (info.hospitalOutLongitude && info.hospitalOutLatitude) {
+            this.addressCoordinates.hospitalOutAddress = {
+              lng: info.hospitalOutLongitude,
+              lat: info.hospitalOutLatitude
+            }
+            console.log('鍔犺浇杞嚭鍖婚櫌GPS鍧愭爣:', info.hospitalOutLongitude, info.hospitalOutLatitude)
+          }
+          
           // 杞叆鍖婚櫌淇℃伅
           this.taskForm.hospitalIn.id = info.hospitalInId || null
           this.taskForm.hospitalIn.name = info.hospitalInName || ''
           this.taskForm.hospitalIn.department = info.hospitalInDepartment || ''
           this.taskForm.hospitalIn.bedNumber = info.hospitalInBedNumber || ''
           this.taskForm.hospitalIn.address = info.hospitalInAddress || ''
+          
+          // 鍔犺浇杞叆鍖婚櫌GPS鍧愭爣锛堜笉鏄剧ず锛屼絾淇濆瓨鍦ㄦ暟鎹腑锛�
+          if (info.hospitalInLongitude && info.hospitalInLatitude) {
+            this.addressCoordinates.hospitalInAddress = {
+              lng: info.hospitalInLongitude,
+              lat: info.hospitalInLatitude
+            }
+            console.log('鍔犺浇杞叆鍖婚櫌GPS鍧愭爣:', info.hospitalInLongitude, info.hospitalInLatitude)
+          }
           
           // 杞繍璺濈鍜屼环鏍�
           this.taskForm.transferDistance = info.transferDistance ? String(info.transferDistance) : ''
@@ -346,20 +466,43 @@
           console.warn('鏈壘鍒板綊灞炴満鏋勪俊鎭�')
         }
         
-        // 璁剧疆鍦板潃鍧愭爣锛堜娇鐢╩ixin涓殑鏂规硶锛�
+        // 璁剧疆鍑哄彂鍦颁俊鎭紙鍦板潃鍜屽潗鏍囷級
+        if (this.taskDetail.departureAddress) {
+          this.departureAddress = this.taskDetail.departureAddress
+        }
         if (this.taskDetail.departureLongitude && this.taskDetail.departureLatitude) {
-          this.setStartLocation({
-            lng: this.taskDetail.departureLongitude,
-            lat: this.taskDetail.departureLatitude
-          })
-          console.log('璁剧疆鍑哄彂鍦板潗鏍�')
+          this.departureLongitude = this.taskDetail.departureLongitude
+          this.departureLatitude = this.taskDetail.departureLatitude
+          console.log('璁剧疆鍑哄彂鍦板潗鏍�:', this.departureLongitude, this.departureLatitude)
+        }
+        
+        // 璁剧疆鐩爣鍦颁俊鎭紙杞叆鍖婚櫌鐨勫湴鍧�鍜屽潗鏍囷級
+        if (this.taskDetail.destinationAddress) {
+          // 鐩爣鍦板湴鍧�宸茬粡鍦� taskForm.hospitalIn.address 涓缃�
+          console.log('鐩爣鍦板湴鍧�:', this.taskDetail.destinationAddress)
         }
         if (this.taskDetail.destinationLongitude && this.taskDetail.destinationLatitude) {
-          this.setEndLocation({
+          this.addressCoordinates.hospitalInAddress = {
             lng: this.taskDetail.destinationLongitude,
             lat: this.taskDetail.destinationLatitude
-          })
-          console.log('璁剧疆鐩殑鍦板潗鏍�')
+          }
+          console.log('璁剧疆鐩爣鍦板潗鏍�:', this.taskDetail.destinationLongitude, this.taskDetail.destinationLatitude)
+        }
+        
+        // 璁剧疆鎵ц浜哄憳
+        if (this.taskDetail.assignees && this.taskDetail.assignees.length > 0) {
+          console.log('鍘熷鎵ц浜哄憳鏁版嵁:', this.taskDetail.assignees)
+          this.selectedStaff = this.taskDetail.assignees.map(assignee => ({
+            userId: assignee.userId,
+            nickName: assignee.userName,
+            type: assignee.userType || 'driver',
+            phonenumber: '',
+            deptName: ''
+          }))
+          console.log('澶勭悊鍚庣殑鎵ц浜哄憳鍒楄〃:', this.selectedStaff)
+        } else {
+          console.warn('浠诲姟娌℃湁鍒嗛厤鎵ц浜哄憳鎴朼ssignees涓虹┖')
+          console.log('taskDetail.assignees:', this.taskDetail.assignees)
         }
         
         console.log('琛ㄥ崟鏁版嵁濉厖瀹屾垚:', this.taskForm)
@@ -402,16 +545,10 @@
       }
     },
     
-    // 杞嚭鍖婚櫌鍦板潃閫夋嫨锛堝綋閫夋嫨"瀹朵腑"鏃朵娇鐢ㄧ櫨搴﹀湴鍥惧湴鍧�寤鸿锛�
+    // 杞嚭鍖婚櫌鍦板潃閫夋嫨浜嬩欢锛堢畝鍖栵級
     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()
       }
     },
     
@@ -432,16 +569,10 @@
       }
     },
     
-    // 杞叆鍖婚櫌鍦板潃閫夋嫨锛堝綋閫夋嫨"瀹朵腑"鏃朵娇鐢ㄧ櫨搴﹀湴鍥惧湴鍧�寤鸿锛�
+    // 杞叆鍖婚櫌鍦板潃閫夋嫨浜嬩欢锛堢畝鍖栵級
     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()
       }
     },
     
@@ -449,6 +580,156 @@
     onDiseaseChange(diseases) {
       console.log('鐥呮儏鍙樺寲:', diseases)
       // 缁勪欢宸茬粡閫氳繃 v-model 鏇存柊浜� selectedDiseases
+    },
+    
+    // 鍔犺浇褰撳墠鐢ㄦ埛鎵�鍦ㄥ垎鍏徃鐨勬墍鏈変汉鍛�
+    loadDeptStaff() {
+      console.log('寮�濮嬪姞杞戒汉鍛樺垪琛�')
+      
+      listBranchUsers().then(response => {
+        console.log('浜哄憳鍒楄〃API鍝嶅簲:', response)
+        const userList = response.data || []
+        console.log('瑙f瀽鍑虹殑鐢ㄦ埛鍒楄〃:', userList, '鏁伴噺:', userList.length)
+        
+        this.allStaffList = userList.map(user => ({
+          userId: user.userId,
+          nickName: user.nickName,
+          phonenumber: user.phonenumber,
+          deptName: user.dept?.deptName || '',
+          postName: user.posts && user.posts.length > 0 ? user.posts[0].postName : '',
+          roleName: user.roles && user.roles.length > 0 ? user.roles[0].roleName : '',
+          type: this.getUserType(user)
+        }))
+        
+        console.log('澶勭悊鍚庣殑浜哄憳鍒楄〃:', this.allStaffList, '鏁伴噺:', this.allStaffList.length)
+        
+        this.filterStaffList()
+      }).catch(error => {
+        console.error('鍔犺浇浜哄憳鍒楄〃澶辫触:', error)
+        this.$modal.showToast('鍔犺浇浜哄憳鍒楄〃澶辫触')
+      })
+    },
+    
+    // 鏍规嵁鐢ㄦ埛鐨勫矖浣嶆垨瑙掕壊鍒ゆ柇绫诲瀷
+    getUserType(user) {
+      const postName = user.posts && user.posts.length > 0 ? user.posts[0].postName : ''
+      const roleName = user.roles && user.roles.length > 0 ? user.roles[0].roleName : ''
+      const deptName = user.dept?.deptName || ''
+      
+      if (postName.includes('鍙告満') || roleName.includes('鍙告満') || deptName.includes('杞﹂槦') || deptName.includes('鍙告満')) {
+        return 'driver'
+      }
+      if (postName.includes('鎶ゅ+') || roleName.includes('鎶ゅ+') || deptName.includes('鎶ゅ+')) {
+        return 'nurse'
+      }
+      if (postName.includes('鍖荤敓') || roleName.includes('鍖荤敓') || deptName.includes('鍖荤敓')) {
+        return 'doctor'
+      }
+      if (deptName.includes('鍖绘姢')) {
+        return 'doctor'
+      }
+      
+      return 'driver'
+    },
+    
+    getUserTypeName(staffType) {
+      switch(staffType) {
+        case 'nurse':
+          return '鎶ゅ+'
+        case 'doctor':
+          return '鍖荤敓'
+        case 'driver':
+          return '鍙告満'
+        default:
+          return '鍙告満'
+      }
+    },
+    
+    // 鏄剧ず浜哄憳閫夋嫨寮圭獥
+    showStaffSelector() {
+      this.$refs.staffPopup.open()
+      this.filterStaffList()
+    },
+    
+    // 鍏抽棴浜哄憳閫夋嫨寮圭獥
+    closeStaffSelector() {
+      this.$refs.staffPopup.close()
+      this.staffSearchKeyword = ''
+      this.staffFilterType = 'driver'
+    },
+    
+    // 浜哄憳鎼滅储
+    onStaffSearch(e) {
+      this.staffSearchKeyword = e.detail.value
+      this.filterStaffList()
+    },
+    
+    // 绛涢�変汉鍛樼被鍨�
+    filterStaff(type) {
+      this.staffFilterType = type
+      this.filterStaffList()
+    },
+    
+    // 杩囨护浜哄憳鍒楄〃
+    filterStaffList() {
+      console.log('寮�濮嬭繃婊や汉鍛樺垪琛紝鍘熷鏁伴噺:', this.allStaffList.length)
+      let list = [...this.allStaffList]
+      
+      // 鎸夌被鍨嬭繃婊�
+      if (this.staffFilterType === 'driver') {
+        list = list.filter(staff => staff.type === 'driver')
+      } else if (this.staffFilterType === 'doctor') {
+        list = list.filter(staff => staff.type === 'doctor')
+      } else if (this.staffFilterType === 'nurse') {
+        list = list.filter(staff => staff.type === 'nurse')
+      }
+      
+      console.log('鎸夌被鍨嬭繃婊ゅ悗:', this.staffFilterType, '鏁伴噺:', list.length)
+      
+      // 鎸夊叧閿瘝鎼滅储
+      if (this.staffSearchKeyword && this.staffSearchKeyword.trim() !== '') {
+        const keyword = this.staffSearchKeyword.trim().toLowerCase()
+        list = list.filter(staff => {
+          return staff.nickName.toLowerCase().includes(keyword) || 
+                 (staff.phonenumber && staff.phonenumber.includes(keyword))
+        })
+      }
+      
+      console.log('鎸夊叧閿瘝杩囨护鍚庯紝鏁伴噺:', list.length)
+      
+      this.filteredStaffList = list
+    },
+    
+    // 鍒囨崲浜哄憳閫変腑鐘舵��
+    toggleStaffSelection(staff) {
+      const index = this.selectedStaff.findIndex(s => s.userId === staff.userId)
+      
+      if (index > -1) {
+        // 宸查�変腑锛岀Щ闄�
+        this.selectedStaff.splice(index, 1)
+      } else {
+        // 鏈�変腑锛屾坊鍔�
+        this.selectedStaff.push(staff)
+      }
+    },
+    
+    // 鍒ゆ柇浜哄憳鏄惁宸查�変腑
+    isStaffSelected(userId) {
+      return this.selectedStaff.some(staff => staff.userId === userId)
+    },
+    
+    // 纭浜哄憳閫夋嫨
+    confirmStaffSelection() {
+      if (this.selectedStaff.length === 0) {
+        this.$modal.showToast('璇疯嚦灏戦�夋嫨涓�鍚嶄汉鍛�')
+        return
+      }
+      this.closeStaffSelector()
+    },
+    
+    // 绉婚櫎浜哄憳
+    removeStaff(index) {
+      this.selectedStaff.splice(index, 1)
     },
     
     // 瑙f瀽鐥呮儏淇℃伅锛堜粠瀛楃涓茶В鏋愬嚭ICD-10鐤剧梾鍒楄〃锛�
@@ -634,10 +915,18 @@
         deptId: this.selectedOrganizationId,
         vehicleIds: this.selectedVehicleId ? [this.selectedVehicleId] : [],
         plannedStartTime: this.taskForm.transferTime,
-        departureAddress: this.taskForm.hospitalOut.address,
+        // 鍑哄彂鍦颁娇鐢� departureAddress锛堝鏋滄湁锛夛紝鍚﹀垯浣跨敤杞嚭鍖婚櫌鍦板潃
+        departureAddress: this.departureAddress || this.taskForm.hospitalOut.address,
+        // 鐩爣鍦颁娇鐢ㄨ浆鍏ュ尰闄㈠湴鍧�
         destinationAddress: this.taskForm.hospitalIn.address,
         // 鐥呮儏ID鍒楄〃锛堢敤浜庡悓姝ヨ皟搴﹀崟鐨凮rdICD_ID鍙傛暟锛�
         diseaseIds: this.selectedDiseases.map(d => d.id).filter(id => id !== null),
+        // 鎵ц浜哄憳鍒楄〃
+        assignees: this.selectedStaff.map(staff => ({
+          userId: staff.userId,
+          userName: staff.nickName,
+          userType: staff.type
+        })),
         emergencyInfo: {
           patientContact: this.taskForm.patient.contact,
           patientPhone: this.taskForm.patient.phone,
@@ -649,10 +938,16 @@
           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,
           // 鐥呮儏璇︾粏淇℃伅锛堣繃婊ゆ帀绌虹殑鐥呮儏鍚嶇О锛�
@@ -666,16 +961,13 @@
         }
       }
       
-      // 娣诲姞GPS鍧愭爣
-      if (this.addressCoordinates.start) {
-        submitData.departureLongitude = this.addressCoordinates.start.lng
-        submitData.departureLatitude = this.addressCoordinates.start.lat
+      // 鍑哄彂鍦癎PS鍧愭爣
+      if (this.departureLongitude && this.departureLatitude) {
+        submitData.departureLongitude = this.departureLongitude
+        submitData.departureLatitude = this.departureLatitude
       }
       
-      if (this.addressCoordinates.end) {
-        submitData.destinationLongitude = this.addressCoordinates.end.lng
-        submitData.destinationLatitude = this.addressCoordinates.end.lat
-      }
+      // 鐩爣鍦癎PS鍧愭爣鐢卞悗绔嚜鍔ㄨ幏鍙�
       
       return submitData
     },
@@ -688,8 +980,6 @@
       this.$modal.confirm('纭畾瑕佷繚瀛樹慨鏀瑰悧锛�').then(() => {
         this.loading = true
         const submitData = this.buildSubmitData()
-        
-        console.log('鎻愪氦鏁版嵁:', JSON.stringify(submitData, null, 2))
         
         updateTask(submitData).then(response => {
           this.loading = false
@@ -946,6 +1236,51 @@
           color: #333;
         }
       }
+      
+      .staff-list {
+        .staff-item {
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          padding: 20rpx;
+          margin-bottom: 15rpx;
+          background-color: #f8f8f8;
+          border-radius: 10rpx;
+          
+          .staff-info {
+            display: flex;
+            align-items: center;
+            gap: 10rpx;
+            
+            .staff-name {
+              font-size: 28rpx;
+              color: #333;
+            }
+            
+            .staff-role {
+              font-size: 24rpx;
+              color: #999;
+            }
+          }
+        }
+        
+        .add-staff {
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          gap: 10rpx;
+          padding: 20rpx;
+          border: 2rpx dashed #007AFF;
+          border-radius: 10rpx;
+          color: #007AFF;
+          font-size: 28rpx;
+          cursor: pointer;
+          
+          &:active {
+            background-color: #f0f8ff;
+          }
+        }
+      }
     }
     
     .form-actions {
@@ -1011,5 +1346,132 @@
       }
     }
   }
+  
+  .staff-popup-container {
+    height: 80vh;
+    background-color: white;
+    border-top-left-radius: 20rpx;
+    border-top-right-radius: 20rpx;
+    display: flex;
+    flex-direction: column;
+    
+    .popup-header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 20rpx 30rpx;
+      border-bottom: 1rpx solid #f0f0f0;
+      
+      .popup-title {
+        font-size: 32rpx;
+        font-weight: bold;
+        color: #333;
+      }
+      
+      .close-btn {
+        width: 50rpx;
+        height: 50rpx;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+      }
+    }
+    
+    .search-bar {
+      padding: 20rpx 30rpx;
+      border-bottom: 1rpx solid #f0f0f0;
+      
+      .search-input {
+        height: 70rpx;
+        padding: 0 20rpx;
+        background-color: #f5f5f5;
+        border-radius: 10rpx;
+        font-size: 28rpx;
+      }
+    }
+    
+    .filter-tabs {
+      display: flex;
+      padding: 20rpx 30rpx;
+      gap: 20rpx;
+      border-bottom: 1rpx solid #f0f0f0;
+      
+      .filter-tab {
+        flex: 1;
+        height: 60rpx;
+        line-height: 60rpx;
+        text-align: center;
+        background-color: #f5f5f5;
+        border-radius: 10rpx;
+        font-size: 28rpx;
+        color: #666;
+        
+        &.active {
+          background-color: #007AFF;
+          color: white;
+        }
+      }
+    }
+    
+    .staff-list-scroll {
+      flex: 1;
+      padding: 20rpx 30rpx;
+      
+      .staff-list-item {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        padding: 20rpx;
+        margin-bottom: 15rpx;
+        background-color: #f8f8f8;
+        border-radius: 10rpx;
+        
+        .staff-item-info {
+          flex: 1;
+          
+          .staff-item-name {
+            display: block;
+            font-size: 30rpx;
+            color: #333;
+            margin-bottom: 8rpx;
+          }
+          
+          .staff-item-dept {
+            display: block;
+            font-size: 24rpx;
+            color: #999;
+          }
+        }
+        
+        .staff-item-check {
+          width: 50rpx;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+        }
+      }
+      
+      .empty-tip {
+        text-align: center;
+        padding: 100rpx 0;
+        color: #999;
+        font-size: 28rpx;
+      }
+    }
+    
+    .popup-footer {
+      padding: 20rpx 30rpx;
+      border-top: 1rpx solid #f0f0f0;
+      
+      .confirm-btn {
+        width: 100%;
+        height: 80rpx;
+        background-color: #007AFF;
+        color: white;
+        border-radius: 10rpx;
+        font-size: 32rpx;
+      }
+    }
+  }
 }
-</style>
+</style>
\ No newline at end of file

--
Gitblit v1.9.1