# 急救转运任务车辆自动填充功能说明 ## 功能概述 在创建非急救转运任务时,车牌号选择器加载当前用户所在分公司的所有车辆,并自动默认选中当前用户绑定的车牌号。 ## 修改文件 - `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)