| | |
| | | @close="detailOpen = false" |
| | | /> |
| | | </el-dialog> |
| | | |
| | | <!-- 案例选择对话框 --> |
| | | <el-dialog |
| | | title="选择转运案例" |
| | | :visible.sync="selectCaseOpen" |
| | | width="900px" |
| | | append-to-body |
| | | :close-on-click-modal="false" |
| | | > |
| | | <div class="case-select-container"> |
| | | <el-card class="search-card"> |
| | | <el-form :model="caseQueryParams" inline> |
| | | <el-form-item label="案例编号"> |
| | | <el-input |
| | | v-model="caseQueryParams.caseNo" |
| | | placeholder="请输入案例编号" |
| | | clearable |
| | | style="width: 180px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="患者姓名"> |
| | | <el-input |
| | | v-model="caseQueryParams.patName" |
| | | placeholder="请输入患者姓名" |
| | | clearable |
| | | style="width: 150px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="el-icon-search" @click="searchCaseList" |
| | | >搜索</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" @click="resetCaseSearch" |
| | | >重置</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <el-card> |
| | | <el-table |
| | | v-loading="caseLoading" |
| | | :data="availableCaseList" |
| | | @row-click="handleCaseSelect" |
| | | highlight-current-row |
| | | style="width: 100%" |
| | | > |
| | | <el-table-column label="案例编号" prop="caseNo" width="150" align="center" /> |
| | | <el-table-column label="患者姓名" prop="name" width="120" align="center" /> |
| | | <el-table-column label="性别" width="80" align="center"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_user_sex" |
| | | :value="scope.row.sex" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="年龄" prop="age" width="80" align="center" /> |
| | | <el-table-column label="血型" width="80" align="center"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_BloodType" |
| | | :value="scope.row.bloodType" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="疾病诊断" prop="diagnosisname" min-width="200" show-overflow-tooltip /> |
| | | <el-table-column label="治疗医院" prop="treatmenthospitalname" width="150" /> |
| | | <el-table-column label="是否已转运" width="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type="hasTransport(scope.row) ? 'danger' : 'success'" |
| | | size="small" |
| | | > |
| | | {{ hasTransport(scope.row) ? '已转运' : '可转运' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="80" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click="selectCase(scope.row)" |
| | | :disabled="hasTransport(scope.row)" |
| | | > |
| | | 选择 |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- 分页 --> |
| | | <pagination |
| | | v-show="caseTotal > 0" |
| | | :total="caseTotal" |
| | | :page.sync="caseQueryParams.pageNum" |
| | | :limit.sync="caseQueryParams.pageSize" |
| | | @pagination="searchCaseList" |
| | | /> |
| | | </el-card> |
| | | </div> |
| | | |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="selectCaseOpen = false">取消</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- 新增:修改弹框 --> |
| | | <transport-edit |
| | | :edit-open="editOpen" |
| | | :transport-data="currentTransport" |
| | | :is-edit="isEditing" |
| | | :selected-case="selectedCase" |
| | | @update:edit-open="editOpen = $event" |
| | | @close="handleEditClose" |
| | | @save-success="handleSaveSuccess" |
| | |
| | | transportAdd, |
| | | transportEdit, |
| | | transportDelete, |
| | | transportInfo |
| | | transportInfo, |
| | | donateList |
| | | } from "@/api/businessApi/index"; |
| | | import TransportDetail from "./transportDetail"; |
| | | import TransportEdit from "./TransportEdit"; |
| | |
| | | dicts: ["sys_user_sex", "sys_BloodType"], |
| | | data() { |
| | | return { |
| | | |
| | | // 遮罩层 |
| | | loading: false, |
| | | // 选中数组 |
| | |
| | | showSearch: true, |
| | | // 总条数 |
| | | total: 0, |
| | | // 转运单表格数据 - 直接使用后端返回的数据结构 |
| | | // 转运单表格数据 |
| | | transportList: [], |
| | | // 详情弹框是否显示 |
| | | detailOpen: false, |
| | | // 案例选择弹框是否显示 |
| | | selectCaseOpen: false, |
| | | // 操作确认弹框是否显示 |
| | | actionOpen: false, |
| | | // 新增:修改弹框相关数据 |
| | |
| | | pendingTransports: 0, |
| | | completedTransports: 0 |
| | | }, |
| | | // 查询参数(完全适配后端接口) |
| | | // 查询参数 |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | caseNo: undefined, // 案例编号 |
| | | patName: undefined, // 患者姓名 |
| | | transitStatus: undefined, // 转运状态:1待转运 2转运中 3转运完成 4转运取消 5暂存 |
| | | searchValue: undefined, // 搜索值 |
| | | params: {} // 其他参数对象 |
| | | caseNo: undefined, |
| | | patName: undefined, |
| | | transitStatus: undefined, |
| | | searchValue: undefined, |
| | | params: {} |
| | | }, |
| | | // 案例选择相关 |
| | | caseLoading: false, |
| | | availableCaseList: [], |
| | | caseTotal: 0, |
| | | selectedCase: null, |
| | | caseQueryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | caseNo: undefined, |
| | | patName: undefined, |
| | | // 只查询已同意且需要转运的案例 |
| | | // reportStatus: "3", // 已同意 |
| | | isTransport: "2" // 需要转运 |
| | | } |
| | | }; |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | this.checkAutoCreate(); |
| | | }, |
| | | methods: { |
| | | /** 查询转运单列表 - 直接使用后端数据结构 */ |
| | | /** 查询转运单列表 */ |
| | | async getList() { |
| | | this.loading = true; |
| | | |
| | | try { |
| | | // 构建符合后端接口的请求参数 [1,2](@ref) |
| | | const requestParams = { |
| | | pageNum: this.queryParams.pageNum, |
| | | pageSize: this.queryParams.pageSize, |
| | |
| | | searchValue: this.queryParams.searchValue |
| | | }; |
| | | |
| | | // 处理时间范围参数 [5](@ref) |
| | | if (this.dateRange && this.dateRange.length === 2) { |
| | | requestParams.transportStartTime = this.dateRange.join(","); |
| | | } |
| | | |
| | | // 调用正式接口 [3](@ref) |
| | | const response = await transportList(requestParams); |
| | | |
| | | if (response.code === 200) { |
| | | // 直接使用后端返回的数据结构,不进行转换 [8](@ref) |
| | | this.transportList = response.rows || response.data || []; |
| | | this.total = response.total || 0; |
| | | |
| | | // 更新统计数据 |
| | | this.updateStats(); |
| | | } else { |
| | | this.$modal.msgError(response.msg || "获取转运单列表失败"); |
| | |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | checkAutoCreate() { |
| | | const query = this.$route.query; |
| | | if (query.autoCreate === 'true') { |
| | | // 自动打开案例选择弹框 |
| | | this.selectCaseOpen = true; |
| | | this.resetCaseSearch(); |
| | | |
| | | // 如果有特定的案例编号,可以预先搜索 |
| | | if (query.caseNo) { |
| | | this.caseQueryParams.caseNo = query.caseNo; |
| | | this.searchCaseList(); |
| | | } |
| | | } |
| | | }, |
| | | /** 搜索可用案例 */ |
| | | async searchCaseList() { |
| | | this.caseLoading = true; |
| | | try { |
| | | const response = await donateList(this.caseQueryParams); |
| | | if (response.code === 200) { |
| | | this.availableCaseList = response.rows || response.data || []; |
| | | this.caseTotal = response.total || 0; |
| | | } else { |
| | | this.$modal.msgError(response.msg || "获取案例列表失败"); |
| | | } |
| | | } catch (error) { |
| | | console.error("获取案例列表失败:", error); |
| | | this.$modal.msgError("获取案例列表失败"); |
| | | } finally { |
| | | this.caseLoading = false; |
| | | } |
| | | }, |
| | | |
| | | /** 重置案例搜索 */ |
| | | resetCaseSearch() { |
| | | this.caseQueryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | caseNo: undefined, |
| | | patName: undefined, |
| | | // reportStatus: "3", |
| | | isTransport: "2" |
| | | }; |
| | | this.searchCaseList(); |
| | | }, |
| | | |
| | | /** 判断案例是否已有转运单 */ |
| | | hasTransport(caseData) { |
| | | // 检查案例是否有转运信息 |
| | | if (caseData.serviceTransport && |
| | | Array.isArray(caseData.serviceTransport) && |
| | | caseData.serviceTransport.length > 0) { |
| | | return true; |
| | | } |
| | | return false; |
| | | }, |
| | | |
| | | /** 选择案例 */ |
| | | selectCase(caseData) { |
| | | if (this.hasTransport(caseData)) { |
| | | this.$message.warning("该案例已有转运单,请选择其他案例"); |
| | | return; |
| | | } |
| | | |
| | | this.selectedCase = caseData; |
| | | this.selectCaseOpen = false; |
| | | |
| | | // 打开转运单编辑页面,并传入选中的案例 |
| | | this.currentTransport = this.convertCaseToTransport(caseData); |
| | | this.isEditing = false; |
| | | this.editOpen = true; |
| | | }, |
| | | |
| | | /** 将案例信息转换为转运单格式 */ |
| | | convertCaseToTransport(caseData) { |
| | | return { |
| | | caseNo: caseData.caseNo, |
| | | patName: caseData.name, |
| | | sex: caseData.sex, |
| | | age: caseData.age, |
| | | diagnosisname: caseData.diagnosisname, |
| | | treatmentHospitalName: caseData.treatmenthospitalname, |
| | | treatmentDeptName: caseData.treatmentdeptname, |
| | | // 其他字段可以根据需要从案例中获取 |
| | | transportStartPlace: caseData.treatmenthospitalname || '', |
| | | contactPerson: caseData.coordinatorName || '', |
| | | transitStatus: 1, // 默认待转运 |
| | | // 清空其他字段 |
| | | id: undefined, |
| | | reportId: undefined, |
| | | transportStartTime: undefined, |
| | | doctor: undefined, |
| | | doctorPhone: undefined, |
| | | nurse: undefined, |
| | | nursePhone: undefined, |
| | | driver: undefined, |
| | | driverPhone: undefined, |
| | | icuDoctor: undefined, |
| | | icuDoctorPhone: undefined, |
| | | annexfilesList: [], |
| | | remark: undefined |
| | | }; |
| | | }, |
| | | |
| | | /** 获取状态标签类型 */ |
| | |
| | | handleUpdate(row) { |
| | | this.currentTransport = row || {}; |
| | | this.isEditing = true; |
| | | this.selectedCase = null; // 编辑时不传入案例信息 |
| | | this.editOpen = true; |
| | | }, |
| | | |
| | | /** 新建转运单 */ |
| | | handleAdd() { |
| | | // 打开案例选择弹框 |
| | | this.selectCaseOpen = true; |
| | | this.selectedCase = null; |
| | | this.currentTransport = {}; |
| | | this.isEditing = false; |
| | | this.editOpen = true; |
| | | this.resetCaseSearch(); // 重置并搜索案例 |
| | | }, |
| | | |
| | | /** 修改弹框关闭处理 */ |
| | | handleEditClose() { |
| | | this.editOpen = false; |
| | | this.currentTransport = {}; |
| | | this.selectedCase = null; |
| | | }, |
| | | |
| | | /** 保存成功处理 */ |
| | |
| | | this.actionOpen = true; |
| | | }, |
| | | |
| | | /** 确认操作 - 使用后端原始数据结构 [4](@ref) */ |
| | | /** 确认操作 */ |
| | | async confirmAction() { |
| | | try { |
| | | let requestData = { |
| | |
| | | requestData.transitStatus = 3; // 设置为转运完成 |
| | | } |
| | | |
| | | // 直接传递后端需要的参数 [8](@ref) |
| | | const response = await transportEdit(requestData); |
| | | |
| | | if (response.code === 200) { |
| | | this.$modal.msgSuccess(`${this.actionText}转运成功`); |
| | | this.getList(); // 刷新列表 |
| | | this.getList(); |
| | | } else { |
| | | this.$modal.msgError(response.msg || `${this.actionText}转运失败`); |
| | | } |
| | |
| | | this.actionOpen = false; |
| | | }, |
| | | |
| | | /** 删除按钮操作 - 使用后端原始ID [1](@ref) */ |
| | | /** 删除按钮操作 */ |
| | | async handleDelete(row) { |
| | | const ids = row.reportId || row.id || this.ids; |
| | | |
| | |
| | | |
| | | if (response.code === 200) { |
| | | this.$modal.msgSuccess("删除成功"); |
| | | this.getList(); // 刷新列表 |
| | | this.getList(); |
| | | } else { |
| | | this.$modal.msgError(response.msg || "删除失败"); |
| | | } |
| | |
| | | |
| | | /** 导出按钮操作 */ |
| | | handleExport() { |
| | | // 直接使用后端参数结构进行导出 [5](@ref) |
| | | this.download( |
| | | "system/transport/export", |
| | | { |
| | |
| | | }, |
| | | `transport_${new Date().getTime()}.xlsx` |
| | | ); |
| | | }, |
| | | |
| | | // 点击行选择案例 |
| | | handleCaseSelect(row) { |
| | | this.selectCase(row); |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .case-select-container { |
| | | max-height: 600px; |
| | | overflow: auto; |
| | | } |
| | | |
| | | .search-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | .filter-card { |
| | | margin-bottom: 20px; |
| | | } |