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

急救转运任务单据类型和任务类型功能说明

功能概述

为急救转运任务添加了两个字段:
1. 单据类型:数据源来自SQL Server数据库的dictionary表,查询条件为vtitle='ServiceOrdAreaType' AND vType=1
2. 任务类型:数据源来自SQL Server数据库的dictionary表,查询条件为vtitle='ServiceOrderType' AND vType>=1

技术实现

1. 数据库层

1.1 SQL Server查询

单据类型:
sql SELECT vID, vtext FROM dictionary WHERE vtitle='ServiceOrdAreaType' AND vType=1 ORDER BY vOrder

任务类型:
sql SELECT vID, vtext FROM dictionary WHERE vtitle='ServiceOrderType' AND vType>=1 ORDER BY vOrder

1.2 MySQL表结构修改

文件:sql/add_document_type_to_emergency.sql
```sql
ALTER TABLE sys_task_emergency
ADD COLUMN document_type_id VARCHAR(50) COMMENT '单据类型ID(对应SQL Server的dictionary表vID,vtitle=ServiceOrdAreaType)';

ALTER TABLE sys_task_emergency
ADD COLUMN task_type_id VARCHAR(50) COMMENT '任务类型ID(对应SQL Server的dictionary表vID,vtitle=ServiceOrderType)';

CREATE INDEX idx_document_type_id ON sys_task_emergency(document_type_id);
CREATE INDEX idx_task_type_id ON sys_task_emergency(task_type_id);
```

2. 后端实现

2.1 实体类扩展

文件: SysTaskEmergency.java
- 新增字段:private String documentTypeId;(单据类型)
- 新增字段:private String taskTypeId;(任务类型)
- 新增getter/setter方法

文件: TaskCreateVO.java
- 新增字段:private String documentTypeId;(单据类型)
- 新增字段:private String taskTypeId;(任务类型)
- 新增getter/setter方法

文件: OrderClassDTO.java
- 新增字段:private String vID; (用于存储单据类型ID)
- 新增getter/setter方法

2.2 Mapper层

文件: OrderClassMapper.java
- 新增方法:List<OrderClassDTO> selectServiceOrdAreaTypes();

文件: OrderClassMapper.xml
xml <select id="selectServiceOrdAreaTypes" resultMap="OrderClassResult"> SELECT vID, vtext FROM dictionary WHERE vtitle = 'ServiceOrdAreaType' AND vType = 1 ORDER BY vOrder </select>

文件: SysTaskEmergencyMapper.xml
- 在resultMap中添加:<result property="documentTypeId" column="document_type_id" />
- 在insert、update、select语句中添加document_type_id字段

2.3 Service层

文件: IOrderClassDataService.java
- 新增方法:List<OrderClassDTO> getServiceOrdAreaTypes();(查询单据类型)
- 新增方法:List<OrderClassDTO> getServiceOrderTypes();(查询任务类型)

文件: OrderClassDataServiceImpl.java
```java
// 查询单据类型
@Override
public List getServiceOrdAreaTypes() {
log.info("开始从 SQL Server 查询单据类型数据...");
List list = orderClassMapper.selectServiceOrdAreaTypes();
log.info("成功查询到 {} 条单据类型数据", list != null ? list.size() : 0);
return list;
}

// 查询任务类型
@Override
public List getServiceOrderTypes() {
log.info("开始从 SQL Server 查询服务订单类型数据...");
List list = orderClassMapper.selectServiceOrderTypes();
log.info("成功查询到 {} 条服务订单类型数据", list != null ? list.size() : 0);
return list;
}
```

文件: SysTaskServiceImpl.java
- 修改saveEmergencyInfo方法,添加单据类型ID和任务类型ID的保存:
java emergencyInfo.setDocumentTypeId(createVO.getDocumentTypeId()); emergencyInfo.setTaskTypeId(createVO.getTaskTypeId());

2.4 Controller层

新增文件: SqlServerDictionaryController.java
```java
// 查询单据类型
@GetMapping("/serviceOrdAreaTypes")
public AjaxResult getServiceOrdAreaTypes() {
List list = orderClassDataService.getServiceOrdAreaTypes();
return AjaxResult.success("查询成功", list);
}

// 查询任务类型
@GetMapping("/serviceOrderTypes")
public AjaxResult getServiceOrderTypes() {
List list = orderClassDataService.getServiceOrderTypes();
return AjaxResult.success("查询成功", list);
}
```

3. 前端实现

3.1 API接口

新增文件: app/api/dictionary.js
```javascript
// 查询单据类型
export function getServiceOrdAreaTypes() {
return request({
url: '/sqlserver/dictionary/serviceOrdAreaTypes',
method: 'get'
})
}

// 查询任务类型
export function getServiceOrderTypes() {
return request({
url: '/sqlserver/dictionary/serviceOrderTypes',
method: 'get'
})
}
```

3.2 页面组件

文件: app/pages/task/create-emergency.vue

数据模型:
```javascript
data() {
return {
selectedEmergencyTaskType: '', // 选中的任务类型文本
selectedEmergencyTaskTypeId: null, // 选中的任务类型ID
emergencyTaskTypes: [], // 任务类型列表
emergencyTaskTypeOptions: [], // 任务类型选项(用于picker显示)

selectedDocumentType: '',           // 选中的单据类型文本
selectedDocumentTypeId: null,       // 选中的单据类型ID
documentTypes: [],                  // 单据类型列表
documentTypeOptions: [],            // 单据类型选项(用于picker显示)

}
}
```

加载方法:
```javascript
import { getServiceOrdAreaTypes, getServiceOrderTypes } from "@/api/dictionary"

// 加载任务类型
loadEmergencyTaskTypes() {
getServiceOrderTypes().then(response => {
const list = response.data || []
this.emergencyTaskTypes = list
this.emergencyTaskTypeOptions = list.map(item => ({
id: item.vID,
text: item.vtext
}))
}).catch(error => {
console.error('加载任务类型失败:', error)
this.emergencyTaskTypes = []
this.emergencyTaskTypeOptions = []
})
}

// 加载单据类型
loadDocumentTypes() {
getServiceOrdAreaTypes().then(response => {
const list = response.data || []
this.documentTypes = list
this.documentTypeOptions = list.map(item => ({
id: item.vID,
text: item.vtext
}))
}).catch(error => {
console.error('加载单据类型失败:', error)
this.documentTypes = []
this.documentTypeOptions = []
})
}
```

UI组件:
```vue


任务类型
<picker mode="selector" :range="emergencyTaskTypeOptions" range-key="text" @change="onEmergencyTaskTypeChange">

{{ selectedEmergencyTaskType || '请选择任务类型' }}




单据类型
<picker mode="selector" :range="documentTypeOptions" range-key="text" @change="onDocumentTypeChange">

{{ selectedDocumentType || '请选择单据类型' }}




```

选择处理:
```javascript
// 任务类型选择
onEmergencyTaskTypeChange(e) {
const index = e.detail.value
const selected = this.emergencyTaskTypeOptions[index]
this.selectedEmergencyTaskType = selected.text
this.selectedEmergencyTaskTypeId = selected.id
}

// 单据类型选择
onDocumentTypeChange(e) {
const index = e.detail.value
const selected = this.documentTypeOptions[index]
this.selectedDocumentType = selected.text
this.selectedDocumentTypeId = selected.id
}
```

提交数据:
javascript buildSubmitData() { const submitData = { taskType: 'EMERGENCY_TRANSFER', vehicleIds: this.selectedVehicleId ? [this.selectedVehicleId] : [], assigneeIds: this.selectedStaff.map(staff => staff.userId), transferTime: this.taskForm.transferTime, documentTypeId: this.selectedDocumentTypeId, // 添加单据类型ID taskTypeId: this.selectedEmergencyTaskTypeId, // 添加任务类型ID patient: { ... }, hospitalOut: { ... }, hospitalIn: { ... }, transferDistance: ..., price: ... } return submitData }

数据流向

前端选择任务类型/单据类型
  ↓
发送 taskTypeId/documentTypeId 到后端
  ↓
TaskCreateVO 接收参数
  ↓
SysTaskServiceImpl.saveEmergencyInfo() 处理
  ↓
SysTaskEmergency 实体保存
  ↓
SysTaskEmergencyMapper 插入数据库
  ↓
sys_task_emergency.task_type_id/document_type_id 字段存储

使用说明

1. 执行数据库迁移

mysql -u root -p your_database < sql/add_document_type_to_emergency.sql

2. 重启后端服务

确保新增的Service和Controller被加载

3. 测试接口

# 测试查询单据类型接口
GET /sqlserver/dictionary/serviceOrdAreaTypes

4. 前端测试

  1. 打开急救转运任务创建页面
  2. 验证单据类型下拉框正常加载数据
  3. 选择单据类型后创建任务
  4. 检查数据库中document_type_id字段是否正确保存

注意事项

  1. 数据库字段类型:document_type_id和task_type_id使用VARCHAR(50),与SQL Server的vID字段保持兼容
  2. 索引优化:为document_type_id和task_type_id添加了索引,提高查询性能
  3. 多数据源切换:查询单据类型和任务类型时使用@DataSource(DataSourceType.SQLSERVER)注解切换到SQL Server数据源
  4. 前端数据结构:使用{id, text}格式的数组便于uni-app的picker组件使用
  5. 字段非必填:任务类型和单据类型字段为可选字段,不会影响已有任务的创建和查询
  6. SQL查询区别
  • ServiceOrdAreaType: vType = 1(精确匹配)
  • ServiceOrderType: vType >= 1(范围匹配)

相关文件清单

后端文件

  • ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskEmergency.java
  • ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TaskCreateVO.java
  • ruoyi-system/src/main/java/com/ruoyi/system/domain/OrderClassDTO.java
  • ruoyi-system/src/main/java/com/ruoyi/system/mapper/OrderClassMapper.java
  • ruoyi-system/src/main/java/com/ruoyi/system/service/IOrderClassDataService.java
  • ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OrderClassDataServiceImpl.java
  • ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
  • ruoyi-system/src/main/resources/mapper/system/OrderClassMapper.xml
  • ruoyi-system/src/main/resources/mapper/system/SysTaskEmergencyMapper.xml
  • ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqlserver/SqlServerDictionaryController.java

前端文件

  • app/api/dictionary.js
  • app/pages/task/create-emergency.vue

SQL文件

  • sql/add_document_type_to_emergency.sql

版本信息

  • 创建时间:2025-10-19
  • 作者:System
  • 版本:v1.0