静态心电
This commit is contained in:
parent
f20a0f747d
commit
a11034df42
@ -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®id查询心电数据
|
||||
getStaticdataByExamidAndRegid: async (examid: string, regid: string) => {
|
||||
return await request.get({
|
||||
url: `/system/staticdata/getByExamidAndRegid?examid=` + examid + `®id=` + regid
|
||||
})
|
||||
},
|
||||
|
||||
//根据examid®id保存诊断结论
|
||||
saveDiagnosis: async (data: any) => {
|
||||
return await request.put({ url: `/system/staticdata/saveDiagnosis`, data })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,6 +17,7 @@ export interface StaticecgVO {
|
||||
status: number // 状态:0未申请,1已申请
|
||||
createtime: Date // 创建时间
|
||||
updatetime: Date // 更新时间
|
||||
weartime: Date // 佩戴时间
|
||||
}
|
||||
|
||||
// 静态心电图数据 API
|
||||
|
||||
@ -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>
|
||||
|
||||
539
src/views/analysis/ECG/ECG_workstation.vue
Normal file
539
src/views/analysis/ECG/ECG_workstation.vue
Normal 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)
|
||||
|
||||
// ECG图片URL
|
||||
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
|
||||
// 如果有examid和regid,则加载详细数据
|
||||
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
|
||||
// 只传递必要的字段:examid、regid和诊断结论
|
||||
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>
|
||||
230
src/views/analysis/ECG/ecgDiagListTemplate.ts
Normal file
230
src/views/analysis/ECG/ecgDiagListTemplate.ts
Normal 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)
|
||||
}
|
||||
1
src/views/analysis/ECG/hospital.config.ts
Normal file
1
src/views/analysis/ECG/hospital.config.ts
Normal file
@ -0,0 +1 @@
|
||||
|
||||
Loading…
Reference in New Issue
Block a user