静态心电

This commit is contained in:
Flow 2025-07-22 15:59:13 +08:00
parent f20a0f747d
commit a11034df42
6 changed files with 801 additions and 6 deletions

View File

@ -11,6 +11,8 @@ export interface StaticdataVO {
ecgdata: string // 心电数据
createtime: Date // 创建时间
updatedtime: Date // 更新时间
generationtime: Date // 生成时间
diagnosis: string // 诊断结论
}
// 静态心电数据 API
@ -43,5 +45,17 @@ export const StaticdataApi = {
// 导出静态心电数据 Excel
exportStaticdata: async (params) => {
return await request.download({ url: `/system/staticdata/export-excel`, params })
},
//根据examid&regid查询心电数据
getStaticdataByExamidAndRegid: async (examid: string, regid: string) => {
return await request.get({
url: `/system/staticdata/getByExamidAndRegid?examid=` + examid + `&regid=` + regid
})
},
//根据examid&regid保存诊断结论
saveDiagnosis: async (data: any) => {
return await request.put({ url: `/system/staticdata/saveDiagnosis`, data })
}
}
}

View File

@ -17,6 +17,7 @@ export interface StaticecgVO {
status: number // 状态0未申请1已申请
createtime: Date // 创建时间
updatetime: Date // 更新时间
weartime: Date // 佩戴时间
}
// 静态心电图数据 API

View File

@ -1,7 +1,7 @@
<template>
<div class="ecg-analysis">
<!-- 分析弹窗组件后续可补充 -->
<!-- <AnalysisDialog ref="analysisDialogRef" /> -->
<!-- ECG分析工作站弹窗组件 -->
<ECGWorkstation ref="ecgWorkstationRef" />
<!-- 患者选择组件后续可补充 -->
<PatientSelect
@ -89,12 +89,12 @@
</el-table-column>
<el-table-column prop="weartime" label="佩戴时间" align="center" min-width="180">
<template #default="{ row }">
<span>{{ row.weartime }}</span>
<span>{{ formatTime(row.weartime) }}</span>
</template>
</el-table-column>
<el-table-column prop="device" label="设备" align="center" min-width="150">
<template #default="{ row }">
<span>{{ row.device }}</span>
<span>{{ row.devicename }}</span>
</template>
</el-table-column>
<el-table-column prop="orgname" label="机构" align="center" min-width="120" />
@ -132,10 +132,12 @@
import { ref, reactive, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import PatientSelect from '@/patientcom/index.vue'
import ECGWorkstation from './ECG_workstation.vue'
import { StaticecgApi, StaticecgVO } from '@/api/staticecg'
import { getUserProfile } from '@/api/system/user/profile'
import { OrgApi } from '@/api/org'
import { Search, Refresh, Plus } from '@element-plus/icons-vue'
import dayjs from 'dayjs'
const loading = ref(false)
const total = ref(0)
@ -157,6 +159,7 @@ const queryParams = reactive({
const tableData = ref<StaticecgVO[]>([])
const patientSelectRef = ref()
const ecgWorkstationRef = ref()
onMounted(() => {
getList()
@ -245,7 +248,8 @@ const handlePatientCancel = () => {
}
const onAnalyze = (row: any) => {
ElMessage.success(`分析:${row.name}`)
// ECG
ecgWorkstationRef.value?.open(row)
}
const onViewReport = (row: any) => {
@ -267,6 +271,12 @@ const handleApply = async (row: any) => {
ElMessage.error('申请失败,请重试')
}
}
const formatTime = (timestamp: number | string) => {
if (!timestamp) return ''
const ts = typeof timestamp === 'string' ? parseInt(timestamp) : timestamp
return dayjs(ts).isValid() ? dayjs(ts).format('YYYY-MM-DD HH:mm:ss') : timestamp
}
</script>
<style scoped>

View File

@ -0,0 +1,539 @@
<template>
<div>
<!-- 全屏弹窗 -->
<el-dialog
v-model="visible"
title="心电图分析"
:fullscreen="true"
:close-on-click-modal="false"
:close-on-press-escape="false"
class="ecg-workstation-dialog"
@close="handleClose"
>
<div class="workstation-container">
<!-- 工作区域 -->
<div class="work-area">
<el-row :gutter="16" style="height: 100%">
<!-- 左侧ECG报告图片显示区 (3/4) -->
<el-col :span="18">
<el-card shadow="never" class="ecg-image-display">
<div class="ecg-image-container">
<!-- ECG报告图片显示区域 -->
<div
class="image-viewer"
v-loading="loading"
element-loading-text="正在加载ECG数据..."
>
<img
v-if="ecgImageUrl"
:src="ecgImageUrl"
alt="ECG报告"
class="ecg-report-image"
@load="handleImageLoad"
@error="handleImageError"
/>
<div v-else class="image-placeholder">
<el-empty description="暂无影像" />
</div>
</div>
</div>
</el-card>
</el-col>
<!-- 右侧诊断信息区 (1/4) -->
<el-col :span="6">
<el-card
shadow="never"
class="diagnosis-panel"
v-loading="loading"
element-loading-text="正在加载..."
>
<div class="diagnosis-content">
<!-- 诊断结果 -->
<div class="diagnosis-section">
<!-- 诊断结论选择列表 -->
<div class="diagnosis-selector">
<h5 class="selector-title">诊断模板</h5>
<!-- 搜索框 -->
<div class="search-box">
<el-input
v-model="searchKeyword"
placeholder="请输入关键词"
clearable
size="small"
prefix-icon="Search"
/>
</div>
<div class="diagnosis-list">
<div
v-for="diag in filteredDiagnoses"
:key="diag.code"
class="diagnosis-item"
@click="insertDiagnosis(diag.name)"
>
{{ diag.name }}
</div>
<div v-if="filteredDiagnoses.length === 0" class="no-results">
暂无匹配的诊断模板
</div>
</div>
</div>
<h4 class="section-title">诊断结论</h4>
<div class="diagnosis-text">
<el-input
v-model="diagnosisText"
type="textarea"
:rows="10"
placeholder="请输入诊断结论..."
style="margin-bottom: 12px"
:disabled="loading"
resize="none"
/>
<div class="diagnosis-actions">
<el-button
type="primary"
@click="handleSaveAnalysis"
:loading="loading"
:disabled="!patientData.examid || !patientData.regid"
>
保存结论
</el-button>
</div>
</div>
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
</div>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, watch, computed } from 'vue'
import { ElMessage } from 'element-plus'
import { DataLine, Picture } from '@element-plus/icons-vue'
import { StaticdataApi, type StaticdataVO } from '@/api/staticdata'
//
import { ecgDiagnoses, diagnosisCategories } from './ecgDiagListTemplate'
//
const visible = ref(false)
//
const loading = ref(false)
// ECGURL
const ecgImageUrl = ref('')
//
const diagnosisText = ref('')
//
const searchKeyword = ref('')
//
const patientData = reactive({
id: 0,
regid: '',
examid: '',
name: '',
gender: '',
age: '',
weartime: '',
device: '',
deviceid: '',
devicename: '',
collecttime: '',
generationtime: '',
orgname: ''
})
// ECG
const currentEcgData = ref<StaticdataVO | null>(null)
//
const extraText = ref('')
//
const filteredDiagnoses = computed(() => {
if (!searchKeyword.value) {
return ecgDiagnoses
}
return ecgDiagnoses.filter((diag) =>
diag.name.toLowerCase().includes(searchKeyword.value.toLowerCase())
)
})
//
const open = async (data: any) => {
Object.assign(patientData, data)
visible.value = true
// examidregid
if (data.examid && data.regid) {
await loadEcgData(data.examid, data.regid)
}
}
// ECG
const loadEcgData = async (examid: string, regid: string) => {
try {
loading.value = true
const response = await StaticdataApi.getStaticdataByExamidAndRegid(examid, regid)
if (response) {
// axios使response
currentEcgData.value = response
diagnosisText.value = response.diagnosis || ''
//
Object.assign(patientData, {
...patientData,
regid: response.regid,
examid: response.examid?.replace(/\r\n/g, ''), //
deviceid: response.deviceid,
devicename: response.devicename,
collecttime: formatDateTime(response.collecttime),
generationtime: formatDateTime(response.generationtime)
})
//
if (response.ecgdata) {
ecgImageUrl.value = response.ecgdata
}
ElMessage.success('数据加载成功')
}
} catch (error) {
console.error('数据加载失败:', error)
ElMessage.error('数据加载失败')
} finally {
loading.value = false
}
}
//
const formatDateTime = (timestamp: number) => {
if (!timestamp) return ''
const date = new Date(timestamp)
return date.toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
})
}
//
const handleClose = () => {
visible.value = false
//
ecgImageUrl.value = ''
diagnosisText.value = ''
currentEcgData.value = null
}
//
const handleSaveAnalysis = async () => {
if (!patientData.examid || !patientData.regid) {
ElMessage.warning('缺少必要的患者信息')
return
}
if (!diagnosisText.value.trim()) {
ElMessage.warning('请输入诊断结论')
return
}
try {
loading.value = true
// examidregid
const saveData = {
examid: patientData.examid,
regid: patientData.regid,
diagnosis: diagnosisText.value.trim()
}
await StaticdataApi.saveDiagnosis(saveData)
ElMessage.success('诊断结论已保存')
} catch (error) {
console.error('保存诊断失败:', error)
ElMessage.error('保存诊断失败')
} finally {
loading.value = false
}
}
//
const handleImageLoad = () => {
console.log('数据加载成功')
}
//
const handleImageError = () => {
ElMessage.error('ECG图片加载失败')
}
//
const insertDiagnosis = (diagnosis: string) => {
const cursorPosition = diagnosisText.value.length
diagnosisText.value =
diagnosisText.value.substring(0, cursorPosition) +
diagnosis +
diagnosisText.value.substring(cursorPosition)
}
//
defineExpose({
open
})
</script>
<style scoped>
.ecg-workstation-dialog :deep(.el-dialog__body) {
padding: 0;
height: calc(80vh - 80px);
}
.workstation-container {
height: 100%;
display: flex;
flex-direction: column;
}
.patient-info {
padding: 16px;
background: #f6f8fa;
}
.info-card {
border: none;
}
.info-content {
display: flex;
gap: 24px;
align-items: center;
flex-wrap: wrap;
}
.info-item {
display: flex;
align-items: center;
}
.label {
font-weight: 500;
color: #666;
margin-right: 8px;
}
.value {
color: #333;
font-weight: 500;
}
.work-area {
flex: 1;
padding: 16px;
overflow: hidden;
}
.ecg-image-display {
height: 100%;
border: none;
}
.ecg-image-display :deep(.el-card__body) {
height: calc(100% - 56px);
padding: 0;
overflow: hidden;
}
.patient-info-header {
padding: 16px;
background: #f8f9fb;
border-bottom: 1px solid #e4e7ed;
}
.patient-info-header :deep(.el-descriptions) {
background: white;
}
.patient-info-header :deep(.el-descriptions__label) {
font-weight: 500;
color: #606266;
background: #fafafa;
}
.patient-info-header :deep(.el-descriptions__content) {
color: #303133;
font-weight: 500;
}
.display-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.display-controls {
display: flex;
gap: 8px;
}
.ecg-image-container {
height: 100%;
position: relative;
overflow: hidden;
background: #f5f5f5;
}
.image-viewer {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
overflow: auto;
}
.ecg-report-image {
max-width: 100%;
max-height: 100%;
object-fit: contain;
border: 1px solid #ddd;
background: white;
}
.image-placeholder {
text-align: center;
color: #666;
}
.diagnosis-panel {
height: 100%;
border: none;
}
.diagnosis-panel :deep(.el-card__body) {
height: calc(100% - 56px);
overflow-y: auto;
padding: 16px;
}
.diagnosis-content {
height: 100%;
}
.measurement-section,
.diagnosis-section,
.action-section {
margin-bottom: 20px;
}
.section-title {
font-weight: 600;
margin-bottom: 12px;
color: #333;
font-size: 14px;
border-bottom: 1px solid #eee;
padding-bottom: 6px;
}
.measurement-grid {
display: grid;
gap: 8px;
}
.measurement-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 6px 0;
border-bottom: 1px solid #f0f0f0;
}
.param-label {
color: #666;
font-size: 13px;
font-weight: 500;
}
.param-value {
color: #333;
font-weight: 600;
font-size: 13px;
}
.diagnosis-text {
margin-bottom: 12px;
}
.action-buttons {
display: flex;
flex-direction: column;
gap: 8px;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
.diagnosis-actions {
display: flex;
justify-content: flex-end;
}
.diagnosis-selector {
margin-bottom: 12px;
border: 1px solid #e4e7ed;
border-radius: 4px;
background-color: #fff;
}
.selector-title {
font-size: 14px;
font-weight: 600;
color: #333;
margin: 0;
padding: 12px 16px 8px;
border-bottom: 1px solid #f0f0f0;
}
.diagnosis-list {
max-height: 450px;
overflow-y: auto;
padding: 8px;
}
.diagnosis-item {
font-size: 13px;
color: #333;
padding: 6px 12px;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s ease;
border: 1px solid transparent;
margin-bottom: 2px;
}
.diagnosis-item:hover {
background-color: #e6f7ff;
border-color: #b3d8ff;
color: #409eff;
}
.search-box {
padding: 0 16px 12px;
}
.no-results {
text-align: center;
color: #909399;
font-size: 13px;
padding: 8px 0;
}
</style>

View File

@ -0,0 +1,230 @@
export interface EcgDiagnosis {
name: string
code: string
category: string
}
export const ecgDiagnoses: EcgDiagnosis[] = [
// 窦性心律相关
{ name: '窦性心律', code: 'ECG001', category: 'sinus_rhythm' },
{ name: '窦性心律不齐', code: 'ECG002', category: 'sinus_rhythm' },
{ name: '窦性心动过缓不齐', code: 'ECG003', category: 'sinus_rhythm' },
{ name: '窦性心动过速', code: 'ECG004', category: 'sinus_rhythm' },
{ name: '窦房结内游走心律', code: 'ECG005', category: 'sinus_rhythm' },
{ name: '窦房结至心房内游走心律', code: 'ECG006', category: 'sinus_rhythm' },
{ name: '窦房结至交界区游走心律', code: 'ECG007', category: 'sinus_rhythm' },
{ name: '窦性停搏', code: 'ECG008', category: 'sinus_rhythm' },
{ name: '窦性停搏及短暂的全心停搏', code: 'ECG009', category: 'sinus_rhythm' },
{ name: '窦性早搏', code: 'ECG010', category: 'sinus_rhythm' },
// 异位心律
{ name: '异位心律', code: 'ECG011', category: 'ectopic_rhythm' },
// 房性心律失常
{ name: '房性早搏', code: 'ECG012', category: 'atrial_arrhythmia' },
{ name: '偶发房性早搏', code: 'ECG013', category: 'atrial_arrhythmia' },
{ name: '频发房性早搏', code: 'ECG014', category: 'atrial_arrhythmia' },
{ name: '偶见二联律', code: 'ECG015', category: 'atrial_arrhythmia' },
{ name: '部分呈二联律', code: 'ECG016', category: 'atrial_arrhythmia' },
{ name: '偶见三联律', code: 'ECG017', category: 'atrial_arrhythmia' },
{ name: '部分呈三联律', code: 'ECG018', category: 'atrial_arrhythmia' },
{ name: '偶见成对', code: 'ECG019', category: 'atrial_arrhythmia' },
{ name: '部分成对', code: 'ECG020', category: 'atrial_arrhythmia' },
{ name: '伴室内差异性传导', code: 'ECG021', category: 'atrial_arrhythmia' },
{ name: '偶伴室内差异性传导', code: 'ECG022', category: 'atrial_arrhythmia' },
{ name: '部分伴室内差异性传导', code: 'ECG023', category: 'atrial_arrhythmia' },
{ name: '房性早搏未下传', code: 'ECG024', category: 'atrial_arrhythmia' },
{ name: '偶呈未下传', code: 'ECG025', category: 'atrial_arrhythmia' },
{ name: '部分呈未下传', code: 'ECG026', category: 'atrial_arrhythmia' },
{ name: '短阵房性心动过速', code: 'ECG027', category: 'atrial_arrhythmia' },
{ name: '阵发性房性心动过速', code: 'ECG028', category: 'atrial_arrhythmia' },
{ name: '房性心动过速', code: 'ECG029', category: 'atrial_arrhythmia' },
{ name: '多源性房性心动过速', code: 'ECG030', category: 'atrial_arrhythmia' },
{ name: '紊乱性房性心动过速', code: 'ECG031', category: 'atrial_arrhythmia' },
{ name: '无休止性房性心动过速', code: 'ECG032', category: 'atrial_arrhythmia' },
{ name: '心房扑动', code: 'ECG033', category: 'atrial_arrhythmia' },
{ name: '阵发性心房扑动', code: 'ECG034', category: 'atrial_arrhythmia' },
{ name: '短阵性心房扑动', code: 'ECG035', category: 'atrial_arrhythmia' },
{ name: '心房颤动', code: 'ECG036', category: 'atrial_arrhythmia' },
{ name: '阵发性心房颤动', code: 'ECG037', category: 'atrial_arrhythmia' },
{ name: '短阵性心房颤动', code: 'ECG038', category: 'atrial_arrhythmia' },
{ name: '不纯性', code: 'ECG039', category: 'atrial_arrhythmia' },
{ name: '加速性房性心律', code: 'ECG040', category: 'atrial_arrhythmia' },
{ name: '房性逸搏', code: 'ECG041', category: 'atrial_arrhythmia' },
{ name: '房性并行心律', code: 'ECG042', category: 'atrial_arrhythmia' },
{ name: '房性反复搏动', code: 'ECG043', category: 'atrial_arrhythmia' },
{ name: '房性融合波', code: 'ECG044', category: 'atrial_arrhythmia' },
{ name: '心房分离', code: 'ECG045', category: 'atrial_arrhythmia' },
{ name: '心房静止', code: 'ECG046', category: 'atrial_arrhythmia' },
{ name: '紊乱性心房律', code: 'ECG047', category: 'atrial_arrhythmia' },
// 交界性心律失常
{ name: '交界性早搏', code: 'ECG048', category: 'junctional_arrhythmia' },
{ name: '室上性心动过速', code: 'ECG049', category: 'junctional_arrhythmia' },
{ name: '交界性心动过速', code: 'ECG050', category: 'junctional_arrhythmia' },
{ name: '加速性交界性心律', code: 'ECG051', category: 'junctional_arrhythmia' },
{ name: '交界性逸搏', code: 'ECG052', category: 'junctional_arrhythmia' },
{ name: '可见交界性逸搏', code: 'ECG053', category: 'junctional_arrhythmia' },
{ name: '偶见交界性逸搏', code: 'ECG054', category: 'junctional_arrhythmia' },
{ name: '交界性逸搏心律', code: 'ECG055', category: 'junctional_arrhythmia' },
{ name: '偶见交界性逸搏心律', code: 'ECG056', category: 'junctional_arrhythmia' },
{ name: '可见交界性逸搏心律', code: 'ECG057', category: 'junctional_arrhythmia' },
{ name: '伴不完全性干扰性房室脱节', code: 'ECG058', category: 'junctional_arrhythmia' },
{ name: '交界性逸搏及逸搏夺获', code: 'ECG059', category: 'junctional_arrhythmia' },
{ name: '部分呈逸搏夺获二联律', code: 'ECG060', category: 'junctional_arrhythmia' },
{ name: '交界性游走心律', code: 'ECG061', category: 'junctional_arrhythmia' },
{ name: '交界性并行心律', code: 'ECG062', category: 'junctional_arrhythmia' },
{ name: '交界性反复搏动', code: 'ECG063', category: 'junctional_arrhythmia' },
{ name: '冠状窦性心律', code: 'ECG064', category: 'junctional_arrhythmia' },
// 室性心律失常
{ name: '室性早搏', code: 'ECG065', category: 'ventricular_arrhythmia' },
{ name: '偶发室性早搏', code: 'ECG066', category: 'ventricular_arrhythmia' },
{ name: '频发室性早搏', code: 'ECG067', category: 'ventricular_arrhythmia' },
{ name: '间位性室早', code: 'ECG068', category: 'ventricular_arrhythmia' },
{ name: '偶呈间位', code: 'ECG069', category: 'ventricular_arrhythmia' },
{ name: '部分呈间位', code: 'ECG070', category: 'ventricular_arrhythmia' },
{ name: '多形性室性早搏', code: 'ECG071', category: 'ventricular_arrhythmia' },
{ name: '多源性室性早搏', code: 'ECG072', category: 'ventricular_arrhythmia' },
{ name: '室性并行心律', code: 'ECG073', category: 'ventricular_arrhythmia' },
{ name: '室性融合波', code: 'ECG074', category: 'ventricular_arrhythmia' },
{ name: '心室停搏', code: 'ECG075', category: 'ventricular_arrhythmia' },
{ name: '室性逸搏', code: 'ECG076', category: 'ventricular_arrhythmia' },
{ name: '室性逸搏心律', code: 'ECG077', category: 'ventricular_arrhythmia' },
{ name: '加速性室性心律', code: 'ECG078', category: 'ventricular_arrhythmia' },
{ name: '室性早搏呈R on T', code: 'ECG079', category: 'ventricular_arrhythmia' },
{ name: '室性心动过速', code: 'ECG080', category: 'ventricular_arrhythmia' },
{ name: '双向性室性心动过速', code: 'ECG081', category: 'ventricular_arrhythmia' },
{ name: '多形性室性心动过速', code: 'ECG082', category: 'ventricular_arrhythmia' },
{ name: '尖端扭转型室性心动过速', code: 'ECG083', category: 'ventricular_arrhythmia' },
{ name: '持续性室性心动过速', code: 'ECG084', category: 'ventricular_arrhythmia' },
{ name: '无休止性室性心动过速', code: 'ECG085', category: 'ventricular_arrhythmia' },
{ name: '宽QRS心动过速', code: 'ECG086', category: 'ventricular_arrhythmia' },
{ name: '心室扑动', code: 'ECG087', category: 'ventricular_arrhythmia' },
{ name: '心室颤动', code: 'ECG088', category: 'ventricular_arrhythmia' },
{ name: '紊乱性心室律', code: 'ECG089', category: 'ventricular_arrhythmia' },
{ name: '室性反复搏动', code: 'ECG090', category: 'ventricular_arrhythmia' },
// 传导阻滞
{ name: '二度窦房阻滞', code: 'ECG091', category: 'conduction_block' },
{ name: '二度Ⅰ型窦房阻滞', code: 'ECG092', category: 'conduction_block' },
{ name: '二度Ⅱ型窦房阻滞', code: 'ECG093', category: 'conduction_block' },
{ name: '一度房室阻滞', code: 'ECG094', category: 'conduction_block' },
{ name: '二度房室阻滞', code: 'ECG095', category: 'conduction_block' },
{ name: '二度Ⅰ型房室阻滞', code: 'ECG096', category: 'conduction_block' },
{ name: '二度Ⅱ型房室阻滞', code: 'ECG097', category: 'conduction_block' },
{ name: '二度房室阻滞呈2:1下传', code: 'ECG098', category: 'conduction_block' },
{ name: '高度房室阻滞', code: 'ECG099', category: 'conduction_block' },
{ name: '几乎完全性房室阻滞', code: 'ECG100', category: 'conduction_block' },
{ name: '三度房室阻滞', code: 'ECG101', category: 'conduction_block' },
{ name: '完全性右束支阻滞', code: 'ECG102', category: 'conduction_block' },
{ name: '不完全性右束支阻滞', code: 'ECG103', category: 'conduction_block' },
{ name: '完全性左束支阻滞', code: 'ECG104', category: 'conduction_block' },
{ name: '不完全性左束支传导阻滞', code: 'ECG105', category: 'conduction_block' },
{ name: '左前分支阻滞', code: 'ECG106', category: 'conduction_block' },
{ name: '双束支传导阻滞', code: 'ECG107', category: 'conduction_block' },
{ name: '间歇性右束支阻滞', code: 'ECG108', category: 'conduction_block' },
{ name: '间歇性左束支阻滞', code: 'ECG109', category: 'conduction_block' },
{ name: '快频率依赖性右束支3相阻滞', code: 'ECG110', category: 'conduction_block' },
{ name: '快频率依赖性左束支3相阻滞', code: 'ECG111', category: 'conduction_block' },
{ name: '慢频率依赖性右束支4相阻滞', code: 'ECG112', category: 'conduction_block' },
{ name: '慢频率依赖性左束支4相阻滞', code: 'ECG113', category: 'conduction_block' },
{ name: '室内阻滞', code: 'ECG114', category: 'conduction_block' },
{ name: '心室夺获', code: 'ECG115', category: 'conduction_block' },
// ST-T改变
{ name: 'T波改变', code: 'ECG116', category: 'st_t_changes' },
{ name: '部分T波改变', code: 'ECG117', category: 'st_t_changes' },
{ name: 'ST-T改变', code: 'ECG118', category: 'st_t_changes' },
{ name: '部分ST-T改变', code: 'ECG119', category: 'st_t_changes' },
{ name: 'ST段压低', code: 'ECG120', category: 'st_t_changes' },
{ name: 'ST段轻度压低', code: 'ECG121', category: 'st_t_changes' },
{ name: 'ST段抬高', code: 'ECG122', category: 'st_t_changes' },
{ name: '冠状T波', code: 'ECG123', category: 'st_t_changes' },
// 预激综合症
{ name: '心室预激', code: 'ECG124', category: 'preexcitation' },
{ name: '预激综合症', code: 'ECG125', category: 'preexcitation' },
{ name: 'A型预激综合症', code: 'ECG126', category: 'preexcitation' },
{ name: 'B型预激综合症', code: 'ECG127', category: 'preexcitation' },
{ name: '间歇性', code: 'ECG128', category: 'preexcitation' },
// 心房心室肥大
{ name: '"肺型"P波', code: 'ECG129', category: 'hypertrophy' },
{ name: '"二尖瓣型"P波', code: 'ECG130', category: 'hypertrophy' },
{ name: '心房肥大', code: 'ECG131', category: 'hypertrophy' },
{ name: '右心室肥大', code: 'ECG132', category: 'hypertrophy' },
{ name: '左心室肥大', code: 'ECG133', category: 'hypertrophy' },
{ name: '双侧心室肥大', code: 'ECG134', category: 'hypertrophy' },
// 心肌梗死
{ name: '符合临床陈旧性心肌梗死图形', code: 'ECG135', category: 'myocardial_infarction' },
{ name: '符合临床急性心肌梗死图形', code: 'ECG136', category: 'myocardial_infarction' },
// 其他异常
{ name: 'V1呈QS型', code: 'ECG137', category: 'other_abnormalities' },
{ name: 'V5呈qR型q波时限0.04s', code: 'ECG138', category: 'other_abnormalities' },
{ name: 'QRS肢导低电压', code: 'ECG139', category: 'other_abnormalities' },
{ name: 'QRS胸导低电压', code: 'ECG140', category: 'other_abnormalities' },
{ name: 'P-R间期≥0.20s', code: 'ECG141', category: 'other_abnormalities' },
{ name: '异常Q波', code: 'ECG142', category: 'other_abnormalities' },
{ name: '胸导R波递增不良', code: 'ECG143', category: 'other_abnormalities' },
{ name: '左室高电压', code: 'ECG144', category: 'other_abnormalities' },
{ name: '体位性QRS波群改变', code: 'ECG145', category: 'other_abnormalities' },
{ name: '体位性ST段压低', code: 'ECG146', category: 'other_abnormalities' },
{ name: '体位性T波改变', code: 'ECG147', category: 'other_abnormalities' },
{ name: '符合临床右位心图形', code: 'ECG148', category: 'other_abnormalities' },
{ name: '符合临床心包炎图形', code: 'ECG149', category: 'other_abnormalities' },
{ name: '心电轴右偏', code: 'ECG150', category: 'other_abnormalities' },
{ name: '心电轴左偏', code: 'ECG151', category: 'other_abnormalities' },
{ name: 'Q-T间期延长', code: 'ECG152', category: 'other_abnormalities' },
// 起搏器相关
{ name: '起搏心律', code: 'ECG153', category: 'pacemaker' },
{ name: '起搏心律+自身心律', code: 'ECG154', category: 'pacemaker' },
{ name: '起搏器起搏功能良好', code: 'ECG155', category: 'pacemaker' },
{ name: '起搏器感知功能良好', code: 'ECG156', category: 'pacemaker' },
{ name: '起搏器起搏功能不良', code: 'ECG157', category: 'pacemaker' },
{ name: '起搏器感知功能不良', code: 'ECG158', category: 'pacemaker' },
{ name: '起搏器过度感知', code: 'ECG159', category: 'pacemaker' },
// 药物影响
{ name: '洋地黄影响', code: 'ECG160', category: 'drug_effects' },
// 正常结果
{ name: '未见心律失常及ST-T改变', code: 'ECG161', category: 'normal' },
{ name: '未见异位心律失常及ST-T改变', code: 'ECG162', category: 'normal' }
]
// 诊断分类定义
export const diagnosisCategories = {
sinus_rhythm: '窦性心律',
ectopic_rhythm: '异位心律',
atrial_arrhythmia: '房性心律失常',
junctional_arrhythmia: '交界性心律失常',
ventricular_arrhythmia: '室性心律失常',
conduction_block: '传导阻滞',
st_t_changes: 'ST-T改变',
preexcitation: '预激综合症',
hypertrophy: '心房心室肥大',
myocardial_infarction: '心肌梗死',
other_abnormalities: '其他异常',
pacemaker: '起搏器相关',
drug_effects: '药物影响',
normal: '正常结果'
} as const
// 根据分类获取诊断列表的辅助函数
export const getDiagnosesByCategory = (category: keyof typeof diagnosisCategories) => {
return ecgDiagnoses.filter((diagnosis) => diagnosis.category === category)
}
// 根据诊断代码获取诊断信息的辅助函数
export const getDiagnosisByCode = (code: string) => {
return ecgDiagnoses.find((diagnosis) => diagnosis.code === code)
}
// 根据诊断名称获取诊断信息的辅助函数
export const getDiagnosisByName = (name: string) => {
return ecgDiagnoses.find((diagnosis) => diagnosis.name === name)
}

View File

@ -0,0 +1 @@