# 急救转运任务单据类型和任务类型功能说明 ## 功能概述 为急救转运任务添加了两个字段: 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 selectServiceOrdAreaTypes();` **文件:** `OrderClassMapper.xml` ```xml ``` **文件:** `SysTaskEmergencyMapper.xml` - 在resultMap中添加:`` - 在insert、update、select语句中添加document_type_id字段 #### 2.3 Service层 **文件:** `IOrderClassDataService.java` - 新增方法:`List getServiceOrdAreaTypes();`(查询单据类型) - 新增方法:`List 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 任务类型 {{ selectedEmergencyTaskType || '请选择任务类型' }} 单据类型 {{ 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. 执行数据库迁移 ```bash mysql -u root -p your_database < sql/add_document_type_to_emergency.sql ``` ### 2. 重启后端服务 确保新增的Service和Controller被加载 ### 3. 测试接口 ```bash # 测试查询单据类型接口 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