Files
his/openhis-ui-vue3/src/views/clinicmanagement/techExecute/index.vue
chenqi 14cb913943 refactor(table): 更新表格组件的单元格合并配置和事件处理
- 将所有表格的单元格合并方法从数组格式 [rowspan, colspan] 改为对象格式 { rowspan, colspan }
- 为 vxe-table 组件添加 checkbox-config 配置以支持复选框保留选择功能
- 移除复选框的 :reserve-selection 属性并改用 checkbox-config 配置
- 全局注册 VxeTableCompat 组件来归一化 cell-click 和 current-change 事件参数
- 更新技术执行和技术审批页面的表格组件配置和操作逻辑
- 优化
2026-06-05 11:44:31 +08:00

190 lines
6.1 KiB
Vue
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="app-container">
<!-- 搜索栏 -->
<el-form
v-show="showSearch"
ref="queryFormRef"
:model="queryParams"
size="small"
:inline="true"
label-width="80px"
>
<el-form-item title="申请类型" field="applyType">
<el-select v-model="queryParams.applyType" placeholder="全部" clearable>
<el-option title="全部" value="" />
<el-option title="检查" value="exam" />
<el-option title="检验" value="lab" />
</el-select>
</el-form-item>
<el-form-item title="申请单号" field="applyNo">
<el-input v-model="queryParams.applyNo" placeholder="请输入申请单号" clearable />
</el-form-item>
<el-form-item title="患者姓名" field="patientName">
<el-input v-model="queryParams.patientName" placeholder="请输入患者姓名" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作栏 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-check" size="small" :disabled="single" @click="handleExecute">
执行确认
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row>
<!-- 数据表格 -->
<vxe-table v-loading="loading" :data="orderList" @checkbox-change="handleSelectionChange" border stripe>
<vxe-column type="checkbox" width="55" align="center" />
<vxe-column title="申请单号" field="applyNo" width="180" :show-overflow="true" />
<vxe-column title="申请类型" field="applyTypeName" width="80" align="center">
<template #default="{ row }">
<el-tag :type="row.applyType === 'exam' ? 'primary' : 'success'" size="small">
{{ row.applyTypeName }}
</el-tag>
</template>
</vxe-column>
<vxe-column title="患者ID" field="patientId" width="120" :show-overflow="true" />
<vxe-column title="患者姓名" field="patientName" width="100" :show-overflow="true" />
<vxe-column title="就诊号" field="visitNo" width="140" :show-overflow="true" />
<vxe-column title="开单科室" field="applyDeptCode" width="120" :show-overflow="true" />
<vxe-column title="申请医生" field="applyDocName" width="100" :show-overflow="true" />
<vxe-column title="申请时间" field="applyTime" width="170" align="center" />
<vxe-column title="诊断/描述" field="clinicDesc" min-width="180" :show-overflow="true" />
<vxe-column title="加急" width="70" align="center">
<template #default="{ row }">
<el-tag v-if="row.isUrgent === 1" type="danger" size="small">加急</el-tag>
<span v-else>普通</span>
</template>
</vxe-column>
<vxe-column title="状态" width="100" align="center">
<template #default="{ row }">
<el-tag :type="statusTagType(row.applyStatus)" size="small">
{{ statusText(row) }}
</el-tag>
</template>
</vxe-column>
<vxe-column title="操作" width="120" align="center" fixed="right">
<template #default="{ row }">
<el-button type="primary" link size="small" @click="handleExecuteSingle(row)">
执行确认
</el-button>
</template>
</vxe-column>
</vxe-table>
<pagination
v-show="total > 0"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { listExecuteOrders, executeExamOrder, executeLabOrder } from '@/api/techStation'
const loading = ref(false)
const showSearch = ref(true)
const orderList = ref([])
const total = ref(0)
const ids = ref([])
const single = ref(true)
const multiple = ref(true)
const queryFormRef = ref(null)
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
applyType: '',
patientName: '',
applyNo: ''
})
// 状态文本映射
function statusText(row) {
if (row.applyType === 'exam') {
const map = { 0: '已开单', 1: '已收费', 2: '已预约', 3: '已签到', 4: '部分报告', 5: '已完成', 6: '已作废' }
return map[row.applyStatus] || '未知'
}
const map = { 1: '待发送', 2: '已收费', 3: '已执行' }
return map[row.applyStatus] || '未知'
}
function statusTagType(status) {
if (status === 1) return 'warning'
if (status === 2 || status === 3) return 'primary'
if (status === 5) return 'success'
if (status === 6) return 'info'
return ''
}
async function getList() {
loading.value = true
try {
const res = await listExecuteOrders(queryParams)
orderList.value = res.rows || []
total.value = res.total || 0
} finally {
loading.value = false
}
}
function handleQuery() {
queryParams.pageNo = 1
getList()
}
function resetQuery() {
queryFormRef.value?.resetFields()
queryParams.pageNo = 1
queryParams.applyType = ''
queryParams.patientName = ''
queryParams.applyNo = ''
getList()
}
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.applyNo)
single.value = selection.length !== 1
multiple.value = !selection.length
}
async function handleExecute() {
const row = orderList.value.find(item => item.applyNo === ids.value[0])
if (!row) return
await doExecute(row)
}
async function handleExecuteSingle(row) {
await doExecute(row)
}
async function doExecute(row) {
await ElMessageBox.confirm(`确认执行申请单 ${row.applyNo}`, '执行确认', { type: 'warning' })
try {
if (row.applyType === 'exam') {
await executeExamOrder(row.applyNo)
} else {
await executeLabOrder(row.applyNo)
}
ElMessage.success('执行成功')
getList()
} catch (e) {
ElMessage.error(e.message || '执行失败')
}
}
onMounted(() => {
getList()
})
</script>