Files
his/healthlink-his-ui/src/views/clinicmanagement/requisition/index.vue
华佗 69518074f2 feat: 全量菜单功能补全 (Phase 1-6)
Phase 1 门诊核心闭环:
- 门诊退药/退号/退费/申请单/结果查看/收费详情/医嘱查看

Phase 2 基础数据:
- 服务目录/货位管理/目录对照

Phase 3 住院核心:
- 医嘱管理/入院诊断/手术管理/病案管理/费用清单

Phase 4 Flowable工作流:
- 流程定义/表单/待办/已办/表达式/监听

Phase 5 统计报表:
- 日结结算单/排班管理/挂号收费记录

Phase 6 外接系统:
- 医保结算/医保目录/医保对账

结果: 空壳视图 26→0, 缺失组件 18→0
2026-06-05 16:34:38 +08:00

260 lines
8.9 KiB
Vue
Executable File

<template>
<div class="app-container">
<!-- 搜索栏 -->
<el-form
v-show="showSearch"
ref="queryRef"
:model="queryParams"
:inline="true"
label-width="90px"
>
<el-form-item label="关键字">
<el-input
v-model="queryParams.searchKey"
placeholder="申请单号/患者姓名"
clearable
style="width: 200px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="申请类型">
<el-select
v-model="queryParams.formType"
placeholder="请选择"
clearable
style="width: 150px"
>
<el-option label="检验申请" value="LAB" />
<el-option label="检查申请" value="EXAM" />
<el-option label="手术申请" value="SURGERY" />
<el-option label="输血申请" value="BLOOD" />
</el-select>
</el-form-item>
<el-form-item label="申请时间">
<el-date-picker
v-model="dateRange"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 260px"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item label="状态">
<el-select
v-model="queryParams.status"
placeholder="请选择"
clearable
style="width: 120px"
>
<el-option label="待提交" value="0" />
<el-option label="已提交" value="1" />
<el-option label="已执行" value="2" />
<el-option label="已撤回" value="3" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
<el-button icon="Refresh" @click="handleReset">重置</el-button>
</el-form-item>
</el-form>
<!-- 表格 -->
<vxe-table
ref="tableRef"
v-loading="loading"
:data="tableData"
border
max-height="calc(100vh - 280px)"
>
<vxe-column field="formNo" title="申请单号" align="center" width="180" show-overflow />
<vxe-column field="patientName" title="患者姓名" align="center" width="110" />
<vxe-column field="genderEnum_enumText" title="性别" align="center" width="70" />
<vxe-column field="age" title="年龄" align="center" width="60" />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow />
<vxe-column field="formType_dictText" title="申请类型" align="center" width="110" />
<vxe-column field="itemNames" title="申请项目" align="left" min-width="200" show-overflow />
<vxe-column field="applyDoctorName" title="申请医生" align="center" width="110" />
<vxe-column field="deptName" title="申请科室" align="center" width="140" show-overflow />
<vxe-column field="status_dictText" title="状态" align="center" width="90" />
<vxe-column title="申请时间" align="center" width="160">
<template #default="scope">
{{ scope.row.createTime ? formatDateStr(scope.row.createTime, 'YYYY-MM-DD HH:mm') : '-' }}
</template>
</vxe-column>
<vxe-column title="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-button link type="primary" icon="View" @click="handleDetail(scope.row)">查看</el-button>
<el-button
v-if="scope.row.status === '0' || scope.row.status === '1'"
link
type="warning"
icon="RefreshLeft"
@click="handleWithdraw(scope.row)"
>
撤回
</el-button>
<el-button
v-if="scope.row.status === '0'"
link
type="danger"
icon="Delete"
@click="handleDelete(scope.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"
/>
<!-- 详情弹窗 -->
<el-dialog
v-model="detailVisible"
title="申请单详情"
width="800px"
destroy-on-close
>
<div v-if="detailData" class="detail-content">
<el-descriptions :column="2" border>
<el-descriptions-item label="申请单号">{{ detailData.formNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="申请类型">{{ detailData.formType_dictText || '-' }}</el-descriptions-item>
<el-descriptions-item label="患者姓名">{{ detailData.patientName || '-' }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ detailData.genderEnum_enumText || '-' }}</el-descriptions-item>
<el-descriptions-item label="年龄">{{ detailData.age || '-' }}</el-descriptions-item>
<el-descriptions-item label="门诊号">{{ detailData.encounterNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="申请医生">{{ detailData.applyDoctorName || '-' }}</el-descriptions-item>
<el-descriptions-item label="申请科室">{{ detailData.deptName || '-' }}</el-descriptions-item>
<el-descriptions-item label="状态">{{ detailData.status_dictText || '-' }}</el-descriptions-item>
<el-descriptions-item label="申请时间">
{{ detailData.createTime ? formatDateStr(detailData.createTime, 'YYYY-MM-DD HH:mm:ss') : '-' }}
</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">{{ detailData.remark || '-' }}</el-descriptions-item>
</el-descriptions>
<div class="item-list" v-if="detailData.items && detailData.items.length">
<div class="item-title">申请项目明细</div>
<vxe-table :data="detailData.items" border size="small">
<vxe-column type="index" title="序号" align="center" width="60" />
<vxe-column field="itemName" title="项目名称" align="left" show-overflow />
<vxe-column field="itemCode" title="项目编码" align="center" width="140" />
<vxe-column field="specification" title="规格" align="center" width="120" />
<vxe-column field="quantity" title="数量" align="center" width="80" />
<vxe-column field="purpose" title="目的/说明" align="left" show-overflow />
</vxe-table>
</div>
</div>
<template #footer>
<el-button @click="detailVisible = false">关闭</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, getCurrentInstance } from 'vue'
import { getList, getDetail, withdraw, deleteForm } from './components/api.js'
import { formatDateStr } from '@/utils/index'
const { proxy } = getCurrentInstance()
const showSearch = ref(true)
const loading = ref(false)
const tableData = ref([])
const total = ref(0)
const dateRange = ref([])
const detailVisible = ref(false)
const detailData = ref(null)
const queryParams = ref({
pageNo: 1,
pageSize: 10,
searchKey: undefined,
formType: undefined,
status: undefined,
})
function getListData() {
const params = { ...queryParams.value }
if (dateRange.value && dateRange.value.length === 2) {
params.startTime = dateRange.value[0] + ' 00:00:00'
params.endTime = dateRange.value[1] + ' 23:59:59'
}
loading.value = true
getList(params).then((res) => {
tableData.value = res.data.records || []
total.value = res.data.total || 0
}).finally(() => {
loading.value = false
})
}
function handleQuery() {
queryParams.value.pageNo = 1
getListData()
}
function handleReset() {
queryParams.value = { pageNo: 1, pageSize: 10, searchKey: undefined, formType: undefined, status: undefined }
dateRange.value = []
getListData()
}
function handleDetail(row) {
getDetail(row.id).then((res) => {
detailData.value = res.data || null
detailVisible.value = true
})
}
function handleWithdraw(row) {
proxy.$modal.confirm('确认撤回该申请单?').then(() => {
withdraw(row.id).then((res) => {
if (res.code === 200) {
proxy.$modal.msgSuccess('撤回成功')
getListData()
} else {
proxy.$modal.msgError(res.msg || '撤回失败')
}
})
}).catch(() => {})
}
function handleDelete(row) {
proxy.$modal.confirm('确认删除该申请单?删除后不可恢复。').then(() => {
deleteForm(row.id).then((res) => {
if (res.code === 200) {
proxy.$modal.msgSuccess('删除成功')
getListData()
} else {
proxy.$modal.msgError(res.msg || '删除失败')
}
})
}).catch(() => {})
}
getListData()
</script>
<style lang="scss" scoped>
.detail-content {
.item-list {
margin-top: 16px;
}
.item-title {
font-size: 14px;
font-weight: bold;
margin-bottom: 10px;
padding-left: 4px;
border-left: 3px solid #409eff;
}
}
</style>