输血管理
This commit is contained in:
parent
d1ba068d7b
commit
b3e26589ef
@ -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
|
||||
})
|
||||
}
|
||||
@ -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;
|
||||
|
||||
157
src/components/DropdownTableSelect/index.vue
Normal file
157
src/components/DropdownTableSelect/index.vue
Normal 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>
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
}
|
||||
},
|
||||
|
||||
430
src/views/blood/crossMatching/index.vue
Normal file
430
src/views/blood/crossMatching/index.vue
Normal 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>
|
||||
235
src/views/blood/rationalityAssessment/components/BasicInfo.vue
Normal file
235
src/views/blood/rationalityAssessment/components/BasicInfo.vue
Normal 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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -0,0 +1,10 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="section-title">检验结果趋势图</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
||||
135
src/views/blood/rationalityAssessment/index.vue
Normal file
135
src/views/blood/rationalityAssessment/index.vue
Normal 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>
|
||||
395
src/views/blood/recheck/index.vue
Normal file
395
src/views/blood/recheck/index.vue
Normal 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>
|
||||
255
src/views/blood/scan/index.vue
Normal file
255
src/views/blood/scan/index.vue
Normal 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>
|
||||
276
src/views/blood/urgent/index.vue
Normal file
276
src/views/blood/urgent/index.vue
Normal 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>
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
});
|
||||
};
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user