# 急救转运任务归属机构字段传递功能说明 ## 功能概述 在创建急救转运任务时,将前端选择的归属机构(分公司)的部门ID传递到后端,并保存到 `sys_task` 表的 `dept_id` 字段中。 ## 修改内容 ### 1. 后端 VO 类扩展 **文件**:`ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TaskCreateVO.java` #### 添加字段 ```java /** 执行人员ID列表 */ private List assigneeIds; /** 归属部门ID */ private Long deptId; ``` #### 添加 Getter 和 Setter ```java public List getAssigneeIds() { return assigneeIds; } public void setAssigneeIds(List assigneeIds) { this.assigneeIds = assigneeIds; } public Long getDeptId() { return deptId; } public void setDeptId(Long deptId) { this.deptId = deptId; } ``` ### 2. 后端服务层修改 **文件**:`ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java` **修改 insertSysTask 方法**: ```java // 修改前 task.setDeptId(SecurityUtils.getDeptId()); // 修改后 // 优先使用前端传入的部门ID,如果没有则使用当前用户的部门ID task.setDeptId(createVO.getDeptId() != null ? createVO.getDeptId() : SecurityUtils.getDeptId()); ``` **逻辑说明**: - 如果前端传入了 `deptId`,优先使用前端传入的值 - 如果前端没有传入 `deptId`(为 null),则使用当前登录用户的部门ID作为回退 - 确保向后兼容性:旧的任务创建流程不受影响 ### 3. 前端数据传递 **文件**:`app/pages/task/create-emergency.vue` #### 数据字段定义 ```javascript data() { return { selectedOrganization: '', selectedOrganizationId: null, // 归属机构ID(部门ID) selectedRegion: '', // 从归属机构中提取的地域信息 // ... } } ``` #### 归属机构选择处理 ```javascript onOrganizationChange(e) { const index = e.detail.value const selected = this.organizationOptions[index] this.selectedOrganization = selected.deptName this.selectedOrganizationId = selected.deptId // 保存部门ID this.selectedRegion = selected.deptName.replace(/分公司$/g, '').trim() this.loadDefaultHospitals() } ``` #### 默认分公司加载 ```javascript loadBranchCompanies() { listBranchCompany().then(response => { const list = response.data || [] this.organizationOptions = list.filter(dept => dept.parentId === 100) this.organizations = this.organizationOptions.map(dept => dept.deptName) // 默认选中当前用户的分公司 if (this.currentUser.branchCompanyName) { const index = this.organizationOptions.findIndex( dept => dept.deptName === this.currentUser.branchCompanyName ) if (index !== -1) { this.selectedOrganization = this.currentUser.branchCompanyName this.selectedOrganizationId = this.organizationOptions[index].deptId // 保存部门ID this.selectedRegion = this.selectedOrganization.replace(/分公司$/g, '').trim() this.loadDefaultHospitals() } } }) } ``` #### 提交数据构建 ```javascript buildSubmitData() { const submitData = { taskType: 'EMERGENCY_TRANSFER', deptId: this.selectedOrganizationId, // 归属机构ID(部门ID) vehicleIds: this.selectedVehicleId ? [this.selectedVehicleId] : [], assigneeIds: this.selectedStaff.map(staff => staff.userId), assigneeId: this.selectedStaff.length > 0 ? this.selectedStaff[0].userId : null, transferTime: this.taskForm.transferTime, plannedStartTime: this.taskForm.transferTime, documentTypeId: this.selectedDocumentTypeId, taskTypeId: this.selectedEmergencyTaskTypeId, departureAddress: this.taskForm.hospitalOut.address || '', destinationAddress: this.taskForm.hospitalIn.address || '', // ... 其他字段 } return submitData } ``` ## 数据流程图 ```mermaid graph LR A[用户选择归属机构] --> B[保存selectedOrganizationId] B --> C[构建提交数据] C --> D[deptId字段传入后端] D --> E[后端接收TaskCreateVO] E --> F{deptId是否为null?} F -->|否| G[使用前端传入的deptId] F -->|是| H[使用当前用户的deptId] G --> I[保存到sys_task表] H --> I ``` ## 数据库字段映射 | 前端字段 | VO 字段 | 实体字段 | 数据库字段 | 说明 | |---------|---------|----------|-----------|------| | selectedOrganizationId | deptId | deptId | dept_id | 归属部门ID(分公司ID) | ## 业务场景 ### 场景 1:用户选择分公司创建任务 1. 用户在创建任务页面选择归属机构(分公司) 2. 前端保存选中的分公司的部门ID到 `selectedOrganizationId` 3. 提交任务时,将 `selectedOrganizationId` 作为 `deptId` 传给后端 4. 后端保存到 `sys_task` 表的 `dept_id` 字段 ### 场景 2:默认选中用户所在分公司 1. 页面加载时,自动选中当前用户所在的分公司 2. 同时保存该分公司的部门ID 3. 用户可以切换到其他分公司 4. 提交时使用用户选择的分公司ID ### 场景 3:向后兼容(未传入deptId) 1. 如果前端没有传入 `deptId`(旧版本或其他创建方式) 2. 后端自动使用当前登录用户的部门ID 3. 确保系统正常运行 ## 后端数据存储 ### sys_task 表 ```sql CREATE TABLE sys_task ( task_id BIGINT PRIMARY KEY AUTO_INCREMENT, task_code VARCHAR(50) NOT NULL COMMENT '任务编号', task_type VARCHAR(50) NOT NULL COMMENT '任务类型', dept_id BIGINT COMMENT '归属部门ID', creator_id BIGINT COMMENT '创建人ID', assignee_id BIGINT COMMENT '执行人ID', -- ... 其他字段 ) ``` **dept_id 字段说明**: - 存储任务所属的部门ID(通常是分公司的部门ID) - 用于数据权限控制、任务查询过滤 - 与 sys_dept 表的 dept_id 字段关联 - 支持 NULL(为了兼容旧数据) ## 权限控制 ### 数据权限 通过 `dept_id` 字段实现部门级别的数据权限控制: 1. 用户只能查看自己部门及子部门的任务 2. 管理员可以查看所有部门的任务 3. 任务统计按部门分组 ### 业务规则 1. 创建任务时,`dept_id` 优先使用前端选择的归属机构ID 2. 如果前端未提供,使用创建人所在部门ID 3. 任务创建后,`dept_id` 不可修改(保证数据一致性) ## 测试要点 ### 功能测试 1. ✅ 用户选择归属机构后,dept_id正确保存 2. ✅ 默认选中用户所在分公司,dept_id正确设置 3. ✅ 切换归属机构,dept_id随之更新 4. ✅ 提交任务后,数据库dept_id字段正确存储 ### 兼容性测试 1. ✅ 不传入deptId时,使用用户部门ID 2. ✅ 旧版本前端调用仍然正常 3. ✅ 其他任务类型(福祉车、普通任务)不受影响 ### 权限测试 1. ✅ 用户只能看到自己部门的任务 2. ✅ 跨部门任务创建和查询正常 3. ✅ 管理员权限正常 ## 相关配置 ### 分公司数据加载 前端通过以下接口加载分公司列表: ```javascript // API: /system/dept/list?parentId=100 listBranchCompany() ``` **返回数据结构**: ```json { "code": 200, "data": [ { "deptId": 101, "deptName": "广州分公司", "parentId": 100, "ancestors": "0,100" }, { "deptId": 102, "deptName": "深圳分公司", "parentId": 100, "ancestors": "0,100" } ] } ``` ## 注意事项 1. **部门ID与用户部门ID的区别**: - `dept_id`:任务所属的部门(通常是分公司) - `creator_id`:任务创建人(个人) - 两者可以不同(例如:总部人员为分公司创建任务) 2. **数据一致性**: - 选择归属机构后,同时提取地域关键词用于医院过滤 - 确保归属机构、地域、医院数据的一致性 3. **默认值处理**: - 优先使用前端传入的值 - 回退使用当前用户的部门ID - 避免数据为空导致的异常 4. **旧系统同步**: - dept_id 用于生成旧系统同步参数 - ServiceOrdClass 参数使用 dept.department_id - ServiceOrdAreaType 参数使用 dept.serviceOrderClass ## 总结 本次修改实现了急救转运任务创建时归属机构字段的完整传递链路: 1. ✅ **前端**:用户选择归属机构,保存部门ID 2. ✅ **VO 类**:添加 deptId 字段接收前端数据 3. ✅ **服务层**:优先使用前端传入的 deptId 4. ✅ **数据库**:正确保存到 sys_task.dept_id 字段 确保了数据的完整性和业务逻辑的正确性,同时保持了向后兼容性。