编辑 | blame | 历史 | 原始文档

急救转运任务归属机构字段传递功能说明

功能概述

在创建急救转运任务时,将前端选择的归属机构(分公司)的部门ID传递到后端,并保存到 sys_task 表的 dept_id 字段中。

修改内容

1. 后端 VO 类扩展

文件ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TaskCreateVO.java

添加字段

/** 执行人员ID列表 */
private List<Long> assigneeIds;

/** 归属部门ID */
private Long deptId;

添加 Getter 和 Setter

public List<Long> getAssigneeIds() {
    return assigneeIds;
}

public void setAssigneeIds(List<Long> 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 方法

// 修改前
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

数据字段定义

data() {
  return {
    selectedOrganization: '',
    selectedOrganizationId: null, // 归属机构ID(部门ID)
    selectedRegion: '', // 从归属机构中提取的地域信息
    // ...
  }
}

归属机构选择处理

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()
}

默认分公司加载

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()
      }
    }
  })
}

提交数据构建

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
}

数据流程图

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 表

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:任务创建人(个人)
  • 两者可以不同(例如:总部人员为分公司创建任务)
  1. 数据一致性
  • 选择归属机构后,同时提取地域关键词用于医院过滤
  • 确保归属机构、地域、医院数据的一致性
  1. 默认值处理
  • 优先使用前端传入的值
  • 回退使用当前用户的部门ID
  • 避免数据为空导致的异常
  1. 旧系统同步
  • dept_id 用于生成旧系统同步参数
  • ServiceOrdClass 参数使用 dept.department_id
  • ServiceOrdAreaType 参数使用 dept.serviceOrderClass

总结

本次修改实现了急救转运任务创建时归属机构字段的完整传递链路:

  1. 前端:用户选择归属机构,保存部门ID
  2. VO 类:添加 deptId 字段接收前端数据
  3. 服务层:优先使用前端传入的 deptId
  4. 数据库:正确保存到 sys_task.dept_id 字段

确保了数据的完整性和业务逻辑的正确性,同时保持了向后兼容性。