Phase 1 门诊核心闭环: - 门诊退药/退号/退费/申请单/结果查看/收费详情/医嘱查看 Phase 2 基础数据: - 服务目录/货位管理/目录对照 Phase 3 住院核心: - 医嘱管理/入院诊断/手术管理/病案管理/费用清单 Phase 4 Flowable工作流: - 流程定义/表单/待办/已办/表达式/监听 Phase 5 统计报表: - 日结结算单/排班管理/挂号收费记录 Phase 6 外接系统: - 医保结算/医保目录/医保对账 结果: 空壳视图 26→0, 缺失组件 18→0
260 lines
8.9 KiB
Vue
Executable File
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>
|