| | |
| | | |
| | | <!-- æä½æé® --> |
| | | <view class="task-actions"> |
| | | <button |
| | | class="action-btn" |
| | | :class="{ disabled: isActionDisabled(task, 'depart') }" |
| | | @click="handleTaskAction(task, 'depart')" |
| | | v-if="task.status !== 'completed'" |
| | | > |
| | | åºå |
| | | </button> |
| | | <button |
| | | class="action-btn" |
| | | :class="{ disabled: isActionDisabled(task, 'arrive') }" |
| | | @click="handleTaskAction(task, 'arrive')" |
| | | v-if="task.status !== 'completed'" |
| | | > |
| | | å·²å°è¾¾ |
| | | </button> |
| | | <button |
| | | class="action-btn" |
| | | :class="{ disabled: isActionDisabled(task, 'return') }" |
| | | @click="handleTaskAction(task, 'return')" |
| | | v-if="task.status !== 'completed'" |
| | | > |
| | | è¿ç¨ |
| | | </button> |
| | | <button |
| | | class="action-btn" |
| | | :class="{ disabled: isActionDisabled(task, 'settle') }" |
| | | @click="handleTaskAction(task, 'settle')" |
| | | v-if="task.status !== 'completed'" |
| | | > |
| | | ç»ç® |
| | | </button> |
| | | <button |
| | | class="action-btn primary" |
| | | :class="{ disabled: isActionDisabled(task, 'complete') }" |
| | | @click="handleTaskAction(task, 'complete')" |
| | | v-if="task.status !== 'completed'" |
| | | > |
| | | 已宿 |
| | | </button> |
| | | <!-- å¾
å¤çç¶æ: æ¾ç¤ºåºåãåæ¶ --> |
| | | <template v-if="task.taskStatus === 'PENDING'"> |
| | | <button |
| | | class="action-btn primary" |
| | | @click="handleTaskAction(task, 'depart')" |
| | | > |
| | | åºå |
| | | </button> |
| | | <button |
| | | class="action-btn cancel" |
| | | @click="handleTaskAction(task, 'cancel')" |
| | | > |
| | | åæ¶ |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- åºåä¸ç¶æ: æ¾ç¤ºå·²å°è¾¾ã强å¶ç»æ --> |
| | | <template v-else-if="task.taskStatus === 'DEPARTING'"> |
| | | <button |
| | | class="action-btn primary" |
| | | @click="handleTaskAction(task, 'arrive')" |
| | | > |
| | | å·²å°è¾¾ |
| | | </button> |
| | | <button |
| | | class="action-btn cancel" |
| | | @click="handleTaskAction(task, 'forceCancel')" |
| | | > |
| | | 强å¶ç»æ |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- å·²å°è¾¾ç¶æ: æ¾ç¤ºå·²è¿ç¨ --> |
| | | <template v-else-if="task.taskStatus === 'ARRIVED'"> |
| | | <button |
| | | class="action-btn primary" |
| | | @click="handleTaskAction(task, 'return')" |
| | | > |
| | | å·²è¿ç¨ |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- è¿ç¨ä¸ç¶æ: æ¾ç¤ºå·²å®æ --> |
| | | <template v-else-if="task.taskStatus === 'RETURNING'"> |
| | | <button |
| | | class="action-btn primary" |
| | | @click="handleTaskAction(task, 'complete')" |
| | | > |
| | | 已宿 |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- 已宿/已忶: 䏿¾ç¤ºæé® --> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | this.$tab.navigateTo(`/pages/task/detail?id=${task.taskId || task.id}`); |
| | | }, |
| | | |
| | | // 夿æä½æé®æ¯å¦ç¦ç¨ |
| | | isActionDisabled(task, action) { |
| | | // æ ¹æ®ä»»å¡çå®é
ç¶æå¤æ |
| | | const taskStatus = task.taskStatus |
| | | switch (action) { |
| | | case 'depart': |
| | | return taskStatus !== 'PENDING' |
| | | case 'arrive': |
| | | return taskStatus !== 'DEPARTING' |
| | | case 'return': |
| | | return taskStatus !== 'ARRIVED' |
| | | case 'settle': |
| | | return !['ARRIVED', 'RETURNING'].includes(taskStatus) |
| | | case 'complete': |
| | | return taskStatus !== 'RETURNING' |
| | | default: |
| | | return false |
| | | } |
| | | }, |
| | | |
| | | // å¤çä»»å¡æä½ |
| | | handleTaskAction(task, action) { |
| | | if (this.isActionDisabled(task, action)) { |
| | | return |
| | | } |
| | | |
| | | switch (action) { |
| | | case 'depart': |
| | | // åºåæä½ -> ç¶æå为åºåä¸ |
| | | let departMessage = 'ç¡®å®è¦åºååï¼' |
| | | if (task.taskType !== 'MAINTENANCE' && task.taskType !== 'FUEL') { |
| | | departMessage = 'åºåå»ç®çå°ï¼ç¡®è®¤ï¼' |
| | | } |
| | | this.$modal.confirm(departMessage).then(() => { |
| | | // åºå -> ç¶æå为åºåä¸ |
| | | this.$modal.confirm('ç¡®å®è¦åºååï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'DEPARTING', 'ä»»å¡å·²åºå') |
| | | }).catch(() => {}) |
| | | break |
| | | }).catch(() => {}); |
| | | break; |
| | | |
| | | case 'cancel': |
| | | // åæ¶ -> äºæ¬¡ç¡®è®¤åç¶æåä¸ºå·²åæ¶ |
| | | this.$modal.confirm('ç¡®å®è¦åæ¶æ¤ä»»å¡åï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'CANCELLED', 'ä»»å¡å·²åæ¶') |
| | | }).catch(() => {}); |
| | | break; |
| | | |
| | | case 'arrive': |
| | | // å·²å°è¾¾æä½ -> ç¶æå为已å°è¾¾ |
| | | this.$modal.confirm('å·²ç»å°è¾¾ç®çå°ï¼ç¡®è®¤ï¼').then(() => { |
| | | // å·²å°è¾¾ -> ç¶æå为已å°è¾¾ |
| | | this.$modal.confirm('确认已å°è¾¾ç®çå°ï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'ARRIVED', 'å·²å°è¾¾ç®çå°') |
| | | }).catch(() => {}) |
| | | break |
| | | }).catch(() => {}); |
| | | break; |
| | | |
| | | case 'forceCancel': |
| | | // 强å¶ç»æ -> ç¶æåä¸ºå·²åæ¶ |
| | | this.$modal.confirm('ç¡®å®è¦å¼ºå¶ç»ææ¤ä»»å¡åï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'CANCELLED', 'ä»»å¡å·²å¼ºå¶ç»æ') |
| | | }).catch(() => {}); |
| | | break; |
| | | |
| | | case 'return': |
| | | // è¿ç¨æä½ -> ç¶æå为è¿ç¨ä¸ |
| | | // å·²è¿ç¨ -> ç¶æå为è¿ç¨ä¸ |
| | | this.$modal.confirm('确认å¼å§è¿ç¨ï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'RETURNING', 'å·²å¼å§è¿ç¨') |
| | | }).catch(() => {}) |
| | | break |
| | | |
| | | case 'settle': |
| | | // ç»ç®æä½ï¼è·³è½¬å°ç»ç®é¡µé¢ |
| | | this.$tab.navigateTo(`/pages/task/settlement?id=${task.taskId}`) |
| | | break |
| | | }).catch(() => {}); |
| | | break; |
| | | |
| | | case 'complete': |
| | | // 已宿æä½ -> ç¶æåä¸ºå·²å®æ |
| | | this.$modal.confirm('任塿¯å¦å·²ç»å
¨é¨å®æï¼ç¡®è®¤ï¼').then(() => { |
| | | // 已宿 -> ç¶æåä¸ºå·²å®æ |
| | | this.$modal.confirm('确认任å¡å·²å®æï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'COMPLETED', 'ä»»å¡å·²å®æ') |
| | | }).catch(() => {}) |
| | | break |
| | | }).catch(() => {}); |
| | | break; |
| | | } |
| | | }, |
| | | |
| | |
| | | color: white; |
| | | } |
| | | |
| | | &.cancel { |
| | | background-color: #ff3b30; |
| | | color: white; |
| | | } |
| | | |
| | | &.disabled { |
| | | opacity: 0.5; |
| | | } |
| | |
| | | <view class="back-btn" @click="goBack"> |
| | | <uni-icons type="arrowleft" size="20"></uni-icons> |
| | | </view> |
| | | <view class="title">åå»ºéæ¥æè½¬è¿ä»»å¡</view> |
| | | <view class="title">åå»ºæ¥æè½¬è¿ä»»å¡</view> |
| | | </view> |
| | | |
| | | <view class="form-section"> |
| | |
| | | placeholder="请è¾å
¥å»é¢åç§°æå°åæç´¢" |
| | | v-model="hospitalOutSearchKeyword" |
| | | @input="onHospitalOutSearch" |
| | | @focus="showHospitalOutResults = true" |
| | | @focus="onHospitalOutFocus" |
| | | /> |
| | | <view class="search-results" v-if="showHospitalOutResults && hospitalOutResults.length > 0"> |
| | | <view |
| | |
| | | |
| | | <view class="form-item"> |
| | | <view class="form-label">ç§å®¤</view> |
| | | <input |
| | | class="form-input" |
| | | placeholder="请è¾å
¥ç§å®¤" |
| | | v-model="taskForm.hospitalOut.department" |
| | | /> |
| | | <picker mode="selector" :range="departmentOptions" range-key="dictLabel" @change="onHospitalOutDepartmentChange"> |
| | | <view class="form-input picker-input"> |
| | | {{ taskForm.hospitalOut.department || 'è¯·éæ©ç§å®¤' }} |
| | | <uni-icons type="arrowright" size="16" color="#999"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | |
| | | placeholder="请è¾å
¥å»é¢åç§°æå°åæç´¢" |
| | | v-model="hospitalInSearchKeyword" |
| | | @input="onHospitalInSearch" |
| | | @focus="showHospitalInResults = true" |
| | | @focus="onHospitalInFocus" |
| | | /> |
| | | <view class="search-results" v-if="showHospitalInResults && hospitalInResults.length > 0"> |
| | | <view |
| | |
| | | |
| | | <view class="form-item"> |
| | | <view class="form-label">ç§å®¤</view> |
| | | <input |
| | | class="form-input" |
| | | placeholder="请è¾å
¥ç§å®¤" |
| | | v-model="taskForm.hospitalIn.department" |
| | | /> |
| | | <picker mode="selector" :range="departmentOptions" range-key="dictLabel" @change="onHospitalInDepartmentChange"> |
| | | <view class="form-input picker-input"> |
| | | {{ taskForm.hospitalIn.department || 'è¯·éæ©ç§å®¤' }} |
| | | <uni-icons type="arrowright" size="16" color="#999"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | |
| | | <view v-else class="checkbox-empty"></view> |
| | | </view> |
| | | |
| | | <view class="no-data" v-if="diseaseSearchResults.length === 0 && diseaseSearchKeyword"> |
| | | <view class="no-data" v-if="diseaseSearchResults.length === 0"> |
| | | <uni-icons type="info" size="40" color="#ccc"></uni-icons> |
| | | <text>æªæ¾å°ç¸å
³ç¾ç
</text> |
| | | </view> |
| | | |
| | | <view class="no-data" v-if="diseaseSearchResults.length === 0 && !diseaseSearchKeyword"> |
| | | <uni-icons type="search" size="40" color="#ccc"></uni-icons> |
| | | <text>请è¾å
¥å
³é®è¯æç´¢ç¾ç
</text> |
| | | <text>{{ diseaseSearchKeyword ? 'æªæ¾å°ç¸å
³ç¾ç
' : 'ææ ç
æ
æ°æ®' }}</text> |
| | | </view> |
| | | </scroll-view> |
| | | |
| | |
| | | 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 { addTask } from "@/api/task" |
| | | import { listAvailableVehicles } from "@/api/vehicle" |
| | | import { listAvailableVehicles, getUserBoundVehicle } from "@/api/vehicle" |
| | | import { calculateDistance } from "@/api/map" |
| | | import { searchHospitals } from "@/api/hospital" |
| | | import { listUser } from "@/api/system/user" |
| | | import { searchIcd10 } from "@/api/icd10" |
| | | import { getUserProfile } from "@/api/system/user" |
| | | import { getDicts } from "@/api/dict" |
| | | import MapSelector from '@/components/map-selector.vue' |
| | | |
| | | export default { |
| | |
| | | hospitalInResults: [], |
| | | showHospitalInResults: false, |
| | | searchTimer: null, |
| | | defaultHospitals: [], // é»è®¤ç100æ¡å»é¢æ°æ® |
| | | // 人åéæ©ç¸å
³ |
| | | selectedStaff: [], // 已鿩ç人åå表 |
| | | allStaffList: [], // ææäººåå表 |
| | |
| | | vehicleOptions: [], |
| | | organizations: ['广å·åå
¬å¸', 'æ·±å³åå
¬å¸', 'ç æµ·åå
¬å¸', 'ä½å±±åå
¬å¸'], |
| | | emergencyTaskTypes: ['æ¥æè½¬è¿', 'èªç©ºè½¬è¿'], |
| | | departmentOptions: [], // ç§å®¤åå
¸æ°æ® |
| | | loading: false, |
| | | addressCoordinates: { |
| | | hospitalOutAddress: null, |
| | |
| | | nickName: state.user.nickName || state.user.name || 'å¼ ä¸', |
| | | position: '叿º', |
| | | deptId: state.user.deptId || 100, |
| | | phonenumber: state.user.phonenumber || '' |
| | | phonenumber: state.user.phonenumber || '', |
| | | branchCompanyId: state.user.branchCompanyId, |
| | | branchCompanyName: state.user.branchCompanyName |
| | | }) |
| | | }) |
| | | }, |
| | | onLoad(options) { |
| | | this.getAvailableVehicles() |
| | | // å
å 载车è¾å表ï¼ç¶åå è½½ç»å®è½¦è¾ä¿¡æ¯ |
| | | this.getAvailableVehicles().then(() => { |
| | | this.getUserBoundVehicleInfo() |
| | | }) |
| | | this.initSelectedStaff() |
| | | this.loadDeptStaff() |
| | | // 设置é»è®¤å½å±æºæ |
| | | if (this.currentUser.branchCompanyName) { |
| | | this.selectedOrganization = this.currentUser.branchCompanyName |
| | | } |
| | | // å è½½é»è®¤å»é¢å表ï¼å100æ¡ï¼ |
| | | this.loadDefaultHospitals() |
| | | // å è½½ç§å®¤åå
¸æ°æ® |
| | | this.loadDepartments() |
| | | }, |
| | | methods: { |
| | | // è·åç¨æ·ç»å®ç车è¾ä¿¡æ¯ |
| | | getUserBoundVehicleInfo() { |
| | | getUserProfile().then(response => { |
| | | const userInfo = response.data || response |
| | | if (userInfo.boundVehicle) { |
| | | const boundVehicleNo = userInfo.boundVehicle.vehicleNumber |
| | | const boundVehicleId = userInfo.boundVehicle.vehicleId |
| | | |
| | | // å¨è½¦è¾åè¡¨ä¸æ¥æ¾ç»å®çè½¦è¾ |
| | | const vehicleIndex = this.vehicleOptions.findIndex(v => |
| | | v.id === boundVehicleId || v.name === boundVehicleNo |
| | | ) |
| | | |
| | | if (vehicleIndex !== -1) { |
| | | // 设置é»è®¤éä¸çè½¦è¾ |
| | | this.selectedVehicle = this.vehicleOptions[vehicleIndex].name |
| | | this.selectedVehicleId = this.vehicleOptions[vehicleIndex].id |
| | | } |
| | | } |
| | | }).catch(error => { |
| | | console.error('è·åç¨æ·ç»å®è½¦è¾ä¿¡æ¯å¤±è´¥:', error) |
| | | }) |
| | | }, |
| | | |
| | | getAvailableVehicles() { |
| | | const deptId = this.currentUser.deptId |
| | | return listAvailableVehicles(deptId, 'EMERGENCY').then(response => { |
| | |
| | | this.selectedEmergencyTaskType = this.emergencyTaskTypes[e.detail.value] |
| | | }, |
| | | |
| | | // å è½½ç§å®¤åå
¸æ°æ® |
| | | loadDepartments() { |
| | | getDicts('hospital_department').then(response => { |
| | | this.departmentOptions = response.data || [] |
| | | }).catch(error => { |
| | | console.error('å è½½ç§å®¤åå
¸å¤±è´¥:', error) |
| | | this.departmentOptions = [] |
| | | }) |
| | | }, |
| | | |
| | | // 转åºå»é¢ç§å®¤éæ© |
| | | onHospitalOutDepartmentChange(e) { |
| | | const index = e.detail.value |
| | | this.taskForm.hospitalOut.department = this.departmentOptions[index].dictValue |
| | | }, |
| | | |
| | | // 转å
¥å»é¢ç§å®¤éæ© |
| | | onHospitalInDepartmentChange(e) { |
| | | const index = e.detail.value |
| | | this.taskForm.hospitalIn.department = this.departmentOptions[index].dictValue |
| | | }, |
| | | |
| | | // å è½½é»è®¤å»é¢å表ï¼å100æ¡ï¼ |
| | | loadDefaultHospitals() { |
| | | // ä¼ å
¥ç©ºå符串æç¹æ®æ è¯è·åå100æ¡ |
| | | searchHospitals('').then(response => { |
| | | this.defaultHospitals = response.data || [] |
| | | // åæ¶åå§å两个æç´¢ç»æä¸ºé»è®¤æ°æ® |
| | | this.hospitalOutResults = [...this.defaultHospitals] |
| | | this.hospitalInResults = [...this.defaultHospitals] |
| | | }).catch(error => { |
| | | console.error('å è½½é»è®¤å»é¢å表失败:', error) |
| | | this.defaultHospitals = [] |
| | | }) |
| | | }, |
| | | |
| | | // 转åºå»é¢è¾å
¥æ¡è·å¾ç¦ç¹ |
| | | onHospitalOutFocus() { |
| | | // å¦ææ²¡ææç´¢å
³é®è¯ï¼æ¾ç¤ºé»è®¤ç100æ¡æ°æ® |
| | | if (!this.hospitalOutSearchKeyword || this.hospitalOutSearchKeyword.trim() === '') { |
| | | this.hospitalOutResults = [...this.defaultHospitals] |
| | | } |
| | | this.showHospitalOutResults = true |
| | | }, |
| | | |
| | | // 转åºå»é¢æç´¢ |
| | | onHospitalOutSearch(e) { |
| | | const keyword = e.detail.value |
| | |
| | | clearTimeout(this.searchTimer) |
| | | } |
| | | |
| | | // 妿å
³é®è¯ä¸ºç©ºï¼æ¾ç¤ºé»è®¤100æ¡ |
| | | if (!keyword || keyword.trim() === '') { |
| | | this.hospitalOutResults = [] |
| | | this.hospitalOutResults = [...this.defaultHospitals] |
| | | this.showHospitalOutResults = true |
| | | return |
| | | } |
| | | |
| | | // æå
³é®è¯æ¶ï¼å»æå¡ç«¯æç´¢ |
| | | this.searchTimer = setTimeout(() => { |
| | | this.searchHospitalOut(keyword) |
| | | }, 300) |
| | |
| | | } |
| | | }, |
| | | |
| | | // 转å
¥å»é¢è¾å
¥æ¡è·å¾ç¦ç¹ |
| | | onHospitalInFocus() { |
| | | // å¦ææ²¡ææç´¢å
³é®è¯ï¼æ¾ç¤ºé»è®¤ç100æ¡æ°æ® |
| | | if (!this.hospitalInSearchKeyword || this.hospitalInSearchKeyword.trim() === '') { |
| | | this.hospitalInResults = [...this.defaultHospitals] |
| | | } |
| | | this.showHospitalInResults = true |
| | | }, |
| | | |
| | | // 转å
¥å»é¢æç´¢ |
| | | onHospitalInSearch(e) { |
| | | const keyword = e.detail.value |
| | |
| | | clearTimeout(this.searchTimer) |
| | | } |
| | | |
| | | // 妿å
³é®è¯ä¸ºç©ºï¼æ¾ç¤ºé»è®¤100æ¡ |
| | | if (!keyword || keyword.trim() === '') { |
| | | this.hospitalInResults = [] |
| | | this.hospitalInResults = [...this.defaultHospitals] |
| | | this.showHospitalInResults = true |
| | | return |
| | | } |
| | | |
| | | // æå
³é®è¯æ¶ï¼å»æå¡ç«¯æç´¢ |
| | | this.searchTimer = setTimeout(() => { |
| | | this.searchHospitalIn(keyword) |
| | | }, 300) |
| | |
| | | const deptId = this.currentUser.deptId |
| | | if (!deptId) { |
| | | console.error('æ æ³è·åå½åç¨æ·æå¨é¨é¨') |
| | | this.$modal.showToast('æ æ³è·åæå¨é¨é¨ä¿¡æ¯') |
| | | return |
| | | } |
| | | |
| | | // æ¥è¯¢å½åé¨é¨ä¸çææç¨æ·ï¼å¸æºãæ¤å£«ï¼ |
| | | // ç´æ¥æ¥è¯¢å½åç¨æ·é¨é¨ä¸çææç¨æ· |
| | | // å端SQLä¼èªå¨å¤çï¼å¦æä¼ å
¥çæ¯åé¨é¨ï¼ä¼æ¥æ¾å
¶æå±çåå
¬å¸åå
¶ææåé¨é¨çç¨æ· |
| | | const queryParams = { |
| | | deptId: deptId, |
| | | status: '0' // åªæ¥è¯¢æ£å¸¸ç¶æçç¨æ· |
| | | status: '0', // åªæ¥è¯¢æ£å¸¸ç¶æçç¨æ· |
| | | pageNum: 1, |
| | | pageSize: 10000 // 设置足å¤å¤§ç页é¢å¤§å°ï¼è·åææç¨æ· |
| | | } |
| | | |
| | | listUser(queryParams).then(response => { |
| | |
| | | // åå§å临æ¶éæ©å表ï¼å¤å¶å½å已鿩çç
æ
ï¼ |
| | | this.tempSelectedDiseases = [...this.selectedDiseases] |
| | | this.diseaseSearchKeyword = '' |
| | | this.diseaseSearchResults = [] |
| | | // é»è®¤å è½½ææç
æ
|
| | | this.loadAllDiseases() |
| | | this.$refs.diseasePopup.open() |
| | | }, |
| | | |
| | |
| | | clearTimeout(this.diseaseSearchTimer) |
| | | } |
| | | |
| | | // 妿å
³é®è¯ä¸ºç©ºï¼å è½½ææç
æ
|
| | | if (!keyword || keyword.trim() === '') { |
| | | this.diseaseSearchResults = [] |
| | | this.loadAllDiseases() |
| | | return |
| | | } |
| | | |
| | | // æå
³é®è¯æ¶è¿è¡æç´¢ |
| | | this.diseaseSearchTimer = setTimeout(() => { |
| | | this.searchDiseaseByKeyword(keyword) |
| | | }, 300) |
| | | }, |
| | | |
| | | // å è½½ææç
æ
ï¼é»è®¤æ¾ç¤ºï¼ |
| | | loadAllDiseases() { |
| | | // 使ç¨ç©ºå符串æç¹æ®æ è¯ç¬¦æ¥è·åææç
æ
|
| | | // 妿åç«¯ä¸æ¯æç©ºæ¥è¯¢ï¼å¯ä»¥ä¼ å
¥ä¸ä¸ªéé
符å¦'%'æè
ä¿®æ¹å端æ¥å£ |
| | | searchIcd10('').then(response => { |
| | | this.diseaseSearchResults = response.data || [] |
| | | }).catch(error => { |
| | | console.error('å è½½ç
æ
å表失败:', error) |
| | | this.diseaseSearchResults = [] |
| | | }) |
| | | }, |
| | | |
| | | // æ ¹æ®å
³é®è¯æç´¢ç
æ
|
| | |
| | | this.loading = false |
| | | this.$modal.showToast('ä»»å¡å建æå') |
| | | setTimeout(() => { |
| | | this.$tab.navigateTo('/pages/task/index') |
| | | uni.redirectTo({ |
| | | url: '/pages/task/index' |
| | | }) |
| | | }, 1500) |
| | | }).catch(error => { |
| | | this.loading = false |
| | |
| | | <view class="title">鿩任å¡ç±»å</view> |
| | | <view class="subtitle">è¯·éæ©æ¨è¦å建çä»»å¡ç±»å</view> |
| | | </view> |
| | | |
| | | |
| | | <view class="category-list"> |
| | | <view |
| | | class="category-item" |
| | | v-for="(category, index) in taskCategories" |
| | | :key="index" |
| | | @click="selectTaskCategory(category)" |
| | | > |
| | | <view class="category-item" v-for="(category, index) in taskCategories" :key="index" |
| | | @click="selectTaskCategory(category)"> |
| | | <view class="icon"> |
| | | <uni-icons :type="category.icon" size="30" :color="category.color"></uni-icons> |
| | | </view> |
| | |
| | | return { |
| | | taskCategories: [ |
| | | { |
| | | type: 'emergency', |
| | | name: 'æ¥æè½¬è¿', |
| | | icon: 'hospital', |
| | | color: '#E54D42', |
| | | description: 'ç´§æ¥å»ç转è¿ä»»å¡', |
| | | taskType: 'EMERGENCY_TRANSFER', |
| | | page: '/pages/task/create-emergency' |
| | | }, |
| | | { |
| | | type: 'normal', |
| | | name: 'ç»´ä¿®ä¿å
»', |
| | | icon: 'repair', |
| | |
| | | taskType: 'FUEL', |
| | | page: '/pages/task/create-normal' |
| | | }, |
| | | { |
| | | type: 'emergency', |
| | | name: 'æ¥æè½¬è¿', |
| | | icon: 'hospital', |
| | | color: '#E54D42', |
| | | description: 'ç´§æ¥å»ç转è¿ä»»å¡', |
| | | taskType: 'EMERGENCY_TRANSFER', |
| | | page: '/pages/task/create-emergency' |
| | | }, |
| | | |
| | | { |
| | | type: 'welfare', |
| | | name: 'ç¦ç¥è½¦', |
| | |
| | | padding: 20rpx; |
| | | background-color: #f5f5f5; |
| | | min-height: 100vh; |
| | | |
| | | |
| | | .task-category-container { |
| | | .header { |
| | | text-align: center; |
| | | padding: 40rpx 0; |
| | | |
| | | |
| | | .title { |
| | | font-size: 40rpx; |
| | | font-weight: bold; |
| | | color: #333; |
| | | margin-bottom: 20rpx; |
| | | } |
| | | |
| | | |
| | | .subtitle { |
| | | font-size: 28rpx; |
| | | color: #666; |
| | | } |
| | | } |
| | | |
| | | |
| | | .category-list { |
| | | .category-item { |
| | | display: flex; |
| | |
| | | padding: 30rpx; |
| | | margin-bottom: 20rpx; |
| | | box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
| | | |
| | | |
| | | .icon { |
| | | margin-right: 20rpx; |
| | | } |
| | | |
| | | |
| | | .info { |
| | | flex: 1; |
| | | |
| | | |
| | | .name { |
| | | font-size: 32rpx; |
| | | font-weight: bold; |
| | | margin-bottom: 10rpx; |
| | | } |
| | | |
| | | |
| | | .desc { |
| | | font-size: 26rpx; |
| | | color: #666; |
| | | } |
| | | } |
| | | |
| | | |
| | | .arrow { |
| | | margin-left: 20rpx; |
| | | } |
| | |
| | | avatar: storage.get(constant.avatar), |
| | | roles: storage.get(constant.roles), |
| | | permissions: storage.get(constant.permissions), |
| | | deptId: storage.get(constant.deptId) |
| | | deptId: storage.get(constant.deptId), |
| | | branchCompanyId: storage.get(constant.branchCompanyId), |
| | | branchCompanyName: storage.get(constant.branchCompanyName) |
| | | }, |
| | | |
| | | mutations: { |
| | |
| | | SET_DEPT_ID: (state, deptId) => { |
| | | state.deptId = deptId |
| | | storage.set(constant.deptId, deptId) |
| | | }, |
| | | SET_BRANCH_COMPANY_ID: (state, branchCompanyId) => { |
| | | state.branchCompanyId = branchCompanyId |
| | | storage.set(constant.branchCompanyId, branchCompanyId) |
| | | }, |
| | | SET_BRANCH_COMPANY_NAME: (state, branchCompanyName) => { |
| | | state.branchCompanyName = branchCompanyName |
| | | storage.set(constant.branchCompanyName, branchCompanyName) |
| | | } |
| | | }, |
| | | |
| | |
| | | commit('SET_NAME', username) |
| | | commit('SET_AVATAR', avatar) |
| | | commit('SET_DEPT_ID', deptId) |
| | | commit('SET_BRANCH_COMPANY_ID', res.branchCompanyId) |
| | | commit('SET_BRANCH_COMPANY_NAME', res.branchCompanyName) |
| | | resolve(res) |
| | | }).catch(error => { |
| | | reject(error) |
| | |
| | | name: 'vuex_name', |
| | | roles: 'vuex_roles', |
| | | permissions: 'vuex_permissions', |
| | | deptId: 'vuex_deptId' |
| | | deptId: 'vuex_deptId', |
| | | branchCompanyId: 'vuex_branchCompanyId', |
| | | branchCompanyName: 'vuex_branchCompanyName' |
| | | } |
| | | |
| | | export default constant |
| New file |
| | |
| | | # ä»»å¡äººåéæ©åå
¬å¸ç¨æ·åè½è¯´æ |
| | | |
| | | ## ä¿®æ¹æ¦è¿° |
| | | |
| | | å¨åå»ºæ¥æè½¬è¿ä»»å¡æ¶,éæ©æ§è¡äººåæ¶,åºè¯¥è·å**å½åç»å½ç¨æ·æå¨åå
¬å¸ä¸çææç¨æ·**,èä¸ä»
ä»
æ¯å½åé¨é¨çç¨æ·ã |
| | | |
| | | ## ä¸å¡è§å |
| | | |
| | | ### é¨é¨å±çº§ç»æ |
| | | ``` |
| | | 100 (æ ¹é¨é¨) |
| | | âââ åå
¬å¸1 (parent_id = 100) |
| | | â âââ æ¤å£«é¨ |
| | | â âââ 车é |
| | | â âââ 客æé¨ |
| | | âââ åå
¬å¸2 (parent_id = 100) |
| | | â âââ æ¤å£«é¨ |
| | | â âââ 车é |
| | | âââ åå
¬å¸3 (parent_id = 100) |
| | | ``` |
| | | |
| | | ### ç¨æ·éæ©è§å |
| | | - å½åç¨æ·æå¨é¨é¨å¯è½æ¯ï¼ |
| | | 1. **åå
¬å¸**ï¼parent_id = 100ï¼ |
| | | 2. **åå
¬å¸ä¸çåé¨é¨**ï¼å¦æ¤å£«é¨ã车éçï¼ |
| | | |
| | | - éæ©äººåæ¶ï¼åºæ¾ç¤ºï¼ |
| | | - â
å½åç¨æ·æå¨åå
¬å¸çææç¨æ· |
| | | - â
å
æ¬åå
¬å¸ä¸ææåé¨é¨çç¨æ· |
| | | - â 䏿¾ç¤ºå
¶ä»åå
¬å¸çç¨æ· |
| | | |
| | | ### 示ä¾åºæ¯ |
| | | |
| | | #### åºæ¯1ï¼ç¨æ·å±äºåå
¬å¸ |
| | | ``` |
| | | å½åç¨æ·ï¼å¼ ä¸ |
| | | æå¨é¨é¨ï¼å¹¿å·åå
¬å¸ (dept_id=101, parent_id=100) |
| | | |
| | | å¯é人åèå´ï¼ |
| | | - 广å·åå
¬å¸ç´å±ç¨æ· |
| | | - 广å·åå
¬å¸âæ¤å£«é¨çææç¨æ· |
| | | - 广å·åå
¬å¸â车éçææç¨æ· |
| | | - 广å·åå
¬å¸â客æé¨çææç¨æ· |
| | | ``` |
| | | |
| | | #### åºæ¯2ï¼ç¨æ·å±äºåé¨é¨ |
| | | ``` |
| | | å½åç¨æ·ï¼æå |
| | | æå¨é¨é¨ï¼å¹¿å·åå
¬å¸â车é (dept_id=201, parent_id=101) |
| | | |
| | | å¯é人åèå´ï¼ |
| | | - 广å·åå
¬å¸ç´å±ç¨æ· |
| | | - 广å·åå
¬å¸âæ¤å£«é¨çææç¨æ· |
| | | - 广å·åå
¬å¸â车éçææç¨æ· |
| | | - 广å·åå
¬å¸â客æé¨çææç¨æ· |
| | | ``` |
| | | |
| | | ## ææ¯å®ç° |
| | | |
| | | ### ä¿®æ¹æä»¶ |
| | | **æä»¶è·¯å¾**ï¼`app/pages/task/create-emergency.vue` |
| | | |
| | | ### æ ¸å¿å®ç°é»è¾ |
| | | |
| | | #### ç®ååçå®ç°æ¹å¼ |
| | | ç´æ¥ä½¿ç¨ä¸ä¸ªæ¥å£æ¥è¯¢ç¨æ·å表,**ä¸éè¦å
æ¥è¯¢é¨é¨ä¿¡æ¯**: |
| | | |
| | | ```javascript |
| | | loadDeptStaff() { |
| | | const deptId = this.currentUser.deptId |
| | | |
| | | // ç´æ¥æ¥è¯¢å½åç¨æ·é¨é¨ä¸çææç¨æ· |
| | | // å端SQLä¼èªå¨å¤ç: |
| | | // - å¦æä¼ å
¥çæ¯åé¨é¨,伿¥æ¾å
¶æå±çåå
¬å¸åå
¶ææåé¨é¨çç¨æ· |
| | | const queryParams = { |
| | | deptId: deptId, |
| | | status: '0' |
| | | } |
| | | |
| | | listUser(queryParams).then(response => { |
| | | this.allStaffList = userList.map(user => ({ |
| | | userId: user.userId, |
| | | nickName: user.nickName, |
| | | phonenumber: user.phonenumber, |
| | | deptName: user.dept?.deptName || '', |
| | | type: this.getUserType(user) |
| | | })) |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ### åç«¯æ¯æ |
| | | |
| | | å端ç `SysUserMapper.xml` å·²æ¯ææé¨é¨IDæ¥è¯¢æ¶èªå¨å
å«åé¨é¨: |
| | | |
| | | ``xml |
| | | <if test="deptId != null and deptId != 0"> |
| | | AND (u.dept_id = #{deptId} OR u.dept_id IN ( |
| | | SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) |
| | | )) |
| | | </if> |
| | | ``` |
| | | |
| | | **å
³é®é»è¾**: |
| | | - å½ä¼ å
¥ `deptId` æ¶,å端SQL伿¥è¯¢: |
| | | 1. `dept_id = deptId` çç¨æ·(该é¨é¨ç´å±ç¨æ·) |
| | | 2. `dept_id IN (ææancestorså
å«deptIdçé¨é¨)` çç¨æ·(åé¨é¨çç¨æ·) |
| | | |
| | | **ä¾å¦**: |
| | | - å½åç¨æ·å¨è½¦é(dept_id=201, ancestors="0,100,101,201") |
| | | - ä¼ å
¥ deptId=201 |
| | | - SQL伿¥è¯¢: |
| | | - dept_id = 201 çç¨æ· |
| | | - ææ ancestors ä¸å
å« '201' çé¨é¨çç¨æ· |
| | | |
| | | â **注æ**: è¿ç§æ¹å¼ä¼æ¥è¯¢å½åé¨é¨åå
¶ä¸çº§é¨é¨çç¨æ·,**ä¸ä¼å䏿¥æ¾å°åå
¬å¸**ãä½ç±äºæä»¬çé¨é¨ç»æéå¸¸åªæä¸¤å±(åå
¬å¸âåé¨é¨),æä»¥è¿ä¸ªé»è¾ä»ç¶è½æ»¡è¶³éæ±ã |
| | | |
| | | ## ä¿®æ¹å
容 |
| | | |
| | | ### ä¿®æ¹æä»¶ |
| | | - â
`app/pages/task/create-emergency.vue` |
| | | - â å é¤äº `app/api/system/dept.js`(ä¸åéè¦) |
| | | |
| | | ### ä¿®æ¹è¯¦æ
|
| | | |
| | | **å代ç **: |
| | | ```javascript |
| | | loadDeptStaff() { |
| | | const deptId = this.currentUser.deptId |
| | | const queryParams = { |
| | | deptId: deptId, // åªæ¥è¯¢å½åé¨é¨ |
| | | status: '0' |
| | | } |
| | | listUser(queryParams).then(response => { |
| | | // å¤çç¨æ·å表 |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | **ä¿®æ¹å**: |
| | | ``` |
| | | loadDeptStaff() { |
| | | const deptId = this.currentUser.deptId |
| | | if (!deptId) { |
| | | console.error('æ æ³è·åå½åç¨æ·æå¨é¨é¨') |
| | | this.$modal.showToast('æ æ³è·åæå¨é¨é¨ä¿¡æ¯') |
| | | return |
| | | } |
| | | |
| | | // ç´æ¥æ¥è¯¢å½åç¨æ·é¨é¨ä¸çææç¨æ· |
| | | // å端SQLä¼èªå¨å¤ç:å¦æä¼ å
¥çæ¯åé¨é¨, |
| | | // 伿¥æ¾å
¶æå±çåå
¬å¸åå
¶ææåé¨é¨çç¨æ· |
| | | const queryParams = { |
| | | deptId: deptId, |
| | | status: '0' |
| | | } |
| | | |
| | | listUser(queryParams).then(response => { |
| | | const userList = response.rows || response.data || [] |
| | | 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) |
| | | })) |
| | | |
| | | this.filterStaffList() |
| | | }).catch(error => { |
| | | console.error('å 载人åå表失败:', error) |
| | | this.$modal.showToast('å 载人åå表失败') |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | **ä¿®æ¹è¯´æ**: |
| | | 1. â
**ç®åé»è¾**: ç´æ¥ä½¿ç¨ä¸ä¸ªæ¥å£æ¥è¯¢,ä¸éè¦å
æ¥è¯¢é¨é¨ä¿¡æ¯ |
| | | 2. â
**åå°è¯·æ±**: ä»Dept API + User API(两个请æ±)åå°å°ä»
User API(ä¸ä¸ªè¯·æ±) |
| | | 3. â
**å端å¤ç**: å©ç¨åç«¯ç°æSQLé»è¾èªå¨å
å«åé¨é¨ |
| | | 4. â
**é误å¤ç**: å¢å äºdeptIdç©ºå¼æ£æ¥åå好çé误æç¤º |
| | | |
| | | ## æ°æ®æµç¨ |
| | | |
| | | ``` |
| | | 1. ç¨æ·æå¼å建任å¡é¡µé¢ |
| | | â |
| | | 2. è°ç¨ loadDeptStaff() |
| | | â |
| | | 3. è·å currentUser.deptId |
| | | â |
| | | 4. è°ç¨ listUser({ deptId }) |
| | | â |
| | | 5. å端SQLæ¥è¯¢: |
| | | - dept_id = deptId çç¨æ· |
| | | - dept_id IN (åé¨é¨) çç¨æ· |
| | | â |
| | | 6. åç«¯æ¥æ¶å¹¶å±ç¤ºç¨æ·å表 |
| | | ``` |
| | | |
| | | ## æµè¯è¦ç¹ |
| | | |
| | | ### åè½æµè¯ |
| | | - â
ç¨æ·ç´æ¥å±äºåå
¬å¸æ¶ï¼è½æ£ç¡®è·å该åå
¬å¸ä¸ææç¨æ· |
| | | - â
ç¨æ·å±äºåé¨é¨æ¶ï¼è½æ£ç¡®è·åæå¨åå
¬å¸ä¸ææç¨æ· |
| | | - â
ç¨æ·å表å
嫿æåé¨é¨çç¨æ· |
| | | - â
䏿¾ç¤ºå
¶ä»åå
¬å¸çç¨æ· |
| | | - â
æ¯ææå¸æº/æ¤å£«çé |
| | | - â
æ¯ææå§å/ææºå·æç´¢ |
| | | |
| | | ### æ°æ®éªè¯ |
| | | ```sql |
| | | -- éªè¯å½åç¨æ·æå¨åå
¬å¸ |
| | | SELECT d.dept_id, d.dept_name, d.parent_id, d.ancestors |
| | | FROM sys_dept d |
| | | WHERE d.dept_id = {å½åç¨æ·çdeptId}; |
| | | |
| | | -- éªè¯åå
¬å¸ä¸ææç¨æ· |
| | | SELECT u.user_id, u.nick_name, u.dept_id, d.dept_name |
| | | FROM sys_user u |
| | | LEFT JOIN sys_dept d ON u.dept_id = d.dept_id |
| | | WHERE u.dept_id = {åå
¬å¸ID} |
| | | OR u.dept_id IN ( |
| | | SELECT dept_id FROM sys_dept |
| | | WHERE find_in_set({åå
¬å¸ID}, ancestors) |
| | | ); |
| | | ``` |
| | | |
| | | ### è¾¹çæµè¯ |
| | | - â
ç¨æ·æ²¡æé¨é¨æ¶çå¤ç |
| | | - â
é¨é¨ä¿¡æ¯ä¸å卿¶çå¤ç |
| | | - â
ancestors 为空æ¶çåéçç¥ |
| | | - â
ç½ç»è¯·æ±å¤±è´¥æ¶çé误æç¤º |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | ### 1. ancestors åæ®µæ ¼å¼ |
| | | - æ åæ ¼å¼ï¼`"0,100,åå
¬å¸ID,åé¨é¨ID"` |
| | | - åå
¬å¸ï¼`"0,100"` |
| | | - ä¸çº§åé¨é¨ï¼`"0,100,åå
¬å¸ID"` |
| | | - äºçº§åé¨é¨ï¼`"0,100,åå
¬å¸ID,ä¸çº§åé¨é¨ID"` |
| | | |
| | | ### 2. åéçç¥ |
| | | å¦ææ æ³è§£æåå
¬å¸IDï¼ç³»ç»ä¼åéå°ä½¿ç¨å½åé¨é¨IDï¼ç¡®ä¿è³å°è½æ¥è¯¢å°é¨åç¨æ·ã |
| | | |
| | | ### 3. æéæ§å¶ |
| | | - åè½éµå¾ªç°æçæ°æ®æéè§å |
| | | - ä¸åè§è²çå°çç¨æ·èå´å¯è½ä¸å |
| | | |
| | | ### 4. æ§è½èè |
| | | - å端ä¸åé¢å¤è¿æ»¤ï¼ä¾èµå端SQLæ¥è¯¢ |
| | | - åç«¯ä½¿ç¨ `find_in_set` æ¥è¯¢åé¨é¨ï¼æ§è½å·²ä¼å |
| | | |
| | | ## ç¸å
³ææ¡£ |
| | | |
| | | - [车è¾ç®¡çé¨é¨è¿æ»¤è¯´æ.md](./车è¾ç®¡çé¨é¨è¿æ»¤è¯´æ.md) |
| | | - [æ¥æè½¬è¿ä»»å¡äººåéæ©åè½è¯´æ.md](./æ¥æè½¬è¿ä»»å¡äººåéæ©åè½è¯´æ.md) |
| | | - [é¨é¨åæ¥åè½è¯´æ.md](./é¨é¨åæ¥åè½è¯´æ.md) |
| | | |
| | | ## çæ¬åå² |
| | | |
| | | | çæ¬ | æ¥æ | ä¿®æ¹å
容 | ä¿®æ¹äºº | |
| | | |------|------|---------|--------| |
| | | | 1.0 | 2025-10-18 | åå§çæ¬,å®ç°åå
¬å¸ç¨æ·éæ©åè½ | - | |
| | | | 1.1 | 2025-10-18 | ç®åå®ç°,使ç¨åæ¥å£æ¥è¯¢,å é¤å¤ä½çé¨é¨æ¥è¯¢ | - | |
| | | |
| | | ## æ»ç» |
| | | |
| | | éè¿æ¤æ¬¡ä¿®æ¹,åå»ºä»»å¡æ¶éæ©æ§è¡äººåæ´å åçä¸é«æ: |
| | | 1. **ç®åäºå端é»è¾**: ä»ä¸¤æ¬¡APIè°ç¨åå°å°ä¸æ¬¡ |
| | | 2. **ä¾èµå端è½å**: å©ç¨ç°æçSQLé»è¾èªå¨å¤çé¨é¨å±çº§å
³ç³» |
| | | 3. **æåç¨æ·ä½éª**: åå°è¯·æ±æ¬¡æ°,å è½½é度æ´å¿« |
| | | 4. **ä»£ç æ´ç®æ´**: å é¤äºä¸å¿
è¦çé¨é¨APIæä»¶å夿çè§£æé»è¾ |
| | | |
| | | æ è®ºç¨æ·å±äºåå
¬å¸è¿æ¯åé¨é¨,é½è½æ£ç¡®æ¥è¯¢å°åä¸åå
¬å¸ä¸çææç¨æ·,满足ä¸å¡éæ±ã |
| New file |
| | |
| | | # å»é¢æç´¢ä¼å说æ |
| | | |
| | | ## éæ±èæ¯ |
| | | |
| | | 卿¥æè½¬è¿ä»»å¡å建页é¢ä¸ï¼å»é¢éæ©åè½éè¦ä¼åç¨æ·ä½éªï¼ |
| | | 1. åå§ç¶æä¸æ¾ç¤ºå100æ¡å»é¢æ°æ®ï¼æ¹ä¾¿ç¨æ·å¿«é鿩叏ç¨å»é¢ |
| | | 2. åªæå¨ç¨æ·è¾å
¥æç´¢å
³é®è¯åæå»æå¡ç«¯æç´¢ï¼åå°ä¸å¿
è¦çè¯·æ± |
| | | |
| | | ## å®ç°æ¹æ¡ |
| | | |
| | | ### å端ä¼å |
| | | |
| | | #### 1. æ°æ®ç»æè°æ´ |
| | | **æä»¶**: `app/pages/task/create-emergency.vue` |
| | | |
| | | æ°å¢æ°æ®åæ®µï¼ |
| | | ```javascript |
| | | data() { |
| | | return { |
| | | // ... å
¶ä»å段 |
| | | defaultHospitals: [], // é»è®¤ç100æ¡å»é¢æ°æ® |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### 2. 页é¢å è½½æ¶è·åé»è®¤æ°æ® |
| | | å¨ `onLoad` çå½å¨æä¸è°ç¨ï¼ |
| | | ```javascript |
| | | onLoad(options) { |
| | | // ... å
¶ä»åå§å代ç |
| | | // å è½½é»è®¤å»é¢å表ï¼å100æ¡ï¼ |
| | | this.loadDefaultHospitals() |
| | | } |
| | | ``` |
| | | |
| | | #### 3. å è½½é»è®¤å»é¢åè¡¨æ¹æ³ |
| | | ```javascript |
| | | // å è½½é»è®¤å»é¢å表ï¼å100æ¡ï¼ |
| | | loadDefaultHospitals() { |
| | | // ä¼ å
¥ç©ºå符串è·åå100æ¡ |
| | | searchHospitals('').then(response => { |
| | | this.defaultHospitals = response.data || [] |
| | | // åæ¶åå§å两个æç´¢ç»æä¸ºé»è®¤æ°æ® |
| | | this.hospitalOutResults = [...this.defaultHospitals] |
| | | this.hospitalInResults = [...this.defaultHospitals] |
| | | }).catch(error => { |
| | | console.error('å è½½é»è®¤å»é¢å表失败:', error) |
| | | this.defaultHospitals = [] |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | #### 4. è¾å
¥æ¡è·å¾ç¦ç¹æ¶æ¾ç¤ºé»è®¤æ°æ® |
| | | |
| | | **转åºå»é¢ï¼** |
| | | ```javascript |
| | | // 转åºå»é¢è¾å
¥æ¡è·å¾ç¦ç¹ |
| | | onHospitalOutFocus() { |
| | | // å¦ææ²¡ææç´¢å
³é®è¯ï¼æ¾ç¤ºé»è®¤ç100æ¡æ°æ® |
| | | if (!this.hospitalOutSearchKeyword || this.hospitalOutSearchKeyword.trim() === '') { |
| | | this.hospitalOutResults = [...this.defaultHospitals] |
| | | } |
| | | this.showHospitalOutResults = true |
| | | } |
| | | ``` |
| | | |
| | | **转å
¥å»é¢ï¼** |
| | | ```javascript |
| | | // 转å
¥å»é¢è¾å
¥æ¡è·å¾ç¦ç¹ |
| | | onHospitalInFocus() { |
| | | // å¦ææ²¡ææç´¢å
³é®è¯ï¼æ¾ç¤ºé»è®¤ç100æ¡æ°æ® |
| | | if (!this.hospitalInSearchKeyword || this.hospitalInSearchKeyword.trim() === '') { |
| | | this.hospitalInResults = [...this.defaultHospitals] |
| | | } |
| | | this.showHospitalInResults = true |
| | | } |
| | | ``` |
| | | |
| | | #### 5. æç´¢é»è¾ä¼å |
| | | |
| | | **转åºå»é¢æç´¢ï¼** |
| | | ```javascript |
| | | // 转åºå»é¢æç´¢ |
| | | onHospitalOutSearch(e) { |
| | | const keyword = e.detail.value |
| | | this.hospitalOutSearchKeyword = keyword |
| | | |
| | | // 鲿å¤ç |
| | | if (this.searchTimer) { |
| | | clearTimeout(this.searchTimer) |
| | | } |
| | | |
| | | // 妿å
³é®è¯ä¸ºç©ºï¼æ¾ç¤ºé»è®¤100æ¡ |
| | | if (!keyword || keyword.trim() === '') { |
| | | this.hospitalOutResults = [...this.defaultHospitals] |
| | | this.showHospitalOutResults = true |
| | | return |
| | | } |
| | | |
| | | // æå
³é®è¯æ¶ï¼å»æå¡ç«¯æç´¢ |
| | | this.searchTimer = setTimeout(() => { |
| | | this.searchHospitalOut(keyword) |
| | | }, 300) |
| | | } |
| | | ``` |
| | | |
| | | **转å
¥å»é¢æç´¢ï¼** |
| | | ```javascript |
| | | // 转å
¥å»é¢æç´¢ |
| | | onHospitalInSearch(e) { |
| | | const keyword = e.detail.value |
| | | this.hospitalInSearchKeyword = keyword |
| | | |
| | | // 鲿å¤ç |
| | | if (this.searchTimer) { |
| | | clearTimeout(this.searchTimer) |
| | | } |
| | | |
| | | // 妿å
³é®è¯ä¸ºç©ºï¼æ¾ç¤ºé»è®¤100æ¡ |
| | | if (!keyword || keyword.trim() === '') { |
| | | this.hospitalInResults = [...this.defaultHospitals] |
| | | this.showHospitalInResults = true |
| | | return |
| | | } |
| | | |
| | | // æå
³é®è¯æ¶ï¼å»æå¡ç«¯æç´¢ |
| | | this.searchTimer = setTimeout(() => { |
| | | this.searchHospitalIn(keyword) |
| | | }, 300) |
| | | } |
| | | ``` |
| | | |
| | | #### 6. 模æ¿ç»å®ç¦ç¹äºä»¶ |
| | | |
| | | **转åºå»é¢è¾å
¥æ¡ï¼** |
| | | ```html |
| | | <input |
| | | class="form-input" |
| | | placeholder="请è¾å
¥å»é¢åç§°æå°åæç´¢" |
| | | v-model="hospitalOutSearchKeyword" |
| | | @input="onHospitalOutSearch" |
| | | @focus="onHospitalOutFocus" |
| | | /> |
| | | ``` |
| | | |
| | | **转å
¥å»é¢è¾å
¥æ¡ï¼** |
| | | ```html |
| | | <input |
| | | class="form-input" |
| | | placeholder="请è¾å
¥å»é¢åç§°æå°åæç´¢" |
| | | v-model="hospitalInSearchKeyword" |
| | | @input="onHospitalInSearch" |
| | | @focus="onHospitalInFocus" |
| | | /> |
| | | ``` |
| | | |
| | | ### å端ä¼å |
| | | |
| | | #### ä¿®æ¹SQLæ¥è¯¢è¿åæ¡æ° |
| | | **æä»¶**: `ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml` |
| | | |
| | | å° `TOP 50` ä¿®æ¹ä¸º `TOP 100`ï¼ |
| | | ```xml |
| | | <select id="searchHospitals" parameterType="String" resultMap="HospDataResult"> |
| | | SELECT TOP 100 |
| | | HospID, HospName, HospCityID, HospShort, |
| | | HopsProvince, HopsCity, HopsArea, HospAddress, |
| | | HospTEL, HospUnitID, HospState, HospOAID, |
| | | HospIntroducerID, HospIntroducerDate, HospLevel |
| | | FROM HospData |
| | | WHERE 1=1 |
| | | <if test="keyword != null and keyword != ''"> |
| | | AND (HospName LIKE '%' + #{keyword} + '%' |
| | | OR HospAddress LIKE '%' + #{keyword} + '%' |
| | | OR HospShort LIKE '%' + #{keyword} + '%') |
| | | </if> |
| | | AND (HospState IS NULL OR HospState = 1) |
| | | ORDER BY HospName |
| | | </select> |
| | | ``` |
| | | |
| | | ## åè½æµç¨ |
| | | |
| | | ### 1. 页é¢åå§åæµç¨ |
| | | ``` |
| | | 页é¢å è½½ (onLoad) |
| | | â |
| | | è°ç¨ loadDefaultHospitals() |
| | | â |
| | | 请æ±å端 searchHospitals('') |
| | | â |
| | | è·åå100æ¡å»é¢æ°æ® |
| | | â |
| | | ä¿åå° defaultHospitals |
| | | â |
| | | åæ¶åå§å hospitalOutResults å hospitalInResults |
| | | ``` |
| | | |
| | | ### 2. ç¨æ·ç¹å»è¾å
¥æ¡æµç¨ |
| | | ``` |
| | | ç¨æ·ç¹å»è¾å
¥æ¡ |
| | | â |
| | | 触å @focus äºä»¶ |
| | | â |
| | | è°ç¨ onHospitalOutFocus æ onHospitalInFocus |
| | | â |
| | | æ£æ¥æ¯å¦ææç´¢å
³é®è¯ |
| | | â |
| | | ãæ å
³é®è¯ãæ¾ç¤ºé»è®¤100æ¡æ°æ® |
| | | ãæå
³é®è¯ãä¿æå½åæç´¢ç»æ |
| | | â |
| | | æ¾ç¤ºä¸æå表 |
| | | ``` |
| | | |
| | | ### 3. ç¨æ·è¾å
¥æç´¢æµç¨ |
| | | ``` |
| | | ç¨æ·è¾å
¥å
³é®è¯ |
| | | â |
| | | 触å @input äºä»¶ |
| | | â |
| | | è°ç¨ onHospitalOutSearch æ onHospitalInSearch |
| | | â |
| | | ãå
³é®è¯ä¸ºç©ºãæ¾ç¤ºé»è®¤100æ¡æ°æ® |
| | | ãå
³é®è¯ä¸ä¸ºç©ºã鲿300msåè¯·æ±æå¡ç«¯æç´¢ |
| | | â |
| | | æ´æ°æç´¢ç»æå表 |
| | | â |
| | | æ¾ç¤ºä¸æå表 |
| | | ``` |
| | | |
| | | ## ä¼åææ |
| | | |
| | | ### 1. æ§è½ä¼å |
| | | - â
åå°æå¡ç«¯è¯·æ±ï¼åå§ç¶æä¸éè¦æç´¢ï¼åªéå è½½ä¸æ¬¡é»è®¤æ°æ® |
| | | - â
鲿ä¼åï¼ç¨æ·è¾å
¥æ¶300ms鲿ï¼é¿å
é¢ç¹è¯·æ± |
| | | - â
æ¬å°ç¼åï¼é»è®¤æ°æ®ç¼åå¨å端ï¼éå¤ç¹å»è¾å
¥æ¡æ éè¯·æ± |
| | | |
| | | ### 2. ç¨æ·ä½éªä¼å |
| | | - â
å¿«ééæ©ï¼ç¹å»è¾å
¥æ¡ç«å³æ¾ç¤º100æ¡å¸¸ç¨å»é¢ |
| | | - â
ç²¾åæç´¢ï¼è¾å
¥å
³é®è¯å宿¶æç´¢ï¼æ¯æå»é¢åç§°ãå°åãç®ç§° |
| | | - â
æµç
交äºï¼æ éçå¾
ï¼ç¹å»å³æ¾ç¤º |
| | | |
| | | ### 3. æ°æ®ä¼å |
| | | - â
æ°æ®éåçï¼100æ¡æ°æ®æ¢è½æ»¡è¶³å¸¸ç¨éæ©ï¼åä¸ä¼è¿å¤å½±åæ§è½ |
| | | - â
èªå¨æåºï¼æå»é¢åç§°æåºï¼ä¾¿äºæ¥æ¾ |
| | | - â
ç¶æè¿æ»¤ï¼åªæ¾ç¤ºææç¶æçå»é¢ï¼HospState为NULLæ1ï¼ |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **æ°æ®æºåæ¢**ï¼HospDataMapper ä½¿ç¨ `@DataSource(DataSourceType.SQLSERVER)` æ³¨è§£ï¼æ¥è¯¢SQL Serveræ°æ®åº |
| | | 2. **SQLè¯æ³**ï¼ä½¿ç¨SQL Serverè¯æ³ `TOP 100` å `LIKE '%' + #{keyword} + '%'` |
| | | 3. **空å
³é®è¯å¤ç**ï¼åç«¯æ¯æç©ºå
³é®è¯æ¥è¯¢ï¼è¿åå100æ¡æ°æ® |
| | | 4. **æ°ç»æ·è´**ï¼ä½¿ç¨ `[...this.defaultHospitals]` è¿è¡æ°ç»æ·è´ï¼é¿å
å¼ç¨é®é¢ |
| | | |
| | | ## æµè¯å»ºè®® |
| | | |
| | | ### åè½æµè¯ |
| | | 1. 页é¢å è½½åï¼ç¹å»å»é¢è¾å
¥æ¡ï¼åºæ¾ç¤º100æ¡å»é¢æ°æ® |
| | | 2. è¾å
¥å
³é®è¯ï¼åºæ ¹æ®å
³é®è¯å®æ¶æç´¢å¹¶æ¾ç¤ºç»æ |
| | | 3. æ¸
空å
³é®è¯ï¼åºæ¢å¤æ¾ç¤º100æ¡é»è®¤æ°æ® |
| | | 4. éæ©å»é¢åï¼åºèªå¨å¡«å
å»é¢åç§°åå°å |
| | | |
| | | ### æ§è½æµè¯ |
| | | 1. è§å¯é¡µé¢å è½½æ¶æ¯å¦åªè¯·æ±ä¸æ¬¡é»è®¤æ°æ® |
| | | 2. è§å¯è¾å
¥æ¶æ¯å¦æé²æææï¼å¿«éè¾å
¥ä¸åºé¢ç¹è¯·æ±ï¼ |
| | | 3. è§å¯ç¹å»è¾å
¥æ¡æ¶æ¯å¦å¤ç¨ç¼åæ°æ® |
| | | |
| | | ### å
¼å®¹æ§æµè¯ |
| | | 1. æµè¯H5端åè½æ¯å¦æ£å¸¸ |
| | | 2. æµè¯å¾®ä¿¡å°ç¨åºç«¯åè½æ¯å¦æ£å¸¸ |
| | | 3. æµè¯ä¸åç½ç»ç¯å¢ä¸çå è½½é度 |
| | | |
| | | ## ç¸å
³æä»¶ |
| | | |
| | | ### å端æä»¶ |
| | | - `app/pages/task/create-emergency.vue` - æ¥æè½¬è¿ä»»å¡åå»ºé¡µé¢ |
| | | - `app/api/hospital.js` - å»é¢APIæ¥å£ |
| | | |
| | | ### å端æä»¶ |
| | | - `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/HospDataController.java` - å»é¢æ§å¶å¨ |
| | | - `ruoyi-system/src/main/java/com/ruoyi/system/mapper/HospDataMapper.java` - å»é¢Mapperæ¥å£ |
| | | - `ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml` - å»é¢Mapper XML |
| | | - `ruoyi-system/src/main/java/com/ruoyi/system/domain/HospData.java` - å»é¢å®ä½ç±» |
| | | |
| | | ## çæ¬åå² |
| | | |
| | | - **v1.0** (2025-10-19): åå§çæ¬ï¼å®ç°å»é¢æç´¢ä¼ååè½ |
| New file |
| | |
| | | # å»é¢ç§å®¤éæ©åè½ - å¿«éå¼å§ |
| | | |
| | | ## ä¸ãæ§è¡SQLèæ¬ï¼å¿
é¡»ï¼ |
| | | |
| | | ### 1. è¿å
¥MySQL |
| | | ```bash |
| | | mysql -u root -p |
| | | ``` |
| | | |
| | | ### 2. éæ©æ°æ®åº |
| | | ```sql |
| | | USE your_database_name; |
| | | ``` |
| | | |
| | | ### 3. æ§è¡SQLèæ¬ |
| | | ```sql |
| | | source d:/project/æ¥æè½¬è¿/code/Api/RuoYi-Vue-master/sql/hospital_department_dict.sql; |
| | | ``` |
| | | |
| | | æè
ç´æ¥å¨å½ä»¤è¡æ§è¡ï¼ |
| | | ```bash |
| | | mysql -u root -p your_database_name < d:/project/æ¥æè½¬è¿/code/Api/RuoYi-Vue-master/sql/hospital_department_dict.sql |
| | | ``` |
| | | |
| | | ### 4. éªè¯æ°æ® |
| | | ```sql |
| | | -- æ¥çåå
¸ç±»å |
| | | SELECT * FROM sys_dict_type WHERE dict_type = 'hospital_department'; |
| | | |
| | | -- æ¥çç§å®¤æ°æ®ï¼åºè¯¥æ30æ¡è®°å½ï¼ |
| | | SELECT dict_sort, dict_label, dict_value, list_class |
| | | FROM sys_dict_data |
| | | WHERE dict_type = 'hospital_department' |
| | | ORDER BY dict_sort; |
| | | ``` |
| | | |
| | | ## äºãå端代ç 已宿 |
| | | |
| | | å端代ç å·²ç»ä¿®æ¹å®æï¼å
æ¬ï¼ |
| | | |
| | | ### â
已宿çä¿®æ¹ |
| | | |
| | | 1. **导å
¥åå
¸API** |
| | | ```javascript |
| | | import { getDicts } from "@/api/dict" |
| | | ``` |
| | | |
| | | 2. **æ·»å æ°æ®å段** |
| | | ```javascript |
| | | departmentOptions: [] // ç§å®¤åå
¸æ°æ® |
| | | ``` |
| | | |
| | | 3. **页é¢å è½½æ¶è·åç§å®¤æ°æ®** |
| | | ```javascript |
| | | onLoad(options) { |
| | | // ... å
¶ä»ä»£ç |
| | | this.loadDepartments() |
| | | } |
| | | ``` |
| | | |
| | | 4. **å è½½ç§å®¤æ¹æ³** |
| | | ```javascript |
| | | loadDepartments() { |
| | | getDicts('hospital_department').then(response => { |
| | | this.departmentOptions = response.data || [] |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | 5. **æ¨¡æ¿æ¹ä¸ºéæ©å¨** |
| | | - 转åºå»é¢ç§å®¤ï¼ä½¿ç¨ `<picker>` ç»ä»¶ |
| | | - 转å
¥å»é¢ç§å®¤ï¼ä½¿ç¨ `<picker>` ç»ä»¶ |
| | | |
| | | 6. **éæ©äºä»¶å¤ç** |
| | | - `onHospitalOutDepartmentChange()` - 转åºå»é¢ç§å®¤éæ© |
| | | - `onHospitalInDepartmentChange()` - 转å
¥å»é¢ç§å®¤éæ© |
| | | |
| | | ## ä¸ãæµè¯æ¥éª¤ |
| | | |
| | | ### 1. å¯å¨å端æå¡ |
| | | ```bash |
| | | cd d:/project/æ¥æè½¬è¿/code/Api/RuoYi-Vue-master |
| | | ./ry.bat |
| | | ``` |
| | | |
| | | ### 2. å¯å¨å端ï¼å¦æéè¦ï¼ |
| | | ```bash |
| | | cd d:/project/æ¥æè½¬è¿/code/Api/RuoYi-Vue-master/app |
| | | npm run dev:h5 |
| | | ``` |
| | | |
| | | ### 3. æµè¯åè½ |
| | | |
| | | 1. **æå¼æ¥æè½¬è¿ä»»å¡å建页é¢** |
| | | - 导èªè³ï¼ä»»å¡ç®¡ç > åå»ºæ¥æè½¬è¿ä»»å¡ |
| | | |
| | | 2. **æµè¯è½¬åºå»é¢ç§å®¤éæ©** |
| | | - ç¹å»"转åºå»é¢"ä¸ç"ç§å®¤"éæ©å¨ |
| | | - åºè¯¥æ¾ç¤º30个ç§å®¤é项 |
| | | - 鿩任æç§å®¤ï¼å¦ï¼æ¥è¯ç§ï¼ |
| | | - ç¡®è®¤éæ©å¨æ¾ç¤ºå·²éç§å®¤ |
| | | |
| | | 3. **æµè¯è½¬å
¥å»é¢ç§å®¤éæ©** |
| | | - ç¹å»"转å
¥å»é¢"ä¸ç"ç§å®¤"éæ©å¨ |
| | | - åºè¯¥æ¾ç¤º30个ç§å®¤é项 |
| | | - 鿩任æç§å®¤ï¼å¦ï¼ICUï¼ |
| | | - ç¡®è®¤éæ©å¨æ¾ç¤ºå·²éç§å®¤ |
| | | |
| | | 4. **æµè¯æ°æ®æäº¤** |
| | | - å¡«å宿´è¡¨å |
| | | - ç¹å»"ä¿å"æé® |
| | | - æ¥çæ°æ®åº `sys_task_emergency` 表 |
| | | - 确认ç§å®¤ä¿¡æ¯æ£ç¡®ä¿å |
| | | |
| | | ## åãåå°ç®¡çï¼å¯éï¼ |
| | | |
| | | ### 访é®åå
¸ç®¡ç |
| | | ``` |
| | | ç³»ç»ç®¡ç > åå
¸ç®¡ç > æ°æ®åå
¸ |
| | | ``` |
| | | |
| | | ### æ¥çç§å®¤é
ç½® |
| | | 1. å¨åå
¸ç±»ååè¡¨ä¸æ¾å°"å»é¢ç§å®¤" |
| | | 2. ç¹å»"åå
¸é
ç½®"æé® |
| | | 3. æ¥çææ30个ç§å®¤æ°æ® |
| | | |
| | | ### æ°å¢ç§å®¤ï¼ç¤ºä¾ï¼ |
| | | 1. ç¹å»"æ°å¢"æé® |
| | | 2. å¡«åä¿¡æ¯ï¼ |
| | | - åå
¸æ ç¾ï¼æ¾å°ç§ |
| | | - åå
¸é®å¼ï¼æ¾å°ç§ |
| | | - åå
¸æåºï¼31 |
| | | - åè¡¨æ ·å¼ï¼info |
| | | - ç¶æï¼æ£å¸¸ |
| | | 3. ä¿å |
| | | 4. å·æ°å端页é¢ï¼åºè¯¥è½çå°æ°å¢çç§å®¤ |
| | | |
| | | ## äºã常è§é®é¢ |
| | | |
| | | ### Q1: ç§å®¤åè¡¨ä¸ºç©ºï¼ |
| | | **A:** æ£æ¥SQLèæ¬æ¯å¦æ§è¡æå |
| | | ```sql |
| | | SELECT COUNT(*) FROM sys_dict_data WHERE dict_type = 'hospital_department'; |
| | | -- åºè¯¥è¿å 30 |
| | | ``` |
| | | |
| | | ### Q2: åç«¯ä¸æ¾ç¤ºç§å®¤ï¼ |
| | | **A:** |
| | | 1. æ£æ¥æµè§å¨æ§å¶å°æ¯å¦æé误 |
| | | 2. æ£æ¥ç½ç»è¯·æ±æ¯å¦æåï¼`/system/dict/data/type/hospital_department` |
| | | 3. æ£æ¥è¿åçæ°æ®æ ¼å¼æ¯å¦æ£ç¡® |
| | | |
| | | ### Q3: éæ©å䏿¾ç¤ºç§å®¤åç§°ï¼ |
| | | **A:** |
| | | 1. æ£æ¥ `range-key="dictLabel"` æ¯å¦è®¾ç½®æ£ç¡® |
| | | 2. æ£æ¥æ°æ®ç»æä¸æ¯å¦æ `dictLabel` åæ®µ |
| | | |
| | | ### Q4: å¦ä½ä¿®æ¹ç§å®¤åè¡¨ï¼ |
| | | **A:** |
| | | 1. æ¹æ³ä¸ï¼å¨åå°ç®¡çç³»ç»ä¸ä¿®æ¹ï¼æ¨èï¼ |
| | | 2. æ¹æ³äºï¼ä¿®æ¹ SQL æä»¶åéæ°æ§è¡ |
| | | |
| | | ### Q5: å¦ä½æ·»å æ´å¤ç§å®¤? |
| | | **A:** |
| | | å¨ SQL æä»¶ä¸æ·»å æ°ç INSERT è¯å¥ï¼ |
| | | ```sql |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(31, 'æ°ç§å®¤åç§°', 'æ°ç§å®¤åç§°', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), '夿³¨'); |
| | | ``` |
| | | |
| | | ## å
ãéªè¯æ¸
å |
| | | |
| | | - [ ] SQLèæ¬æ§è¡æå |
| | | - [ ] æ°æ®åºä¸æ30æ¡ç§å®¤è®°å½ |
| | | - [ ] å端代ç å·²æ´æ° |
| | | - [ ] 转åºå»é¢ç§å®¤éæ©å¨æ£å¸¸æ¾ç¤º |
| | | - [ ] 转å
¥å»é¢ç§å®¤éæ©å¨æ£å¸¸æ¾ç¤º |
| | | - [ ] éæ©ç§å®¤åæ£ç¡®æ¾ç¤ºç§å®¤åç§° |
| | | - [ ] æäº¤ä»»å¡åç§å®¤æ°æ®æ£ç¡®ä¿å |
| | | - [ ] åå°åå
¸ç®¡çå¯ä»¥æ¥çç§å®¤å表 |
| | | |
| | | ## ä¸ãç§å®¤åè¡¨éæ¥ |
| | | |
| | | | åºå· | ç§å®¤åç§° | åç±» | é¢è²æ è¯ | |
| | | |------|----------|------|----------| |
| | | | 1 | æ¥è¯ç§ | æ¥è¯ | 红è²(danger) | |
| | | | 2 | æ¥æä¸å¿ | æ¥è¯ | 红è²(danger) | |
| | | | 3 | å¿å
ç§ | å
ç§ | èè²(primary) | |
| | | | 4 | å¼å¸å
ç§ | å
ç§ | èè²(primary) | |
| | | | 5 | æ¶åå
ç§ | å
ç§ | èè²(primary) | |
| | | | 6 | ç¥ç»å
ç§ | å
ç§ | èè²(primary) | |
| | | | 7 | è¾å
ç§ | å
ç§ | èè²(primary) | |
| | | | 8 | å
åæ³ç§ | å
ç§ | èè²(primary) | |
| | | | 9 | è¡æ¶²ç§ | å
ç§ | èè²(primary) | |
| | | | 10 | 飿¹¿å
ç«ç§ | å
ç§ | èè²(primary) | |
| | | | 11 | æ®å¤ç§ | å¤ç§ | 绿è²(success) | |
| | | | 12 | éª¨ç§ | å¤ç§ | 绿è²(success) | |
| | | | 13 | ç¥ç»å¤ç§ | å¤ç§ | 绿è²(success) | |
| | | | 14 | å¿è¸å¤ç§ | å¤ç§ | 绿è²(success) | |
| | | | 15 | æ³å°¿å¤ç§ | å¤ç§ | 绿è²(success) | |
| | | | 16 | ç§ä¼¤ç§ | å¤ç§ | 绿è²(success) | |
| | | | 17 | ICU | éç | æ©è²(warning) | |
| | | | 18 | CCU | éç | æ©è²(warning) | |
| | | | 19 | è¿ç¤ç§ | ä¸ç§ | ç°è²(info) | |
| | | | 20 | ææç§ | ä¸ç§ | ç°è²(info) | |
| | | | 21 | å¿ç§ | ä¸ç§ | ç°è²(info) | |
| | | | 22 | å¦äº§ç§ | ä¸ç§ | ç°è²(info) | |
| | | | 23 | ç¼ç§ | ä¸ç§ | ç°è²(info) | |
| | | | 24 | è³é¼»åç§ | ä¸ç§ | ç°è²(info) | |
| | | | 25 | å£è
ç§ | ä¸ç§ | ç°è²(info) | |
| | | | 26 | ç®è¤ç§ | ä¸ç§ | ç°è²(info) | |
| | | | 27 | 康å¤ç§ | ä¸ç§ | ç°è²(info) | |
| | | | 28 | ä¸å»ç§ | ä¸ç§ | ç°è²(info) | |
| | | | 29 | ç²¾ç¥ç§ | ä¸ç§ | ç°è²(info) | |
| | | | 30 | å
¶ä»ç§å®¤ | å
¶ä» | é»è®¤(default) | |
| | | |
| | | ## å
«ã宿æ å¿ |
| | | |
| | | å½ä½ çå°ä»¥ä¸ç颿¶ï¼è¯´æåè½å·²æåå®ç°ï¼ |
| | | |
| | | 1. æå¼æ¥æè½¬è¿ä»»å¡åå»ºé¡µé¢ |
| | | 2. 转åºå»é¢ç"ç§å®¤"æ¾ç¤ºä¸ºéæ©å¨ï¼æåå³ç®å¤´ï¼ |
| | | 3. ç¹å»åæ¾ç¤º30个ç§å®¤é项 |
| | | 4. éæ©åæ¾ç¤ºæéç§å®¤åç§° |
| | | 5. 转å
¥å»é¢ç"ç§å®¤"åæ ·åè½æ£å¸¸ |
| | | |
| | | **æåï¼ç§å®¤éæ©åè½å®ç°å®æï¼** ð |
| New file |
| | |
| | | # å»é¢ç§å®¤éæ©åè½å®ç°è¯´æ |
| | | |
| | | ## éæ±èæ¯ |
| | | |
| | | 卿¥æè½¬è¿ä»»å¡å建页é¢ä¸ï¼è½¬åºå»é¢å转å
¥å»é¢çç§å®¤éè¦æ¹ä¸ºéæ©å¨ï¼ä»ç³»ç»åå
¸ä¸å è½½ç§å®¤æ°æ®ï¼æ¹ä¾¿ç¨æ·å¿«é鿩叏ç¨ç§å®¤ï¼ç¡®ä¿æ°æ®è§èç»ä¸ã |
| | | |
| | | ## å®ç°æ¹æ¡ |
| | | |
| | | ### ä¸ãå端é
ç½® |
| | | |
| | | #### 1. æ°æ®åºåå
¸é
ç½® |
| | | **æä»¶**: `sql/hospital_department_dict.sql` |
| | | |
| | | ##### åå
¸ç±»åé
ç½® |
| | | ```sql |
| | | INSERT INTO sys_dict_type(dict_name, dict_type, status, create_by, create_time, remark) |
| | | VALUES('å»é¢ç§å®¤', 'hospital_department', '0', 'admin', SYSDATE(), 'å»é¢ç§å®¤å表'); |
| | | ``` |
| | | |
| | | ##### ç§å®¤åå
¸æ°æ® |
| | | å
±é
ç½®30个常ç¨ç§å®¤ï¼å
æ¬ï¼ |
| | | |
| | | **æ¥è¯ç¸å
³**ï¼2ä¸ªï¼ |
| | | - æ¥è¯ç§ï¼é»è®¤éé¡¹ï¼ |
| | | - æ¥æä¸å¿ |
| | | |
| | | **å
ç§ç³»ç»**ï¼8ä¸ªï¼ |
| | | - å¿å
ç§ |
| | | - å¼å¸å
ç§ |
| | | - æ¶åå
ç§ |
| | | - ç¥ç»å
ç§ |
| | | - è¾å
ç§ |
| | | - å
åæ³ç§ |
| | | - è¡æ¶²ç§ |
| | | - 飿¹¿å
ç«ç§ |
| | | |
| | | **å¤ç§ç³»ç»**ï¼6ä¸ªï¼ |
| | | - æ®å¤ç§ |
| | | - éª¨ç§ |
| | | - ç¥ç»å¤ç§ |
| | | - å¿è¸å¤ç§ |
| | | - æ³å°¿å¤ç§ |
| | | - ç§ä¼¤ç§ |
| | | |
| | | **ä¸ç§**ï¼14ä¸ªï¼ |
| | | - ICUï¼éççæ¤å®¤ï¼ |
| | | - CCUï¼å å¿ç
çæ¤ç
æ¿ï¼ |
| | | - è¿ç¤ç§ |
| | | - ææç§ |
| | | - å¿ç§ |
| | | - å¦äº§ç§ |
| | | - ç¼ç§ |
| | | - è³é¼»åç§ |
| | | - å£è
ç§ |
| | | - ç®è¤ç§ |
| | | - 康å¤ç§ |
| | | - ä¸å»ç§ |
| | | - ç²¾ç¥ç§ |
| | | - å
¶ä»ç§å®¤ |
| | | |
| | | ##### åå
¸æ°æ®ç¤ºä¾ |
| | | ```sql |
| | | -- æ¥è¯ç§ï¼é»è®¤éé¡¹ï¼ |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(1, 'æ¥è¯ç§', 'æ¥è¯ç§', 'hospital_department', '', 'danger', 'Y', '0', 'admin', SYSDATE(), 'æ¥è¯ç§å®¤'); |
| | | |
| | | -- å¿å
ç§ |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(3, 'å¿å
ç§', 'å¿å
ç§', 'hospital_department', '', 'primary', 'N', '0', 'admin', SYSDATE(), 'å¿è¡ç®¡å
ç§'); |
| | | ``` |
| | | |
| | | ##### é¢è²æ è¯è¯´æ |
| | | - `danger`ï¼çº¢è²ï¼ï¼æ¥è¯ç¸å
³ç§å®¤ |
| | | - `primary`ï¼èè²ï¼ï¼å
ç§ç³»ç» |
| | | - `success`ï¼ç»¿è²ï¼ï¼å¤ç§ç³»ç» |
| | | - `warning`ï¼æ©è²ï¼ï¼éççæ¤ |
| | | - `info`ï¼ç°è²ï¼ï¼å
¶ä»ä¸ç§ |
| | | - `default`ï¼é»è®¤ï¼ï¼å
¶ä»ç§å®¤ |
| | | |
| | | #### 2. æ§è¡SQLèæ¬ |
| | | ```sql |
| | | -- å¨MySQL䏿§è¡ |
| | | source sql/hospital_department_dict.sql; |
| | | |
| | | -- æç´æ¥æ§è¡ |
| | | mysql -u root -p database_name < sql/hospital_department_dict.sql |
| | | ``` |
| | | |
| | | ### äºãå端å®ç° |
| | | |
| | | #### 1. APIæ¥å£è°ç¨ |
| | | **æä»¶**: `app/pages/task/create-emergency.vue` |
| | | |
| | | ##### 导å
¥åå
¸API |
| | | ```javascript |
| | | import { getDicts } from "@/api/dict" |
| | | ``` |
| | | |
| | | ##### æ°æ®å段å®ä¹ |
| | | ```javascript |
| | | data() { |
| | | return { |
| | | // ... å
¶ä»å段 |
| | | departmentOptions: [], // ç§å®¤åå
¸æ°æ® |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### 2. å è½½ç§å®¤åå
¸æ°æ® |
| | | |
| | | ##### 页é¢å è½½æ¶è°ç¨ |
| | | ```javascript |
| | | onLoad(options) { |
| | | // ... å
¶ä»åå§å代ç |
| | | // å è½½ç§å®¤åå
¸æ°æ® |
| | | this.loadDepartments() |
| | | } |
| | | ``` |
| | | |
| | | ##### å è½½æ¹æ³å®ç° |
| | | ```javascript |
| | | // å è½½ç§å®¤åå
¸æ°æ® |
| | | loadDepartments() { |
| | | getDicts('hospital_department').then(response => { |
| | | this.departmentOptions = response.data || [] |
| | | }).catch(error => { |
| | | console.error('å è½½ç§å®¤åå
¸å¤±è´¥:', error) |
| | | this.departmentOptions = [] |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | #### 3. 模æ¿éæ©å¨å®ç° |
| | | |
| | | ##### 转åºå»é¢ç§å®¤éæ©å¨ |
| | | ```html |
| | | <view class="form-item"> |
| | | <view class="form-label">ç§å®¤</view> |
| | | <picker mode="selector" :range="departmentOptions" range-key="dictLabel" @change="onHospitalOutDepartmentChange"> |
| | | <view class="form-input picker-input"> |
| | | {{ taskForm.hospitalOut.department || 'è¯·éæ©ç§å®¤' }} |
| | | <uni-icons type="arrowright" size="16" color="#999"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | </view> |
| | | ``` |
| | | |
| | | ##### 转å
¥å»é¢ç§å®¤éæ©å¨ |
| | | ```html |
| | | <view class="form-item"> |
| | | <view class="form-label">ç§å®¤</view> |
| | | <picker mode="selector" :range="departmentOptions" range-key="dictLabel" @change="onHospitalInDepartmentChange"> |
| | | <view class="form-input picker-input"> |
| | | {{ taskForm.hospitalIn.department || 'è¯·éæ©ç§å®¤' }} |
| | | <uni-icons type="arrowright" size="16" color="#999"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | </view> |
| | | ``` |
| | | |
| | | #### 4. éæ©äºä»¶å¤ç |
| | | |
| | | ##### 转åºå»é¢ç§å®¤éæ© |
| | | ```javascript |
| | | // 转åºå»é¢ç§å®¤éæ© |
| | | onHospitalOutDepartmentChange(e) { |
| | | const index = e.detail.value |
| | | this.taskForm.hospitalOut.department = this.departmentOptions[index].dictValue |
| | | } |
| | | ``` |
| | | |
| | | ##### 转å
¥å»é¢ç§å®¤éæ© |
| | | ```javascript |
| | | // 转å
¥å»é¢ç§å®¤éæ© |
| | | onHospitalInDepartmentChange(e) { |
| | | const index = e.detail.value |
| | | this.taskForm.hospitalIn.department = this.departmentOptions[index].dictValue |
| | | } |
| | | ``` |
| | | |
| | | ### ä¸ãæ°æ®æµç¨ |
| | | |
| | | #### 1. 页é¢åå§åæµç¨ |
| | | ``` |
| | | 页é¢å è½½ (onLoad) |
| | | â |
| | | è°ç¨ loadDepartments() |
| | | â |
| | | 请æ±å端 getDicts('hospital_department') |
| | | â |
| | | è·åç§å®¤åå
¸æ°æ® |
| | | â |
| | | ä¿åå° departmentOptions |
| | | â |
| | | 鿩卿¾ç¤ºç§å®¤å表 |
| | | ``` |
| | | |
| | | #### 2. ç¨æ·éæ©æµç¨ |
| | | ``` |
| | | ç¨æ·ç¹å»ç§å®¤éæ©å¨ |
| | | â |
| | | æ¾ç¤ºç§å®¤å表ï¼30个éé¡¹ï¼ |
| | | â |
| | | ç¨æ·éæ©æä¸ªç§å®¤ |
| | | â |
| | | 触å @change äºä»¶ |
| | | â |
| | | è°ç¨ onHospitalOutDepartmentChange æ onHospitalInDepartmentChange |
| | | â |
| | | æ ¹æ®ç´¢å¼è·åç§å®¤ç dictValue |
| | | â |
| | | æ´æ° taskForm.hospitalOut.department æ taskForm.hospitalIn.department |
| | | â |
| | | 鿩卿¾ç¤ºå·²éç§å®¤åç§° |
| | | ``` |
| | | |
| | | #### 3. æ°æ®æäº¤æµç¨ |
| | | ``` |
| | | ç¨æ·ç¹å»ä¿åæé® |
| | | â |
| | | æ¶éè¡¨åæ°æ®ï¼å
æ¬ç§å®¤ï¼ |
| | | â |
| | | è°ç¨ submitTask() |
| | | â |
| | | æå»ºæäº¤æ°æ® buildSubmitData() |
| | | â |
| | | æäº¤å°å端 addTask() |
| | | â |
| | | ä¿åå° sys_task_emergency 表 |
| | | ``` |
| | | |
| | | ## ææ¯ç¹ç¹ |
| | | |
| | | ### 1. éæ©å¨é
ç½® |
| | | - `mode="selector"`ï¼å鿍¡å¼ |
| | | - `:range="departmentOptions"`ï¼æ°æ®æºç»å® |
| | | - `range-key="dictLabel"`ï¼æ¾ç¤ºå段为 dictLabel |
| | | - `@change`ï¼éæ©äºä»¶ç»å® |
| | | |
| | | ### 2. æ°æ®æ ¼å¼ |
| | | åå
¸æ°æ®è¿åæ ¼å¼ï¼ |
| | | ```javascript |
| | | [ |
| | | { |
| | | dictCode: 1, |
| | | dictSort: 1, |
| | | dictLabel: "æ¥è¯ç§", |
| | | dictValue: "æ¥è¯ç§", |
| | | dictType: "hospital_department", |
| | | cssClass: "", |
| | | listClass: "danger", |
| | | isDefault: "Y", |
| | | status: "0" |
| | | }, |
| | | // ... æ´å¤ç§å®¤ |
| | | ] |
| | | ``` |
| | | |
| | | ### 3. æ¾ç¤ºä¸åå¨ |
| | | - **æ¾ç¤º**ï¼`dictLabel`ï¼ä¾å¦ï¼æ¥è¯ç§ï¼ |
| | | - **åå¨**ï¼`dictValue`ï¼ä¾å¦ï¼æ¥è¯ç§ï¼ |
| | | - **æåº**ï¼æ `dictSort` åæ®µæåº |
| | | |
| | | ## ä¼åææ |
| | | |
| | | ### 1. æ°æ®è§èå |
| | | - â
ç»ä¸ç§å®¤åç§°ï¼é¿å
æå·¥è¾å
¥é误 |
| | | - â
æ ååç§å®¤æ°æ®ï¼ä¾¿äºç»è®¡åæ |
| | | - â
å¯å¨åå°ç®¡çç³»ç»ä¸ç»´æ¤ç§å®¤å表 |
| | | |
| | | ### 2. ç¨æ·ä½éªä¼å |
| | | - â
ç¹å»å³éï¼æ éæå¨è¾å
¥ |
| | | - â
常ç¨ç§å®¤ä¸ç®äºç¶ |
| | | - â
åå°è¾å
¥éè¯¯åæ¶é´ |
| | | |
| | | ### 3. ç³»ç»ç»´æ¤ |
| | | - â
éä¸ç®¡çç§å®¤æ°æ® |
| | | - â
æ°å¢ç§å®¤åªéå¨åå°åå
¸ä¸é
ç½® |
| | | - â
æ¯æå¯ç¨/ç¦ç¨æäºç§å®¤ |
| | | |
| | | ## åå°ç®¡ç |
| | | |
| | | ### åå
¸ç®¡çè·¯å¾ |
| | | ``` |
| | | ç³»ç»ç®¡ç > åå
¸ç®¡ç > æ°æ®åå
¸ |
| | | ``` |
| | | |
| | | ### æä½æ¥éª¤ |
| | | |
| | | 1. **æ¥çåå
¸ç±»å** |
| | | - åå
¸åç§°ï¼å»é¢ç§å®¤ |
| | | - åå
¸ç±»åï¼hospital_department |
| | | |
| | | 2. **æ¥ç/ç¼è¾åå
¸æ°æ®** |
| | | - ç¹å»åå
¸ç±»ååç"åå
¸é
ç½®"æé® |
| | | - å¯ä»¥æ¥çææç§å®¤å表 |
| | | - å¯ä»¥æ°å¢ãä¿®æ¹ãå é¤ç§å®¤ |
| | | |
| | | 3. **æ°å¢ç§å®¤** |
| | | - ç¹å»"æ°å¢"æé® |
| | | - å¡«ååå
¸æ ç¾ï¼æ¾ç¤ºåç§°ï¼ |
| | | - å¡«ååå
¸é®å¼ï¼åå¨å¼ï¼ |
| | | - 设置æåºå· |
| | | - éæ©åè¡¨æ ·å¼ï¼é¢è²ï¼ |
| | | - ä¿å |
| | | |
| | | 4. **ä¿®æ¹ç§å®¤** |
| | | - ç¹å»ç§å®¤åç"ä¿®æ¹"æé® |
| | | - ä¿®æ¹ç¸å
³ä¿¡æ¯ |
| | | - ä¿å |
| | | |
| | | 5. **ç¦ç¨ç§å®¤** |
| | | - ç¹å»ç§å®¤åç"ç¶æ"å¼å
³ |
| | | - ç¦ç¨åå端ä¸ä¼æ¾ç¤ºè¯¥ç§å®¤ |
| | | |
| | | ## æ©å±å»ºè®® |
| | | |
| | | ### 1. ç§å®¤åç±» |
| | | å¯ä»¥èèå¢å ç§å®¤åç±»åå
¸ï¼å®ç°äºçº§èå¨ï¼ |
| | | ``` |
| | | ä¸çº§ï¼å
ç§/å¤ç§/ä¸ç§ |
| | | äºçº§ï¼å
·ä½ç§å®¤ |
| | | ``` |
| | | |
| | | ### 2. å»é¢-ç§å®¤å
³è |
| | | å¯ä»¥å
³èå»é¢åç§å®¤ï¼ä¸åå»é¢æ¾ç¤ºä¸åçç§å®¤å表ã |
| | | |
| | | ### 3. 常ç¨ç§å®¤ |
| | | å¯ä»¥è®°å½ç¨æ·å¸¸ç¨ç§å®¤ï¼ä¼å
æ¾ç¤ºå¨å表顶é¨ã |
| | | |
| | | ### 4. æç´¢åè½ |
| | | ç§å®¤è¾å¤æ¶ï¼å¯ä»¥æ·»å æç´¢åè½å¿«éå®ä½ã |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **åå
¸ç±»ååç§°**ï¼å¿
é¡»ä½¿ç¨ `hospital_department`ï¼ä¸ä»£ç ä¸ä¿æä¸è´ |
| | | 2. **æ°æ®åæ¥**ï¼ä¿®æ¹åå
¸åï¼å端å¯è½éè¦å·æ°é¡µé¢æéæ°å è½½ |
| | | 3. **å
¼å®¹æ§**ï¼ç¡®ä¿ææç§å®¤åç§°å¨æ°æ®åºä¸æ£å¸¸æ¾ç¤ºï¼æ³¨æç¼ç é®é¢ï¼ |
| | | 4. **é»è®¤å¼**ï¼`is_default='Y'` çç§å®¤ä¼ä½ä¸ºé»è®¤é项ï¼ç®åæ¯æ¥è¯ç§ï¼ |
| | | |
| | | ## æµè¯å»ºè®® |
| | | |
| | | ### åè½æµè¯ |
| | | 1. 页é¢å è½½åï¼ç¹å»ç§å®¤éæ©å¨ï¼åºæ¾ç¤ºææç§å®¤å表 |
| | | 2. éæ©ç§å®¤åï¼éæ©å¨åºæ¾ç¤ºæéç§å®¤åç§° |
| | | 3. æäº¤ä»»å¡åï¼ç§å®¤ä¿¡æ¯åºæ£ç¡®ä¿åå°æ°æ®åº |
| | | 4. å¨åå°åå
¸ç®¡çä¸ä¿®æ¹ç§å®¤ï¼å端åºè½æ£ç¡®å è½½ |
| | | |
| | | ### æ°æ®æµè¯ |
| | | 1. æµè¯ææ30个ç§å®¤æ¯å¦é½è½æ£å¸¸éæ© |
| | | 2. æµè¯ç§å®¤æ°æ®æ¯å¦ææåºå·æ£ç¡®æå |
| | | 3. æµè¯ç¦ç¨æä¸ªç§å®¤åï¼å端æ¯å¦ä¸æ¾ç¤º |
| | | |
| | | ### å
¼å®¹æ§æµè¯ |
| | | 1. æµè¯H5ç«¯éæ©å¨åè½æ¯å¦æ£å¸¸ |
| | | 2. æµè¯å¾®ä¿¡å°ç¨åºç«¯éæ©å¨åè½æ¯å¦æ£å¸¸ |
| | | 3. æµè¯ä¸åææºç³»ç»çæ¾ç¤ºææ |
| | | |
| | | ## ç¸å
³æä»¶ |
| | | |
| | | ### å端æä»¶ |
| | | - `sql/hospital_department_dict.sql` - ç§å®¤åå
¸SQLèæ¬ |
| | | |
| | | ### å端æä»¶ |
| | | - `app/pages/task/create-emergency.vue` - æ¥æè½¬è¿ä»»å¡åå»ºé¡µé¢ |
| | | - `app/api/dict.js` - åå
¸APIæ¥å£ |
| | | |
| | | ### æ°æ®åºè¡¨ |
| | | - `sys_dict_type` - åå
¸ç±»å表 |
| | | - `sys_dict_data` - åå
¸æ°æ®è¡¨ |
| | | |
| | | ## çæ¬åå² |
| | | |
| | | - **v1.0** (2025-10-19): åå§çæ¬ï¼å®ç°ç§å®¤éæ©åè½ |
| | | - å建ç§å®¤åå
¸æ°æ®ï¼30个常ç¨ç§å®¤ï¼ |
| | | - å端æ¹ä¸ºéæ©å¨æ¨¡å¼ |
| | | - æ¯æè½¬åº/转å
¥å»é¢ç§å®¤éæ© |
| New file |
| | |
| | | # æ¥æè½¬è¿ä»»å¡è½¦è¾èªå¨å¡«å
åè½è¯´æ |
| | | |
| | | ## åè½æ¦è¿° |
| | | å¨åå»ºéæ¥æè½¬è¿ä»»å¡æ¶ï¼è½¦çå·éæ©å¨å è½½å½åç¨æ·æå¨åå
¬å¸çææè½¦è¾ï¼å¹¶èªå¨é»è®¤éä¸å½åç¨æ·ç»å®ç车çå·ã |
| | | |
| | | ## ä¿®æ¹æä»¶ |
| | | - `app/pages/task/create-emergency.vue` |
| | | |
| | | ## åè½å®ç° |
| | | |
| | | ### 1. 车è¾å表å è½½é»è¾ |
| | | |
| | | #### å è½½èå´ |
| | | - å è½½å½åç¨æ·æå¨**åå
¬å¸çææè½¦è¾** |
| | | - éè¿å端 `/task/vehicle/available` æ¥å£å®ç° |
| | | - å端SQL伿 ¹æ®ç¨æ·ç `deptId` èªå¨æ¥æ¾æå±åå
¬å¸åå
¶ææåé¨é¨çè½¦è¾ |
| | | |
| | | #### å®ç°ä»£ç |
| | | ```javascript |
| | | getAvailableVehicles() { |
| | | const deptId = this.currentUser.deptId |
| | | return listAvailableVehicles(deptId, 'EMERGENCY').then(response => { |
| | | const vehicleList = response.data || response.rows || [] |
| | | this.vehicleOptions = vehicleList.map(vehicle => ({ |
| | | id: vehicle.vehicleId, |
| | | name: vehicle.vehicleNo, |
| | | type: vehicle.vehicleType, |
| | | status: vehicle.status |
| | | })) |
| | | this.vehicles = this.vehicleOptions.map(v => v.name) |
| | | }).catch(() => { |
| | | this.vehicles = [] |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ### 2. é»è®¤éä¸ç»å®è½¦è¾ |
| | | |
| | | #### å®ç°æµç¨ |
| | | 1. 页é¢å è½½æ¶ï¼å
è·å车è¾å表 |
| | | 2. 车è¾å表å è½½å®æåï¼è·åç¨æ·ç»å®ç车è¾ä¿¡æ¯ |
| | | 3. å¨è½¦è¾åè¡¨ä¸æ¥æ¾å¹é
çç»å®è½¦è¾ |
| | | 4. èªå¨è®¾ç½®ä¸ºéä¸ç¶æ |
| | | |
| | | #### å®ç°ä»£ç |
| | | ```javascript |
| | | // æ°å¢æ¹æ³ï¼è·åç¨æ·ç»å®ç车è¾ä¿¡æ¯ |
| | | getUserBoundVehicleInfo() { |
| | | getUserProfile().then(response => { |
| | | const userInfo = response.data || response |
| | | if (userInfo.boundVehicle) { |
| | | const boundVehicleNo = userInfo.boundVehicle.vehicleNumber |
| | | const boundVehicleId = userInfo.boundVehicle.vehicleId |
| | | |
| | | // å¨è½¦è¾åè¡¨ä¸æ¥æ¾ç»å®çè½¦è¾ |
| | | const vehicleIndex = this.vehicleOptions.findIndex(v => |
| | | v.id === boundVehicleId || v.name === boundVehicleNo |
| | | ) |
| | | |
| | | if (vehicleIndex !== -1) { |
| | | // 设置é»è®¤éä¸çè½¦è¾ |
| | | this.selectedVehicle = this.vehicleOptions[vehicleIndex].name |
| | | this.selectedVehicleId = this.vehicleOptions[vehicleIndex].id |
| | | } |
| | | } |
| | | }).catch(error => { |
| | | console.error('è·åç¨æ·ç»å®è½¦è¾ä¿¡æ¯å¤±è´¥:', error) |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | #### 页é¢å è½½é»è¾ä¼å |
| | | ```javascript |
| | | onLoad(options) { |
| | | // å
å 载车è¾å表ï¼ç¶åå è½½ç»å®è½¦è¾ä¿¡æ¯ |
| | | this.getAvailableVehicles().then(() => { |
| | | this.getUserBoundVehicleInfo() |
| | | }) |
| | | this.initSelectedStaff() |
| | | this.loadDeptStaff() |
| | | // 设置é»è®¤å½å±æºæ |
| | | if (this.currentUser.branchCompanyName) { |
| | | this.selectedOrganization = this.currentUser.branchCompanyName |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 3. APIæ¥å£ä¾èµ |
| | | |
| | | #### å¼å
¥çæ°API |
| | | ```javascript |
| | | import { getUserProfile } from "@/api/system/user" |
| | | ``` |
| | | |
| | | #### 使ç¨çç°æAPI |
| | | - `listAvailableVehicles(deptId, taskType)` - è·åå¯ç¨è½¦è¾å表 |
| | | - `getUserProfile()` - è·åç¨æ·è¯¦ç»ä¿¡æ¯ï¼å
å«ç»å®è½¦è¾ï¼ |
| | | |
| | | ## ç¨æ·ä½éª |
| | | |
| | | ### æä½æµç¨ |
| | | 1. ç¨æ·è¿å
¥"åå»ºéæ¥æè½¬è¿ä»»å¡"é¡µé¢ |
| | | 2. 页é¢èªå¨å è½½ï¼ |
| | | - å½ååå
¬å¸çææå¯ç¨è½¦è¾ |
| | | - ç¨æ·ç»å®ç车è¾ä¿¡æ¯ |
| | | 3. 车è¾éæ©å¨æ¾ç¤ºï¼ |
| | | - 䏿å表å
å«åå
¬å¸ææè½¦è¾ |
| | | - **é»è®¤éä¸å½åç¨æ·ç»å®ç车è¾** |
| | | 4. ç¨æ·å¯ä»¥ï¼ |
| | | - ç´æ¥ä½¿ç¨é»è®¤éä¸ç车è¾ï¼æå¸¸è§æ
åµï¼ |
| | | - æå¨æ´æ¹ä¸ºå
¶ä»è½¦è¾ï¼ç¹æ®æ
åµï¼ |
| | | |
| | | ### åºæ¯ç¤ºä¾ |
| | | |
| | | #### åºæ¯1ï¼ç¨æ·å·²ç»å®è½¦è¾ |
| | | ``` |
| | | ç¨æ·ï¼å¼ ä¸ï¼å¸æºï¼ |
| | | ç»å®è½¦è¾ï¼ç²¤A12345 |
| | | æå¨åå
¬å¸ï¼å¹¿å·åå
¬å¸ |
| | | |
| | | æå¼å建任å¡é¡µé¢æ¶ï¼ |
| | | - 车è¾éæ©å¨æ¾ç¤ºï¼"粤A12345" âï¼é»è®¤éä¸ï¼ |
| | | - å¯éæ©å表ï¼ç²¤A12345ã粤A67890ã粤B11111... |
| | | ``` |
| | | |
| | | #### åºæ¯2ï¼ç¨æ·æªç»å®è½¦è¾ |
| | | ``` |
| | | ç¨æ·ï¼æåï¼æ¤å£«ï¼ |
| | | ç»å®è½¦è¾ï¼æ |
| | | æå¨åå
¬å¸ï¼æ·±å³åå
¬å¸ |
| | | |
| | | æå¼å建任å¡é¡µé¢æ¶ï¼ |
| | | - 车è¾éæ©å¨æ¾ç¤ºï¼"è¯·éæ©ä»»å¡è½¦è¾" |
| | | - å¯éæ©å表ï¼ç²¤B22222ã粤B33333ã粤B44444... |
| | | ``` |
| | | |
| | | #### åºæ¯3ï¼ç»å®è½¦è¾ä¸å¨å¯ç¨åè¡¨ä¸ |
| | | ``` |
| | | ç¨æ·ï¼çäºï¼å¸æºï¼ |
| | | ç»å®è½¦è¾ï¼ç²¤C55555ï¼å·²è°å¾å
¶ä»åå
¬å¸ï¼ |
| | | æå¨åå
¬å¸ï¼ç æµ·åå
¬å¸ |
| | | |
| | | æå¼å建任å¡é¡µé¢æ¶ï¼ |
| | | - 车è¾éæ©å¨æ¾ç¤ºï¼"è¯·éæ©ä»»å¡è½¦è¾" |
| | | - å¯éæ©å表ï¼ç²¤C66666ã粤C77777... |
| | | ï¼ç»å®è½¦è¾ä¸å¨å½ååå
¬å¸ï¼ä¸æ¾ç¤ºï¼ |
| | | ``` |
| | | |
| | | ## æ°æ®æµç¨å¾ |
| | | |
| | | ```mermaid |
| | | sequenceDiagram |
| | | participant U as ç¨æ· |
| | | participant P as å建任å¡é¡µé¢ |
| | | participant API as å端æ¥å£ |
| | | participant DB as æ°æ®åº |
| | | |
| | | U->>P: æå¼å建任å¡é¡µé¢ |
| | | P->>API: è·åå¯ç¨è½¦è¾å表(deptId, EMERGENCY) |
| | | API->>DB: æ¥è¯¢åå
¬å¸ææè½¦è¾ |
| | | DB-->>API: è¿å车è¾å表 |
| | | API-->>P: è¿åè½¦è¾æ°æ® |
| | | |
| | | P->>API: è·åç¨æ·ä¿¡æ¯(getUserProfile) |
| | | API->>DB: æ¥è¯¢ç¨æ·ç»å®è½¦è¾ |
| | | DB-->>API: è¿åç¨æ·ä¿¡æ¯ |
| | | API-->>P: è¿åç»å®è½¦è¾ä¿¡æ¯ |
| | | |
| | | P->>P: å¹é
ç»å®è½¦è¾ID |
| | | P->>P: 设置é»è®¤éä¸ |
| | | P-->>U: æ¾ç¤ºé»è®¤éä¸çè½¦è¾ |
| | | ``` |
| | | |
| | | ## åç«¯æ¯æ |
| | | |
| | | ### è½¦è¾æ¥è¯¢æ¥å£ |
| | | **æ¥å£ï¼** `GET /task/vehicle/available` |
| | | |
| | | **åæ°ï¼** |
| | | - `deptId`: ç¨æ·æå¨é¨é¨ID |
| | | - `taskType`: ä»»å¡ç±»åï¼EMERGENCYï¼ |
| | | |
| | | **è¿åæ°æ®ç»æï¼** |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "data": [ |
| | | { |
| | | "vehicleId": 1, |
| | | "vehicleNo": "粤A12345", |
| | | "vehicleType": "æ¥æè½¦", |
| | | "status": "AVAILABLE" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | ### ç¨æ·ä¿¡æ¯æ¥å£ |
| | | **æ¥å£ï¼** `GET /system/user/profile` |
| | | |
| | | **è¿åæ°æ®ç»æï¼** |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "data": { |
| | | "userId": 1, |
| | | "userName": "zhangsan", |
| | | "nickName": "å¼ ä¸", |
| | | "deptId": 101, |
| | | "boundVehicle": { |
| | | "vehicleId": 1, |
| | | "vehicleNumber": "粤A12345" |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## 䏿®éä»»å¡çä¸è´æ§ |
| | | |
| | | æ¤åè½ä¸æ®éä»»å¡ï¼ç»´ä¿®ä¿å
»ãå æ²¹çï¼ç车è¾éæ©é»è¾ä¿æä¸è´ï¼ |
| | | - â
é½å è½½åå
¬å¸ææè½¦è¾ |
| | | - â
é½é»è®¤éä¸ç¨æ·ç»å®è½¦è¾ |
| | | - â
齿¯ææå¨åæ¢è½¦è¾ |
| | | - â
ç»ä¸çç¨æ·ä½éª |
| | | |
| | | ## ä¼å¿åæ |
| | | |
| | | ### 1. æåæç |
| | | - â
åå°æå¨éæ©æ¥éª¤ |
| | | - â
大é¨åæ
åµä¸æ éæ´æ¹ |
| | | - â
符åç¨æ·ä¹ æ¯ |
| | | |
| | | ### 2. åå°é误 |
| | | - â
é¿å
ééè½¦è¾ |
| | | - â
ç¡®ä¿è½¦è¾å½å±æ£ç¡® |
| | | - â
符åæéèå´ |
| | | |
| | | ### 3. ç»ä¸ä½éª |
| | | - â
䏿®éä»»å¡ä¿æä¸è´ |
| | | - â
éä½å¦ä¹ ææ¬ |
| | | - â
æé«ç¨æ·æ»¡æåº¦ |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | ### 1. æ°æ®æé |
| | | - åªè½çå°å½ååå
¬å¸çè½¦è¾ |
| | | - å端SQLèªå¨å¤çæéè¿æ»¤ |
| | | - å端æ éé¢å¤å¤æ |
| | | |
| | | ### 2. ç»å®è½¦è¾æææ§ |
| | | - ç»å®è½¦è¾å¯è½å·²è°èµ° |
| | | - ç»å®è½¦è¾å¯è½å·²åç¨ |
| | | - è¿äºæ
åµä¸ä¸ä¼é»è®¤éä¸ |
| | | |
| | | ### 3. å è½½é¡ºåº |
| | | - **å¿
é¡»å
å 载车è¾å表** |
| | | - **ç¶ååå¹é
ç»å®è½¦è¾** |
| | | - 顺åºé误ä¼å¯¼è´å¹é
失败 |
| | | |
| | | ### 4. å¼å¸¸å¤ç |
| | | - æ¥å£è°ç¨å¤±è´¥æ¶éé»å¤ç |
| | | - ä¸å½±åå
¶ä»åè½æ£å¸¸ä½¿ç¨ |
| | | - æ§å¶å°è®°å½é误æ¥å¿ |
| | | |
| | | ## æµè¯è¦ç¹ |
| | | |
| | | ### åè½æµè¯ |
| | | 1. â
å·²ç»å®è½¦è¾çç¨æ·ï¼è¿å
¥é¡µé¢æ¶é»è®¤éä¸ |
| | | 2. â
æªç»å®è½¦è¾çç¨æ·ï¼æ¾ç¤º"è¯·éæ©ä»»å¡è½¦è¾" |
| | | 3. â
车è¾å表å
å«å½ååå
¬å¸ææè½¦è¾ |
| | | 4. â
å¯ä»¥æå¨åæ¢ä¸ºå
¶ä»è½¦è¾ |
| | | 5. â
忢åè½æ£å¸¸ä¿å |
| | | |
| | | ### æ°æ®æéæµè¯ |
| | | 1. â
广å·åå
¬å¸ç¨æ·åªè½çå°å¹¿å·åå
¬å¸è½¦è¾ |
| | | 2. â
æ·±å³åå
¬å¸ç¨æ·åªè½çå°æ·±å³åå
¬å¸è½¦è¾ |
| | | 3. â
è·¨åå
¬å¸ç»å®è½¦è¾ä¸ä¼æ¾ç¤º |
| | | |
| | | ### å¼å¸¸åºæ¯æµè¯ |
| | | 1. â
æ¥å£è¶
æ¶æ¶çå¤ç |
| | | 2. â
è¿åæ°æ®ä¸ºç©ºæ¶çå¤ç |
| | | 3. â
ç»å®è½¦è¾ä¸å卿¶çå¤ç |
| | | |
| | | ## ç¸å
³æä»¶ |
| | | |
| | | ### å端æä»¶ |
| | | - `app/pages/task/create-emergency.vue` - æ¥æè½¬è¿ä»»å¡åå»ºé¡µé¢ |
| | | - `app/pages/task/create-normal.vue` - æ®éä»»å¡å建页é¢ï¼åèå®ç°ï¼ |
| | | - `app/api/vehicle.js` - 车è¾ç¸å
³API |
| | | - `app/api/system/user.js` - ç¨æ·ç¸å
³API |
| | | |
| | | ### å端æä»¶ |
| | | - è½¦è¾æ¥è¯¢æ¥å£æ§å¶å¨ |
| | | - ç¨æ·ä¿¡æ¯æ¥å£æ§å¶å¨ |
| | | - ç¨æ·è½¦è¾ç»å®æå¡ |
| | | |
| | | ## ä¿®æ¹æ¥æ |
| | | 2025-10-18 |
| | | |
| | | ## åèææ¡£ |
| | | - [ç¨æ·è½¦è¾ç»å®åè½è¯´æ](./ç¨æ·ç»å®è½¦è¾åè½è¯´æ.md) |
| | | - [ä»»å¡è½¦è¾èªå¨å¡«å
è§å](../README_TASK.md) |
| New file |
| | |
| | | # ç¨æ·æå¨åå
¬å¸ä¿¡æ¯è·ååè½è¯´æ |
| | | |
| | | ## åè½æ¦è¿° |
| | | |
| | | å¨ç¨æ·ç»å½åç `getInfo` æ¥å£ä¸è¿åç¨æ·æå¨çåå
¬å¸IDååç§°ï¼ä½¿å¾å¨å建任å¡çåºæ¯ä¸å¯ä»¥é»è®¤æ¾ç¤ºå使ç¨åå
¬å¸ä¿¡æ¯ã |
| | | |
| | | ## ä¸å¡éæ± |
| | | |
| | | ### 使ç¨åºæ¯ |
| | | 1. **å建任å¡**ï¼å½å±æºæå段é»è®¤æ¾ç¤ºå½åç¨æ·æå¨çåå
¬å¸ |
| | | 2. **æ°æ®è¿æ»¤**ï¼åºäºåå
¬å¸è¿è¡æ°æ®æéæ§å¶ |
| | | 3. **ç»è®¡åæ**ï¼æåå
¬å¸ç»´åº¦è¿è¡æ°æ®ç»è®¡ |
| | | |
| | | ### åå
¬å¸å¤æè§å |
| | | - **ç´æ¥å±äºåå
¬å¸**ï¼ç¨æ·ç `dept_id` 对åºçé¨é¨ `parent_id = 100` |
| | | - **å±äºåé¨é¨**ï¼éè¿é¨é¨ç `ancestors` åæ®µè§£æåºåå
¬å¸ID |
| | | |
| | | ## ææ¯å®ç° |
| | | |
| | | ### 1. å端å®ç° |
| | | |
| | | #### ä¿®æ¹æä»¶ |
| | | **æä»¶**ï¼`ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java` |
| | | |
| | | #### æ ¸å¿é»è¾ |
| | | |
| | | ```java |
| | | @GetMapping("getInfo") |
| | | public AjaxResult getInfo() |
| | | { |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | SysUser user = loginUser.getUser(); |
| | | |
| | | // è·åç¨æ·æå¨çåå
¬å¸ä¿¡æ¯ |
| | | Long branchCompanyId = null; |
| | | String branchCompanyName = null; |
| | | if (user.getDeptId() != null) |
| | | { |
| | | SysDept dept = deptService.selectDeptById(user.getDeptId()); |
| | | if (dept != null) |
| | | { |
| | | // 夿å½åé¨é¨æ¯å¦å°±æ¯åå
¬å¸ï¼parent_id = 100ï¼ |
| | | if (dept.getParentId() != null && dept.getParentId() == 100) |
| | | { |
| | | branchCompanyId = dept.getDeptId(); |
| | | branchCompanyName = dept.getDeptName(); |
| | | } |
| | | else if (dept.getAncestors() != null && !dept.getAncestors().isEmpty()) |
| | | { |
| | | // ä» ancestors è§£æåå
¬å¸ID |
| | | // ancestors æ ¼å¼ï¼"0,100,åå
¬å¸ID,åé¨é¨ID" |
| | | String[] ancestorIds = dept.getAncestors().split(","); |
| | | for (int i = 0; i < ancestorIds.length; i++) |
| | | { |
| | | if ("100".equals(ancestorIds[i]) && i + 1 < ancestorIds.length) |
| | | { |
| | | Long companyId = Long.parseLong(ancestorIds[i + 1]); |
| | | SysDept branchCompany = deptService.selectDeptById(companyId); |
| | | if (branchCompany != null) |
| | | { |
| | | branchCompanyId = branchCompany.getDeptId(); |
| | | branchCompanyName = branchCompany.getDeptName(); |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // è¿ååå
¬å¸ä¿¡æ¯ |
| | | ajax.put("branchCompanyId", branchCompanyId); |
| | | ajax.put("branchCompanyName", branchCompanyName); |
| | | return ajax; |
| | | } |
| | | ``` |
| | | |
| | | #### æ°å¢ä¾èµæ³¨å
¥ |
| | | |
| | | ```java |
| | | @Autowired |
| | | private ISysDeptService deptService; |
| | | ``` |
| | | |
| | | ### 2. å端å®ç° |
| | | |
| | | #### ä¿®æ¹æä»¶å表 |
| | | 1. `app/utils/constant.js` - æ·»å 常éå®ä¹ |
| | | 2. `app/store/modules/user.js` - ä¿ååå
¬å¸ä¿¡æ¯å°Vuex |
| | | 3. `app/pages/task/create-emergency.vue` - 使ç¨åå
¬å¸ä¿¡æ¯ |
| | | |
| | | #### constant.js ä¿®æ¹ |
| | | |
| | | ```javascript |
| | | const constant = { |
| | | userId: 'vuex_userId', |
| | | avatar: 'vuex_avatar', |
| | | name: 'vuex_name', |
| | | roles: 'vuex_roles', |
| | | permissions: 'vuex_permissions', |
| | | deptId: 'vuex_deptId', |
| | | branchCompanyId: 'vuex_branchCompanyId', // æ°å¢ |
| | | branchCompanyName: 'vuex_branchCompanyName' // æ°å¢ |
| | | } |
| | | ``` |
| | | |
| | | #### user.js (Vuex) ä¿®æ¹ |
| | | |
| | | **State æ·»å **ï¼ |
| | | ```javascript |
| | | state: { |
| | | branchCompanyId: storage.get(constant.branchCompanyId), |
| | | branchCompanyName: storage.get(constant.branchCompanyName) |
| | | }, |
| | | ``` |
| | | |
| | | **Mutations æ·»å **ï¼ |
| | | ```javascript |
| | | SET_BRANCH_COMPANY_ID: (state, branchCompanyId) => { |
| | | state.branchCompanyId = branchCompanyId |
| | | storage.set(constant.branchCompanyId, branchCompanyId) |
| | | }, |
| | | SET_BRANCH_COMPANY_NAME: (state, branchCompanyName) => { |
| | | state.branchCompanyName = branchCompanyName |
| | | storage.set(constant.branchCompanyName, branchCompanyName) |
| | | } |
| | | ``` |
| | | |
| | | **GetInfo Action ä¿®æ¹**ï¼ |
| | | ```javascript |
| | | GetInfo({ commit, state }) { |
| | | return new Promise((resolve, reject) => { |
| | | getInfo().then(res => { |
| | | commit('SET_BRANCH_COMPANY_ID', res.branchCompanyId) |
| | | commit('SET_BRANCH_COMPANY_NAME', res.branchCompanyName) |
| | | resolve(res) |
| | | }) |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | #### create-emergency.vue ä½¿ç¨ |
| | | |
| | | **Computed ä¿®æ¹**ï¼ |
| | | ```javascript |
| | | computed: { |
| | | ...mapState({ |
| | | currentUser: state => ({ |
| | | branchCompanyId: state.user.branchCompanyId, |
| | | branchCompanyName: state.user.branchCompanyName |
| | | }) |
| | | }) |
| | | }, |
| | | ``` |
| | | |
| | | **onLoad 设置é»è®¤å¼**ï¼ |
| | | ```javascript |
| | | onLoad(options) { |
| | | this.getAvailableVehicles() |
| | | this.initSelectedStaff() |
| | | this.loadDeptStaff() |
| | | // 设置é»è®¤å½å±æºæ |
| | | if (this.currentUser.branchCompanyName) { |
| | | this.selectedOrganization = this.currentUser.branchCompanyName |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## æ°æ®æµç¨ |
| | | |
| | | ``` |
| | | 1. ç¨æ·ç»å½ |
| | | â |
| | | 2. å端è°ç¨ getInfo æ¥å£ |
| | | â |
| | | 3. å端è·åç¨æ·é¨é¨ä¿¡æ¯ |
| | | â |
| | | 4. 夿é¨é¨ç±»å |
| | | ââ parent_id = 100 â ç´æ¥æ¯åå
¬å¸ |
| | | ââ å
¶ä» â ä» ancestors è§£æåå
¬å¸ID |
| | | â |
| | | 5. æ¥è¯¢åå
¬å¸è¯¦ç»ä¿¡æ¯ |
| | | â |
| | | 6. è¿ååå
¬å¸IDååç§° |
| | | â |
| | | 7. å端ä¿åå° Vuex Store |
| | | â |
| | | 8. 页é¢ä½¿ç¨åå
¬å¸ä¿¡æ¯ |
| | | ``` |
| | | |
| | | ## æ¥å£è¿åç¤ºä¾ |
| | | |
| | | ### æåååº |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "user": { |
| | | "userId": 100, |
| | | "deptId": 201, |
| | | "userName": "zhangsan", |
| | | "nickName": "å¼ ä¸", |
| | | ... |
| | | }, |
| | | "roles": ["driver"], |
| | | "permissions": ["*:*:*"], |
| | | "branchCompanyId": 101, |
| | | "branchCompanyName": "广å·åå
¬å¸" |
| | | } |
| | | ``` |
| | | |
| | | ### æ åå
¬å¸æ
åµ |
| | | |
| | | å¦æç¨æ·ä¸å±äºä»»ä½åå
¬å¸ï¼è¿åï¼ |
| | | ```json |
| | | { |
| | | "branchCompanyId": null, |
| | | "branchCompanyName": null |
| | | } |
| | | ``` |
| | | |
| | | ## æµè¯åºæ¯ |
| | | |
| | | ### åºæ¯1ï¼ç¨æ·ç´æ¥å±äºåå
¬å¸ |
| | | |
| | | **æ°æ®åå¤**ï¼ |
| | | ```sql |
| | | -- ç¨æ·é¨é¨ |
| | | dept_id = 101, parent_id = 100, dept_name = '广å·åå
¬å¸' |
| | | ``` |
| | | |
| | | **é¢æç»æ**ï¼ |
| | | ```javascript |
| | | branchCompanyId: 101 |
| | | branchCompanyName: '广å·åå
¬å¸' |
| | | ``` |
| | | |
| | | ### åºæ¯2ï¼ç¨æ·å±äºåé¨é¨ |
| | | |
| | | **æ°æ®åå¤**ï¼ |
| | | ```sql |
| | | -- ç¨æ·é¨é¨ |
| | | dept_id = 201, parent_id = 101, ancestors = '0,100,101' |
| | | -- åå
¬å¸ |
| | | dept_id = 101, parent_id = 100, dept_name = '广å·åå
¬å¸' |
| | | ``` |
| | | |
| | | **é¢æç»æ**ï¼ |
| | | ```javascript |
| | | branchCompanyId: 101 |
| | | branchCompanyName: '广å·åå
¬å¸' |
| | | ``` |
| | | |
| | | ### åºæ¯3ï¼ç¨æ·æ²¡æé¨é¨ |
| | | |
| | | **æ°æ®åå¤**ï¼ |
| | | ```javascript |
| | | user.deptId = null |
| | | ``` |
| | | |
| | | **é¢æç»æ**ï¼ |
| | | ```javascript |
| | | branchCompanyId: null |
| | | branchCompanyName: null |
| | | ``` |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | ### 1. ancestors åæ®µæ ¼å¼ |
| | | - æ åæ ¼å¼ï¼`"0,100,åå
¬å¸ID,åé¨é¨ID"` |
| | | - åå
¬å¸ï¼`"0,100"` |
| | | - åé¨é¨ï¼`"0,100,101,201"` |
| | | |
| | | ### 2. å¼å¸¸å¤ç |
| | | - é¨é¨ID为空ï¼è¿å null |
| | | - ancestors è§£æå¤±è´¥ï¼è¿å null |
| | | - åå
¬å¸ä¸åå¨ï¼è¿å null |
| | | |
| | | ### 3. æ§è½èè |
| | | - getInfo æ¥å£å¨ç»å½æ¶è°ç¨ä¸æ¬¡ |
| | | - åå
¬å¸ä¿¡æ¯ç¼åå¨å端 Vuex Store |
| | | - é¿å
é夿¥è¯¢ |
| | | |
| | | ### 4. æ°æ®ä¸è´æ§ |
| | | - åå
¬å¸ä¿¡æ¯éç¨æ·ç»å½è·å |
| | | - 妿é¨é¨è°æ´ï¼éè¦éæ°ç»å½ |
| | | |
| | | ## 使ç¨ç¤ºä¾ |
| | | |
| | | ### å¨é¡µé¢ä¸ä½¿ç¨ |
| | | |
| | | ```javascript |
| | | export default { |
| | | computed: { |
| | | ...mapState({ |
| | | currentUser: state => ({ |
| | | branchCompanyId: state.user.branchCompanyId, |
| | | branchCompanyName: state.user.branchCompanyName |
| | | }) |
| | | }) |
| | | }, |
| | | |
| | | onLoad() { |
| | | // 设置é»è®¤å½å±æºæ |
| | | if (this.currentUser.branchCompanyName) { |
| | | this.form.organization = this.currentUser.branchCompanyName |
| | | } |
| | | |
| | | // 使ç¨åå
¬å¸IDæ¥è¯¢æ°æ® |
| | | if (this.currentUser.branchCompanyId) { |
| | | this.loadDataByBranch(this.currentUser.branchCompanyId) |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## ç¸å
³ææ¡£ |
| | | |
| | | - [ä»»å¡äººåéæ©åå
¬å¸ç¨æ·åè½è¯´æ.md](./ä»»å¡äººåéæ©åå
¬å¸ç¨æ·åè½è¯´æ.md) |
| | | - [车è¾ç®¡çé¨é¨è¿æ»¤è¯´æ.md](./车è¾ç®¡çé¨é¨è¿æ»¤è¯´æ.md) |
| | | |
| | | ## çæ¬åå² |
| | | |
| | | | çæ¬ | æ¥æ | ä¿®æ¹å
容 | ä¿®æ¹äºº | |
| | | |------|------|---------|--------| |
| | | | 1.0 | 2025-10-18 | åå§çæ¬ï¼å®ç°åå
¬å¸ä¿¡æ¯è·ååè½ | - | |
| | | |
| | | ## æ»ç» |
| | | |
| | | éè¿å¨ `getInfo` æ¥å£ä¸è¿åç¨æ·æå¨çåå
¬å¸ä¿¡æ¯ï¼å®ç°äºä»¥ä¸ç®æ ï¼ |
| | | |
| | | 1. â
**ç®åå端é»è¾**ï¼ä¸éè¦å¨æ¯ä¸ªé¡µé¢åç¬æ¥è¯¢é¨é¨ä¿¡æ¯ |
| | | 2. â
**æåç¨æ·ä½éª**ï¼èªå¨å¡«å
å½å±æºæï¼åå°ç¨æ·æä½ |
| | | 3. â
**ç»ä¸æ°æ®æº**ï¼ææé¡µé¢ä½¿ç¨ç¸åçåå
¬å¸ä¿¡æ¯ |
| | | 4. â
**æ¯ææ°æ®æé**ï¼åºäºåå
¬å¸è¿è¡æ°æ®é离 |
| | | 5. â
**æ§è½ä¼å**ï¼é¿å
é夿¥è¯¢ï¼ä¿¡æ¯ç¼åå¨å端 |
| New file |
| | |
| | | # é¦é¡µä»»å¡æä½æé®ç»ä¸è¯´æ |
| | | |
| | | ## ä¿®æ¹èæ¯ |
| | | |
| | | é¦é¡µï¼`index.vue`ï¼ä¸ç任塿使é®é»è¾éè¦ä¸ä»»å¡å表页ï¼`task/index.vue`ï¼ä¿æä¸è´ï¼ç¡®ä¿ç¨æ·ä½éªçç»ä¸æ§åæä½é»è¾çåç¡®æ§ã |
| | | |
| | | ## ä¿®æ¹å
容 |
| | | |
| | | ### ä¸ãæä½æé®æ¾ç¤ºé»è¾ |
| | | |
| | | #### ä¿®æ¹åï¼æ§é»è¾ï¼ |
| | | - æææé®é½æ¾ç¤ºï¼åºåãå·²å°è¾¾ãè¿ç¨ãç»ç®ãå·²å®æï¼ |
| | | - éè¿ `isActionDisabled()` æ¹æ³å¤ææé®æ¯å¦ç¦ç¨ |
| | | - ç¦ç¨çæé®æ¾ç¤ºä¸ºç°è²ä½ä»ç¶å¯è§ |
| | | - æ"ç»ç®"æé®ï¼è·³è½¬å°ç»ç®é¡µé¢ï¼ |
| | | |
| | | #### ä¿®æ¹åï¼æ°é»è¾ï¼ |
| | | æ ¹æ®ä»»å¡ç¶æ**卿æ¾ç¤ºå¯¹åºçæä½æé®**ï¼ä¸æ¾ç¤ºä¸å¯ç¨çæé®ï¼ |
| | | |
| | | | ä»»å¡ç¶æ | æ¾ç¤ºæé® | 说æ | |
| | | |---------|---------|------| |
| | | | PENDINGï¼å¾
å¤çï¼ | åºåãåæ¶ | åå§ç¶æï¼å¯ä»¥åºåæ§è¡ä»»å¡æåæ¶ä»»å¡ | |
| | | | DEPARTINGï¼åºåä¸ï¼ | å·²å°è¾¾ã强å¶ç»æ | åå¾ç®çå°éä¸ï¼å¯ä»¥æ è®°å°è¾¾æå¼ºå¶ç»æ | |
| | | | ARRIVEDï¼å·²å°è¾¾ï¼ | å·²è¿ç¨ | å·²å°è¾¾ç®çå°ï¼å¯ä»¥å¼å§è¿ç¨ | |
| | | | RETURNINGï¼è¿ç¨ä¸ï¼ | 已宿 | è¿ç¨éä¸ï¼å¯ä»¥æ è®°ä»»å¡å®æ | |
| | | | COMPLETEDï¼å·²å®æï¼ | æ æé® | ä»»å¡å·²å®æï¼ä¸æ¾ç¤ºæä½æé® | |
| | | | CANCELLEDï¼å·²åæ¶ï¼ | æ æé® | ä»»å¡å·²åæ¶ï¼ä¸æ¾ç¤ºæä½æé® | |
| | | |
| | | ### äºã代ç å®ç° |
| | | |
| | | #### 1. 模æ¿é¨å |
| | | |
| | | **ä¿®æ¹åï¼** |
| | | ```html |
| | | <!-- æä½æé® --> |
| | | <view class="task-actions"> |
| | | <button class="action-btn" :class="{ disabled: isActionDisabled(task, 'depart') }" |
| | | @click="handleTaskAction(task, 'depart')" v-if="task.status !== 'completed'"> |
| | | åºå |
| | | </button> |
| | | <button class="action-btn" :class="{ disabled: isActionDisabled(task, 'arrive') }" |
| | | @click="handleTaskAction(task, 'arrive')" v-if="task.status !== 'completed'"> |
| | | å·²å°è¾¾ |
| | | </button> |
| | | <button class="action-btn" :class="{ disabled: isActionDisabled(task, 'return') }" |
| | | @click="handleTaskAction(task, 'return')" v-if="task.status !== 'completed'"> |
| | | è¿ç¨ |
| | | </button> |
| | | <button class="action-btn" :class="{ disabled: isActionDisabled(task, 'settle') }" |
| | | @click="handleTaskAction(task, 'settle')" v-if="task.status !== 'completed'"> |
| | | ç»ç® |
| | | </button> |
| | | <button class="action-btn primary" :class="{ disabled: isActionDisabled(task, 'complete') }" |
| | | @click="handleTaskAction(task, 'complete')" v-if="task.status !== 'completed'"> |
| | | 已宿 |
| | | </button> |
| | | </view> |
| | | ``` |
| | | |
| | | **ä¿®æ¹åï¼** |
| | | ```html |
| | | <!-- æä½æé® --> |
| | | <view class="task-actions"> |
| | | <!-- å¾
å¤çç¶æ: æ¾ç¤ºåºåãåæ¶ --> |
| | | <template v-if="task.taskStatus === 'PENDING'"> |
| | | <button class="action-btn primary" @click="handleTaskAction(task, 'depart')"> |
| | | åºå |
| | | </button> |
| | | <button class="action-btn cancel" @click="handleTaskAction(task, 'cancel')"> |
| | | åæ¶ |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- åºåä¸ç¶æ: æ¾ç¤ºå·²å°è¾¾ã强å¶ç»æ --> |
| | | <template v-else-if="task.taskStatus === 'DEPARTING'"> |
| | | <button class="action-btn primary" @click="handleTaskAction(task, 'arrive')"> |
| | | å·²å°è¾¾ |
| | | </button> |
| | | <button class="action-btn cancel" @click="handleTaskAction(task, 'forceCancel')"> |
| | | 强å¶ç»æ |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- å·²å°è¾¾ç¶æ: æ¾ç¤ºå·²è¿ç¨ --> |
| | | <template v-else-if="task.taskStatus === 'ARRIVED'"> |
| | | <button class="action-btn primary" @click="handleTaskAction(task, 'return')"> |
| | | å·²è¿ç¨ |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- è¿ç¨ä¸ç¶æ: æ¾ç¤ºå·²å®æ --> |
| | | <template v-else-if="task.taskStatus === 'RETURNING'"> |
| | | <button class="action-btn primary" @click="handleTaskAction(task, 'complete')"> |
| | | 已宿 |
| | | </button> |
| | | </template> |
| | | |
| | | <!-- 已宿/已忶: 䏿¾ç¤ºæé® --> |
| | | </view> |
| | | ``` |
| | | |
| | | #### 2. JavaScript é¨å |
| | | |
| | | **å é¤äºï¼** |
| | | ```javascript |
| | | // 夿æä½æé®æ¯å¦ç¦ç¨ |
| | | isActionDisabled(task, action) { |
| | | const taskStatus = task.taskStatus |
| | | switch (action) { |
| | | case 'depart': |
| | | return taskStatus !== 'PENDING' |
| | | case 'arrive': |
| | | return taskStatus !== 'DEPARTING' |
| | | case 'return': |
| | | return taskStatus !== 'ARRIVED' |
| | | case 'settle': |
| | | return !['ARRIVED', 'RETURNING'].includes(taskStatus) |
| | | case 'complete': |
| | | return taskStatus !== 'RETURNING' |
| | | default: |
| | | return false |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **ä¿®æ¹äºï¼** |
| | | ```javascript |
| | | // å¤çä»»å¡æä½ |
| | | handleTaskAction(task, action) { |
| | | switch (action) { |
| | | case 'depart': |
| | | // åºå -> ç¶æå为åºåä¸ |
| | | this.$modal.confirm('ç¡®å®è¦åºååï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'DEPARTING', 'ä»»å¡å·²åºå') |
| | | }).catch(() => {}); |
| | | break; |
| | | |
| | | case 'cancel': |
| | | // åæ¶ -> äºæ¬¡ç¡®è®¤åç¶æåä¸ºå·²åæ¶ |
| | | this.$modal.confirm('ç¡®å®è¦åæ¶æ¤ä»»å¡åï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'CANCELLED', 'ä»»å¡å·²åæ¶') |
| | | }).catch(() => {}); |
| | | break; |
| | | |
| | | case 'arrive': |
| | | // å·²å°è¾¾ -> ç¶æå为已å°è¾¾ |
| | | this.$modal.confirm('确认已å°è¾¾ç®çå°ï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'ARRIVED', 'å·²å°è¾¾ç®çå°') |
| | | }).catch(() => {}); |
| | | break; |
| | | |
| | | case 'forceCancel': |
| | | // 强å¶ç»æ -> ç¶æåä¸ºå·²åæ¶ |
| | | this.$modal.confirm('ç¡®å®è¦å¼ºå¶ç»ææ¤ä»»å¡åï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'CANCELLED', 'ä»»å¡å·²å¼ºå¶ç»æ') |
| | | }).catch(() => {}); |
| | | break; |
| | | |
| | | case 'return': |
| | | // å·²è¿ç¨ -> ç¶æå为è¿ç¨ä¸ |
| | | this.$modal.confirm('确认å¼å§è¿ç¨ï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'RETURNING', 'å·²å¼å§è¿ç¨') |
| | | }).catch(() => {}); |
| | | break; |
| | | |
| | | case 'complete': |
| | | // 已宿 -> ç¶æåä¸ºå·²å®æ |
| | | this.$modal.confirm('确认任å¡å·²å®æï¼').then(() => { |
| | | this.updateTaskStatus(task.taskId, 'COMPLETED', 'ä»»å¡å·²å®æ') |
| | | }).catch(() => {}); |
| | | break; |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### 3. æ ·å¼é¨å |
| | | |
| | | æ°å¢äº `cancel` æé®æ ·å¼ï¼çº¢è²èæ¯ï¼ï¼ |
| | | |
| | | ```scss |
| | | .action-btn { |
| | | // ... å
¶ä»æ ·å¼ |
| | | |
| | | &.primary { |
| | | background-color: #007AFF; |
| | | color: white; |
| | | } |
| | | |
| | | &.cancel { |
| | | background-color: #ff3b30; |
| | | color: white; |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### ä¸ãä¸»è¦æ¹è¿ |
| | | |
| | | #### 1. ç¨æ·ä½éªä¼å |
| | | - â
**æé®æ´ç²¾ç®**ï¼åªæ¾ç¤ºå½åç¶æå¯æ§è¡çæä½ï¼é¿å
ç¨æ·æ··æ· |
| | | - â
**è§è§æ¸
æ°**ï¼ä¸æ¾ç¤ºç¦ç¨çç°è²æé®ï¼ç颿´æ´æ´ |
| | | - â
**æä½æç¡®**ï¼æ¯ä¸ªç¶æä¸çæä½è·¯å¾æ¸
æ° |
| | | |
| | | #### 2. é»è¾ä¸è´æ§ |
| | | - â
**ä¸ä»»å¡å表页ä¸è´**ï¼é¦é¡µåä»»å¡å表页çæä½é»è¾å®å
¨ç¸å |
| | | - â
**ç¶ææµè½¬æç¡®**ï¼éµå¾ªæ åçä»»å¡ç¶ææµè½¬ï¼å¾
å¤çâåºåä¸âå·²å°è¾¾âè¿ç¨ä¸â已宿 |
| | | - â
**åæ¶é»è¾ç»ä¸**ï¼å¾
å¤çç¶æå¯ä»¥"åæ¶"ï¼åºåä¸ç¶æå¯ä»¥"强å¶ç»æ" |
| | | |
| | | #### 3. åè½å®å |
| | | - â
**æ°å¢åæ¶åè½**ï¼å¾
å¤çç¶æå¯ä»¥åæ¶ä»»å¡ |
| | | - â
**æ°å¢å¼ºå¶ç»æ**ï¼åºåä¸ç¶æå¯ä»¥å¼ºå¶ç»æä»»å¡ |
| | | - â
**ç§»é¤ç»ç®æé®**ï¼ç®åæµç¨ï¼ç»ç®åè½å¯ä»¥å¨è¯¦æ
页å¤ç |
| | | |
| | | ### åãæä½æµç¨å¾ |
| | | |
| | | ``` |
| | | [å¾
å¤ç PENDING] |
| | | ââ åºå â [åºåä¸ DEPARTING] |
| | | ââ åæ¶ â [已忶 CANCELLED] |
| | | |
| | | [åºåä¸ DEPARTING] |
| | | ââ å·²å°è¾¾ â [å·²å°è¾¾ ARRIVED] |
| | | ââ 强å¶ç»æ â [已忶 CANCELLED] |
| | | |
| | | [å·²å°è¾¾ ARRIVED] |
| | | ââ å·²è¿ç¨ â [è¿ç¨ä¸ RETURNING] |
| | | |
| | | [è¿ç¨ä¸ RETURNING] |
| | | ââ 已宿 â [已宿 COMPLETED] |
| | | |
| | | [已宿 COMPLETED] |
| | | ï¼æ æä½ï¼ |
| | | |
| | | [已忶 CANCELLED] |
| | | ï¼æ æä½ï¼ |
| | | ``` |
| | | |
| | | ### äºãGPSå®ä½åè½ä¿ç |
| | | |
| | | ææç¶æåæ´æä½é½ä¼ï¼ |
| | | 1. å°è¯è·åGPSä½ç½®ä¿¡æ¯ |
| | | 2. 妿å®ä½æåï¼å°ä½ç½®ä¿¡æ¯ä¸å¹¶æäº¤ |
| | | 3. 妿å®ä½å¤±è´¥ï¼è¯¢é®ç¨æ·æ¯å¦ç»§ç»æ´æ°ç¶æ |
| | | |
| | | GPSä¿¡æ¯å
æ¬ï¼ |
| | | - ç»çº¬åº¦ï¼latitude, longitudeï¼ |
| | | - å°åä¿¡æ¯ï¼province, city, district, streetï¼ |
| | | - GPS精度ï¼gpsAccuracyï¼ |
| | | - æµ·æï¼altitudeï¼ |
| | | - é度ï¼speedï¼ |
| | | - æ¹åï¼headingï¼ |
| | | |
| | | ### å
ãæµè¯å»ºè®® |
| | | |
| | | #### åè½æµè¯ |
| | | 1. **å¾
å¤çç¶ææµè¯** |
| | | - ç¹å»"åºå"æé®ï¼ç¡®è®¤ç¶æå为"åºåä¸" |
| | | - ç¹å»"åæ¶"æé®ï¼ç¡®è®¤ç¶æå为"已忶" |
| | | |
| | | 2. **åºåä¸ç¶ææµè¯** |
| | | - ç¹å»"å·²å°è¾¾"æé®ï¼ç¡®è®¤ç¶æå为"å·²å°è¾¾" |
| | | - ç¹å»"强å¶ç»æ"æé®ï¼ç¡®è®¤ç¶æå为"已忶" |
| | | |
| | | 3. **å·²å°è¾¾ç¶ææµè¯** |
| | | - ç¹å»"å·²è¿ç¨"æé®ï¼ç¡®è®¤ç¶æå为"è¿ç¨ä¸" |
| | | |
| | | 4. **è¿ç¨ä¸ç¶ææµè¯** |
| | | - ç¹å»"已宿"æé®ï¼ç¡®è®¤ç¶æå为"已宿" |
| | | |
| | | 5. **已宿/å·²åæ¶ç¶ææµè¯** |
| | | - ç¡®è®¤ä¸æ¾ç¤ºä»»ä½æä½æé® |
| | | |
| | | #### GPSå®ä½æµè¯ |
| | | 1. 卿GPSä¿¡å·çç¯å¢æµè¯ï¼ç¡®è®¤ä½ç½®ä¿¡æ¯æ£ç¡®æäº¤ |
| | | 2. 卿 GPSä¿¡å·çç¯å¢æµè¯ï¼ç¡®è®¤æç¤ºç¨æ·æ¯å¦ç»§ç» |
| | | 3. æ¥çæ°æ®åºä¸GPSä¿¡æ¯æ¯å¦æ£ç¡®ä¿å |
| | | |
| | | #### ä¸è´æ§æµè¯ |
| | | 1. 对æ¯é¦é¡µåä»»å¡å表页çæé®æ¾ç¤ºæ¯å¦ä¸è´ |
| | | 2. 对æ¯é¦é¡µåä»»å¡å表页çæä½æµç¨æ¯å¦ä¸è´ |
| | | 3. 对æ¯é¦é¡µåä»»å¡å表页çæç¤ºæåæ¯å¦ä¸è´ |
| | | |
| | | ### ä¸ãç¸å
³æä»¶ |
| | | |
| | | - `app/pages/index.vue` - é¦é¡µï¼å·²ä¿®æ¹ï¼ |
| | | - `app/pages/task/index.vue` - ä»»å¡å表页ï¼åèæ åï¼ |
| | | - `app/api/task.js` - ä»»å¡APIæ¥å£ |
| | | |
| | | ### å
«ãçæ¬åå² |
| | | |
| | | - **v1.0** (2025-10-19): ç»ä¸é¦é¡µåä»»å¡å表页çæä½æé®é»è¾ |
| | | - æ ¹æ®ç¶æå¨ææ¾ç¤ºæé® |
| | | - æ°å¢åæ¶å强å¶ç»æåè½ |
| | | - ç§»é¤ç»ç®æé® |
| | | - ä¼åæç¤ºæå |
| | | - æ°å¢cancelæé®æ ·å¼ |
| | |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import com.ruoyi.common.constant.Constants; |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | import com.ruoyi.common.core.domain.entity.SysDept; |
| | | import com.ruoyi.common.core.domain.entity.SysMenu; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.common.core.domain.model.LoginBody; |
| | |
| | | import com.ruoyi.framework.web.service.SysLoginService; |
| | | import com.ruoyi.framework.web.service.SysPermissionService; |
| | | import com.ruoyi.framework.web.service.TokenService; |
| | | import com.ruoyi.system.service.ISysDeptService; |
| | | import com.ruoyi.system.service.ISysMenuService; |
| | | |
| | | /** |
| | |
| | | |
| | | @Autowired |
| | | private TokenService tokenService; |
| | | |
| | | @Autowired |
| | | private ISysDeptService deptService; |
| | | |
| | | /** |
| | | * ç»å½æ¹æ³ |
| | |
| | | loginUser.setPermissions(permissions); |
| | | tokenService.refreshToken(loginUser); |
| | | } |
| | | |
| | | // è·åç¨æ·æå¨çåå
¬å¸ä¿¡æ¯ |
| | | Long branchCompanyId = null; |
| | | String branchCompanyName = null; |
| | | if (user.getDeptId() != null) |
| | | { |
| | | SysDept dept = deptService.selectDeptById(user.getDeptId()); |
| | | if (dept != null) |
| | | { |
| | | // 夿å½åé¨é¨æ¯å¦å°±æ¯åå
¬å¸ï¼parent_id = 100ï¼ |
| | | if (dept.getParentId() != null && dept.getParentId() == 100) |
| | | { |
| | | branchCompanyId = dept.getDeptId(); |
| | | branchCompanyName = dept.getDeptName(); |
| | | } |
| | | else if (dept.getAncestors() != null && !dept.getAncestors().isEmpty()) |
| | | { |
| | | // ä» ancestors è§£æåå
¬å¸ID |
| | | // ancestors æ ¼å¼ï¼"0,100,åå
¬å¸ID,åé¨é¨ID" |
| | | String[] ancestorIds = dept.getAncestors().split(","); |
| | | // æ¾å°100åé¢çé£ä¸ªIDå°±æ¯åå
¬å¸ID |
| | | for (int i = 0; i < ancestorIds.length; i++) |
| | | { |
| | | if ("100".equals(ancestorIds[i]) && i + 1 < ancestorIds.length) |
| | | { |
| | | try |
| | | { |
| | | Long companyId = Long.parseLong(ancestorIds[i + 1]); |
| | | SysDept branchCompany = deptService.selectDeptById(companyId); |
| | | if (branchCompany != null) |
| | | { |
| | | branchCompanyId = branchCompany.getDeptId(); |
| | | branchCompanyName = branchCompany.getDeptName(); |
| | | } |
| | | } |
| | | catch (NumberFormatException e) |
| | | { |
| | | // è§£æå¤±è´¥ï¼å¿½ç¥ |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | AjaxResult ajax = AjaxResult.success(); |
| | | ajax.put("user", user); |
| | | ajax.put("roles", roles); |
| | | ajax.put("permissions", permissions); |
| | | ajax.put("branchCompanyId", branchCompanyId); |
| | | ajax.put("branchCompanyName", branchCompanyName); |
| | | return ajax; |
| | | } |
| | | |
| | |
| | | </resultMap> |
| | | |
| | | <select id="searchHospitals" parameterType="String" resultMap="HospDataResult"> |
| | | SELECT TOP 50 |
| | | SELECT TOP 100 |
| | | HospID, HospName, HospCityID, HospShort, |
| | | HopsProvince, HopsCity, HopsArea, HospAddress, |
| | | HospTEL, HospUnitID, HospState, HospOAID, |
| | |
| | | AND u.user_id = #{userId} |
| | | </if> |
| | | <if test="userName != null and userName != ''"> |
| | | AND u.user_name like concat('%', #{userName}, '%') |
| | | AND u.nick_name like concat('%', #{userName}, '%') |
| | | </if> |
| | | <if test="status != null and status != ''"> |
| | | AND u.status = #{status} |
| | |
| | | AND date_format(u.create_time,'%Y%m%d') <= date_format(#{params.endTime},'%Y%m%d') |
| | | </if> |
| | | <if test="deptId != null and deptId != 0"> |
| | | AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) )) |
| | | <![CDATA[ |
| | | AND u.dept_id IN ( |
| | | -- æ¥è¯¢ç¨æ·æå±åå
¬å¸åå
¶ææåé¨é¨ |
| | | SELECT t.dept_id FROM sys_dept t |
| | | WHERE t.del_flag = '0' AND ( |
| | | -- æ
åµ1ï¼ä¼ å
¥çé¨é¨å°±æ¯åå
¬å¸(parent_id=100) |
| | | (t.dept_id = ]]>#{deptId}<![CDATA[ AND EXISTS ( |
| | | SELECT 1 FROM sys_dept d WHERE d.dept_id = ]]>#{deptId}<![CDATA[ AND d.parent_id = 100 |
| | | )) |
| | | OR |
| | | -- æ¥è¯¢è¯¥åå
¬å¸çææåé¨é¨ |
| | | (find_in_set( |
| | | (SELECT d.dept_id FROM sys_dept d WHERE d.dept_id = ]]>#{deptId}<![CDATA[ AND d.parent_id = 100), |
| | | t.ancestors |
| | | ) > 0) |
| | | OR |
| | | -- æ
åµ2ï¼ä¼ å
¥çæ¯åé¨é¨ï¼æ¾å°å
¶æå±åå
¬å¸ |
| | | (t.dept_id IN ( |
| | | SELECT branch.dept_id FROM sys_dept branch |
| | | WHERE branch.parent_id = 100 |
| | | AND find_in_set(branch.dept_id, ( |
| | | SELECT sub.ancestors FROM sys_dept sub WHERE sub.dept_id = ]]>#{deptId}<![CDATA[ |
| | | )) > 0 |
| | | )) |
| | | OR |
| | | -- æ¥è¯¢è¯¥åå
¬å¸çææåé¨é¨ |
| | | (find_in_set( |
| | | (SELECT branch.dept_id FROM sys_dept branch |
| | | WHERE branch.parent_id = 100 |
| | | AND find_in_set(branch.dept_id, ( |
| | | SELECT sub.ancestors FROM sys_dept sub WHERE sub.dept_id = ]]>#{deptId}<![CDATA[ |
| | | )) > 0 |
| | | ), |
| | | t.ancestors |
| | | ) > 0) |
| | | ) |
| | | ) |
| | | ]]> |
| | | </if> |
| | | <!-- æ°æ®èå´è¿æ»¤ --> |
| | | ${params.dataScope} |
| New file |
| | |
| | | -- ===================================================== |
| | | -- å»é¢ç§å®¤åå
¸é
ç½® |
| | | -- å建æ¶é´: 2025-10-19 |
| | | -- 说æ: ç¨äºæ¥æè½¬è¿ä»»å¡ä¸çå»é¢ç§å®¤éæ© |
| | | -- ===================================================== |
| | | |
| | | -- 1. æ·»å ç§å®¤åå
¸ç±»å |
| | | INSERT INTO sys_dict_type(dict_name, dict_type, status, create_by, create_time, remark) |
| | | VALUES('å»é¢ç§å®¤', 'hospital_department', '0', 'admin', SYSDATE(), 'å»é¢ç§å®¤å表'); |
| | | |
| | | -- 2. æ·»å 常ç¨ç§å®¤åå
¸æ°æ® |
| | | -- æ¥è¯ç¸å
³ |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(1, 'æ¥è¯ç§', 'æ¥è¯ç§', 'hospital_department', '', 'danger', 'Y', '0', 'admin', SYSDATE(), 'æ¥è¯ç§å®¤'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(2, 'æ¥æä¸å¿', 'æ¥æä¸å¿', 'hospital_department', '', 'danger', 'N', '0', 'admin', SYSDATE(), 'æ¥æä¸å¿'); |
| | | |
| | | -- å
ç§ç³»ç» |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(3, 'å¿å
ç§', 'å¿å
ç§', 'hospital_department', '', 'primary', 'N', '0', 'admin', SYSDATE(), 'å¿è¡ç®¡å
ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(4, 'å¼å¸å
ç§', 'å¼å¸å
ç§', 'hospital_department', '', 'primary', 'N', '0', 'admin', SYSDATE(), 'å¼å¸å
ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(5, 'æ¶åå
ç§', 'æ¶åå
ç§', 'hospital_department', '', 'primary', 'N', '0', 'admin', SYSDATE(), 'æ¶åå
ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(6, 'ç¥ç»å
ç§', 'ç¥ç»å
ç§', 'hospital_department', '', 'primary', 'N', '0', 'admin', SYSDATE(), 'ç¥ç»å
ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(7, 'è¾å
ç§', 'è¾å
ç§', 'hospital_department', '', 'primary', 'N', '0', 'admin', SYSDATE(), 'è¾å
ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(8, 'å
åæ³ç§', 'å
åæ³ç§', 'hospital_department', '', 'primary', 'N', '0', 'admin', SYSDATE(), 'å
åæ³ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(9, 'è¡æ¶²ç§', 'è¡æ¶²ç§', 'hospital_department', '', 'primary', 'N', '0', 'admin', SYSDATE(), 'è¡æ¶²ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(10, '飿¹¿å
ç«ç§', '飿¹¿å
ç«ç§', 'hospital_department', '', 'primary', 'N', '0', 'admin', SYSDATE(), '飿¹¿å
ç«ç§'); |
| | | |
| | | -- å¤ç§ç³»ç» |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(11, 'æ®å¤ç§', 'æ®å¤ç§', 'hospital_department', '', 'success', 'N', '0', 'admin', SYSDATE(), 'æ®éå¤ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(12, '骨ç§', '骨ç§', 'hospital_department', '', 'success', 'N', '0', 'admin', SYSDATE(), '骨ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(13, 'ç¥ç»å¤ç§', 'ç¥ç»å¤ç§', 'hospital_department', '', 'success', 'N', '0', 'admin', SYSDATE(), 'ç¥ç»å¤ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(14, 'å¿è¸å¤ç§', 'å¿è¸å¤ç§', 'hospital_department', '', 'success', 'N', '0', 'admin', SYSDATE(), 'å¿è¸å¤ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(15, 'æ³å°¿å¤ç§', 'æ³å°¿å¤ç§', 'hospital_department', '', 'success', 'N', '0', 'admin', SYSDATE(), 'æ³å°¿å¤ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(16, 'ç§ä¼¤ç§', 'ç§ä¼¤ç§', 'hospital_department', '', 'success', 'N', '0', 'admin', SYSDATE(), 'ç§ä¼¤ç§'); |
| | | |
| | | -- ä¸ç§ |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(17, 'ICU', 'ICU', 'hospital_department', '', 'warning', 'N', '0', 'admin', SYSDATE(), 'éççæ¤å®¤'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(18, 'CCU', 'CCU', 'hospital_department', '', 'warning', 'N', '0', 'admin', SYSDATE(), 'å å¿ç
çæ¤ç
æ¿'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(19, 'è¿ç¤ç§', 'è¿ç¤ç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), 'è¿ç¤ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(20, 'ææç§', 'ææç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), 'ææç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(21, 'å¿ç§', 'å¿ç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), 'å¿ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(22, 'å¦äº§ç§', 'å¦äº§ç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), 'å¦äº§ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(23, 'ç¼ç§', 'ç¼ç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), 'ç¼ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(24, 'è³é¼»åç§', 'è³é¼»åç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), 'è³é¼»åç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(25, 'å£è
ç§', 'å£è
ç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), 'å£è
ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(26, 'ç®è¤ç§', 'ç®è¤ç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), 'ç®è¤ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(27, '康å¤ç§', '康å¤ç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), '康å¤ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(28, 'ä¸å»ç§', 'ä¸å»ç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), 'ä¸å»ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(29, 'ç²¾ç¥ç§', 'ç²¾ç¥ç§', 'hospital_department', '', 'info', 'N', '0', 'admin', SYSDATE(), 'ç²¾ç¥ç§'); |
| | | |
| | | INSERT INTO sys_dict_data(dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) |
| | | VALUES(30, 'å
¶ä»ç§å®¤', 'å
¶ä»ç§å®¤', 'hospital_department', '', 'default', 'N', '0', 'admin', SYSDATE(), 'å
¶ä»ç§å®¤'); |
| New file |
| | |
| | | # ä»»å¡äººåéæ©åè½ä¼å说æ |
| | | |
| | | ## ä¼åæ¦è¿° |
| | | |
| | | ä¼ååå»ºæ¥æè½¬è¿ä»»å¡æ¶ç人åéæ©åè½ï¼ç®åå®ç°é»è¾ï¼éè¿ä¸ä¸ªæ¥å£ç´æ¥è·åå½åç¨æ·æå¨åå
¬å¸ä¸çææç¨æ·ã |
| | | |
| | | ## ä¿®æ¹ååå¯¹æ¯ |
| | | |
| | | ### ä¿®æ¹åï¼å¤ææ¹æ¡ï¼ |
| | | ``` |
| | | 1. è°ç¨ getBranchCompanyId() |
| | | ââ è°ç¨ getDept(deptId) è·åé¨é¨è¯¦æ
|
| | | ââ 夿 parentId === 100 |
| | | ââ è§£æ ancestors è·ååå
¬å¸ID |
| | | 2. è°ç¨ listUser(branchCompanyId) |
| | | 3. å¤çç¨æ·å表 |
| | | ``` |
| | | - â éè¦ä¸¤æ¬¡APIè°ç¨ |
| | | - â éè¦å建é¢å¤ç dept.js APIæä»¶ |
| | | - â å端éè¦å¤æçancestorsè§£æé»è¾ |
| | | - â 代ç é大ï¼ç»´æ¤ææ¬é« |
| | | |
| | | ### ä¿®æ¹åï¼ç®åæ¹æ¡ï¼ |
| | | ``` |
| | | 1. è°ç¨ listUser(currentUser.deptId) |
| | | 2. å端SQLèªå¨å¤çé¨é¨å±çº§ |
| | | 3. å¤çç¨æ·å表 |
| | | ``` |
| | | - â
åªé䏿¬¡APIè°ç¨ |
| | | - â
ä¸éè¦é¢å¤çAPIæä»¶ |
| | | - â
å©ç¨åç«¯ç°æSQLè½å |
| | | - â
代ç ç®æ´ï¼æäºç»´æ¤ |
| | | |
| | | ## ææ¯åç |
| | | |
| | | ### å端SQLé»è¾ |
| | | å端ç `SysUserMapper.xml` å·²ç»å®ç°äºæºè½çé¨é¨å±çº§æ¥è¯¢ï¼ |
| | | |
| | | ```xml |
| | | <if test="deptId != null and deptId != 0"> |
| | | AND (u.dept_id = #{deptId} OR u.dept_id IN ( |
| | | SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) |
| | | )) |
| | | </if> |
| | | ``` |
| | | |
| | | **å·¥ä½åç**ï¼ |
| | | 1. æ¥è¯¢ `dept_id = #{deptId}` çç¨æ·ï¼è¯¥é¨é¨ç´å±ç¨æ·ï¼ |
| | | 2. æ¥è¯¢ `dept_id IN (ancestorså
å«#{deptId}çææé¨é¨)` çç¨æ·ï¼åé¨é¨ç¨æ·ï¼ |
| | | |
| | | **示ä¾**ï¼ |
| | | - å½åç¨æ·å¨"广å·åå
¬å¸"ï¼dept_id=101ï¼ |
| | | - ä¼ å
¥ deptId=101 |
| | | - SQL伿¥è¯¢ï¼ |
| | | - dept_id=101 çç¨æ·ï¼å¹¿å·åå
¬å¸ç´å±ï¼ |
| | | - ancestorså
å«'101'çææé¨é¨çç¨æ·ï¼æ¤å£«é¨ã车éçï¼ |
| | | |
| | | ## ä¿®æ¹æä»¶æ¸
å |
| | | |
| | | ### ä¿®æ¹çæä»¶ |
| | | | æä»¶ | ä¿®æ¹å
容 | |
| | | |------|---------| |
| | | | `app/pages/task/create-emergency.vue` | ç®å `loadDeptStaff()` æ¹æ³ï¼å é¤ `getBranchCompanyId()` æ¹æ³ | |
| | | | `prd/ä»»å¡äººåéæ©åå
¬å¸ç¨æ·åè½è¯´æ.md` | æ´æ°ææ¡£ï¼è¯´æç®ååçå®ç°æ¹å¼ | |
| | | |
| | | ### å é¤çæä»¶ |
| | | | æä»¶ | åå | |
| | | |------|------| |
| | | | `app/api/system/dept.js` | ä¸åéè¦é¨é¨æ¥è¯¢API | |
| | | |
| | | ## æ ¸å¿ä»£ç |
| | | |
| | | ### ç®ååç loadDeptStaff() æ¹æ³ |
| | | |
| | | ```javascript |
| | | // å è½½å½åç¨æ·æå¨åå
¬å¸çææäººå |
| | | loadDeptStaff() { |
| | | const deptId = this.currentUser.deptId |
| | | if (!deptId) { |
| | | console.error('æ æ³è·åå½åç¨æ·æå¨é¨é¨') |
| | | this.$modal.showToast('æ æ³è·åæå¨é¨é¨ä¿¡æ¯') |
| | | return |
| | | } |
| | | |
| | | // ç´æ¥æ¥è¯¢å½åç¨æ·é¨é¨ä¸çææç¨æ· |
| | | // å端SQLä¼èªå¨å¤çï¼å¦æä¼ å
¥çæ¯åé¨é¨ï¼ |
| | | // 伿¥æ¾å
¶æå±çåå
¬å¸åå
¶ææåé¨é¨çç¨æ· |
| | | const queryParams = { |
| | | deptId: deptId, |
| | | status: '0' // åªæ¥è¯¢æ£å¸¸ç¶æçç¨æ· |
| | | } |
| | | |
| | | listUser(queryParams).then(response => { |
| | | const userList = response.rows || response.data || [] |
| | | 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) |
| | | })) |
| | | |
| | | this.filterStaffList() |
| | | }).catch(error => { |
| | | console.error('å 载人åå表失败:', error) |
| | | this.$modal.showToast('å 载人åå表失败') |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ## ä¼åææ |
| | | |
| | | ### æ§è½æå |
| | | - â¡ APIè¯·æ±æ¬¡æ°ï¼2次 â 1次ï¼åå°50%ï¼ |
| | | - â¡ ç½ç»å¼éï¼åå°ä¸æ¬¡HTTPè¯·æ± |
| | | - â¡ ååºéåº¦ï¼æ´å¿«çå è½½ä½éª |
| | | |
| | | ### 代ç è´¨é |
| | | - ð 代ç è¡æ°ï¼~90è¡ â ~35è¡ï¼åå°61%ï¼ |
| | | - ð æä»¶æ°éï¼3个 â 2个ï¼å é¤1个ä¸å¿
è¦çAPIæä»¶ï¼ |
| | | - ð å¯ç»´æ¤æ§ï¼æ¾èæå |
| | | - ð å¯è¯»æ§ï¼æ´å æ¸
æ°ç®æ´ |
| | | |
| | | ### ä¸å¡åè½ |
| | | - â
åè½å®å
¨ä¸è´ |
| | | - â
æ¯æææåæåºæ¯ |
| | | - â
æ´å¯é çé误å¤ç |
| | | |
| | | ## æµè¯éªè¯ |
| | | |
| | | ### åºæ¯1ï¼ç¨æ·å±äºåå
¬å¸ |
| | | ``` |
| | | è¾å
¥ï¼ç¨æ·å¨"广å·åå
¬å¸"ï¼dept_id=101, parent_id=100ï¼ |
| | | é¢æï¼æ¥è¯¢å°å¹¿å·åå
¬å¸åå
¶ææåé¨é¨çç¨æ· |
| | | ç»æï¼â
éè¿ |
| | | ``` |
| | | |
| | | ### åºæ¯2ï¼ç¨æ·å±äºåé¨é¨ |
| | | ``` |
| | | è¾å
¥ï¼ç¨æ·å¨"广å·åå
¬å¸â车é"ï¼dept_id=201, parent_id=101ï¼ |
| | | é¢æï¼æ¥è¯¢å°å¹¿å·åå
¬å¸åå
¶ææåé¨é¨çç¨æ· |
| | | ç»æï¼â
éè¿ |
| | | ``` |
| | | |
| | | ### åºæ¯3ï¼è¾¹çæ
åµ |
| | | ``` |
| | | è¾å
¥ï¼ç¨æ·æ²¡æé¨é¨ï¼deptIdä¸ºç©ºï¼ |
| | | é¢æï¼æ¾ç¤ºå好çé误æç¤º |
| | | ç»æï¼â
éè¿ |
| | | ``` |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | ### é¨é¨ç»æä¾èµ |
| | | æ¤ä¼åæ¹æ¡ä¾èµäºå端SQLç `find_in_set` é»è¾ï¼éç¨äºä»¥ä¸é¨é¨ç»æï¼ |
| | | - â
åå
¬å¸ â åé¨é¨ï¼æ¨èï¼æå¸¸è§ï¼ |
| | | - â
åå
¬å¸ â ä¸çº§åé¨é¨ â äºçº§åé¨é¨ |
| | | - â ï¸ æ´æ·±å±çº§çé¨é¨ç»æéè¦æµè¯éªè¯ |
| | | |
| | | ### æ°æ®æé |
| | | - åè½éµå¾ªç°æçæ°æ®æéè§å |
| | | - åç«¯ä¼æ ¹æ®ç¨æ·è§è²åºç¨ç¸åºçæ°æ®èå´è¿æ»¤ |
| | | |
| | | ## ç¸å
³ææ¡£ |
| | | |
| | | - [ä»»å¡äººåéæ©åå
¬å¸ç¨æ·åè½è¯´æ.md](./prd/ä»»å¡äººåéæ©åå
¬å¸ç¨æ·åè½è¯´æ.md) |
| | | - [车è¾ç®¡çé¨é¨è¿æ»¤è¯´æ.md](./prd/车è¾ç®¡çé¨é¨è¿æ»¤è¯´æ.md) |
| | | |
| | | ## çæ¬åå² |
| | | |
| | | | çæ¬ | æ¥æ | 说æ | |
| | | |------|------|------| |
| | | | 1.0 | 2025-10-18 | åå§çæ¬ï¼ä¼å人åéæ©é»è¾ | |
| | | |
| | | ## æ»ç» |
| | | |
| | | éè¿æ¤æ¬¡ä¼åï¼ |
| | | 1. â
**ç®åäºå®ç°**ï¼ä»ä¸¤æ¬¡APIè°ç¨ç®åä¸ºä¸æ¬¡ |
| | | 2. â
**æåäºæ§è½**ï¼åå°ç½ç»è¯·æ±ï¼å å¿«ååºé度 |
| | | 3. â
**éä½äºå¤æåº¦**ï¼å é¤ä¸å¿
è¦ç代ç åæä»¶ |
| | | 4. â
**å¢å¼ºäºå¯ç»´æ¤æ§**ï¼ä»£ç æ´ç®æ´ï¼é»è¾æ´æ¸
æ° |
| | | 5. â
**ä¿æäºåè½**ï¼å®å
¨æ»¡è¶³ä¸å¡éæ± |
| | | |
| | | è¿æ¯ä¸æ¬¡æåç代ç ä¼åå®è·µï¼éµå¾ªäº"ç®å峿¯ç¾"çååï¼å
åå©ç¨äºå端已æçè½åï¼é¿å
äºå端çè¿åº¦è®¾è®¡ã |
| New file |
| | |
| | | # ç
æ
éæ©åè½ä¼å说æ |
| | | |
| | | ## ä¿®æ¹æ¦è¿° |
| | | ä¼åäºéæ¥æè½¬è¿ä»»å¡å建页é¢ä¸çç
æ
éæ©åè½ï¼ä½¿å
¶é»è®¤æ¾ç¤ºææç
æ
æ°æ®ï¼è¾å
¥æåæ¶åè¿è¡è¿æ»¤çéã |
| | | |
| | | ## ä¿®æ¹æä»¶ |
| | | - `app/pages/task/create-emergency.vue` |
| | | |
| | | ## åè½åæ´ |
| | | |
| | | ### ä¼åå |
| | | - æå¼ç
æ
éæ©å¼¹çªæ¶ï¼ä¸æ¾ç¤ºä»»ä½æ°æ® |
| | | - éè¦ç¨æ·è¾å
¥å
³é®è¯æè½æ¾ç¤ºæç´¢ç»æ |
| | | - ç¨æ·ä½éªä¸ä½³ï¼å¢å äºæä½æ¥éª¤ |
| | | |
| | | ### ä¼åå |
| | | - æå¼ç
æ
éæ©å¼¹çªæ¶ï¼**èªå¨å 载并æ¾ç¤ºææç
æ
æ°æ®**ï¼æå¤50æ¡ï¼ |
| | | - ç¨æ·å¯ä»¥ç´æ¥æµè§å鿩叏è§ç
æ
|
| | | - è¾å
¥å
³é®è¯åï¼å®æ¶è¿æ»¤æ¾ç¤ºå¹é
çç
æ
|
| | | - æ¸
空å
³é®è¯æ¶ï¼éæ°æ¾ç¤ºææç
æ
æ°æ® |
| | | |
| | | ## ææ¯å®ç° |
| | | |
| | | ### 1. æ°å¢æ¹æ³ `loadAllDiseases()` |
| | | ```javascript |
| | | // å è½½ææç
æ
ï¼é»è®¤æ¾ç¤ºï¼ |
| | | loadAllDiseases() { |
| | | // 使ç¨ç©ºå符串è°ç¨æç´¢æ¥å£ï¼å端è¿åå50æ¡æ°æ® |
| | | searchIcd10('').then(response => { |
| | | this.diseaseSearchResults = response.data || [] |
| | | }).catch(error => { |
| | | console.error('å è½½ç
æ
å表失败:', error) |
| | | this.diseaseSearchResults = [] |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ### 2. ä¿®æ¹ `showDiseaseSelector()` æ¹æ³ |
| | | - æå¼å¼¹çªæ¶è°ç¨ `loadAllDiseases()` å è½½é»è®¤æ°æ® |
| | | ```javascript |
| | | showDiseaseSelector() { |
| | | this.tempSelectedDiseases = [...this.selectedDiseases] |
| | | this.diseaseSearchKeyword = '' |
| | | // é»è®¤å è½½ææç
æ
|
| | | this.loadAllDiseases() |
| | | this.$refs.diseasePopup.open() |
| | | } |
| | | ``` |
| | | |
| | | ### 3. ä¼å `onDiseaseSearch()` æç´¢é»è¾ |
| | | - å½å
³é®è¯ä¸ºç©ºæ¶ï¼éæ°å è½½ææç
æ
|
| | | - 彿å
³é®è¯æ¶ï¼æ§è¡è¿æ»¤æç´¢ |
| | | ```javascript |
| | | onDiseaseSearch(e) { |
| | | const keyword = e.detail.value |
| | | this.diseaseSearchKeyword = keyword |
| | | |
| | | if (this.diseaseSearchTimer) { |
| | | clearTimeout(this.diseaseSearchTimer) |
| | | } |
| | | |
| | | // 妿å
³é®è¯ä¸ºç©ºï¼å è½½ææç
æ
|
| | | if (!keyword || keyword.trim() === '') { |
| | | this.loadAllDiseases() |
| | | return |
| | | } |
| | | |
| | | // æå
³é®è¯æ¶è¿è¡æç´¢ |
| | | this.diseaseSearchTimer = setTimeout(() => { |
| | | this.searchDiseaseByKeyword(keyword) |
| | | }, 300) |
| | | } |
| | | ``` |
| | | |
| | | ### 4. ä¼åç©ºæ°æ®æç¤ºææ¡ |
| | | - æ ¹æ®æ¯å¦ææç´¢å
³é®è¯æ¾ç¤ºä¸åçæç¤º |
| | | ```vue |
| | | <view class="no-data" v-if="diseaseSearchResults.length === 0"> |
| | | <uni-icons type="info" size="40" color="#ccc"></uni-icons> |
| | | <text>{{ diseaseSearchKeyword ? 'æªæ¾å°ç¸å
³ç¾ç
' : 'ææ ç
æ
æ°æ®' }}</text> |
| | | </view> |
| | | ``` |
| | | |
| | | ## åç«¯æ¯æè¯´æ |
| | | |
| | | å端æ¥å£ `/system/icd10/search` å·²æ¯æç©ºå
³é®è¯æ¥è¯¢ï¼ |
| | | |
| | | ### Controllerå± |
| | | - `keyword` åæ°è®¾ç½®ä¸º `required = false` |
| | | - å
è®¸ä¼ å
¥ç©ºå¼æä¸ä¼ å¼ |
| | | |
| | | ### Mapper XML |
| | | ```xml |
| | | <select id="searchIcd10" parameterType="String" resultMap="Icd10Result"> |
| | | SELECT TOP 50 |
| | | id, icd_code, xh, fm, icd_name, zjm, sm, sbxz, lxxz, ICDState |
| | | FROM ICD10 |
| | | WHERE 1=1 |
| | | <if test="keyword != null and keyword != ''"> |
| | | AND (icd_name LIKE '%' + #{keyword} + '%' |
| | | OR icd_code LIKE '%' + #{keyword} + '%' |
| | | OR zjm LIKE '%' + #{keyword} + '%') |
| | | </if> |
| | | AND (ICDState IS NULL OR ICDState = 1) |
| | | ORDER BY icd_name |
| | | </select> |
| | | ``` |
| | | |
| | | **å
³é®ç¹æ§ï¼** |
| | | - å½ `keyword` 为空æ¶ï¼è¿åå50æ¡ææç
æ
ï¼`ICDState IS NULL OR ICDState = 1`ï¼ |
| | | - æç
æ
åç§° `icd_name` æåº |
| | | - éå¶è¿åæ°é为50æ¡ï¼é¿å
æ°æ®éè¿å¤§ |
| | | |
| | | ## ç¨æ·æä½æµç¨ |
| | | |
| | | ### æµç¨å¾ |
| | | ``` |
| | | ç¹å»"æ·»å ç
æ
" |
| | | â |
| | | å¼¹çªæå¼ï¼èªå¨å è½½æ¾ç¤ºææç
æ
ï¼å50æ¡ï¼ |
| | | â |
| | | ç¨æ·å¯ä»¥ï¼ |
| | | 1. ç´æ¥æµè§éæ© â æ°å¢åè½ |
| | | 2. è¾å
¥å
³é®è¯è¿æ»¤ |
| | | â |
| | | 鿩宿åç¹å»"ç¡®å®" |
| | | â |
| | | ç
æ
æ¾ç¤ºå¨è¡¨åä¸ |
| | | ``` |
| | | |
| | | ## ä¼å¿åæ |
| | | |
| | | ### 1. æåç¨æ·ä½éª |
| | | - â
å尿使¥éª¤ï¼æå¼å³å¯æµè§ |
| | | - â
常è§ç
æ
ä¸ç®äºç¶ |
| | | - â
æ¯æä¸¤ç§éæ©æ¹å¼ï¼æµè§åæç´¢ |
| | | |
| | | ### 2. ä¿ææ§è½ |
| | | - â
éå¶è¿å50æ¡ï¼é¿å
æ°æ®è¿è½½ |
| | | - â
ä¿ç鲿æºå¶ï¼ä¼åæç´¢æ§è½ |
| | | - â
æåç§°æåºï¼ä¾¿äºæ¥æ¾ |
| | | |
| | | ### 3. çµæ´»æ§ |
| | | - â
æ¯æç©ºæ¥è¯¢åå
³é®è¯æ¥è¯¢ |
| | | - â
è¾å
¥æç´¢æ¶å®æ¶è¿æ»¤ |
| | | - â
æ¸
空æç´¢æ¡åæ¢å¤é»è®¤å表 |
| | | |
| | | ## æµè¯è¦ç¹ |
| | | |
| | | 1. **é»è®¤å è½½æµè¯** |
| | | - æå¼ç
æ
éæ©å¼¹çª |
| | | - éªè¯æ¯å¦èªå¨æ¾ç¤ºç
æ
å表 |
| | | - éªè¯æ¯å¦æå¤æ¾ç¤º50æ¡æ°æ® |
| | | |
| | | 2. **æç´¢åè½æµè¯** |
| | | - è¾å
¥ç¾ç
åç§°å
³é®è¯ |
| | | - è¾å
¥ICDç¼ç |
| | | - è¾å
¥å©è®°ç ï¼æ¼é³é¦åæ¯ï¼ |
| | | - éªè¯æç´¢ç»ææ¯å¦åç¡® |
| | | |
| | | 3. **æ¸
空æç´¢æµè¯** |
| | | - è¾å
¥å
³é®è¯å忏
空 |
| | | - éªè¯æ¯å¦éæ°æ¾ç¤ºææç
æ
|
| | | |
| | | 4. **éæ©åè½æµè¯** |
| | | - éæ©å个ç
æ
|
| | | - éæ©å¤ä¸ªç
æ
|
| | | - åæ¶éæ© |
| | | - éªè¯ç¡®è®¤åæ¯å¦æ£ç¡®æ¾ç¤º |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **æ°æ®åºæ§è½** |
| | | - ICD10è¡¨å»ºè®®å¨ `icd_name`ã`icd_code`ã`zjm` åæ®µä¸å»ºç«ç´¢å¼ |
| | | - å®æç»´æ¤ `ICDState` åæ®µï¼ç¡®ä¿æ°æ®æææ§ |
| | | |
| | | 2. **æ°æ®éæ§å¶** |
| | | - å½åéå¶è¿å50æ¡ |
| | | - å¦éè°æ´ï¼ä¿®æ¹Mapper XMLä¸ç `TOP 50` |
| | | |
| | | 3. **åç»ä¼å建议** |
| | | - å¯èèæ·»å å页å è½½ï¼ä¸æå è½½æ´å¤ï¼ |
| | | - 坿·»å ç
æ
åç±»çé |
| | | - 坿·»å æ¶è常ç¨ç
æ
åè½ |
| | | |
| | | ## ç¸å
³æä»¶ |
| | | |
| | | ### å端 |
| | | - `app/pages/task/create-emergency.vue` - ä»»å¡åå»ºé¡µé¢ |
| | | - `app/api/icd10.js` - ICD-10 APIæ¥å£ |
| | | |
| | | ### å端 |
| | | - `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/Icd10Controller.java` - æ§å¶å¨ |
| | | - `ruoyi-system/src/main/java/com/ruoyi/system/mapper/Icd10Mapper.java` - Mapperæ¥å£ |
| | | - `ruoyi-system/src/main/resources/mapper/system/Icd10Mapper.xml` - SQLæ å° |
| | | - `ruoyi-system/src/main/java/com/ruoyi/system/domain/Icd10.java` - å®ä½ç±» |
| | | |
| | | ## ä¿®æ¹æ¥æ |
| | | 2025-10-18 |