输血管理

This commit is contained in:
wuyy 2026-06-26 17:55:13 +08:00
parent d1ba068d7b
commit b3e26589ef
17 changed files with 2167 additions and 37 deletions

View File

@ -43,4 +43,12 @@ export function getComDicts(data?: Object) {
method: 'get',
params: data
})
}
// 清空缓存
export function clearCache(data?: Object) {
return request({
url: '/bus/bloodbank/dmzd/clear',
method: 'get',
params: data
})
}

View File

@ -135,6 +135,45 @@ aside {
box-sizing: border-box;
}
.card-box {
background: #fff;
border-radius: 4px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
padding: 10px;
margin-bottom: 10px;
.section-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;
}
}
}
.separator {
width: 6%;
display: inline-block;
text-align: center;
}
.components-container {
margin: 30px 50px;
position: relative;

View File

@ -0,0 +1,157 @@
/**
* @file index.vue
* @description: 下拉表格选择
* @author: w
* @since: 2026-06-18
*/
<template>
<div class="dropdown-table-select" :style="{ width: inputWidth }">
<el-dropdown ref="dropdownRef" trigger="manual" placement="bottom-start" style="width:100%">
<div class="input-wrap" style="width:100%">
<el-input v-model="inputText" :placeholder="placeholder" @keydown.enter.prevent="handleInputEnter" />
<span class="arrow-icon" @click.stop="toggleDropdown">
<el-icon>
<ArrowDown />
</el-icon>
</span>
</div>
<template #dropdown>
<div class="table-panel" :style="{ width: panelWidth }">
<el-table :data="tableData" border :height="tableHeight" @row-click="handleRowClick" v-loading="tableLoading">
<el-table-column v-for="col in columnList" :key="col.prop" :label="col.label" :prop="col.prop"
:width="col.width" :align="col.align || 'center'" />
</el-table>
</div>
</template>
</el-dropdown>
</div>
</template>
<script setup lang="ts">
export interface TableColumnItem {
label: string
prop: string
width?: string
align?: 'left' | 'center' | 'right'
}
export type TableRowItem = Record<string, any>
const props = defineProps({
// 绑定值
modelValue: {
type: String,
default: ''
},
// 占位符
placeholder: {
type: String,
default: ''
},
// 绑定值字段
labelField: {
type: String,
default: 'billNo'
},
// 输入框宽度
inputWidth: {
type: String,
default: '100%'
},
// 下拉面板宽度
panelWidth: {
type: String,
default: '700px'
},
//表格高度
tableHeight: {
type: String,
default: '150px'
},
// 表格列 父必传,无默认值
columnList: {
type: Array as () => TableColumnItem[],
required: true
},
// 表格数据 父必传
tableData: {
type: Array as () => TableRowItem[],
required: true
}
})
const emit = defineEmits<{
'update:modelValue': [val: string]
change: [row: TableRowItem]
open: []
search: [val: string]
}>()
const bindField = props.labelField ?? 'billNo'
const dropdownRef = useTemplateRef('dropdownRef')
const showPanel = ref(false)
const inputText = ref('')
const tableLoading = ref(false)
watch(
() => props.modelValue,
(val) => {
inputText.value = val ?? ''
},
{ immediate: true }
)
watch(inputText, (val) => {
emit('update:modelValue', val)
})
// 回车处理
const handleInputEnter = (e: KeyboardEvent) => {
e.stopPropagation();
emit('search', inputText.value)
}
// 仅点击箭头才切换下拉
const toggleDropdown = () => {
if (!dropdownRef.value) return
showPanel.value = !showPanel.value
if (showPanel.value) {
dropdownRef.value.handleOpen()
tableLoading.value = true
emit('open')
setTimeout(() => {
tableLoading.value = false
}, 300)
} else {
dropdownRef.value.handleClose()
}
}
// 行点击选中
const handleRowClick = (row: TableRowItem) => {
const text = row[bindField] ?? ''
inputText.value = text
emit('update:modelValue', text)
emit('change', row)
dropdownRef.value?.handleClose()
showPanel.value = false
}
</script>
<style scoped lang="scss">
.dropdown-table-select {
.input-wrap {
position: relative;
}
.arrow-icon {
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
color: #909399;
z-index: 999 !important;
pointer-events: auto !important;
font-size: 16px;
transition: transform 0.2s;
}
.table-panel {
padding: 12px;
}
}
</style>

View File

@ -55,9 +55,9 @@ import ImagePreview from "@/components/ImagePreview/index.vue"
// 字典标签组件
import DictTag from '@/components/DictTag/index.vue'
// elTable表格组件
import CustomTable from '@/components/elTable/index.vue'
import CustomTable from '@/components/ElTable/index.vue'
// vxeTable 组件
import CustomVxeTable from '@/components/vxeTable/index.vue'
import CustomVxeTable from '@/components/VxeTable/index.vue'
// 下拉框表格组件
import SelectTable from '@/components/SelectTable/index.vue'
const app = createApp(App)

View File

@ -123,10 +123,27 @@ service.interceptors.response.use((res: any) => {
} else if (code === 601) {
ElMessage({ message: msg, type: 'warning' })
return Promise.reject(new Error(msg))
} else if (code === 1) {
ElNotification({
title: '提示',
message: msg,
type: 'error',
duration: 0,
})
return Promise.resolve(res.data)
} else if (code === 3) {
ElMessage({
message: msg,
type: 'success'
})
return Promise.resolve(res.data)
} else if (code === 4) {
return Promise.resolve(res.data)
} else if (code !== 200 && code !== 0) {
ElNotification.error({ title: msg })
return Promise.reject('error')
} else {
}
else {
return Promise.resolve(res.data)
}
},

View File

@ -0,0 +1,430 @@
/**
* @file index.vue
* @description: 交叉配血
* @author: w
* @since: 2026-06-18
*/
<template>
<div class="box-container">
<!-- 顶部操作按钮栏 -->
<div class="card-box">
<el-button type="primary" plain @click="openJsHandle">检索</el-button>
<el-button type="primary" plain>新增单据</el-button>
<el-button type="danger" plain>删除单据</el-button>
<el-button type="danger" 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="main-wrap">
<!-- 左侧主表单区域 -->
<el-row :gutter="10">
<el-col :span="15">
<!-- 申请单信息卡片 -->
<div class="card-box">
<div class="section-title">申请单信息</div>
<el-form :model="formData" label-width="auto">
<!-- 使用el-row实现一行四个表单项 -->
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="申请单号">
<DropdownTableSelect v-model="formData.applyBillNo" :column-list="applyColumns"
labelField="applyBillNo" :table-data="applyTableData" @open="loadApplyData"
@search="handleSearch" />
</el-form-item>
</el-col>
<el-col :span="6">
<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" placeholder="0000-00-00 00:00" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="姓 名">
<el-input v-model="formData.patientName" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="血型">
<el-input v-model="formData.bloodType" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="性 别">
<el-select v-model="formData.gender" placeholder="请选择">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="年 龄">
<el-input v-model="formData.age" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="住院号/ID号">
<el-input v-model="formData.hospitalId" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="Rh(D)">
<el-input v-model="formData.rhD" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="病 区">
<el-input v-model="formData.ward" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="科 室">
<el-input v-model="formData.department" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="床位号">
<el-input v-model="formData.bedNo" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="临床诊断">
<el-input v-model="formData.diagnosis" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="输血目的">
<el-input v-model="formData.transPurpose" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="5">
<el-form-item label="申请血型">
<el-input v-model="formData.applyBloodType" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="ABO复核">
<el-input v-model="formData.aboCheck" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="亚型">
<el-input v-model="formData.subType" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="Rh(D)复核">
<el-input v-model="formData.rhDCheck" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="抗体筛选">
<el-input v-model="formData.antibodyScreen" placeholder="" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="15">
<el-form-item label=" ">
<div class="checkbox-group">
<el-checkbox v-model="formData.transReactionHis">输血反应史</el-checkbox>
<el-checkbox v-model="formData.transHistory">输血史</el-checkbox>
<el-checkbox v-model="formData.deliverHistory">分娩史</el-checkbox>
<el-checkbox v-model="formData.pregnancyHistory">妊娠史</el-checkbox>
<el-checkbox v-model="formData.matchHistory">配型史</el-checkbox>
</div>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="预定输血日期">
<el-date-picker v-model="formData.preTransDate" type="datetime" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss" placeholder="0000-00-00 00:00" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 血液申请表格 - 固定高度确保一屏展示 -->
<el-table :data="bloodApplyTable" border height="160">
<el-table-column label="血液品种" prop="bloodKind" align="center" />
<el-table-column label="申请血量" prop="applyNum" align="center" />
<el-table-column label="单位" prop="unit" align="center" />
<el-table-column label="申请血型" prop="applyBlood" align="center" />
<el-table-column label="替代血液品种" prop="replaceBlood" align="center" />
<el-table-column label="输血目的" prop="transGoal" align="center" />
<el-table-column label="输血指征" prop="transIndex" align="center" />
</el-table>
</div>
<!-- 配血记录卡片 - 固定高度确保一屏展示 -->
<div class="card-box" style="margin-bottom: 0px;">
<div class="section-title">配血记录</div>
<div class="mb10">
<el-select v-model="matchSelect" placeholder="请选择" style="width: 150px">
<el-option label="增加配血血液" value="add" />
<el-option label="取消配血血液" value="cancel" />
</el-select>
<el-input v-model="searchText" placeholder="" style="width: 250px;margin-left: 20px;" />
</div>
<el-table :data="matchTable" border height="200" stripe>
<el-table-column label="序号" prop="index" align="center" width="60" />
<el-table-column label="复核者" prop="checkUser" align="center" />
<el-table-column label="血液流水号" prop="bloodSerial" align="center" width="120" />
<el-table-column label="产品码" prop="productCode" align="center" />
<el-table-column label="血液品种" prop="bloodType" align="center" />
<el-table-column label="血型" prop="abo" align="center" />
<el-table-column label="Rh(D)" prop="rh" align="center" />
<el-table-column label="容量" prop="capacity" align="center" />
<el-table-column label="供者血型复核" prop="donorAbo" align="center" width="120" />
<el-table-column label="供者Rh(D)复核" prop="donorRh" align="center" width="120" />
<el-table-column label="配血方法" prop="donorRh" align="center" />
<el-table-column label="复核配血方法" prop="donorRh" align="center" width="120" />
<el-table-column label="主侧" prop="donorRh" align="center" />
<el-table-column label="次侧" prop="donorRh" align="center" />
<el-table-column label="结果" prop="donorRh" align="center" />
<el-table-column label="配血日期" prop="donorRh" align="center" />
<el-table-column label="配血者" prop="donorRh" align="center" />
<el-table-column label="血液存放位子" prop="donorRh" align="center" width="120" />
<el-table-column label="标本存放位子" prop="donorRh" align="center" width="120" />
</el-table>
</div>
</el-col>
<!-- 右侧筛选+结果表格区域 -->
<el-col :span="9">
<div class="card-box" style="margin-bottom: 0px;">
<el-form :model="filterForm" inline>
<div>
<el-form-item label="姓名:">
<el-input v-model="filterForm.name" placeholder="" style="width: 120px" />
</el-form-item>
<el-form-item label="状态:">
<el-select v-model="filterForm.status" placeholder="全部" style="width: 150px">
<el-option label="全部" value="" />
</el-select>
</el-form-item>
<el-form-item label="">
<el-button type="primary" plain @click="handleRefresh">刷新</el-button>
</el-form-item>
</div>
<div>
<el-form-item label="时间:">
<el-date-picker v-model="filterForm.startTime" type="date" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
<span class="timesplit">-</span>
<el-date-picker v-model="filterForm.endTime" type="date" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
</el-form-item>
</div>
</el-form>
<div class="result-table-card">
<el-table :data="resultTable" border height="645px">
<el-table-column label="配血日期" prop="matchDate" align="center" />
<el-table-column label="患者姓名" prop="patName" align="center" />
<el-table-column label="单据状态" prop="billStatus" align="center" />
<el-table-column label="配血单号" prop="matchNo" align="center" />
<el-table-column label="申请单号" prop="applyBillNo" align="center" />
<el-table-column label="科室" prop="dept" align="center" />
<el-table-column label="ABO复核" prop="aboResult" align="center" />
<el-table-column label="Rh(D)复核" prop="rhResult" align="center" />
</el-table>
</div>
</div>
</el-col>
</el-row>
</div>
<el-dialog title="常规配血单检索" v-model="visible" width="1200px" :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="10">
<el-col :span="10">
<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">-</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="7">
<el-form-item label="配血单号">
<el-input v-model="searchForm.bill_no" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="科室">
<!-- <el-input v-model="searchForm.ks" placeholder="" /> -->
<SelectTable v-model:data="searchForm.ks" :tableData="dictData.ks" placeholder="" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="10">
<el-form-item label="申请单号">
<el-input v-model="searchForm.bill_no" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="7">
<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 height="350" @row-click="handleRowClick" highlight-current-row>
<el-table-column prop="patient_name" label="患者姓名" align="center" />
<el-table-column prop="patient_name" label="单据状态" align="center" />
<el-table-column prop="bill_no" label="配血单号" align="center" width="150" />
<el-table-column prop="bill_no" label="申请单号" align="center" width="150" />
<el-table-column prop="bill_no" label="住院号/ID号" align="center" width="150" />
<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="assess_data" label="配血日期" width="150" align="center" />
<el-table-column prop="beinhos_id" label="ABO复核" align="center" />
<el-table-column prop="assess_person" label="Rh(D)复核" align="center" />
</el-table>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import DropdownTableSelect, { type TableColumnItem, type TableRowItem } from '@/components/DropdownTableSelect/index.vue'
import dayjs from 'dayjs'
import { getDictData, formatDict, dictData } from '@/hooks'
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 applyColumns = ref<TableColumnItem[]>([
{ label: '申请单号', prop: 'applyBillNo' },
{ label: '患者姓名', prop: 'patientName' },
{ label: '科室', prop: 'dept' },
{ label: '申请品种', prop: 'bloodKind' }
])
const applyTableData = ref<TableRowItem[]>([])
const searchText = ref('')
const matchSelect = ref('add')
// 主表单数据
const formData = ref({})
// 右侧筛选表单
const filterForm = reactive({
name: '',
status: '',
startTime: dayjs().format('YYYY-MM-DD'),
endTime: dayjs().format('YYYY-MM-DD'),
})
// 配血操作单选
const matchRadio = ref('add')
// 血液申请表格
const bloodApplyTable = ref([])
// 配血记录表格
const matchTable = ref([])
// 右侧结果列表
const resultTable = ref([])
const openJsHandle = () => {
visible.value = true
}
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: ''
}
}
const handleConfirm = () => {
}
const handleRowClick = (row: any) => {
console.log('点击行', row)
}
// 刷新右侧列表
const handleRefresh = () => {
console.log('刷新右侧配血列表', filterForm)
}
const loadApplyData = () => {
}
const handleSearch = () => {
}
onMounted(() => {
getDictData('ks')
})
</script>
<style scoped lang="scss">
.box-container {
overflow-y: auto;
// 主体左右容器
.main-wrap {
height: calc(100% - 70px);
.timesplit {
margin: 0 5px;
color: #999;
}
}
// 通用卡片样式(对齐规范)
.card-box {
:deep(.el-form-item) {
margin-bottom: 8px;
}
.space-item {
margin-right: 10px;
}
}
}
</style>

View File

@ -0,0 +1,235 @@
<template>
<div class="basic-info">
<el-form label-width="">
<div class="section-title">患者信息</div>
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="评估单号" label-width="70">
<el-input readonly />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="住院号/ID号">
<el-input v-model="patientInfo.visitNo" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="姓名">
<el-input v-model="patientInfo.name" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="性别">
<el-select v-model="patientInfo.gender" placeholder="">
<el-option label="男" value="男" />
<el-option label="女" value="女" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="年龄">
<el-input v-model="patientInfo.age" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="科室" label-width="70">
<SelectTable v-model:data="patientInfo.department" dict-type="ks" />
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="">
<el-checkbox v-model="localFlags.surgeryDept">是否手术科室</el-checkbox>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="ABO血型">
<el-input v-model="patientInfo.abo" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="上级医师">
<el-input v-model="patientInfo.seniorDoctor" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="临床诊断" label-width="70">
<el-input v-model="patientInfo.diagnosis" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="住院时间">
<el-date-picker v-model="patientInfo.stime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
style="width: 47%" />
<span class="separator">-</span>
<el-date-picker v-model="patientInfo.etime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
style="width: 47%" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="5">
<el-checkbox v-model="patientInfo.immunologyChecked">输血前是否有免疫学检查</el-checkbox>
</el-col>
<el-col :span="2">
<el-checkbox v-model="patientInfo.transfusionHistory">输血史</el-checkbox>
</el-col>
<el-col :span="3">
<el-checkbox v-model="patientInfo.adverseReaction">输血不良反应</el-checkbox>
</el-col>
<el-col :span="5">
<el-form-item label="贫血类型">
<el-select v-model="patientInfo.anemiaType">
<el-option label="急性" value="急性" />
<el-option label="慢性" value="慢性" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="贫血原因">
<el-select v-model="patientInfo.anemiaReason">
<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="转归">
<el-select v-model="patientInfo.outcomeReason">
<el-option label="死亡" value="死亡" />
<el-option label="好转" value="好转" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<div class="line"></div>
<div>
<div class="section-title">
<div> 血液检验信息 </div>
<div>
<el-button size="small" type="primary" @click="addBloodTest">增加</el-button>
<el-button size="small" type="danger" @click="deleteBloodTests">删除</el-button>
</div>
</div>
<el-table :data="bloodTests" border height="140" highlight-current-row @row-click="handleRowClick">
<el-table-column label="时间" prop="time" />
<el-table-column label="Hgb(g/L)" prop="hgb" />
<el-table-column label="Hct(%)" prop="hct" />
<el-table-column label="Plt(10^9/L)" prop="plt" />
<el-table-column label="PT(s)" prop="pt" />
<el-table-column label="APTT(s)" prop="aptt" />
<el-table-column label="Fib(g/L)" prop="fib" />
<el-table-column label="总蛋白(mg/L)" prop="totalProtein" />
<el-table-column label="白蛋白(mg/L)" prop="albumin" />
</el-table>
</div>
<div class="section-title mt10">治疗过程信息</div>
<el-row :gutter="10">
<el-col :span="16">
<el-table :data="td" border style="width:100%" height="160">
<el-table-column prop="time" label="时间" align="center" />
<el-table-column prop="bloodKind" label="血液品种" align="center" />
<el-table-column prop="unit" label="单位" align="center" />
<el-table-column prop="amount" label="实际采血量" align="center" />
</el-table>
</el-col>
<el-col :span="8">
<div class="checkbox-line">
<el-checkbox v-model="localFlags.signedConsent">是否已签署输血知情同意书</el-checkbox>
<el-checkbox v-model="localFlags.safetyEntry">有无输血安全处置单录入</el-checkbox>
<el-checkbox v-model="localFlags.hasGap">有无缺项</el-checkbox>
<div>
<el-checkbox v-model="localFlags.hasBloodRecord">是否有输血记录</el-checkbox>
<el-checkbox v-model="localFlags.incompleteRecord"
:disabled="!localFlags.hasBloodRecord">输血记录不全</el-checkbox>
</div>
<el-checkbox v-model="localFlags.preMedication">输血前用药</el-checkbox>
</div>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
const props = defineProps({
treatmentData: { type: Array, default: () => [] },
flags: { type: Object, default: () => ({ signedConsent: false, safetyEntry: false, hasContraindication: false, hasBloodRecord: false, incompleteRecord: false, hasGap: false, preMedication: false, surgeryDept: false }) }
})
const { treatmentData: td, flags } = toRefs(props)
// local copy of flags to allow v-model in this component
const localFlags = reactive({ ...flags.value })
watch(flags, (val) => {
Object.assign(localFlags, val)
})
// patient local fields added (complete set used by template)
const patientInfo = reactive({
visitNo: '',
name: '',
gender: '',
age: '',
department: '',
abo: '',
diagnosis: '',
seniorDoctor: '',
admissionStart: null as null | string,
admissionEnd: null as null | string,
immunologyChecked: false,
transfusionHistory: false,
adverseReaction: false,
anemiaType: '',
anemiaReason: '',
outcome: ''
})
// 血液检验信息数据与选择
const bloodTests = ref<Array<any>>([])
const selectedRow = ref(null)
const handleRowClick = (row: any) => {
selectedRow.value = row
}
const addBloodTest = () => {
bloodTests.value.push({ time: '', hgb: '', hct: '', plt: '', pt: '', aptt: '', fib: '', totalProtein: '', albumin: '' })
}
const deleteBloodTests = () => {
if (!selectedRow.value) return
bloodTests.value = bloodTests.value.filter(item => item !== selectedRow.value)
selectedRow.value = null
}
watch(localFlags, (val) => {
// emit update if needed in future
})
</script>
<style scoped lang="scss">
.basic-info {
.el-form-item {
margin-bottom: 8px;
}
.checkbox-line {
display: flex;
flex-direction: column;
}
.line {
height: 1px;
background-color: #ccc;
margin-bottom: 10px;
}
}
</style>

View File

@ -0,0 +1,105 @@
<template>
<div>
<div class="section-title">输血申请不合理用血指征列表</div>
<el-table :data="transfusionIndicators" border height="220" highlight-current-row>
<el-table-column prop="applyNo" label="申请单号" align="center" />
<el-table-column prop="bloodKind" label="血液品种" align="center" />
<el-table-column prop="actualVolume" label="实际发血容量" align="center" />
<el-table-column prop="unit" label="单位" align="center" />
<el-table-column prop="indicator" width="340" label="不合理输血指征" align="center" />
</el-table>
<div class="indicator-panel">
<div class="indicator-left">
<div class="section-title">输血指征评估信息</div>
<el-form class="indicator-form">
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="申请单号:">
<el-input v-model="indicatorEvaluation.applyNo" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="血液类型:">
<el-input v-model="indicatorEvaluation.bloodType" readonly />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="其他不合理用血理由:" label-position="top">
<el-input type="textarea" :rows="2" v-model="indicatorEvaluation.reason" />
</el-form-item>
<el-form-item label="本申请单评估结论:">
<el-radio-group v-model="indicatorEvaluation.result">
<el-radio label="合理">合理</el-radio>
<el-radio label="不合理">不合理</el-radio>
</el-radio-group>
</el-form-item>
<div class="indicator-summary">共:{{ transfusionIndicators.length }} 单</div>
</el-form>
</div>
<div class="indicator-right">
<div class="section-title">指征明细</div>
<el-table :data="indicatorDetails" border height="245">
<el-table-column prop="row" label="行" width="60" align="center" />
<el-table-column prop="name" label="输血指征名称" align="center" />
<el-table-column prop="isRational" label="是否合理" align="center" />
<el-table-column prop="applyNo" label="申请单号" align="center" />
</el-table>
</div>
</div>
</div>
</template>
<script setup lang="ts">
const transfusionIndicators = ref([
{ applyNo: '', bloodKind: '', actualVolume: '', unit: '', indicator: '' }
])
const indicatorEvaluation = reactive({
applyNo: '',
bloodType: '',
reason: '',
result: '合理'
})
const indicatorDetails = ref([])
</script>
<style scoped lang="scss">
.indicator-panel {
display: flex;
gap: 12px;
margin-top: 12px;
}
.indicator-left,
.indicator-right {
background: #fff;
padding: 12px;
border: 1px solid #ebeef5;
border-radius: 4px;
}
.indicator-left {
flex: 1 1 45%;
min-width: 320px;
}
.indicator-right {
flex: 1 1 55%;
min-width: 320px;
}
.indicator-form .el-form-item {
margin-bottom: 10px;
}
.indicator-summary {
margin-top: 10px;
font-weight: 600;
color: #d12b2b;
}
</style>

View File

@ -0,0 +1,16 @@
<template>
<div>
<el-table :data="[]" border>
<el-table-column label="申请单号" align="center" />
<el-table-column label="检验时间" align="center" />
<el-table-column label="@col" align="center" />
</el-table>
</div>
</template>
<script setup lang="ts">
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,10 @@
<template>
<div>
<div class="section-title">检验结果趋势图</div>
</div>
</template>
<script setup lang="ts">
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,135 @@
/**
* @file index.vue
* @description: 输血合理性评估
* @author: w
* @since: 2026-06-24
*/
<template>
<div class="box-container">
<div class="card-box toolbar-box">
<el-button type="primary" plain @click="onSearch">检索</el-button>
<el-button type="primary" plain @click="onNew">选择申请单</el-button>
<el-button type="primary" plain @click="onAdd">新增单据</el-button>
<el-button type="danger" plain @click="onDelete">删除单据</el-button>
<el-button type="success" plain @click="onSave">保存</el-button>
</div>
<el-row :gutter="10">
<el-col :span="15">
<div class="card-box">
<el-tabs v-model="activeTabName" type="card" class="tabs_box">
<el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.label" :name="tab.name"></el-tab-pane>
</el-tabs>
<div class="tab-content">
<component :is="currentComponent" v-bind="currentProps" />
</div>
</div>
<div class="card-box bottom-box">
<div class="section-title">合理用血评估结论</div>
<el-row :gutter="10">
<el-col :span="7">
<el-form-item label="是否合理用血">
<el-select v-model="conclusion.isRational" placeholder="请选择">
<el-option label="不合理" value="1" />
<el-option label="部分合理" value="2" />
<el-option label="合理" value="3" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="17">
<el-form-item label="评估结论">
<el-input v-model="conclusion.text" placeholder="请输入评估结论" />
</el-form-item>
</el-col>
</el-row>
</div>
</el-col>
<el-col :span="9">
<!-- 右侧暂空,后续放置相关信息或操作 -->
</el-col>
</el-row>
</div>
</template>
<script setup lang="ts">
import BasicInfo from './components/BasicInfo.vue'
import BloodIndicators from './components/BloodIndicators.vue'
import HistoryTests from './components/HistoryTests.vue'
import ResultChart from './components/ResultChart.vue'
// toolbar state
const tabs = [
{ name: 'basic', label: '基本信息', comp: BasicInfo },
{ name: 'indicators', label: '输血指标信息', comp: BloodIndicators },
{ name: 'history', label: '历史检验信息', comp: HistoryTests },
{ name: 'result', label: '结果提示图', comp: ResultChart }
]
const activeTabName = ref('basic')
const currentComponent = computed(() => {
const t = tabs.find((i) => i.name === activeTabName.value)
return t ? t.comp : BasicInfo
})
// bottom area data (to be passed into BasicInfo)
const treatmentData = ref([])
const flags = ref({ signedConsent: false, safetyEntry: false, hasContraindication: false })
// 合理用血评估结论
const conclusion = ref({ isRational: null as boolean | null, text: '' })
// pass props to dynamic component when needed
const currentProps = computed(() => {
if (activeTabName.value === 'basic') {
return { treatmentData: treatmentData.value, flags: flags.value }
}
return {}
})
// toolbar actions (placeholders)
const onSearch = () => { console.log('search') }
const onNew = () => { console.log('select apply') }
const onAdd = () => { console.log('new') }
const onDelete = () => { console.log('delete') }
const onSave = () => { console.log('save') }
</script>
<style scoped lang="scss">
.box-container {
overflow-y: auto;
}
.toolbar-checkbox {
margin-left: 8px
}
.tab-content {
min-height: 65vh;
padding: 10px;
}
.bottom-box {
margin-bottom: 0;
padding-left: 22px;
.el-form-item {
margin-bottom: 0
}
}
.section-title {
font-weight: 600;
margin-bottom: 8px
}
</style>

View File

@ -0,0 +1,395 @@
/**
* @file index.vue
* @description: 血型复核
* @author: w
* @since: 2026-06-23
*/
<template>
<div class="box-container">
<!-- 顶部操作按钮栏 -->
<div class="card-box">
<el-button type="primary" plain @click="openJsHandle">检索</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 plain>血型复核历史查询</el-button>
</div>
<el-form label-width="auto">
<!-- 主卡片面板 -->
<div class="card-box">
<!-- 顶部复选框行 -->
<div class="checkbox-row">
<el-checkbox v-model="form.urgent">紧急</el-checkbox>
<el-checkbox v-model="form.urgentMatch">是否紧急配血</el-checkbox>
<el-checkbox v-model="form.specialBlood">是否特殊血型</el-checkbox>
<el-checkbox v-model="form.autoPrint">保存后打印</el-checkbox>
</div>
<el-row>
<el-col :span="18">
<div class="section-title">申请信息</div>
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="申请单号">
<DropdownTableSelect v-model="form.applyBillNo" :column-list="applyColumns" labelField="applyBillNo"
:table-data="applyTableData" @open="loadApplyData" @search="handleSearch" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="申请日期">
<el-date-picker v-model="form.applyDate" type="datetime" placeholder="0000-00-00 00:00"
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" readonly />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="姓 名">
<el-input v-model="form.patientName" readonly />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="血型">
<el-input v-model="form.bloodType" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="性 别">
<el-input v-model="form.patient_sex" readonly />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="年 龄">
<el-input v-model="form.age" readonly />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="住院号/ID号">
<el-input v-model="form.inHospitalNo" readonly />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="Rh(D)">
<el-input v-model="form.rhd" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="病 区">
<el-input v-model="form.ward" readonly />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="床位号">
<el-input v-model="form.bedNo" readonly />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="科 室">
<el-input v-model="form.dept_id" readonly />
<!-- <SelectTable v-model:data="form.dept_id" :tableData="dictData.ks" placeholder="" disabled /> -->
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="临床诊断">
<el-input v-model="form.diagnosis" readonly />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预定输血日期">
<el-date-picker v-model="form.planTransDate" type="datetime" placeholder="0000-00-00 00:00"
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" readonly />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6"></el-col>
</el-row>
<!-- 病史复选框行 -->
<div class="checkbox-row">
<el-checkbox v-model="form.transReactionHis">输血反应史</el-checkbox>
<el-checkbox v-model="form.transHis">输血史</el-checkbox>
<el-checkbox v-model="form.deliveryHis">分娩史</el-checkbox>
<el-checkbox v-model="form.pregnancyHis">妊娠史</el-checkbox>
<el-checkbox v-model="form.matchHis">配型史</el-checkbox>
</div>
<!-- 血液品种表格 -->
<el-table :data="bloodTableData" border height="150">
<el-table-column label="血液品种" prop="bloodKind" align="center" />
<el-table-column label="申请血量" prop="applyNum" align="center" />
<el-table-column label="单位" prop="unit" align="center" />
<el-table-column label="申请血型" prop="applyBloodType" align="center" />
<el-table-column label="替代血液品种" prop="replaceBloodKind" align="center" />
<el-table-column label="输血目的" prop="transPurpose" align="center" />
<el-table-column label="输血指征" prop="transIndicate" align="center" />
<el-table-column label="实际用血量" prop="realNum" align="center" />
</el-table>
</div>
<div class="card-box">
<el-row>
<el-col :span="18">
<div class="section-title">实验信息</div>
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="ABO正定复核">
<div class="input-btn-row">
<el-input v-model="form.aboPositiveCheck" />
<el-button type="primary" plain>清空</el-button>
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="ABO反定复核">
<div class="input-btn-row">
<el-input v-model="form.aboReverseCheck" />
<el-button type="primary" plain>清空</el-button>
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="ABO复核结果">
<el-input v-model="form.aboResult" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="Rh(D)复核结果">
<el-input v-model="form.rhdResult" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="抗筛I">
<el-input v-model="form.antiScreen1" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="抗筛II">
<el-input v-model="form.antiScreen2" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="抗体筛选结果">
<el-input v-model="form.antiResult" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="复检人">
<el-input v-model="form.recheckUser" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="抗筛III">
<el-input v-model="form.antiScreen3" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="抗人球蛋白试验">
<el-input v-model="form.globulinTest" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="血小板抗体检测">
<el-input v-model="form.plateTest" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="检验人">
<el-input v-model="form.testUser" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="备 注">
<el-input v-model="form.remark" />
</el-form-item>
</el-col>
<el-col :span="6" v-if="form.specialBlood">
<el-form-item label="亚 型" class="redText">
<el-input v-model="form.remark" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="检验时间">
<el-date-picker v-model="form.testTime" type="datetime" style="width:100%" />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6"></el-col>
</el-row>
</div>
</el-form>
<el-dialog title="血型复核单检索" v-model="visible" width="1200px" :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="10">
<el-col :span="10">
<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">-</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="7">
<el-form-item label="血型复核单">
<el-input v-model="searchForm.bill_no" placeholder="" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="10">
<el-form-item label="申请单号">
<el-input v-model="searchForm.bill_no" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="7">
<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 height="350" @row-click="handleRowClick" highlight-current-row>
<el-table-column prop="bill_no" label="配血单号" align="center" width="150" />
<el-table-column prop="bill_no" label="申请单号" align="center" width="150" />
<el-table-column prop="bill_no" label="住院号/ID号" align="center" width="150" />
<el-table-column prop="patient_name" label="患者姓名" align="center" />
<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="assess_data" label="检验人" align="center" />
<el-table-column prop="assess_data" label="检验日期" width="150" align="center" />
<el-table-column prop="beinhos_id" label="ABO血型" align="center" />
<el-table-column prop="assess_person" label="Rh(D)复核" align="center" />
<el-table-column prop="assess_person" label="抗体筛选" align="center" />
<el-table-column prop="assess_person" label="单据状态" align="center" />
</el-table>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { getDictData, formatDict, dictData } from '@/hooks'
import DropdownTableSelect, { type TableColumnItem, type TableRowItem } from '@/components/DropdownTableSelect/index.vue'
import dayjs from 'dayjs'
const visible = ref(false)
const tableData = ref([])
const searchForm = ref({})
// 下拉申请单列配置
const applyColumns = ref<TableColumnItem[]>([
{ label: '申请单号', prop: 'applyBillNo' },
{ label: '患者姓名', prop: 'patientName' },
{ label: '科室', prop: 'dept' },
{ label: '申请品种', prop: 'bloodKind' }
])
const applyTableData = ref<TableRowItem[]>([])
// 下拉面板展开加载申请单数据
const loadApplyData = () => {
console.log('open');
// 申请单数据
applyTableData.value = [
{ applyBillNo: 'SX20260618001', patientName: '张三', dept: '骨科', bloodKind: '悬浮红细胞' }
]
}
const openJsHandle = () => {
visible.value = true
}
const handleClose = () => {
searchForm.value = {}
visible.value = false
}
const handleConfirm = () => {
visible.value = false
}
const handleRowClick = (row: TableRowItem) => {
console.log("🚀 ~ handleRowClick ~ row:", row)
}
const handleSearch = (val: string) => {
console.log("🚀 ~ handleSearch ~ val:", val)
}
// 血液表格行类型
interface BloodTableRow {
bloodKind: string
applyNum: string
unit: string
applyBloodType: string
replaceBloodKind: string
transPurpose: string
transIndicate: string
realNum: string
}
const bloodTableData = ref<BloodTableRow[]>([])
// 整体表单
const form = ref({})
</script>
<style scoped lang="scss">
.checkbox-row {
margin-bottom: 10px;
padding-left: 110px;
}
.el-form-item {
margin-bottom: 8px;
}
.redText {
:deep(.el-form-item__label) {
color: red;
}
}
.input-btn-row {
display: flex;
gap: 8px;
align-items: center;
.el-input {
flex: 1;
}
}
</style>

View File

@ -0,0 +1,255 @@
<template>
<div class="box-container">
<div class="card-box">
<el-button type="primary" plain @click="onSearch">检索</el-button>
<el-button type="primary" plain @click="onClear">清空</el-button>
<el-button type="warning" plain>取消接收</el-button>
<el-button type="warning" plain>打印</el-button>
</div>
<el-form label-width="auto">
<div class="card-box">
<div class="section-title">申请单扫描</div>
<el-row :gutter="10">
<el-col :span="4">
<el-form-item label="申请单号">
<el-input v-model="form.applyNo" clearable />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="录入人">
<el-select v-model="form.operator" placeholder="请选择">
<el-option label="管理员" value="admin" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="录入时间">
<el-date-picker v-model="form.inputTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" />
</el-form-item>
</el-col>
</el-row>
<div class="line"></div>
<el-row :gutter="10" class="mt8">
<el-col :span="4">
<el-form-item label="申请单号">
<el-input v-model="form.applyNoCopy" clearable />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="申请日期">
<el-date-picker v-model="form.applyDate" type="date" value-format="YYYY-MM-DD" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="申请医师">
<el-input v-model="form.applyDoctor" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="申请科室">
<el-input v-model="form.applyDept" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="患者姓名">
<el-input v-model="form.patientName" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
<el-select v-model="form.gender">
<el-option label="男" value="男" />
<el-option label="女" value="女" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="mt8">
<el-col :span="4">
<el-form-item label="床位号">
<el-input v-model="form.bedNo" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="临床诊断">
<el-input v-model="form.diagnosis" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="血液品种">
<el-input v-model="form.bloodKind" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="申请血量">
<el-input v-model="form.applyVolume" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="单位">
<el-input v-model="form.unit" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="是否合格">
<el-input v-model="form.qualified" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="mt8">
<el-col :span="12">
<el-form-item label="不合格原因">
<el-input v-model="form.notQualifiedReason" />
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<!-- 申请单列表 -->
<div class="card-box table-box">
<el-form :form="searchForm">
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="接收日期">
<div class="date-range">
<el-date-picker v-model="searchForm.startTime" type="date" value-format="YYYY-MM-DD" placeholder="开始时间"
style="width: 47%" />
<span class="separator">-</span>
<el-date-picker v-model="searchForm.endTime" type="date" value-format="YYYY-MM-DD" placeholder="结束时间"
style="width: 47%" />
</div>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="科室">
<SelectTable v-model:data="searchForm.searchDept" :tableData="dictData.ks" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="申请单号">
<el-input v-model="searchForm.searchApplyNo" clearable />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="合格状态">
<el-select v-model="searchForm.searchQualified" placeholder="全部" clearable>
<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="申请单状态" clearable>
<el-select v-model="searchForm.searchApplyStatus" placeholder="请选择">
<el-option v-for="v in dictData.billApplyStatus" :key="v.value" :label="v.label" :value="v.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="">
<el-button type="primary" icon="Search">查询</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="table_content">
<CustomTable :columns="columns" :data="tableData" :config="tableConfig" :enableColumnDrag="true"
@column-drag-end="columnDeagEnd" />
</div>
</div>
</div>
</template>
<script setup lang="ts">
import dayjs from 'dayjs'
import { getDictData, formatDict, dictData } from '@/hooks'
const form = ref({})
const searchForm = ref({
startTime: dayjs().format('YYYY-MM-DD'),
endTime: dayjs().format('YYYY-MM-DD'),
})
const tableData = ref([])
const columns = ref([
{ label: '序号', type: 'index', width: 60, visible: true, align: 'center' },
{ label: '申请单号', prop: 'applyNo', visible: true, align: 'center', width: 140 },
{ label: '住院号', prop: 'visitNo', visible: true, align: 'center', },
{ label: '录入人', prop: 'operator', visible: true, align: 'center', },
{ label: '录入时间', prop: 'inputTime', visible: true, align: 'center', width: 160 },
{ label: '申请科室', prop: 'applyDept', visible: true, align: 'center', },
{ label: '申请日期', prop: 'applyDate', visible: true, align: 'center', },
{ label: '申请医师', prop: 'applyDoctor', visible: true, align: 'center', },
{ label: '临床诊断', prop: 'diagnosis', visible: true },
{ label: '患者姓名', prop: 'patientName', visible: true, align: 'center', },
{ label: '性别', prop: 'gender', visible: true, align: 'center', width: 40 },
{ label: '床位号', prop: 'bedNo', visible: true, align: 'center', },
{ label: '血液品种', prop: 'bloodKind', visible: true, align: 'center', },
{ label: 'ABO血型', prop: 'abo', visible: true, align: 'center', width: 80 },
{ label: 'Rh血型', prop: 'rh', visible: true, align: 'center', width: 60 },
{ label: '申请血量', prop: 'applyVolume', visible: true, align: 'center', },
{ label: '单位', prop: 'unit', visible: true, align: 'center', width: 40 },
{ label: '合格标志', prop: 'qualified', visible: true, align: 'center', },
{ label: '不合格原因', prop: 'notQualifiedReason', visible: true, width: 160 }
])
const tableConfig = ref({
border: true,
highlightCurrentRow: true,
height: '100%'
})
const columnDeagEnd = (data) => {
columns.value = data.columns
}
const onSearch = () => {
console.log('search', form)
}
const onClear = () => {
Object.keys(form).forEach(k => (form[k] = ''))
}
onMounted(() => {
getDictData('ks', 'billApplyStatus')
})
</script>
<style lang="scss" scoped>
.box-container {
display: flex;
flex-direction: column;
overflow-y: auto;
}
.el-form-item {
margin-bottom: 8px;
}
.table-box {
flex: 1;
display: flex;
flex-direction: column;
margin-bottom: 10px;
.table_content {
flex: 1;
}
}
.line {
height: 1px;
background: #ccc;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,276 @@
/**
* @file index.vue
* @description: 紧急配血
* @author: w
* @since: 2026-06-22
*/
<template>
<div class="box-container">
<div class="card-box">
<el-button type="primary" plain @click="openDialog">检索</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-checkbox v-model="form.saveAndPrint" class="toolbar-checkbox">保存后打印</el-checkbox>
</div>
<el-form label-width="auto">
<div class="card-box">
<div class="section-title">血型复核信息</div>
<el-row :gutter="10">
<el-col :span="4">
<el-form-item label="血型复核单">
<DropdownTableSelect v-model="form.billNo" :column-list="applyColumns" labelField="applyBillNo"
:table-data="applyTableData" @open="loadApplyData" @search="handleApplySearch" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="患者姓名">
<el-input v-model="form.patientName" readonly />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="科 室">
<el-input v-model="form.dept" readonly />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="住院号/ID号">
<el-input v-model="form.inHospitalNo" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="4">
<el-form-item label="ABO复核">
<el-input v-model="form.aboCheck" readonly />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="Rh(D)复检">
<el-input v-model="form.rhdCheck" readonly />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="抗体筛选">
<el-input v-model="form.antibodyScreen" readonly />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="检验日期">
<el-date-picker v-model="form.inspectDate" type="datetime" placeholder="0000-00-00 00:00"
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" readonly />
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<div class="card-box table-box">
<div class="section-title">配血信息</div>
<div class="mb10">
<el-select v-model="actionType" placeholder="请选择" style="width: 150px">
<el-option label="增加配血血液" value="add" />
<el-option label="取消配血血液" value="cancel" />
</el-select>
<el-input v-model="actionRemark" placeholder="请输入" style="width: 250px;margin-left:20px" />
</div>
<el-table :data="mainTableData" border height="calc(100% - 70px)">
<el-table-column label="序号" type="index" width="60" align="center" />
<el-table-column label="血液流水号" prop="bloodSerial" align="center" width="120" />
<el-table-column label="血液品种" prop="bloodKind" align="center" width="120" />
<el-table-column label="容量" prop="volume" align="center" />
<el-table-column label="供者血型复核" prop="donorAbo" align="center" width="140" />
<el-table-column label="供者Rh(D)复核" prop="donorRh" align="center" width="140" />
<el-table-column label="配血方法" prop="matchMethod" align="center" width="120" />
<el-table-column label="复核配血方法" prop="checkMethod" align="center" width="140" />
<el-table-column label="主侧" prop="mainSide" align="center" />
<el-table-column label="次侧" prop="secondarySide" align="center" />
<el-table-column label="结果" prop="result" align="center" />
<el-table-column label="配血日期" prop="matchDate" align="center" width="150" />
<el-table-column label="配血者" prop="matcher" align="center" width="110" />
<el-table-column label="复核者" prop="checker" align="center" width="110" />
</el-table>
</div>
<el-dialog title="紧急配血单检索" v-model="dialogVisible" width="1000px" :close-on-click-modal="false"
@closed="handleDialogClose">
<div class="mb10">
<el-button type="primary" @click="handleDialogSearch">检索</el-button>
<el-button type="success" @click="handleDialogConfirm">确认</el-button>
</div>
<el-form :model="dialogSearchForm">
<el-row :gutter="10">
<el-col :span="10">
<el-form-item label="检索日期">
<div class="date-range">
<el-date-picker v-model="dialogSearchForm.stime" type="date" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" style="width: 47%" />
<span class="separator">-</span>
<el-date-picker v-model="dialogSearchForm.etime" type="date" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" style="width: 47%" />
</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单号">
<el-input v-model="dialogSearchForm.bill_no" placeholder="" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="dialogTableData" border height="350" @row-click="handleDialogRowClick" highlight-current-row>
<el-table-column prop="matchNo" label="配血单号" align="center" />
<el-table-column prop="dept" label="科室" align="center" />
<el-table-column prop="patientName" label="患者姓名" align="center" />
<el-table-column prop="matchDate" label="配血日期" align="center" />
<el-table-column prop="aboCheck" label="ABO复核" align="center" />
<el-table-column prop="rhdCheck" label="Rh(D)复核" align="center" />
<el-table-column prop="status" label="单据状态" align="center" />
</el-table>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import DropdownTableSelect, { type TableColumnItem, type TableRowItem } from '@/components/DropdownTableSelect/index.vue'
import { getDictData, formatDict, dictData } from '@/hooks'
import dayjs from 'dayjs'
const form = ref({
billNo: '',
patientName: '',
dept: '',
inHospitalNo: '',
aboCheck: '',
rhdCheck: '',
antibodyScreen: '',
inspectDate: '',
saveAndPrint: false
})
const actionType = ref('add')
const actionRemark = ref('')
const applyColumns = ref<TableColumnItem[]>([
{ label: '申请单号', prop: 'applyBillNo' },
{ label: '患者姓名', prop: 'patientName' },
{ label: '科室', prop: 'dept' },
{ label: '申请品种', prop: 'bloodKind' }
])
const applyTableData = ref<TableRowItem[]>([])
const dialogVisible = ref(false)
const dialogTableData = ref([])
const dialogSearchForm = ref({
stime: dayjs().format('YYYY-MM-DD'),
etime: dayjs().format('YYYY-MM-DD'),
bill_no: ''
})
const loadApplyData = () => {
applyTableData.value = [
{ applyBillNo: 'PX20260623001', patientName: '李四', dept: '内科', bloodKind: '悬浮红细胞' }
]
}
const handleApplySearch = (val: string) => {
console.log('apply search', val)
}
const openDialog = () => {
dialogVisible.value = true
}
const handleDialogClose = () => {
dialogSearchForm.value = {
stime: dayjs().format('YYYY-MM-DD'),
etime: dayjs().format('YYYY-MM-DD'),
bill_no: ''
}
dialogVisible.value = false
}
const handleDialogConfirm = () => {
dialogVisible.value = false
}
const handleDialogRowClick = (row: any) => {
console.log('dialog row click', row)
}
const handleDialogSearch = () => {
console.log('search urgent dialog table')
// fill demo data
dialogTableData.value = [
{ matchNo: 'PX20260623001', dept: '内科', patientName: '李四', matchDate: '2026-06-23', aboCheck: 'A', rhdCheck: '+', status: '已配血' }
]
}
interface UrgentTableRow {
bloodSerial: string
bloodKind: string
volume: string
donorAbo: string
donorRh: string
matchMethod: string
checkMethod: string
mainSide: string
secondarySide: string
result: string
matchDate: string
matcher: string
checker: string
}
const mainTableData = ref<UrgentTableRow[]>([
{
bloodSerial: 'B20260623001',
bloodKind: '悬浮红细胞',
volume: '300ml',
donorAbo: 'A+',
donorRh: '阴性',
matchMethod: '交叉配血',
checkMethod: '复检',
mainSide: '主',
secondarySide: '次',
result: '符合',
matchDate: '2026-06-23 09:20:00',
matcher: '张涛',
checker: '王梅'
}
])
onMounted(() => {
getDictData('ks')
})
</script>
<style scoped lang="scss">
.box-container {
display: flex;
flex-direction: column;
overflow-y: auto;
}
.toolbar-checkbox {
margin-left: 18px;
vertical-align: middle;
}
.table-box {
flex: 1;
}
.el-form-item {
margin-bottom: 8px;
}
</style>

View File

@ -11,12 +11,12 @@
<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="success" plain @click="handleSubmit" :loading="saveLoading">保存</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>
<el-button type="warning" plain :disabled="!evaluationInfo.billNo" @click="printPg('ASSESS_BEFORE')"
:loading="printLoading">打印输血前评估单</el-button>
<el-button type="warning" plain :disabled="!evaluationInfo.billNo" @click="printPg('INFORMED_CONSENT')"
:loading='printLoading'>打印输血知情同意书</el-button>
</div>
@ -245,7 +245,7 @@
</div>
</template>
<script setup lang="ts">
<script setup lang="ts" name="Assessment">
import dayjs from 'dayjs'
import { printPat, queryPatInfo, queryPatList, savePat, queryPatOne, updatePat, delPat } from '@/api/doctor/assessment'
import { queryLisProject, getParameterOne } from '@/api/common'
@ -269,6 +269,9 @@ const searchForm = ref({
beinhos_id: ''
})
const printLoading = ref(false)
const saveLoading = ref(false)
const tableData = ref([])
const evaluationInfo = ref({
@ -397,7 +400,9 @@ const handleDel = () => {
//打印输血评估单
const printPg = (name: string) => {
printLoading.value = true
printPat({ billNo: evaluationInfo.value.billNo, templateName: name }).then((res) => {
printLoading.value = false
if (res.data) {
printBase64PDF(res.data)
}
@ -424,7 +429,7 @@ const handleSubmit = () => {
if (baseInfo.value.age) {
tempPatient.age = baseInfo.value.age + baseInfo.value.nldw
}
saveLoading.value = true
const data = {
xkPatientInfo: tempPatient,
xkTransfuseApplyBeforeList: [{
@ -436,12 +441,14 @@ const handleSubmit = () => {
}
if (bloodInfo.value.bill_status && bloodInfo.value.bill_status == '1') {
updatePat(data).then((res) => {
saveLoading.value = false
if (res.code == 0) {
ElMessage.success('保存成功')
}
})
} else {
savePat(data).then((res) => {
saveLoading.value = false
if (res.code == 0) {
ElMessage.success('保存成功')
evaluationInfo.value.billNo = res.data

View File

@ -40,7 +40,7 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" ">新增</el-button>
<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>
@ -48,9 +48,9 @@
<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-col :span="1.5">
<el-button type="danger" plain icon="Refresh" @click="clearCacheHandle">刷新缓存</el-button>
</el-col>
</el-row>
<!-- 表格区域-->
<el-table v-loading="loading" :data="typeDetail" @selection-change="handleSelectionChange" highlight-current-row
@ -67,8 +67,10 @@
<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>
<el-button link type="primary" icon="Edit" :disabled="queryParams.dictType == 'ks'"
@click="handleUpdate(row)">修改</el-button>
<el-button link type="primary" icon="Delete" :disabled="queryParams.dictType == 'ks'"
@click="handleDelete(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
@ -139,7 +141,7 @@
<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";
import { queryComDictListService, addComDictService, delComDictService, updateComDictService, getComDicts, clearCache } from "@/api/liswork/dict/ComDict";
const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
@ -292,7 +294,7 @@ function handleExport() {
const clearCacheHandle = () => {
clearCache().then(() => {
proxy.$modal.msgSuccess("清理成功");
proxy.$modal.msgSuccess("刷新成功");
handleQuery();
});
};

View File

@ -9,7 +9,7 @@
<el-input v-model="deptName" placeholder="请输入部门名称" clearable prefix-icon="Search"
style="margin-bottom: 20px" />
</div>
<div class="head-container">
<div class="tree-box">
<el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }"
:expand-on-click-node="false" :filter-node-method="filterNode" ref="deptTreeRef" node-key="id"
highlight-current default-expand-all @node-click="handleNodeClick" />
@ -70,17 +70,16 @@
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"
height="calc(100vh - 350px)">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns.userId.visible" />
<el-table-column label="用户工号" align="center" key="userName" prop="userName"
v-if="columns.userName.visible" :show-overflow-tooltip="true" />
v-if="columns.userName.visible" show-overflow-tooltip />
<el-table-column label="用户姓名" align="center" key="nickName" prop="nickName"
v-if="columns.nickName.visible" :show-overflow-tooltip="true" />
v-if="columns.nickName.visible" show-overflow-tooltip />
<el-table-column label="部门" align="center" key="deptName" prop="dept.deptName"
v-if="columns.deptName.visible" :show-overflow-tooltip="true" />
v-if="columns.deptName.visible" show-overflow-tooltip />
<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber"
v-if="columns.phonenumber.visible" width="120" />
<el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
@ -89,6 +88,22 @@
@change="handleStatusChange(scope.row)"></el-switch>
</template>
</el-table-column>
<el-table-column label="所属工作组" align="center" prop="workgroup" v-if="columns.workgroup.visible">
<template #default="scope">
{{ formatDict(scope.row.workgroup, 'workgroup') }}
</template>
</el-table-column>
<el-table-column label="职称" align="center" prop="postname" v-if="columns.postname.visible">
<template #default="scope">
{{ formatDict(scope.row.postname, 'zc') }}
</template>
</el-table-column>
<el-table-column label="是否操作员" align="center" prop="operator_type" v-if="columns.operator_type.visible">
<template #default="scope">
<el-checkbox :model-value="scope.row.operator_type" true-value="Y" false-value="N"
@click.prevent="scope.row.operator_type === null" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns.createTime.visible"
width="160">
<template #default="scope">
@ -125,8 +140,8 @@
<!-- 添加或修改用户配置对话框 -->
<el-dialog :title="title" v-model="open" width="600px" append-to-body>
<el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
<el-row>
<el-form :model="form" :rules="rules" ref="userRef" label-width="auto">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="用户姓名" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入用户姓名" maxlength="30" />
@ -140,7 +155,7 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
@ -152,7 +167,7 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item v-if="form.userId == undefined" label="用户工号" prop="userName">
<el-input v-model="form.userName" placeholder="请输入用户工号" maxlength="30" />
@ -164,12 +179,11 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="用户性别">
<el-select v-model="form.sex" placeholder="请选择">
<el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
<el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
@ -182,12 +196,12 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="岗位">
<el-select v-model="form.postIds" multiple placeholder="请选择">
<el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId"
:disabled="item.status == 1"></el-option>
<el-form-item label="所属工作组">
<el-select v-model="form.workgroup" placeholder="请选择" clearable>
<el-option v-for="item in dictData.workgroup" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
@ -195,11 +209,25 @@
<el-form-item label="角色">
<el-select v-model="form.roleIds" multiple placeholder="请选择">
<el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId"
:disabled="item.status == 1"></el-option>
:disabled="item.status == 1" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="职称">
<el-select v-model="form.postname" placeholder="请选择" clearable>
<el-option v-for="item in dictData.zc" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否操作员">
<el-checkbox v-model="form.operator_type" true-value="Y" false-value="N" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注">
@ -255,6 +283,8 @@ import type { SysUser, UserQueryParams, UserFormDataResult } from '@/types/api/s
import type { SysRole } from '@/types/api/system/role'
import type { SysPost } from '@/types/api/system/post'
import type { TreeSelect, TableShowColumns, AjaxResult } from '@/types/api/common'
import { getDictData, formatDict, dictData } from '@/hooks'
const router = useRouter()
const appStore = useAppStore()
@ -300,6 +330,9 @@ const columns = ref<Record<string, TableShowColumns>>({
deptName: { label: '部门', visible: true },
phonenumber: { label: '手机号码', visible: true },
status: { label: '状态', visible: true },
workgroup: { label: '所属工作组', visible: true },
postname: { label: '职称', visible: true },
operator_type: { label: '是否操作员', visible: true },
createTime: { label: '创建时间', visible: true }
})
@ -531,6 +564,9 @@ function reset() {
phonenumber: undefined,
email: undefined,
sex: undefined,
workgroup: undefined,
postname: undefined,
operator_type: undefined,
status: "0",
remark: undefined,
postIds: [],
@ -563,7 +599,7 @@ function handleUpdate(row?: SysUser) {
reset()
const userId = row?.userId || ids.value[0]
getUser(userId).then(response => {
form.value = response.data!
form.value = response.data
postOptions.value = response.posts
roleOptions.value = response.roles
form.value.postIds = response.postIds
@ -596,6 +632,7 @@ function submitForm() {
}
onMounted(() => {
getDictData('zc', 'workgroup')
getDeptTree()
getList()
proxy.getConfigKey("sys.user.initPassword").then((response: AjaxResult) => {
@ -603,3 +640,9 @@ onMounted(() => {
})
})
</script>
<style scoped lang="scss">
.tree-box {
height: 80vh;
overflow-y: auto;
}
</style>