2026-06-16 17:50:04 +08:00

581 lines
17 KiB
Vue

/**
* @file bloodTransfusionAssessment.vue
* @description: 输血评估
* @author: w
* @since: 2026-06-04
*/
<template>
<div class="app-container">
<div class="section">
<el-button type="primary" plain @click="openJsDialog">检索</el-button>
<el-button type="primary" plain @click="handleAdd">新增</el-button>
<el-button type="danger" plain :disabled="!evaluationInfo.billNo" @click="handleDel">删除</el-button>
<el-button type="success" plain @click="handleSubmit">保存</el-button>
<el-button type="primary" plain @click="goSxPath">输血申请</el-button>
<el-button type="warning" plain :disabled="!evaluationInfo.billNo"
@click="printPg('ASSESS_BEFORE')">打印输血前评估单</el-button>
<el-button type="warning" plain :disabled="!evaluationInfo.billNo"
@click="printPg('INFORMED_CONSENT')">打印输血知情同意书</el-button>
</div>
<el-form label-width="auto">
<div class="section">
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="评估单号">
<el-input v-model="evaluationInfo.billNo" disabled />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="评估日期">
<el-input v-model="evaluationInfo.assessmentDate" disabled />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="评估医师">
<el-input v-model="evaluationInfo.assess_person" disabled />
</el-form-item>
</el-col>
</el-row>
</div>
<!-- 基础信息 -->
<div class="section">
<div class="title">基础信息</div>
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="住院号/ID号">
<el-input v-model="baseInfo.beinhos_id" @keyup.enter="handleChange"
:disabled="evaluationInfo.billNo !== ''" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="姓 名">
<el-input v-model="baseInfo.patient_name" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="血 型">
<el-input v-model="baseInfo.abo" disabled :value="baseInfo.abo" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="床位号">
<el-input v-model="bloodInfo.patient_bed" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
<el-select v-model="baseInfo.patient_sex" placeholder="">
<el-option label="男" value="男" />
<el-option label="女" value="女" />
<el-option label="未知" value="未知" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="Rh(D)">
<el-input v-model="baseInfo.rh" disabled :value="baseInfo.rh" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="科 室">
<SelectTable v-model:data="bloodInfo.dept_id" :tableData="dictData.ks" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="年 龄">
<el-input v-model="baseInfo.age" style="width:60%" />
<div style="width: 40%">
<el-select v-model="baseInfo.nldw" placeholder="">
<el-option v-for="v in dictData.nldw" :label="v.label" :value="v.value" />
</el-select>
</div>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="病 区">
<SelectTable v-model:data="bloodInfo.zone_id" dict-type="bq" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="临床诊断">
<el-input v-model="bloodInfo.diagnoses" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="输血目的">
<SelectTable v-model:data="bloodInfo.intent" dict-type="sxmd" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="出血量">
<el-input v-model="bloodInfo.blood_loss" type="number" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="贫血程度">
<el-select v-model="bloodInfo.anemia" placeholder="">
<el-option v-for="v in dictData.anemia" :label="v.label" :value="v.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="血液品种">
<SelectTable v-model:data="bloodInfo.blood_breed" dict-type="xylx" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="血量">
<el-input v-model="bloodInfo.blood_num" type="number" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label=" ">
<el-checkbox v-model="bloodInfo.agreement_ink" class="text-danger" true-value="Y" false-value="N">
病人/病人家属是否签署输血同意书
</el-checkbox>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="病情概要" class="tips-label">
<span class="tips">
(病人基本情况、贫血程度、凝血障碍、有无创面弥漫性渗血、心肺代偿功能、有无代谢率增高、年龄因素、输血目的等。)
</span>
<el-input v-model="bloodInfo.bqgy" type="textarea" :rows="3" style="margin-top: 8px" />
</el-form-item>
</el-col>
</el-row>
</div>
<div class="section">
<div class="title">病人最近检查结果</div>
<el-row :gutter="20">
<el-col :span="18">
<el-row :gutter="50">
<el-col :span="6" v-for="item in lisProject" class="col-project">
<el-form-item :label="item.item_name">
<el-select v-model="item.item_result" placeholder="">
<el-option v-for="v in dictData.sxqjcxmmrz" :label="v.label" :value="v.value" />
</el-select>
<span class="unit">{{ item.item_unit }}</span>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</div>
</el-form>
<el-dialog title="输血申请检索" v-model="visible" width="800px" :close-on-click-modal="false" @closed="handleClose">
<div class="mb10">
<el-button type="primary" @click="handleSearch">检索</el-button>
<el-button type="success" @click="handleConfirm">确认</el-button>
</div>
<!-- 检索条件区 -->
<el-form :model="searchForm" label-width="auto" class="search-form">
<el-row :gutter="30">
<el-col :span="14">
<el-form-item label="评估日期">
<div class="date-range">
<el-date-picker v-model="searchForm.stime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
style="width: 47%" />
<span class="separator" style="width: 6%;display: inline-block;text-align: center;">-</span>
<el-date-picker v-model="searchForm.etime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
style="width: 47%" />
</div>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item label="患者姓名">
<el-input v-model="searchForm.patient_name" placeholder="" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="14">
<el-form-item label="评估单号">
<el-input v-model="searchForm.bill_no" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item label="住院号/ID号">
<el-input v-model="searchForm.beinhos_id" placeholder="" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 结果表格区 -->
<el-table :data="tableData" border style="width: 100%; margin-top: 10px" height="350" @row-click="handleRowClick"
highlight-current-row>
<el-table-column prop="bill_no" label="评估单号" align="center" width="180" />
<el-table-column prop="dept_id" label="科室" align="center">
<template #default="scope">
{{ formatDict(scope.row.dept_id, 'ks') }}
</template>
</el-table-column>
<el-table-column prop="beinhos_id" label="住院号" align="center" />
<el-table-column prop="patient_name" label="姓名" align="center" />
<el-table-column prop="assess_data" label="评估日期" width="180" align="center" />
<el-table-column prop="assess_person" label="评估人" align="center" />
</el-table>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import dayjs from 'dayjs'
import { printPat, queryPatInfo, queryPatList, savePat, queryPatOne, updatePat, delPat } from '@/api/doctor/assessment'
import { queryLisProject, getParameterOne } from '@/api/common'
import { getDictData, formatDict, dictData } from '@/hooks'
import router from '@/router'
import { ElMessage, ElMessageBox } from 'element-plus'
import { printBase64PDF } from '@/utils/classCom'
import useUserStore from '@/store/modules/user'
import { useSysParam } from '@/hooks/useSysParam'
const { getParam } = useSysParam()
const userInfo = useUserStore()
const visible = ref(false)
// 表单数据
const searchForm = ref({
stime: dayjs().format('YYYY-MM-DD'),
etime: dayjs().format('YYYY-MM-DD'),
patient_name: '',
bill_no: '',
beinhos_id: ''
})
const tableData = ref([])
const evaluationInfo = ref({
assessmentDate: dayjs().format('YYYY-MM-DD HH:mm:ss'),
billNo: '',
assess_person: userInfo.nickName,
})
// 基础信息数据
const baseInfo = ref({
beinhos_id: '',
nldw: '岁',
})
// 输血数据
const bloodInfo = ref({
agreement_ink: 'Y',
assess_person: userInfo.name,//申请人
})
// 检查结果
const lisProject = ref([])
// 检索
const openJsDialog = () => {
getList()
visible.value = true
}
const handleSearch = () => {
getList()
}
const handleConfirm = () => {
if (!seelctRow.value.bill_no) return ElMessage.warning('请选择评估单')
evaluationInfo.value.billNo = seelctRow.value.bill_no
getBillInfo()
visible.value = false
seelctRow.value = {}
}
const handleClose = () => {
visible.value = false
searchForm.value = {
stime: dayjs().format('YYYY-MM-DD'),
etime: dayjs().format('YYYY-MM-DD'),
patient_name: '',
bill_no: '',
beinhos_id: ''
}
seelctRow.value = {}
}
//获取评估单信息
const getBillInfo = () => {
queryPatOne({ billNo: evaluationInfo.value.billNo }).then((res) => {
if (res.code == 0) {
evaluationInfo.value.assessmentDate = res.data.xkTransfuseApplyBeforeList[0].assess_data
baseInfo.value = res.data.xkPatientInfo
bloodInfo.value = res.data.xkTransfuseApplyBeforeList[0]
lisProject.value = res.data.xkTransfuseApplyTestitemList.map(item => {
return {
bill_no: item.bill_no,
item_name: item.pro_name,
item_result: item.item_result,
item_unit: item.item_unit,
test_date: item.test_date,
sid: item.sid
}
})
splitAge(baseInfo.value.age)
}
})
}
// 回显时拆分 年龄 + 单位
const splitAge = (ageStr: string) => {
const unitList = dictData.value.nldw.map(item => item.value)
let age = ageStr
let unit = '岁'
for (const u of unitList) {
if (ageStr.includes(u)) {
age = ageStr.replace(u, '')
unit = u
break
}
}
baseInfo.value.age = age
baseInfo.value.nldw = unit
}
const seelctRow = ref({})
const handleRowClick = (row) => {
seelctRow.value = row
}
//查询单据信息
const getList = () => {
const data = {
...searchForm.value,
stime: dayjs(searchForm.value.stime).format('YYYY-MM-DD') + ' 00:00:00',
etime: dayjs(searchForm.value.etime).format('YYYY-MM-DD') + ' 23:59:59',
}
queryPatList(data).then((res) => {
tableData.value = res.data || []
})
}
// 关闭弹窗
const handleAdd = () => {
evaluationInfo.value.assessmentDate = dayjs().format('YYYY-MM-DD HH:mm:ss')
evaluationInfo.value.billNo = ''
baseInfo.value = { beinhos_id: '', nldw: '岁' }
bloodInfo.value = { agreement_ink: 'Y', assess_person: userInfo.name }
getProject()
}
//删除单据
const handleDel = () => {
ElMessageBox.confirm('确定删除当前评估单吗?', '提示', {
type: 'warning'
}).then(() => {
delPat({ billNo: evaluationInfo.value.billNo }).then(() => {
ElMessage.success('删除成功')
handleAdd()
})
})
}
//打印输血评估单
const printPg = (name: string) => {
printPat({ billNo: evaluationInfo.value.billNo, templateName: name }).then((res) => {
if (res.data) {
printBase64PDF(res.data)
}
})
}
const handleChange = () => {
queryPatInfo({ patNo: baseInfo.value.beinhos_id }).then((res) => {
baseInfo.value = res.data.xkPatientInfo
// bloodInfo.value = res.data.xkTransfuseApplyBeforeList[0] || {}
// lisProject.value = res.data.xkTransfuseApplyTestitemList || []
splitAge(baseInfo.value.age)
})
}
// 提交
const handleSubmit = () => {
if (bloodInfo.value.bill_status && bloodInfo.value.bill_status == '2') return ElMessage.warning('该评估单已审核,不允许修改!')
//判断病情概要是否填写
if (getParam('HZBQGY') == 'Y' && !bloodInfo.value.bqgy) return ElMessage.warning('请务必填写病情概要,以便输血科评估用血合理性!')
const tempPatient = { ...baseInfo.value }
if (baseInfo.value.age) {
tempPatient.age = baseInfo.value.age + baseInfo.value.nldw
}
const data = {
xkPatientInfo: tempPatient,
xkTransfuseApplyBeforeList: [{
...bloodInfo.value,
beinhos_id: baseInfo.value.beinhos_id,
assess_data: evaluationInfo.value.assessmentDate
}],
xkTransfuseApplyTestitemList: lisProject.value
}
if (bloodInfo.value.bill_status && bloodInfo.value.bill_status == '1') {
updatePat(data).then((res) => {
if (res.code == 0) {
ElMessage.success('保存成功')
}
})
} else {
savePat(data).then((res) => {
if (res.code == 0) {
ElMessage.success('保存成功')
evaluationInfo.value.billNo = res.data
//获取到评估单号后请求最新评估单信息
getBillInfo()
}
})
}
}
const goSxPath = () => {
router.push({ path: `/doctor/application` })
}
const getProject = () => {
queryLisProject({ need: 'Y' }).then((res) => {
lisProject.value = res.data.map(item => {
return {
bill_no: '',
item_name: item.pro_name,
item_result: '',
item_unit: item.unit,
test_date: dayjs().format('YYYY-MM-DD HH:mm:ss'),
sid: item.sid
}
})
})
}
onMounted(() => {
getDictData('ks', 'sxqjcxmmrz', 'nldw', 'anemia')
getProject()
const tipText = `<strong>输血报销适用限制范围如下:</strong><br />
诊疗少白细胞红细胞限特殊适应症与急救、抢救请根据限制范围,结合当前病人情况,判断是否适用医保如为自费患者。<br />
请到HIS-医保管理菜单-医保费用审核里`
//判断是否显示医保提示
if (getParam('YBZFXMTSXX') == 'Y') {
ElMessageBox.alert(
tipText,
'提示',
{
dangerouslyUseHTMLString: true,
}
)
}
})
</script>
<style scoped lang="scss">
.app-container {
overflow-y: auto;
font-size: 14px;
padding: 10px;
}
.section {
background: #fff;
border-radius: 4px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
padding: 12px;
margin-bottom: 10px;
.title {
position: relative;
padding-left: 12px;
padding-bottom: 6px;
font-size: 15px;
font-weight: 600;
display: flex;
justify-content: space-between;
// align-items: center;
/* 左侧蓝色小竖线 */
&::before {
content: '';
position: absolute;
left: 0;
top: 2px;
bottom: 2px;
width: 4px;
height: 14px;
background-color: #409eff;
margin-right: 8px;
border-radius: 0 4px 4px 0;
}
}
.el-form-item {
margin-bottom: 6px;
:deep(.el-form-item__label) {
font-weight: 700;
}
}
.col-project {
position: relative;
}
.unit {
position: absolute;
left: 100%;
top: 0;
color: #aeb1b7;
margin-left: 5px;
}
}
.tips-label {
label {
display: none !important;
}
}
.tips {
color: #f00;
font-size: 12px;
display: block;
}
.text-danger {
color: #f00 !important;
:deep(.el-checkbox__label) {
color: #f00 !important;
}
}
</style>