From 7de1396e315896dbc72a9d54e44f77434ea90f18 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期日, 14 十二月 2025 23:47:34 +0800
Subject: [PATCH] feat:增加企业微信自动登录

---
 app/pagesTask/create-emergency.vue |  356 +++++++++++++++++------------------------------------------
 1 files changed, 102 insertions(+), 254 deletions(-)

diff --git a/app/pagesTask/create-emergency.vue b/app/pagesTask/create-emergency.vue
index 8fb53ae..146f013 100644
--- a/app/pagesTask/create-emergency.vue
+++ b/app/pagesTask/create-emergency.vue
@@ -23,6 +23,7 @@
       </view>
         <view class="form-item">
         <OrganizationSelector 
+          ref="organizationSelector"
           v-model="selectedOrganizationId"
           :required="true"
           :auto-select-user-dept="true"
@@ -64,7 +65,8 @@
         label="鎵ц浠诲姟浜哄憳"
         :required="false"
         :auto-add-current-user="true"
-        :current-user-removable="false"
+        :current-user-removable="true"
+        :branch-dept-ids="allOrganizationIds"
         @change="onStaffChange"
       />
       
@@ -142,28 +144,60 @@
         label="鍖婚櫌鍚嶇О"
         address-label="杞嚭鍦板潃"
         :required="true"
-        :department-required="true"
+        :show-department="false"
         v-model="taskForm.hospitalOut"
         :dept-id="selectedOrganizationId"
         :region="selectedRegion"
-        :department-options="departmentOptions"
         @change="onHospitalOutChange"
         @address-selected="onHospitalOutAddressSelected"
       />
+      <DepartmentSelector
+        label="杞嚭绉戝"
+        :required="true"
+        v-model="taskForm.hospitalOut.department"
+        :department-id="taskForm.hospitalOut.departmentId"
+        :is-home="taskForm.hospitalOut.name === '瀹朵腑'"
+        @change="onHospitalOutDepartmentChange"
+      />
+      
+      <view class="form-item">
+        <view class="form-label">搴婂彿</view>
+        <input 
+          class="form-input" 
+          placeholder="璇疯緭鍏ュ簥鍙�" 
+          v-model="taskForm.hospitalOut.bedNumber"
+        />
+      </view>
       
       <view class="form-section-title">杞叆鍖婚櫌淇℃伅</view>
       <HospitalSelector
         label="鍖婚櫌鍚嶇О"
         address-label="杞叆鍦板潃"
         :required="true"
-        :department-required="true"
+        :show-department="false"
         v-model="taskForm.hospitalIn"
         :dept-id="selectedOrganizationId"
         :region="selectedRegion"
-        :department-options="departmentOptions"
         @change="onHospitalInChange"
         @address-selected="onHospitalInAddressSelected"
       />
+      <DepartmentSelector
+        label="杞叆绉戝"
+        :required="true"
+        v-model="taskForm.hospitalIn.department"
+        :department-id="taskForm.hospitalIn.departmentId"
+        :is-home="taskForm.hospitalIn.name === '瀹朵腑'"
+        @change="onHospitalInDepartmentChange"
+      />
+      
+      <view class="form-item">
+        <view class="form-label">搴婂彿</view>
+        <input 
+          class="form-input" 
+          placeholder="璇疯緭鍏ュ簥鍙�" 
+          v-model="taskForm.hospitalIn.bedNumber"
+        />
+      </view>
       
       <view class="form-item">
         <view class="form-label required">杞繍鍏噷鏁�</view>
@@ -243,13 +277,14 @@
 import { checkVehicleActiveTasks } from "@/api/task"
 
 import { getDicts } from "@/api/dict"
-import { getServiceOrdAreaTypes, getServiceOrderTypes, getHospitalDepartments } from "@/api/dictionary"
+import { getServiceOrdAreaTypes, getServiceOrderTypes } from "@/api/dictionary"
 import { listBranchCompany, getDept } from "@/api/system/dept"
 import MapSelector from './components/map-selector.vue'
 import OrganizationSelector from './components/OrganizationSelector.vue'
 import HospitalSelector from './components/HospitalSelector.vue'
 import DiseaseSelector from './components/DiseaseSelector.vue'
 import StaffSelector from './components/StaffSelector.vue'
+import DepartmentSelector from './components/DepartmentSelector.vue'
 
 export default {
   components: {
@@ -260,13 +295,15 @@
     HospitalSelector,
     DiseaseSelector,
     DepartureSelector,
-    StaffSelector
+    StaffSelector,
+    DepartmentSelector
   },
   data() {
     return {
       selectedVehicle: '',
       selectedVehicleId: null,
-      selectedOrganizationId: null, // 褰掑睘鏈烘瀯ID锛堥儴闂↖D锛�
+      selectedOrganizationId: null, // 褰撳墠閫変腑鐨勫綊灞炴満鏋処D
+      allOrganizationIds: [], // 鎵�鏈夊彲閫夋満鏋処D鏁扮粍
       selectedOrganizationServiceOrderClass: '', // 褰掑睘鏈烘瀯鐨勬湇鍔″崟缂栫爜
       selectedRegion: '', // 浠庡綊灞炴満鏋勪腑鎻愬彇鐨勫湴鍩熶俊鎭紙濡傦細骞垮窞銆佹繁鍦崇瓑锛�
       departureAddress: '', // 鍑哄彂鍦板湴鍧�
@@ -317,7 +354,6 @@
       emergencyTaskTypeOptions: [], // 浠诲姟绫诲瀷閫夐」锛堢敤浜巔icker鏄剧ず锛�
       documentTypes: [], // 鍗曟嵁绫诲瀷鍒楄〃
       documentTypeOptions: [], // 鍗曟嵁绫诲瀷閫夐」锛堢敤浜巔icker鏄剧ず锛�
-      departmentOptions: [], // 绉戝瀛楀吀鏁版嵁
       loading: false,
       // 鏅鸿兘璇嗗埆鐩稿叧
       rawText: '',
@@ -354,12 +390,12 @@
     this.getAvailableVehicles().then(() => {
       this.getUserBoundVehicleInfo()
     })
-    // 鍔犺浇绉戝瀛楀吀鏁版嵁
-    this.loadDepartments()
     // 鍔犺浇浠诲姟绫诲瀷鏁版嵁
     this.loadEmergencyTaskTypes()
     // 鍔犺浇鍗曟嵁绫诲瀷鏁版嵁
     this.loadDocumentTypes()
+    // 鍔犺浇鎵�鏈夋満鏋処D
+    this.loadAllOrganizationIds()
   },
   methods: {
     // 鑾峰彇鐢ㄦ埛缁戝畾鐨勮溅杈嗕俊鎭�
@@ -446,20 +482,21 @@
 		return region.replace(/(鍒嗗叕鍙竱鎬诲叕鍙竱鎬婚儴)$/g, '').trim();
 	},
     
-    // 鍔犺浇绉戝鏁版嵁锛堜粠 SQL Server 鍔ㄦ�佸姞杞斤級
-    loadDepartments() {
-      getHospitalDepartments().then(response => {
-        const list = response.data || [];
-        this.departmentOptions = list.map(item => ({
-          id: item.vID,
-          text: item.vtext,
-          dictValue: item.vtext  // 涓轰簡淇濇寔鍏煎鎬э紝淇濈暀dictValue瀛楁
-        }));
-        // console.log('绉戝鏁版嵁鍔犺浇鎴愬姛:', this.departmentOptions);
-      }).catch(error => {
-        console.error('鍔犺浇绉戝鏁版嵁澶辫触:', error)
-        this.departmentOptions = []
-      })
+    // 鍔犺浇鎵�鏈夋満鏋処D
+    loadAllOrganizationIds() {
+      // 閫氳繃 OrganizationSelector 缁勪欢鑾峰彇鎵�鏈夋満鏋�
+      const orgSelector = this.$refs.organizationSelector
+      if (orgSelector) {
+        orgSelector.reload().then(organizations => {
+          this.allOrganizationIds = organizations.map(org => org.deptId)
+          console.log('鎵�鏈夋満鏋処D:', this.allOrganizationIds)
+        })
+      } else {
+        // 濡傛灉缁勪欢杩樻湭鎸傝浇,绋嶅悗閲嶈瘯
+        setTimeout(() => {
+          this.loadAllOrganizationIds()
+        }, 100)
+      }
     },
     
     // 鍔犺浇浠诲姟绫诲瀷鏁版嵁锛堜粠 SQL Server锛�
@@ -530,6 +567,12 @@
       console.log('杞嚭鍖婚櫌鍙樺寲:', hospitalData)
       // 缁勪欢宸茬粡閫氳繃 v-model 鏇存柊浜� taskForm.hospitalOut
       
+      // 濡傛灉閫夋嫨鐨勬槸"瀹朵腑"锛岃嚜鍔ㄨ缃瀹や负"鍏跺畠"
+      if (hospitalData.name === '瀹朵腑') {
+        this.taskForm.hospitalOut.department = '鍏跺畠'
+        this.taskForm.hospitalOut.departmentId = null
+      }
+      
       // 濡傛灉杞叆鍦板潃宸插~鍐�,鑷姩璁$畻璺濈
       if (this.taskForm.hospitalIn.address) {
         // 濡傛灉涓や釜閮戒笉鏄�"瀹朵腑",浣跨敤鍖婚櫌璺濈璁$畻
@@ -554,6 +597,12 @@
       console.log('杞叆鍖婚櫌鍙樺寲:', hospitalData)
       // 缁勪欢宸茬粡閫氳繃 v-model 鏇存柊浜� taskForm.hospitalIn
       
+      // 濡傛灉閫夋嫨鐨勬槸"瀹朵腑"锛岃嚜鍔ㄨ缃瀹や负"鍏跺畠"
+      if (hospitalData.name === '瀹朵腑') {
+        this.taskForm.hospitalIn.department = '鍏跺畠'
+        this.taskForm.hospitalIn.departmentId = null
+      }
+      
       // 濡傛灉杞嚭鍦板潃宸插~鍐�,鑷姩璁$畻璺濈
       if (this.taskForm.hospitalOut.address) {
         // 濡傛灉涓や釜閮戒笉鏄�"瀹朵腑",浣跨敤鍖婚櫌璺濈璁$畻
@@ -570,6 +619,28 @@
     onHospitalInAddressSelected(data) {
       if (this.taskForm.hospitalOut.address) {
         this.calculateDistanceByManualAddress()
+      }
+    },
+    
+    // 杞嚭绉戝鍙樺寲
+    onHospitalOutDepartmentChange(data) {
+      if (data && typeof data === 'object') {
+        this.taskForm.hospitalOut.department = data.department
+        this.taskForm.hospitalOut.departmentId = data.departmentId
+      } else {
+        this.taskForm.hospitalOut.department = data
+        this.taskForm.hospitalOut.departmentId = null
+      }
+    },
+    
+    // 杞叆绉戝鍙樺寲
+    onHospitalInDepartmentChange(data) {
+      if (data && typeof data === 'object') {
+        this.taskForm.hospitalIn.department = data.department
+        this.taskForm.hospitalIn.departmentId = data.departmentId
+      } else {
+        this.taskForm.hospitalIn.department = data
+        this.taskForm.hospitalIn.departmentId = null
       }
     },
     
@@ -980,20 +1051,14 @@
       if (result.phone) this.taskForm.patient.phone = result.phone
       if (result.price) this.taskForm.price = result.price
       
-      // 搴旂敤绉戝淇℃伅锛堝尮閰� departmentOptions 涓殑鏁版嵁锛�
+      // 搴旂敤绉戝淇℃伅锛堥�氳繃 DepartmentSelector 缁勪欢澶勭悊锛�
       if (result.departmentOut) {
-        const deptOut = this.matchDepartment(result.departmentOut)
-        if (deptOut) {
-          this.taskForm.hospitalOut.department = deptOut.text
-          this.taskForm.hospitalOut.departmentId = deptOut.id
-        }
+        this.taskForm.hospitalOut.department = result.departmentOut
+        // 绉戝ID浼氬湪 DepartmentSelector 缁勪欢涓嚜鍔ㄥ尮閰�
       }
       if (result.departmentIn) {
-        const deptIn = this.matchDepartment(result.departmentIn)
-        if (deptIn) {
-          this.taskForm.hospitalIn.department = deptIn.text
-          this.taskForm.hospitalIn.departmentId = deptIn.id
-        }
+        this.taskForm.hospitalIn.department = result.departmentIn
+        // 绉戝ID浼氬湪 DepartmentSelector 缁勪欢涓嚜鍔ㄥ尮閰�
       }
 
       // 澶勭悊鍖婚櫌鍚嶇О 鈫� 绮剧‘鍖归厤鍖婚櫌骞惰ˉ鍏ㄥ湴鍧�涓嶪D锛堜笉闄愬埗鍒嗗叕鍙稿尯鍩燂級
@@ -1139,40 +1204,6 @@
       return ''
     },
     
-    // 鍖归厤绉戝锛堜紭鍏堜娇鐢� departmentOptions 涓殑鏁版嵁锛�
-    matchDepartment(deptName) {
-      if (!deptName || !this.departmentOptions || this.departmentOptions.length === 0) {
-        return null
-      }
-      
-      const normalized = deptName.trim().toUpperCase()
-      
-      // 1. 绮剧‘鍖归厤锛堜笉鍖哄垎澶у皬鍐欙級
-      let matched = this.departmentOptions.find(d => 
-        d.text.toUpperCase() === normalized
-      )
-      if (matched) return matched
-      
-      // 2. 鍖呭惈鍖归厤锛堢瀹ゅ悕鍖呭惈璇嗗埆鍒扮殑鍏抽敭璇嶏級
-      matched = this.departmentOptions.find(d => 
-        d.text.toUpperCase().includes(normalized) || 
-        normalized.includes(d.text.toUpperCase())
-      )
-      if (matched) return matched
-      
-      // 3. 妯$硦鍖归厤锛堝幓闄�"绉�"銆�"瀹�"绛夊悗缂�鍐嶅尮閰嶏級
-      const cleanedInput = normalized.replace(/[绉戝閮╙/g, '')
-      matched = this.departmentOptions.find(d => {
-        const cleanedDept = d.text.toUpperCase().replace(/[绉戝閮╙/g, '')
-        return cleanedDept === cleanedInput || 
-               cleanedDept.includes(cleanedInput) || 
-               cleanedInput.includes(cleanedDept)
-      })
-      if (matched) return matched
-      
-      return null
-    },
-    
     // 鎻愬彇绉戝淇℃伅
     extractDepartment(text, type) {
       // 甯歌绉戝鍏抽敭璇嶏紙浣滀负鍏滃簳鏂规锛�
@@ -1188,24 +1219,7 @@
         '妫�楠岀', '鐥呯悊绉�', '鑽墏绉�', '钀ュ吇绉�'
       ]
       
-      // 浼樺厛灏濊瘯浠� departmentOptions 涓尮閰�
-      if (this.departmentOptions && this.departmentOptions.length > 0) {
-        // 鏋勫缓 departmentOptions 鐨勫尮閰嶆ā寮忥紙鎸夐暱搴﹀�掑簭锛�
-        const optionTexts = this.departmentOptions.map(d => d.text).sort((a, b) => b.length - a.length)
-        const optionPattern = optionTexts.map(t => t.replace(/[()锛堬級]/g, '\\$&')).join('|')
-        
-        if (optionPattern) {
-          const regex = new RegExp(`(${optionPattern})`, 'gi')
-          const matches = text.match(regex)
-          
-          if (matches && matches.length > 0) {
-            // 濡傛灉鏄浆鍑猴紝鍙栫涓�涓瀹わ紱濡傛灉鏄浆鍏ワ紝鍙栨渶鍚庝竴涓瀹�
-            return type === 'out' ? matches[0] : matches[matches.length - 1]
-          }
-        }
-      }
-      
-      // 鍏滃簳锛氫娇鐢ㄩ粯璁ょ瀹ゅ垪琛ㄥ尮閰�
+      // 浣跨敤榛樿绉戝鍒楄〃鍖归厤
       const sortedDepts = departments.sort((a, b) => b.length - a.length)
       const deptPattern = sortedDepts.join('|')
       
@@ -1686,172 +1700,6 @@
           color: #999;
         }
       }
-    }
-  }
-}
-
-// 浜哄憳閫夋嫨寮圭獥鏍峰紡
-.staff-selector-popup {
-  background-color: white;
-  border-radius: 20rpx 20rpx 0 0;
-  max-height: 80vh;
-  display: flex;
-  flex-direction: column;
-  
-  .popup-header {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    padding: 30rpx;
-    border-bottom: 1rpx solid #f0f0f0;
-    flex-shrink: 0;
-    
-    .popup-title {
-      font-size: 32rpx;
-      font-weight: bold;
-      color: #333;
-    }
-    
-    .popup-close {
-      padding: 10rpx;
-    }
-  }
-  
-  .search-box {
-    display: flex;
-    align-items: center;
-    margin: 20rpx 30rpx;
-    padding: 15rpx 20rpx;
-    background-color: #f5f5f5;
-    border-radius: 10rpx;
-    flex-shrink: 0;
-    
-    .search-input {
-      flex: 1;
-      margin-left: 10rpx;
-      font-size: 28rpx;
-    }
-  }
-  
-  .staff-filter {
-    display: flex;
-    padding: 0 30rpx 20rpx;
-    gap: 20rpx;
-    flex-shrink: 0;
-    
-    .filter-item {
-      flex: 1;
-      text-align: center;
-      padding: 15rpx 0;
-      background-color: #f5f5f5;
-      border-radius: 10rpx;
-      font-size: 28rpx;
-      color: #666;
-      
-      &.active {
-        background-color: #007AFF;
-        color: white;
-      }
-    }
-  }
-  
-  .staff-list-popup {
-    flex: 1;
-    overflow-y: auto;
-    padding: 0 30rpx;
-    
-    .staff-item-popup {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      padding: 25rpx 20rpx;
-      border-bottom: 1rpx solid #f0f0f0;
-      
-      &:active {
-        background-color: #f5f5f5;
-      }
-      
-      .staff-info {
-        flex: 1;
-        
-        .staff-name-row {
-          display: flex;
-          align-items: center;
-          margin-bottom: 10rpx;
-          
-          .staff-name {
-            font-size: 30rpx;
-            font-weight: bold;
-            color: #333;
-            margin-right: 20rpx;
-          }
-          
-          .staff-phone {
-            font-size: 24rpx;
-            color: #999;
-          }
-        }
-        
-        .staff-detail-row {
-          display: flex;
-          align-items: center;
-          
-          .staff-dept {
-            font-size: 24rpx;
-            color: #666;
-            margin-right: 20rpx;
-          }
-          
-          .staff-post {
-            font-size: 24rpx;
-            color: #007AFF;
-          }
-        }
-      }
-      
-      .checkbox-empty {
-        width: 40rpx;
-        height: 40rpx;
-        border: 2rpx solid #ddd;
-        border-radius: 50%;
-      }
-    }
-    
-    .no-data {
-      text-align: center;
-      padding: 100rpx 0;
-      color: #999;
-      
-      text {
-        display: block;
-        margin-top: 20rpx;
-        font-size: 28rpx;
-      }
-    }
-  }
-  
-  .popup-footer {
-    display: flex;
-    padding: 20rpx 30rpx;
-    border-top: 1rpx solid #f0f0f0;
-    gap: 20rpx;
-    flex-shrink: 0;
-    
-    button {
-      flex: 1;
-      height: 80rpx;
-      border-radius: 10rpx;
-      font-size: 30rpx;
-    }
-    
-    .cancel-btn {
-      background-color: #f5f5f5;
-      color: #666;
-    }
-    
-    .confirm-btn {
-      background-color: #007AFF;
-      color: white;
     }
   }
 }

--
Gitblit v1.9.1