代码字典

This commit is contained in:
wuyy 2026-06-12 18:01:21 +08:00
parent d88d2ff675
commit 54cce95758
21 changed files with 2134 additions and 1400 deletions

View File

@ -0,0 +1,50 @@
import request from '@/utils/request'
// 根据住院号获取病人信息
export function queryPatInfo(query?: Object) {
return request({
url: '/doctor/applyBefore/getPatInfo',
method: 'get',
params: query
})
}
// 查询单据信息
export function queryPatList(query?: Object) {
return request({
url: '/doctor/applyBefore/queryList',
method: 'get',
params: query
})
}
// 打印单据信息
export function printPat(query?: Object) {
return request({
url: '/doctor/applyBefore/print',
method: 'get',
params: query
})
}
// 保存信息
export function savePat(query?: Object) {
return request({
url: '/doctor/applyBefore/save',
method: 'post',
data: query
})
}
// 修改信息
export function updatePat(query?: Object) {
return request({
url: '/doctor/applyBefore/update',
method: 'post',
data: query
})
}
// 删除信息
export function delPat(query?: Object) {
return request({
url: '/doctor/applyBefore/delete',
method: 'get',
params: query
})
}

View File

@ -1,10 +1,9 @@
// @ts-ignore
import request from '@/utils/request'
// 查询字典数据列表
export function queryComDictListService(query?: Object) {
return request({
url: '/comdict/query',
url: '/bus/bloodbank/dmzd/queryList',
method: 'get',
params: query
})
@ -12,7 +11,7 @@ export function queryComDictListService(query?: Object) {
//增加字典数据
export function addComDictService(data?: Object) {
return request({
url: '/comdict/add',
url: '/bus/bloodbank/dmzd/add',
method: 'post',
data
})
@ -21,7 +20,7 @@ export function addComDictService(data?: Object) {
//修改字典数据
export function updateComDictService(data?: Object) {
return request({
url: '/comdict/update',
url: '/bus/bloodbank/dmzd/update',
method: 'post',
data
})
@ -30,18 +29,18 @@ export function updateComDictService(data?: Object) {
//删除字典数据
export function delComDictService(data?: Object) {
return request({
url: '/comdict/del',
method: 'delete',
data
url: '/bus/bloodbank/dmzd/delete',
method: 'get',
params: data
})
}
// 根据字典类型查询字典数据信息
export function getComDicts(dict_type?: Object) {
export function getComDicts(data?: Object) {
return request({
url: '/transitdict/regdict/getInfoOne',
url: '/bus/common/queryDictData',
method: 'get',
params: dict_type
params: data
})
}

View File

@ -1,19 +0,0 @@
// @ts-ignore
import request from '@/utils/request'
// 查询字典数据列表
export function querylabInstrList(query?: Object) {
return request({
url: '/instr/query',
method: 'get',
params: query
})
}
// 查询字典数据列表
export function querylabInstrListByLisgroup(query?: Object) {
return request({
url: '/instr/querybylisgroup',
method: 'get',
params: query
})
}

View File

@ -1,44 +0,0 @@
import request from '@/utils/request'
// 查询诊断列表
export function listdiagnosis(query: Object) {
return request({
url: '/transitdict/diagnosis/list',
method: 'get',
params: query
})
}
// 查询诊断详细
export function getdiagnosis(diagnosisId: number) {
return request({
url: '/transitdict/diagnosis/' + diagnosisId,
method: 'get'
})
}
// 新增诊断
export function adddiagnosis(data: Object) {
return request({
url: '/transitdict/diagnosis',
method: 'post',
data: data
})
}
// 修改诊断
export function updatediagnosis(data: Object) {
return request({
url: '/transitdict/diagnosis',
method: 'put',
data: data
})
}
// 删除诊断
export function deldiagnosis(diagnosisId: number) {
return request({
url: '/transitdict/diagnosis/' + diagnosisId,
method: 'delete'
})
}

View File

@ -1,44 +0,0 @@
import request from '@/utils/request'
// 查询诊断列表
export function listitemclass(query: Object) {
return request({
url: '/transitdict/itemclass/list',
method: 'get',
params: query
})
}
// 查询诊断详细
export function getitemclass(itemclassId: number) {
return request({
url: '/transitdict/itemclass/' + itemclassId,
method: 'get'
})
}
// 新增诊断
export function additemclass(data: Object) {
return request({
url: '/transitdict/itemclass',
method: 'post',
data: data
})
}
// 修改诊断
export function updateitemclass(data: Object) {
return request({
url: '/transitdict/itemclass',
method: 'put',
data: data
})
}
// 删除诊断
export function delitemclass(itemclassId: number) {
return request({
url: '/transitdict/itemclass/' + itemclassId,
method: 'delete'
})
}

View File

@ -1,59 +0,0 @@
import request from '@/utils/request'
// 查询字典列表
export function listregdict(query: Object) {
return request({
url: '/transitdict/regdict/list',
method: 'get',
params: query
})
}
// 获取字典最大编码
export function getMaxDictCode(query: Object) {
return request({
url: '/transitdict/regdict/getMaxDictCode',
method: 'get',
params: query
})
}
// 查询字典详细
export function getregdict(regdictId: number) {
return request({
url: '/transitdict/regdict/' + regdictId,
method: 'get'
})
}
// 新增字典
export function addregdict(data: Object) {
return request({
url: '/transitdict/regdict',
method: 'post',
data: data
})
}
// 修改字典
export function updateregdict(data: Object) {
return request({
url: '/transitdict/regdict',
method: 'put',
data: data
})
}
// 删除字典
export function delregdict(regdictId: number) {
return request({
url: '/transitdict/regdict/' + regdictId,
method: 'delete'
})
}
// 清空缓存
export function clearCache() {
return request({
url: '/transitdict/regdict/clearCache',
method: 'get'
})
}

View File

@ -1,108 +0,0 @@
// @ts-ignore
import request from '@/utils/request'
// 获取流转数据
export function querySample(query?: Object) {
return request({
url: '/transit/querySample',
method: 'get',
params: query
})
}
// 获取未签收的标本
export function querySampleSign(query?: Object) {
return request({
url: '/transit/querySampleSign',
method: 'get',
params: query
})
}
// 签收标本
export function sampleSign(query?: Object) {
return request({
url: '/transit/sampleSign',
method: 'post',
data: query
})
}
// 退回的标本
export function querySampleSignBack(query?: Object) {
return request({
url: '/transit/querySampleSignBack',
method: 'get',
params: query
})
}
// 标本数量统计
export function querySampleTypeCount(query?: Object) {
return request({
url: '/transitReport/sampleTypeCount',
method: 'get',
params: query
})
}
// 标本报表
export function sampleTypeCount(query?: Object) {
return request({
url: '/transitReport/sampleTypeCount',
method: 'get',
params: query
})
}
// 标本报表费用
export function sampleitemCount(query?: Object) {
return request({
url: '/transitReport/itemCount',
method: 'get',
params: query
})
}
// 标本报表费用
export function getallcount(query?: Object) {
return request({
url: '/transitstat/getallcount',
method: 'get',
params: query
})
}
// 获取流转项目列表
export function getXmList(query?: Object) {
return request({
url: '/item/getList',
method: 'get',
params: query
})
}
// 新增项目
export function addXmInfo(query?: Object) {
return request({
url: '/item/add',
method: 'post',
data: query
})
}
// 修改项目
export function updateXmInfo(query?: Object) {
return request({
url: '/item/update',
method: 'post',
data: query
})
}
// 删除项目
export function deleteXmInfo(query?: Object) {
return request({
url: '/item/delete',
method: 'post',
data: query
})
}
// 获取已打印的条码数据
export function sampleCollect(query?: Object) {
return request({
url: '/transit/sampleCollect',
method: 'get',
params: query
})
}

View File

@ -124,7 +124,7 @@ aside {
.app-container {
padding: 10px 10px 0 10px;
height: calc(100vh - 5.25rem);
background-color: #f9f9f9;
background-color: #e6edf9;
box-sizing: border-box;
}
@ -470,7 +470,7 @@ aside {
.el-table__fixed-header-wrapper {
th {
word-break: break-word;
background-color: #f6fafc !important;
background-color: #eff6fa !important;
color: #3c526f;
height: 1.875rem !important;
font-size: 15px;
@ -490,18 +490,13 @@ aside {
}
/* 表格最外层边框(可选) */
.el-table--border {
border: 1px solid #ece9ea !important;
}
.el-scrollbar__thumb {
background-color: #d9ecf7 !important;
background-color: #d8d8d8 !important;
opacity: 1;
}
.el-scrollbar__thumb:hover {
background-color: #d9ecf7 !important;
background-color: #d8d8d8 !important;
opacity: 1;
}
@ -515,10 +510,7 @@ aside {
line-height: 1.8125rem;
}
// .el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell {
// background-color: #a4beef !important;
// color: #000 !important;
// }
.cell.el-tooltip {
padding: 0 !important;
@ -562,6 +554,20 @@ aside {
.el-table__empty-block {
width: 100% !important;
}
--el-table-border-color:#ccc; // 边框颜色
.el-table__header th {
border-color: #ccc !important;
}
.el-table__body td {
border-color: #ccc !important;
}
.el-table__row {
border-color: #ccc !important;
}
}

View File

@ -361,8 +361,8 @@ const clearHandle = () => {
:deep(.vxe-header--row th) {
border-color: #00a5ff;
background-color: #00a5ff;
color: #fff;
// background-color: #e6edf9;
font-size: 14px;
}
:deep(.vxe-body--row td) {
@ -389,7 +389,7 @@ const clearHandle = () => {
// 表头边框
:deep(.vxe-table--render-default.border--full .vxe-header--column) {
background-image: linear-gradient(#00a5ff, #00a5ff), linear-gradient(#00a5ff, #00a5ff) !important;
background-image: linear-gradient(#e6edf9, #e6edf9), linear-gradient(#e6edf9, #e6edf9) !important;
}
.select-table-dropdown {

View File

@ -51,7 +51,7 @@ import RuoYiDoc from '@/components/RuoYi/Doc/index.vue'
import useAppStore from '@/store/modules/app'
import useUserStore from '@/store/modules/user'
import useSettingsStore from '@/store/modules/settings'
import { listhospital } from '@/api/regional/dict/hospital'
import { listhospital } from '@/api/regional/hospital'
const appStore = useAppStore()
const userStore = useUserStore()
const settingsStore = useSettingsStore()

View File

@ -76,13 +76,11 @@ export function comDict(...args: string[]): Promise<DictResult> {
} else {
// 缓存不存在,发起请求并记录 Promise
const promise = getComDicts({
dict_type: dictType
dictType: dictType
}).then((resp: any) => {
const dictList = resp.data.map((p: any) => ({
label: p.dictName,
value: p.dictCode,
elTagType: "",
elTagClass: ""
label: p.wordbook_name,
value: p.wordbook_code,
}));
res.value[dictType] = dictList;

File diff suppressed because it is too large Load Diff

View File

@ -7,265 +7,286 @@
<template>
<div class="app-container">
<!-- 基础信息 -->
<div class="section">
<div class="section-title">基础信息</div>
<div class="form-row three-col">
<div class="form-item">
<label>评估单号:</label>
<el-input v-model="baseInfo.assessmentNo" disabled placeholder="" />
</div>
<div class="form-item">
<label>姓 名:</label>
<el-input v-model="baseInfo.name" placeholder="" />
</div>
<div class="form-item">
<label>科 室:</label>
<el-input v-model="baseInfo.department" placeholder="" />
</div>
</div>
<div class="form-row three-col">
<div class="form-item">
<label>评估日期:</label>
<el-input v-model="baseInfo.assessmentDate" readonly placeholder="" />
</div>
<div class="form-item">
<label>床位号:</label>
<el-input v-model="baseInfo.bedNo" placeholder="" />
</div>
<div class="form-item">
<label>病 区:</label>
<el-input v-model="baseInfo.ward" placeholder="" />
</div>
</div>
<div class="form-row three-col">
<div class="form-item">
<label>评估医师:</label>
<el-input v-model="baseInfo.doctorName" readonly placeholder="" />
</div>
<div class="form-item">
<label>年 龄:</label>
<el-input v-model="baseInfo.age" type="number" placeholder="" />
</div>
<div class="form-item">
<label>血 型:</label>
<div>
{{ baseInfo.bloodType }}
</div>
</div>
</div>
<div class="form-row three-col">
<div class="form-item">
<label>住院号/ID号:</label>
<el-input v-model="baseInfo.hospitalId" placeholder="" />
</div>
<div class="form-item">
<label>临床诊断:</label>
<el-input v-model="baseInfo.diagnosis" placeholder="" />
</div>
<div class="form-item">
<label>Rh(D):</label>
<div>
{{ baseInfo.rhD }}
</div>
</div>
</div>
<el-button type="primary" plain>检索</el-button>
<el-button type="primary" plain>新增</el-button>
<el-button type="primary" plain>保存</el-button>
<el-button type="primary" plain>输血申请</el-button>
<el-button type="warning" plain>打印</el-button>
<el-button type="warning" plain>打印输血知情同意书</el-button>
</div>
<!-- 输入区域 -->
<div class="section">
<div class="two-col">
<div class="form-item-column">
<div class="text">出血量:</div>
<el-input v-model="formData.bleedingVolume" placeholder="" />
</div>
<div class="form-item-column">
<div class="text">输血目的:</div>
<el-input v-model="formData.purpose" placeholder="" />
</div>
<div class="form-item-column">
<div class="text">贫血程度:</div>
<el-input v-model="formData.anemiaDegree" placeholder="" />
</div>
<div class="form-item-column">
<div class="text">血液品种:</div>
<el-input v-model="formData.bloodType" placeholder="" />
</div>
<div class="form-item-column">
<div class="text">血量:</div>
<el-input v-model="formData.bloodVolume" placeholder="" />
</div>
</div>
<div class="form-row checkbox-row">
<el-checkbox v-model="formData.hbLow">病人/病人家属是否签署输血同意书</el-checkbox>
</div>
<div>
<div class="tips">病情概要
(病人基本情况、贫血程度、凝血障碍、有无创面弥漫性渗血、心肺代偿功能、有无代谢率增高、年龄因素、输血目的等。)</div>
<el-input v-model="formData.otherReason" type="textarea" :rows="3" placeholder="" />
</div>
</div>
<el-form :model="form" label-width="auto">
<!-- 基础信息 -->
<div class="section">
<div class="title">基础信息</div>
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="评估单号">
<el-input v-model="baseInfo.assessmentNo" disabled />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="住院号/ID号">
<el-input v-model="baseInfo.beinhos_id" @change="handleChange" />
</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>
<div class="section">
<div class="section-title">病人最近检查结果</div>
<div class="two-col">
<div class="form-item-column">
<div class="text">HGB:</div>
<div class="input-with-unit">
<el-input v-model="formData.hgbValue" placeholder="">
<template #suffix>
g/L
</template>
</el-input>
</div>
</div>
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="评估日期">
<el-input v-model="baseInfo.assessmentDate" readonly />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="科 室">
<SelectTable v-model:data="baseInfo.dept_id" :tableData="dictData.ks" />
</el-form-item>
</el-col>
<div class="form-item-column">
<div class="text">HCT:</div>
<div class="input-with-unit">
<el-input v-model="formData.hgbExpect" placeholder="">
<template #suffix>
%
</template>
</el-input>
</div>
</div>
<div class="form-item-column">
<div class="text">PLT:</div>
<div class="input-with-unit">
<el-input v-model="formData.estimatedVolume" placeholder="">
<template #suffix>
X10^9/L
</template>
</el-input>
</div>
</div>
<div class="form-item-column">
<div class="text">APTT:</div>
<div class="input-with-unit">
<el-input v-model="formData.aptt" placeholder="">
<template #suffix>
秒
</template>
</el-input>
</div>
</div>
</div>
<div class="two-col">
<div class="form-item-column">
<div class="text">ALT:</div>
<div class="input-with-unit">
<el-input v-model="formData.altValue" placeholder="">
<template #suffix>
U/L
</template>
</el-input>
</div>
</div>
<div class="form-item-column">
<div class="text">HBsAg:</div>
<div class="input-with-unit">
<el-select v-model="formData.hbsAg" placeholder="请选择">
<el-option label="阴性" value="negative" />
<el-option label="阳性" value="positive" />
</el-select>
</div>
</div>
<div class="form-item-column">
<div class="text">TP:</div>
<div class="input-with-unit">
<el-select v-model="formData.tp" placeholder="请选择">
<el-option label="阴性" value="negative" />
<el-option label="阳性" value="positive" />
</el-select>
</div>
</div>
<div class="form-item-column">
<div class="text">FIB:</div>
<div class="input-with-unit">
<el-input v-model="formData.fib" placeholder="">
<template #suffix>
g/L
</template>
</el-input>
</div>
</div>
</div>
<div class="two-col">
<div class="form-item-column">
<div class="text">Anti-HCV:</div>
<div class="input-with-unit">
<el-select v-model="formData.antiHcv" placeholder="请选择">
<el-option label="阴性" value="negative" />
<el-option label="阳性" value="positive" />
</el-select>
</div>
</div>
<div class="form-item-column">
<div class="text">Anti-HIV:</div>
<div class="input-with-unit">
<el-select v-model="formData.antiHiv" placeholder="请选择">
<el-option label="阴性" value="negative" />
<el-option label="阳性" value="positive" />
</el-select>
</div>
</div>
<div class="form-item-column">
<div class="text">PT:</div>
<div class="input-with-unit">
<el-input v-model="formData.pt" placeholder="">
<template #suffix>
U
</template>
</el-input>
</div>
</div>
<div class="form-item-column">
<div class="text">INR:</div>
<div class="input-with-unit">
<el-input v-model="formData.inr" placeholder="" />
</div>
</div>
</div>
<div class="dialog-footer">
<el-button type="primary" @click="handleSubmit">确定</el-button>
<el-button @click="visible = false">取消</el-button>
</div>
</div>
<el-col :span="4">
<el-form-item label="床位号">
<el-input v-model="baseInfo.patient_bed" />
</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="评估医师">
<el-input v-model="baseInfo.doctorname" readonly />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="病 区">
<el-input v-model="baseInfo.zone_id" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="年 龄">
<el-input v-model="baseInfo.age" type="number" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="临床诊断">
<el-input v-model="baseInfo.diagnosis" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="出血量">
<el-input v-model="formData.bleedingVolume" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="输血目的">
<el-input v-model="formData.intent" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="贫血程度">
<el-input v-model="formData.anemiaDegree" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="血液品种">
<el-input v-model="formData.abo" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="血量">
<el-input v-model="formData.bloodVolume" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="18">
<el-form-item label=" ">
<el-checkbox v-model="formData.hbLow" class="text-danger">
病人/病人家属是否签署输血同意书
</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="formData.otherReason" 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="4">
<el-form-item label="HGB">
<el-input v-model="formData.hgbValue" placeholder="">
<template #suffix>
g/L
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="HCT">
<el-input v-model="formData.hgbExpect" placeholder="">
<template #suffix>
%
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="PLT">
<el-input v-model="formData.estimatedVolume" placeholder="">
<template #suffix>
X10^9/L
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="APTT">
<el-input v-model="formData.aptt" placeholder="">
<template #suffix>
秒
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="ALT">
<el-input v-model="formData.altValue" placeholder="">
<template #suffix>
U/L
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="HBsAg">
<el-select v-model="formData.hbsAg" placeholder="请选择">
<el-option label="阴性" value="negative" />
<el-option label="阳性" value="positive" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="TP">
<el-select v-model="formData.tp" placeholder="请选择">
<el-option label="阴性" value="negative" />
<el-option label="阳性" value="positive" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="FIB">
<el-input v-model="formData.fib" placeholder="">
<template #suffix>
g/L
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="Anti-HCV">
<el-select v-model="formData.antiHcv" placeholder="请选择">
<el-option label="阴性" value="negative" />
<el-option label="阳性" value="positive" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="Anti-HIV">
<el-select v-model="formData.antiHiv" placeholder="请选择">
<el-option label="阴性" value="negative" />
<el-option label="阳性" value="positive" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="PT">
<el-input v-model="formData.pt" placeholder="">
<template #suffix>
U
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="INR">
<el-input v-model="formData.inr" placeholder="" />
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
</div>
</template>
<script setup lang="ts">
import dayjs from 'dayjs'
import { queryPatInfo } from '@/api/doctor/assessment'
import { getDictData, formatDict, dictData } from '@/hooks'
const type = ref<'operation' | 'nonOperation'>('operation')
// 表单聚合(统一Form模型)
const form = reactive({})
// 基础信息数据
const baseInfo = reactive({
const baseInfo = ref({
assessmentNo: '',
name: '',
department: '',
patient_name: '',
dept_id: '',
assessmentDate: dayjs().format('YYYY-MM-DD HH:mm:ss'),
bedNo: '',
ward: '',
patient_bed: '',
zone_id: '',
doctorName: '',
age: '',
bloodType: '',
hospitalId: '',
abo: '',
beinhos_id: '',
diagnosis: '',
rhD: '待查' // Rh(D)
rh: ''
})
// 表单数据
const formData = reactive({
bleedingVolume: '',
purpose: '',
intent: '',
anemiaDegree: '',
bloodType: '', // 血液品种
abo: '', // 血液品种
bloodVolume: '', // 血量
hbLow: false,
otherReason: '',
@ -294,34 +315,31 @@ const formData = reactive({
colloidBefore: false
})
// 初始化当前时间
onMounted(() => {
})
// 关闭弹窗
const handleClose = () => {
// 重置基础信息(保留评估单号和评估医师,仅重置可编辑项)
Object.assign(baseInfo, {
Object.assign(baseInfo.value, {
name: '',
department: '',
dept_id: '',
assessmentDate: new Date().toLocaleString(),
bedNo: '',
ward: '',
patient_bed: '',
zone_id: '',
age: '',
bloodType: '',
hospitalId: '',
abo: '',
beinhos_id: '',
diagnosis: '',
rhD: ''
rh: ''
})
// 重置表单
Object.assign(formData, {
bleedingVolume: '',
purpose: '',
intent: '',
anemiaDegree: '',
bloodType: '',
abo: '',
bloodVolume: '',
hbLow: false,
otherReason: '',
@ -352,193 +370,91 @@ const handleClose = () => {
type.value = 'operation'
}
// 提交
const handleSubmit = () => {
console.log('基础信息:', baseInfo)
console.log('表单数据:', formData)
const handleChange = (val) => {
queryPatInfo({ patNo: val }).then((res) => {
baseInfo.value = res.data.xkPatientInfo
})
}
// 提交
const handleSubmit = () => {
console.log('基础信息', baseInfo)
console.log('表单数据', formData)
}
onMounted(() => {
getDictData('ks')
})
</script>
<style scoped lang="scss">
.app-container {
overflow-y: auto;
font-size: 14px;
padding: 10px;
}
.tab-switch {
.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: center;
margin-bottom: 20px;
justify-content: space-between;
// align-items: center;
.tab-item {
width: 120px;
height: 32px;
line-height: 32px;
text-align: center;
background: #f5f7fa;
border: 1px solid #dcdfe6;
cursor: pointer;
position: relative;
&:first-child {
border-radius: 4px 0 0 4px;
border-right: none;
}
&:last-child {
border-radius: 0 4px 4px 0;
}
&.active {
background: #e6f7ff;
border-color: #91d5ff;
color: #1890ff;
}
.check-icon {
position: absolute;
right: 4px;
bottom: 2px;
font-size: 12px;
color: #1890ff;
}
/* 左侧蓝色小竖线 */
&::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;
}
}
.section {
margin-bottom: 20px;
background: #fff;
border-radius: 4px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
padding: 12px;
.el-form-item {
margin-bottom: 6px;
.section-title {
font-size: 14px;
font-weight: 600;
color: #303133;
padding: 6px 0;
// margin-bottom: 8px;
&::before {
content: '';
display: inline-block;
width: 4px;
height: 14px;
background-color: #409eff;
margin-right: 8px;
border-radius: 0 4px 4px 0;
}
}
.form-row {
display: flex;
gap: 20px;
margin-bottom: 8px;
&.three-col {
.form-item {
flex: 1;
}
}
&.checkbox-row {
align-items: center;
:deep(.el-checkbox__label) {
color: #f00;
}
}
}
.two-col {
display: flex;
gap: 20px;
flex-wrap: wrap;
.form-item-column {
flex: 1;
.text {
color: #80868d;
font-weight: 700;
margin: 6px 0;
}
}
}
.tips {
color: #f00;
}
.form-item {
display: flex;
align-items: center;
gap: 8px;
&.full-width {
width: 100%;
flex-direction: column;
align-items: flex-start;
label {
margin-bottom: 6px;
}
.el-textarea {
width: 100%;
}
}
label {
width: 80px;
text-align: right;
color: #686f77;
white-space: nowrap;
font-weight: 500;
}
span {
font-weight: 700;
color: #284160;
padding-left: 30px;
}
.el-input,
.el-select,
.el-date-picker {
flex: 1;
}
}
.input-with-unit {
display: flex;
align-items: center;
flex: 1;
.el-input {
flex: 1;
}
.input-unit {
color: #5a616a;
}
}
.checkbox-group {
display: flex;
flex-direction: column;
gap: 8px;
}
.mt-10 {
margin-top: 10px;
:deep(.el-form-item__label) {
font-weight: 700;
}
}
}
.dialog-footer {
display: flex;
justify-content: center;
gap: 10px;
.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>

View File

@ -11,7 +11,7 @@
<div class="top-search-bar">
<el-input placeholder="输入床号/住院号/病人姓名搜索" style="width: 240px" clearable />
<div class="btn_box ml10">
<el-button type="primary">编辑病人</el-button>
<el-button type="primary" @click="editHandle">编辑病人</el-button>
<el-button type="primary" @click="goSxpg">输血评估</el-button>
<el-button type="primary" @click="goSxsq">输血申请</el-button>
<el-button type="primary">大量用血审批</el-button>
@ -115,7 +115,7 @@
<!-- 2. 输血记录卡片 -->
<div class="card transfusion-record-card">
<div class="card-title">
<div class="text"> 输血记录 </div>
<div class="text">输血记录</div>
<div>
<el-checkbox v-model="recordFilter.showDiscarded">显示已作废</el-checkbox>
<el-button type="primary" icon="Refresh" plain class="ml10">刷 新</el-button>
@ -163,13 +163,49 @@
</div>
</div>
<!-- 编辑病人信息 -->
<el-dialog v-model="visible" title="编辑病人信息" width="650px" :draggable="true" :close-on-click-modal="false">
<el-form ref="formRef" :model="formData" label-width="auto" inline>
<el-form-item label="姓名:">
<el-input v-model="formData.name" />
</el-form-item>
<el-form-item label="性别:">
<el-select v-model="formData.gender" placeholder="请选择性别">
<el-option label="男" value="男" />
<el-option label="女" value="女" />
</el-select>
</el-form-item>
<el-form-item label="年龄:">
<el-input v-model="formData.age" />
</el-form-item>
<el-form-item label="身份证号:">
<el-input v-model="formData.id" />
</el-form-item>
<el-form-item label="联系方式:">
<el-input v-model="formData.phone" />
</el-form-item>
<el-form-item label="地址:">
<el-input v-model="formData.address" />
</el-form-item>
<el-form-item label="诊断:">
<el-input v-model="formData.diagnosis" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="visible = false">取 消</el-button>
<el-button type="primary" @click="visible = false">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import router from '@/router'
const visible = ref(false)
const formData = ref({})
const activeIndex = ref(0) // 当前选中患者索引
// 患者列表数据
const patientList = ref([
@ -318,11 +354,14 @@ const transfusionEvalData = ref([
purpose: '手术备血'
},
])
const editHandle = () => {
visible.value = true
}
const goSxpg = () => {
router.push(`/doctor/assessment`)
}
const goSxsq = () => {
router.push(`/doctor/application`)
router.push(`/doctor/application?external=1`)
}
</script>

View File

@ -2,16 +2,559 @@
* @file index.vue
* @description: 输血有效性评价
* @author: w
* @since: 2026-06-09
* @since: 2026-06-11
*/
<template>
<div>
输血有效性评价
<div class="app-container">
<!-- 顶部工具栏 -->
<div class="toolbar">
<el-button type="primary" plain>检索</el-button>
<el-button type="primary" plain>新增单据</el-button>
<el-button type="primary" plain>刷新结果</el-button>
<el-button type="primary" plain>用血信息</el-button>
<el-button type="success" plain>保存</el-button>
<el-button type="warning" plain>打印</el-button>
</div>
<!-- 主体内容区 -->
<div class="content-wrapper">
<!-- 左侧区域 -->
<div class="left-panel">
<!-- 输血后有效性评估 -->
<div class="form-section">
<div class="section-title">输血后有效性评估</div>
<el-form :model="formData" label-width="auto">
<div class="form-row three-col">
<el-form-item label="申请单号">
<el-input v-model="formData.applyNo" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="申请日期">
<el-date-picker v-model="formData.applyDate" type="datetime" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
</el-form-item>
<el-form-item label="血型">
<el-input v-model="formData.bloodType" placeholder="">
</el-input>
</el-form-item>
</div>
<div class="form-row three-col">
<el-form-item label="患者姓名">
<el-input v-model="formData.patientName" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="科 室">
<el-input v-model="formData.department" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="Rh(D)">
<el-input v-model="formData.rhD" placeholder="">
</el-input>
</el-form-item>
</div>
<div class="form-row three-col">
<el-form-item label="住院号/ID号">
<el-input v-model="formData.hospitalId" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="科室类型">
<el-input v-model="formData.deptType" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="术中患者出血量">
<el-input v-model="formData.bloodLoss" placeholder="">
<template #suffix>
ml
</template>
</el-input>
</el-form-item>
</div>
<div class="form-row three-col">
<el-form-item label="评估时间">
<el-date-picker v-model="formData.evalTime" type="datetime" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
</el-form-item>
<el-form-item label="评估人">
<el-input v-model="formData.evaluator" placeholder="">
</el-input>
</el-form-item>
<el-form-item>
</el-form-item>
</div>
<div class="divider-line"></div>
<div class="form-row full-col">
<el-form-item label="评估意见">
<el-input v-model="formData.evalOpinion" type="textarea" :rows="3" placeholder="">
</el-input>
</el-form-item>
</div>
<div class="form-row full-col">
<el-form-item label="评估结论">
<el-input v-model="formData.evalConclusion" placeholder="">
</el-input>
</el-form-item>
</div>
</el-form>
</div>
<!-- 输血血液信息表格 -->
<div class="form-section">
<div class="section-title">输血血液信息</div>
<el-table :data="bloodInfoData" border size="small" height="130">
<el-table-column label="血液品种" prop="bloodType" />
<el-table-column label="申请血量" prop="applyVolume" />
<el-table-column label="单位" prop="unit" />
<el-table-column label="申请血型" prop="applyBloodType" />
<el-table-column label="替代血液品种" prop="replaceBloodType" />
<el-table-column label="输血目的" prop="purpose" />
<el-table-column label="输血指征" prop="transfusionCorrection" />
<el-table-column label="实际用血量" prop="actualVolume" />
</el-table>
</div>
</div>
<!-- 右侧区域 -->
<div class="right-panel">
<!-- 血小板指标 -->
<div class="form-section" style="padding-right: 20%">
<div class="section-title">血小板指标</div>
<el-form :model="plateletData" label-width="auto">
<el-form-item label="身高">
<el-input v-model="plateletData.height" placeholder="">
<template #suffix>
cm
</template>
</el-input>
</el-form-item>
<el-form-item label="体重">
<el-input v-model="plateletData.weight" placeholder="">
<template #suffix>
kg
</template>
</el-input>
</el-form-item>
<el-form-item label="血容量">
<el-select v-model="plateletData.bloodVolume" placeholder="" style="width: 85%">
<el-option label="70" value="70"></el-option>
<el-option label="80" value="80"></el-option>
<el-option label="100" value="100"></el-option>
</el-select> &nbsp; ml/kg
</el-form-item>
<el-form-item />
<div class="divider-line"></div>
<el-form-item label="输注前的Plt">
<el-input v-model="plateletData.pltBefore" placeholder="" readonly>
<template #suffix>
10^9/L
</template>
</el-input>
</el-form-item>
<el-form-item label="输注后的Plt">
<el-input v-model="plateletData.pltAfter" placeholder="" readonly>
<template #suffix>
10^9/L
</template>
</el-input>
</el-form-item>
<el-form-item label="Plt增加校正指数">
<el-input v-model="plateletData.pltCorrection" placeholder="" readonly>
<template #suffix>
10^9/L
</template>
</el-input>
</el-form-item>
<el-form-item label="Plt回收率">
<el-input v-model="plateletData.pltRecovery" placeholder="" readonly>
<template #suffix>
%
</template>
</el-input>
</el-form-item>
</el-form>
</div>
</div>
</div>
<!-- 底部检查结果区域 -->
<div class="bottom-panel">
<!-- 输血后检查结果 -->
<div class="form-section">
<div class="section-title">病人输血后检查结果</div>
<el-form :model="postCheckData" label-width="auto">
<div class="form-row three-col">
<el-form-item label="HGB">
<el-input v-model="postCheckData.hgb" placeholder="">
<template #suffix>
g/L
</template>
</el-input>
</el-form-item>
<el-form-item label="HCT">
<el-input v-model="postCheckData.hct" placeholder="">
<template #suffix>
%
</template>
</el-input>
</el-form-item>
<el-form-item label="PLT">
<el-input v-model="postCheckData.plt" placeholder="">
<template #suffix>
×10^9/L
</template>
</el-input>
</el-form-item>
</div>
<div class="form-row three-col">
<el-form-item label="ALT">
<el-input v-model="postCheckData.alt" placeholder="">
<template #suffix>
U/L
</template>
</el-input>
</el-form-item>
<el-form-item label="HBsAg">
<el-input v-model="postCheckData.hbsAg" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="TP">
<el-input v-model="postCheckData.tp" placeholder="">
</el-input>
</el-form-item>
</div>
<div class="form-row three-col">
<el-form-item label="Anti-HCV">
<el-input v-model="postCheckData.antiHcv" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="Anti-HIV">
<el-input v-model="postCheckData.antiHiv" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="PT">
<el-input v-model="postCheckData.pt" placeholder="">
<template #suffix>
秒
</template>
</el-input>
</el-form-item>
</div>
<div class="form-row three-col">
<el-form-item label="APTT">
<el-input v-model="postCheckData.aptt" placeholder="">
<template #suffix>
秒
</template>
</el-input>
</el-form-item>
<el-form-item label="FIB">
<el-input v-model="postCheckData.fib" placeholder="">
<template #suffix>
g/L
</template>
</el-input>
</el-form-item>
<el-form-item label="INR">
<el-input v-model="postCheckData.inr" placeholder="">
</el-input>
</el-form-item>
</div>
</el-form>
</div>
<!-- 输血前检查结果 -->
<div class="form-section">
<div class="section-title pre-check">病人输血前检查结果</div>
<el-form :model="preCheckData" label-width="auto">
<div class="form-row three-col">
<el-form-item label="HGB">
<el-input v-model="preCheckData.hgb" placeholder="">
<template #suffix>
g/L
</template>
</el-input>
</el-form-item>
<el-form-item label="HCT">
<el-input v-model="preCheckData.hct" placeholder="">
<template #suffix>
%
</template>
</el-input>
</el-form-item>
<el-form-item label="PLT">
<el-input v-model="preCheckData.plt" placeholder="">
<template #suffix>
×10^9/L
</template>
</el-input>
</el-form-item>
</div>
<div class="form-row three-col">
<el-form-item label="ALT">
<el-input v-model="preCheckData.alt" placeholder="">
<template #suffix>
U/L
</template>
</el-input>
</el-form-item>
<el-form-item label="HBsAg">
<el-input v-model="preCheckData.hbsAg" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="TP">
<el-input v-model="preCheckData.tp" placeholder="">
</el-input>
</el-form-item>
</div>
<div class="form-row three-col">
<el-form-item label="Anti-HCV">
<el-input v-model="preCheckData.antiHcv" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="Anti-HIV">
<el-input v-model="preCheckData.antiHiv" placeholder="">
</el-input>
</el-form-item>
<el-form-item label="PT">
<el-input v-model="preCheckData.pt" placeholder="">
<template #suffix>
秒
</template>
</el-input>
</el-form-item>
</div>
<div class="form-row three-col">
<el-form-item label="APTT">
<el-input v-model="preCheckData.aptt" placeholder="">
<template #suffix>
秒
</template>
</el-input>
</el-form-item>
<el-form-item label="FIB">
<el-input v-model="preCheckData.fib" placeholder="">
<template #suffix>
g/L
</template>
</el-input>
</el-form-item>
<el-form-item label="INR">
<el-input v-model="preCheckData.inr" placeholder="">
</el-input>
</el-form-item>
</div>
</el-form>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import dayjs from 'dayjs'
// 表单主数据
const formData = reactive({
applyNo: '',
applyDate: '',
patientName: '',
department: '',
hospitalId: '',
deptType: '',
evalTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
evaluator: '管理员',
bloodType: '',
rhD: '',
bloodLoss: '',
evalOpinion: '',
evalConclusion: '输血有效'
})
// 血小板指标数据
const plateletData = reactive({
height: '',
weight: '',
bloodVolume: '',
pltBefore: '',
pltAfter: '',
pltCorrection: '',
pltRecovery: ''
})
// 输血血液信息表格数据
const bloodInfoData = reactive([
{ bloodType: 'test', applyVolume: '', unit: '', applyBloodType: '', replaceBloodType: '', purpose: '' }
])
// 输血后检查结果
const postCheckData = reactive({
hgb: '',
hct: '',
plt: '',
alt: '',
hbsAg: '',
tp: '',
antiHcv: '',
antiHiv: '',
pt: '',
aptt: '',
fib: '',
inr: ''
})
// 输血前检查结果
const preCheckData = reactive({
hgb: '',
hct: '',
plt: '',
alt: '',
hbsAg: '',
tp: '',
antiHcv: '',
antiHiv: '',
pt: '',
aptt: '',
fib: '',
inr: ''
})
</script>
<style scoped></style>
<style scoped lang="scss">
.app-container {
display: flex;
flex-direction: column;
box-sizing: border-box;
overflow-y: auto;
// 顶部工具栏
.toolbar {
display: flex;
gap: 4px;
margin-bottom: 8px;
background: #fff;
padding: 12px;
border-radius: 4px;
flex-shrink: 0;
}
// 主体内容区(左右布局)
.content-wrapper {
display: flex;
gap: 12px;
flex: 1;
margin-bottom: 8px;
.left-panel {
flex: 2;
display: flex;
flex-direction: column;
gap: 12px;
}
.right-panel {
flex: 1;
display: flex;
flex-direction: column;
}
}
// 底部检查结果区
.bottom-panel {
display: flex;
gap: 12px;
flex-shrink: 0;
}
// 通用表单卡片样式
.form-section {
background: #fff;
padding: 10px;
border-radius: 4px;
height: 100%;
display: flex;
flex-direction: column;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
flex: 1;
.section-title {
position: relative;
font-size: 15px;
font-weight: 600;
margin-bottom: 10px;
color: #303133;
padding-left: 12px;
/* 左侧蓝色小竖线 */
&::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;
}
&.pre-check {
color: #e6399b;
&::before {
background-color: #e6399b;
}
}
}
.form-row {
display: flex;
gap: 12px;
width: 100%;
&.three-col {
.el-form-item {
flex: 1;
}
}
&.two-col {
.el-form-item {
flex: 1;
}
}
&.full-col {
.el-form-item {
flex: 1;
}
}
}
.divider-line {
height: 1px;
background-color: #d0d7e5;
margin: 10px 0;
width: 100%;
&.blue {
background-color: #409eff;
}
}
:deep(.el-form-item) {
margin-bottom: 6px;
}
:deep(.el-textarea__inner) {
min-height: 72px !important;
}
:deep(.el-input__suffix) {
display: inline-block;
}
}
}
</style>

View File

@ -4,11 +4,18 @@
* @author: w
* @since: 2026-06-03
*/
<template>
<div class="app-container">
<!-- 1.申请单信息卡片 -->
<div class="card-wrap">
<el-button type="primary" plain>检索</el-button>
<el-button type="primary" plain>新增单据</el-button>
<el-button type="danger" plain>删除单据</el-button>
<el-button type="success" plain>保存</el-button>
<el-button type="warning" plain>打印</el-button>
<el-button type="primary" plain>审核</el-button>
<el-button type="primary" plain>反审核</el-button>
</div>
<div class="card-wrap">
<div class="card-title">申请单信息</div>
<div class="info-row three-col">
@ -71,7 +78,8 @@
<div class="card-title">血液信息</div>
<div class="oper-bar">
<el-select v-model="addBloodVal" placeholder="增加血液" style="width:160px">
<el-option label="新增血袋" value="1" />
<el-option label="新增血液" value="1" />
<el-option label="取消血液" value="2" />
</el-select>
<el-input v-model="inputVal" placeholder="请输入" style="width:240px;margin:0 12px" />
<el-button type="primary" @click="searchBlood">确定</el-button>
@ -88,89 +96,115 @@
</el-table>
</div>
<!--3.输血反应信息卡片-->
<!-- 3.输血反应信息卡片 纯 el-form + el-form-item + 栅格布局 -->
<div class="card-wrap">
<div class="card-title">输血反应信息</div>
<div class="form-row four-col">
<div class="form-item">
<div class="label">血液流水号:</div>
<el-input v-model="formData.bloodNo" placeholder="请输入" />
</div>
<div class="form-item">
<div class="label">医师:</div>
<el-input v-model="formData.doctor" placeholder="请输入" />
</div>
<div class="form-item">
<div class="label">产品码:</div>
<el-input v-model="formData.proCode" placeholder="请输入" />
</div>
<div class="form-item">
<div class="label">实际输入量:</div>
<el-input v-model="formData.realNum" placeholder="请输入" />
</div>
<div class="form-item">
<div class="label">受血方式:</div>
<el-input v-model="formData.receiveType" placeholder="请输入" />
</div>
</div>
<div class="form-row four-col">
<div class="form-item">
<div class="label">输血日期:</div>
<el-date-picker v-model="formData.transDate" type="datetime" placeholder="选择日期时间" style="width:100%" />
</div>
<div class="form-item">
<div class="label">发生日期:</div>
<el-date-picker v-model="formData.occurDate" type="datetime" placeholder="选择日期时间" style="width:100%" />
</div>
<div class="form-item">
<div class="label">输血反应:</div>
<el-select v-model="formData.react" placeholder="请选择" style="width:100%">
</el-select>
</div>
<div class="form-item">
<div class="label">临床处理:</div>
<el-select v-model="formData.clinicDeal" placeholder="请选择" style="width:100%">
</el-select>
</div>
<div class="form-item">
<div class="label">输血科处理:</div>
<el-select v-model="formData.bloodDeptDeal" placeholder="请选择" style="width:100%">
</el-select>
</div>
</div>
<el-form :model="formData" label-width="90px" class="reaction-form">
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="血液流水号" prop="bloodNo">
<el-input v-model="formData.bloodNo" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="医师" prop="doctor">
<el-input v-model="formData.doctor" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="产品码" prop="proCode">
<el-input v-model="formData.proCode" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="实际输入量" prop="realNum">
<el-input v-model="formData.realNum" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="受血方式" prop="receiveType">
<el-input v-model="formData.receiveType" placeholder="请输入" />
</el-form-item>
</el-col>
</el-row>
<div class="form-item full-item">
<div class="label">备注:</div>
<el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入" style="width: 50%" />
</div>
<div class="btn-bottom">
<el-button type="primary">确定</el-button>
<el-button>取消</el-button>
</div>
<el-row :gutter="20">
<el-col :span="4">
<el-form-item label="输血日期" prop="transDate">
<el-date-picker v-model="formData.transDate" type="datetime" placeholder="选择日期时间" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="发生日期" prop="occurDate">
<el-date-picker v-model="formData.occurDate" type="datetime" placeholder="选择日期时间" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="输血反应" prop="react">
<el-input v-model="formData.react" type="textarea" :rows="3" placeholder="请输入" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="临床处理" prop="clinicDeal">
<el-input v-model="formData.clinicDeal" type="textarea" :rows="3" placeholder="请输入" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="输血科处理" prop="bloodDeptDeal">
<el-input v-model="formData.bloodDeptDeal" type="textarea" :rows="3" placeholder="请输入"
style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</div>
</template>
<script setup lang="ts">
//下拉框
const addBloodVal = ref('')
const inputVal = ref('')
//表格数据
const bloodTableData = ref([
{ bloodNo: '999922220001', productCode: '999922220001', bloodType: '洗涤红细胞', abo: 'O', rhd: '待查', volume: '2.00', unit: 'u', validDate: '2021-09-10 10:00' }
])
//表单数据
const formData = reactive({
bloodNo: '', doctor: '', proCode: '', realNum: '',
receiveType: '', transDate: '', occurDate: '', react: '',
clinicDeal: '', bloodDeptDeal: '', remark: ''
})
//查询血液信息
const searchBlood = () => {
// 下拉框
const addBloodVal = ref('1')
const inputVal = ref('')
// 表格数据
const bloodTableData = ref([
{
bloodNo: '999922220001',
productCode: '999922220001',
bloodType: '洗涤红细胞',
abo: 'O',
rhd: '待查',
volume: '2.00',
unit: 'u',
validDate: '2021-09-10 10:00'
}
])
// 表单数据
const formData = reactive({
bloodNo: '',
doctor: '',
proCode: '',
realNum: '',
receiveType: '',
transDate: '',
occurDate: '',
react: '',
clinicDeal: '',
bloodDeptDeal: '',
remark: ''
})
// 查询血液信息
const searchBlood = () => {
}
</script>
@ -185,12 +219,9 @@ const searchBlood = () => {
.card-wrap {
background: #fff;
border-radius: 6px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.07); //还原卡片阴影
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.07);
padding: 12px;
&:hover {
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.12); // 悬停加深阴影
}
.card-title {
font-size: 15px;
@ -211,7 +242,10 @@ const searchBlood = () => {
}
}
//三列基础信息
.el-form-item {
margin-bottom: 6px;
}
.three-col {
display: flex;
gap: 24px;
@ -239,70 +273,10 @@ const searchBlood = () => {
}
}
//血液操作栏
.oper-bar {
display: flex;
align-items: center;
}
//表单四列布局
.four-col {
display: flex;
gap: 18px;
.form-item {
flex: 1;
display: flex;
flex-direction: column;
font-size: 14px;
.label {
color: #80868d;
font-weight: 700;
margin: 8px 0;
}
}
}
//两列布局
.two-col {
display: flex;
gap: 18px;
font-size: 14px;
.form-item {
flex: 1;
display: flex;
flex-direction: column;
.label {
color: #80868d;
font-weight: 700;
margin: 8px 0;
}
}
}
//整行备注
.full-item {
display: flex;
flex-direction: column;
margin-bottom: 22px;
font-size: 14px;
.label {
color: #80868d;
font-weight: 700;
margin: 8px 0;
}
}
//底部按钮居中
.btn-bottom {
display: flex;
justify-content: center;
gap: 12px;
}
}
}
</style>

View File

@ -42,9 +42,11 @@
<!-- 表格卡片 -->
<div class="table-card">
<div class="table-btn-bar">
<el-button icon="Printer" @click="onCancel">作废</el-button>
<el-button type="primary" @click="onAudit">审核</el-button>
<div class="mb10">
<el-button type="primary">检索</el-button>
<el-button type="primary">科主任核准</el-button>
<el-button type="primary">医务部审批</el-button>
<el-button type="warning">打印</el-button>
</div>
<CustomTable :data="tableData" :columns="columns" :config="config" @selection-change="selectionChange"

View File

@ -0,0 +1,11 @@
<script setup>
</script>
<template>
</template>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,390 @@
/**
* @file index.vue
* @description: 代码字典
* @author: w
* @since: 2026-06-12
*/
<template>
<div class="app-container">
<el-row :gutter="20">
<el-col :span="4" :xs="24">
<div class="head-container">
<el-input v-model="dictTypemc" clearable placeholder="请输入字典名称" prefix-icon="Search"
style="margin-bottom: 20px" />
</div>
<div class="head-container">
<div class="card-content">
<el-tree ref="treeRef" class="filter-tree" :data="typeList" :props="defaultProps" default-expand-all
node-key="wordbook_code" :filter-node-method="filterNode" @node-click="nodeHandle" highlight-current />
</div>
</div>
</el-col>
<!-- 字典明细-->
<el-col :span="20" :xs="24">
<!-- 表单区域-->
<el-form :model="queryParams" ref="queryRef" :inline="true" label-width="68px">
<el-form-item class="cus-el-form-item" label="名称" prop="wordbook_name">
<el-input v-model="queryParams.wordbook_name" placeholder="请输入名称" clearable style="width: 240px"
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item class="cus-el-form-item" label="明细代号" prop="status">
<el-input v-model="queryParams.wordbook_code" placeholder="请输入明细代号" clearable style="width: 240px"
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @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="Plus" @click="handleAdd" ">新增</el-button>
</el-col>
<!-- <el-col :span=" 1.5">
<el-button type="info" plain icon="Upload" @click="handleImport">导入</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
</el-col> -->
<!-- <el-col :span="1.5">
<el-button type="warning" plain @click="clearCacheHandle">清除缓存</el-button>
</el-col> -->
</el-row>
<!-- 表格区域-->
<el-table v-loading="loading" :data="typeDetail" @selection-change="handleSelectionChange" highlight-current-row
show-overflow-tooltip height="calc(100vh - 200px)">
<el-table-column label='字典类型' align="center" prop="wordbook_sign" />
<el-table-column label="明细代号" align="center" prop="wordbook_code" />
<el-table-column label="名称" align="center" prop="wordbook_name" />
<el-table-column label="状态" align="center" prop="use_sign">
<template #default="{ row }">
<el-tag v-if="row.use_sign == 'Y'" type="primary">正常</el-tag>
<el-tag v-if="row.use_sign == 'N'" type="danger">停用</el-tag>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
<template #default="{ row }">
<el-button link type="primary" icon="Edit" @click="handleUpdate(row)">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" /> -->
</el-col>
</el-row>
<!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="dictRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="字典类别" prop="wordbook_sign">
<el-input v-model="form.wordbook_sign" disabled></el-input>
</el-form-item>
<el-form-item label="字典代号" prop="wordbook_code">
<el-input v-model="form.wordbook_code" placeholder="请输入字典代号" />
</el-form-item>
<el-form-item label="字典名称" prop="wordbook_name">
<el-input v-model="form.wordbook_name" placeholder="请输入字典名称" />
</el-form-item>
<el-form-item label="状态" prop="use_sign">
<el-radio-group v-model="form.use_sign">
<el-radio value="Y"> 正常 </el-radio>
<el-radio value="N"> 停用 </el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
<!-- 用户导入对话框 -->
<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
<el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
:on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="upload.updateSupport" />是否覆盖已经存在的字典数据
</div>
<span>仅允许导入xls、xlsx格式文件。</span>
<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
@click="importTemplate">下载模板</el-link>
</div>
</template>
</el-upload>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitFileForm">确 定</el-button>
<el-button @click="upload.open = false">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { computed, reactive, ref, onMounted, nextTick } from "vue";
import { getToken } from "@/utils/auth";
import { queryComDictListService, addComDictService, delComDictService, updateComDictService, getComDicts } from "@/api/liswork/dict/ComDict";
const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const data = reactive({
form: {},
queryParams: {
wordbook_name: undefined,
wordbook_code: undefined,
dictType: '',
},
rules: {
wordbook_name: [{ required: true, message: "字典名称不能为空", trigger: "blur" }],
wordbook_sign: [{ required: true, message: "字典类型不能为空", trigger: "blur" }]
},
});
const { queryParams, form, rules } = toRefs(data);
const single = ref(true);
const multiple = ref(true);
const loading = ref(true);
const typeList = ref([])
const typeDetail = ref([])
const total = ref(0);
const dictTypemc = ref('');
const open = ref(false);
const title = ref('');
/*** 用户导入参数 */
const upload = reactive({
// 是否显示弹出层(用户导入)
open: false,
// 弹出层标题(用户导入)
title: "",
// 是否禁用上传
isUploading: false,
// 是否更新已经存在的用户数据
updateSupport: 0,
// 设置上传的请求头部
headers: { Authorization: "Bearer " + getToken() },
// 上传的地址
url: import.meta.env.VITE_APP_BASE_API + "/comdict/importData"
});
const treeRef = ref(null)
const defaultProps = {
children: 'children',
label: 'wordbook_name',
id: 'wordbook_code'
}
const info = ref({})
watch(dictTypemc, (val) => {
treeRef.value?.filter(val)
})
const filterNode = (value, data) => {
if (!value) return true
return data.wordbook_name.includes(value)
}
const nodeHandle = (data) => {
queryParams.value.dictType = data.wordbook_code
getList()
}
// 获取左侧字典列表
function getTypeList() {
queryComDictListService().then(response => {
typeList.value = response.data;
queryParams.value.dictType = response.data[0].wordbook_code
treeRef.value.setCurrentKey(response.data[0].wordbook_code)
getList()
});
}
// 查询字典明细列表
function getList() {
loading.value = true;
getComDicts(queryParams.value).then(response => {
typeDetail.value = response.data;
loading.value = false;
});
}
//查询
function handleQuery() {
getList();
}
/** 表单重置 */
function reset() {
form.value = {
wordbook_sign: '',
wordbook_name: '',
wordbook_code: '',
use_sign: "Y",
remark: undefined
};
proxy.resetForm("dictRef");
}
//重置
function resetQuery() {
queryParams.value.wordbook_name = ''
queryParams.value.wordbook_code = ''
proxy.resetForm("queryRef");
handleQuery();
}
//新增
function handleAdd() {
if (!queryParams.value.dictType) {
proxy.$modal.msgWarning("请先选择字典大类");
return;
}
reset();
form.value.wordbook_sign = queryParams.value.dictType;
open.value = true;
title.value = '新增字典';
}
//修改
function handleUpdate(row) {
reset()
form.value = row.wordbook_sign ? JSON.parse(JSON.stringify(row)) : info.value
open.value = true;
title.value = '编辑字典';
}
//删除
function handleDelete(row) {
proxy.$modal.confirm('是否确认删除字典名称为"' + row.wordbook_name + '"的数据项?').then(function () {
return delComDictService(row);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => { });
}
/** 导入按钮操作 */
function handleImport() {
upload.title = "字典导入";
upload.open = true;
};
/** 导出按钮操作 */
function handleExport() {
proxy.download("comdict/export", {
...queryParams.value,
}, `user_${new Date().getTime()}.xlsx`);
};
const clearCacheHandle = () => {
clearCache().then(() => {
proxy.$modal.msgSuccess("清理成功");
handleQuery();
});
};
/** 下载模板操作 */
function importTemplate() {
proxy.download("comdict/importTemplate", {
}, `user_template_${new Date().getTime()}.xlsx`);
};
/** 提交上传文件 */
function submitFileForm() {
proxy.$refs["uploadRef"].submit();
};
/**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => {
upload.isUploading = true;
};
/** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => {
upload.open = false;
upload.isUploading = false;
proxy.$refs["uploadRef"].handleRemove(file);
proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
handleQuery()
};
//多选框选中数据
function handleSelectionChange(selection) {
info.value = selection[0]
single.value = selection.length != 1;
}
function submitForm() {
proxy.$refs["dictRef"].validate(valid => {
if (valid) {
if (title.value == '编辑字典') {
updateComDictService(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addComDictService(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}
function cancel() {
open.value = false;
reset();
}
onMounted(() => {
getTypeList()
})
</script>
<style scoped lang="scss">
.card-content {
.card-content {
max-height: 450px;
/* 设置最大高度 */
overflow-y: auto;
/* 超出高度时显示垂直滚动条 */
padding: 16px;
/* 保持与卡片默认一致的内边距 */
}
.clickable:hover {
cursor: pointer;
/* 鼠标悬停时显示手型 */
transition: all 0.3s;
/* 平滑过渡效果 */
color: blue;
}
}
.filter-tree {
height: 80vh;
overflow-y: auto;
}
</style>

View File

@ -7,14 +7,16 @@
<template>
<div class="app-container">
<div class="section-card">
<el-button type="primary" plain>检索</el-button>
<el-button type="primary" plain>确认接收</el-button>
</div>
<!-- 申请单信息卡片 -->
<div class="section-card">
<div class="section-title">申请单信息</div>
<el-form :model="applyForm" label-position="top" class="form-top-label">
<!-- 第1行 6项 -->
<el-form :model="applyForm" label-width="auto">
<div class="form-row row-six">
<el-form-item label="血袋条码:">
<!-- 血袋条码输入框保持可编辑,添加扫码触发事件 -->
<el-input v-model="bloodForm.bagBarcode" placeholder="请扫码或输入血袋条码" @change="handleBagBarcodeScan"
@keyup.enter="handleBagBarcodeScan" />
</el-form-item>
@ -36,7 +38,6 @@
</el-form-item>
</div>
<!-- 第2行 6项 -->
<div class="form-row row-six">
<el-form-item label="病 区:">
<el-input v-model="applyForm.ward" placeholder="" readonly />
@ -58,7 +59,6 @@
</el-form-item>
</div>
<!-- 第3行 6项 -->
<div class="form-row row-six">
<el-form-item label="输血目的:">
<el-input v-model="applyForm.purpose" placeholder="" readonly />
@ -84,7 +84,6 @@
</el-form-item>
</div>
<!-- 第4行 6项 -->
<div class="form-row row-six">
<el-form-item label="ABO复核:">
<el-input v-model="applyForm.aboCheck" placeholder="" readonly />
@ -116,7 +115,7 @@
<!-- 发血单主信息卡片 -->
<div class="section-card">
<div class="section-title">发血单主信息</div>
<el-form :model="bloodForm" label-position="top" class="form-top-label">
<el-form :model="bloodForm" label-width="auto">
<div class="form-row row-six">
<el-form-item label="发血时间:">
<el-date-picker v-model="bloodForm.sendTime" type="datetime" format="YYYY-MM-DD HH:mm:ss"
@ -147,7 +146,7 @@
<el-radio label="none">全否</el-radio>
</el-radio-group>
</div>
<el-table :data="detailTableData" border stripe size="small">
<el-table :data="detailTableData" border height="30vh">
<el-table-column label="序号" prop="index" align="center" width="50" />
<el-table-column label="血液流水号" prop="bloodSn" align="center" />
<el-table-column label="产品码" prop="productCode" align="center" />
@ -161,10 +160,7 @@
<el-table-column label="血液是否已接收" prop="isReceived" align="center" />
</el-table>
<div class="btn-bottom">
<el-button type="primary">确认接收</el-button>
<el-button>取消</el-button>
</div>
</div>
@ -242,19 +238,16 @@ const handleBagBarcodeScan = async () => {
.section-card {
background: #ffffff;
border-radius: 8px;
border-radius: 4px;
padding: 12px 16px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
&:hover {
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.12); // 悬停加深阴影
}
.section-title {
font-size: 15px;
font-weight: 600;
color: #303133;
margin-bottom: 16px;
margin-bottom: 10px;
display: flex;
align-items: center;
@ -269,17 +262,17 @@ const handleBagBarcodeScan = async () => {
}
}
.form-top-label {
:deep(.el-form-item__label) {
padding: 0 0 3px 0;
margin-bottom: 0;
}
:deep(.el-form-item) {
margin-bottom: 8px;
}
:deep(.el-form-item__label) {
padding: 0 0 3px 0;
margin-bottom: 0;
}
:deep(.el-form-item) {
margin-bottom: 6px;
}
/* 核心:固定一行6列,均分宽度 */
.form-row {
display: flex;