122 lines
4.9 KiB
Vue
122 lines
4.9 KiB
Vue
<template>
|
|
<div style="padding:16px">
|
|
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
|
|
<span style="font-size:18px;font-weight:bold">CDA临床文档管理</span>
|
|
<div>
|
|
<el-button type="primary" @click="showGenerate = true">生成CDA文档</el-button>
|
|
<el-button @click="loadPage">刷新</el-button>
|
|
</div>
|
|
</div>
|
|
<el-table :data="docList" border stripe>
|
|
<el-table-column prop="documentType" label="文档类型" width="120">
|
|
<template #default="{row}">
|
|
<el-tag size="small">{{ typeMap[row.documentType] || row.documentType }}</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="documentTitle" label="文档标题" min-width="180" show-overflow-tooltip />
|
|
<el-table-column prop="encounterId" label="就诊ID" width="100" />
|
|
<el-table-column prop="patientId" label="患者ID" width="100" />
|
|
<el-table-column prop="status" label="状态" width="90">
|
|
<template #default="{row}">
|
|
<el-tag :type="row.status==='PUBLISHED'?'success':row.status==='DRAFT'?'warning':'info'" size="small">
|
|
{{ row.status === 'DRAFT' ? '草稿' : row.status === 'PUBLISHED' ? '已发布' : row.status }}
|
|
</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="versionId" label="版本" width="60" align="center" />
|
|
<el-table-column prop="createTime" label="创建时间" width="170" />
|
|
<el-table-column label="操作" width="160">
|
|
<template #default="{row}">
|
|
<el-button type="primary" link size="small" @click="viewCda(row)">查看XML</el-button>
|
|
<el-button v-if="row.status==='DRAFT'" type="success" link size="small" @click="doPublish(row.id)">发布</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<el-pagination
|
|
v-model:current-page="page.pageNo"
|
|
v-model:page-size="page.pageSize"
|
|
style="margin-top:12px;justify-content:flex-end"
|
|
:total="pageTotal"
|
|
layout="total,prev,pager,next"
|
|
@current-change="loadPage"
|
|
/>
|
|
|
|
<el-dialog v-model="showGenerate" title="生成CDA文档" width="600px">
|
|
<el-form :model="genForm" label-width="100px">
|
|
<el-form-item label="就诊ID">
|
|
<el-input v-model="genForm.encounterId" />
|
|
</el-form-item>
|
|
<el-form-item label="患者ID">
|
|
<el-input v-model="genForm.patientId" />
|
|
</el-form-item>
|
|
<el-form-item label="文档类型">
|
|
<el-select v-model="genForm.documentType" style="width:100%">
|
|
<el-option label="入院记录" value="admission" />
|
|
<el-option label="出院记录" value="discharge" />
|
|
<el-option label="检验报告" value="lab_report" />
|
|
<el-option label="转诊记录" value="referral" />
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="文档标题">
|
|
<el-input v-model="genForm.documentTitle" />
|
|
</el-form-item>
|
|
<el-form-item label="临床数据">
|
|
<el-input v-model="genForm.clinicalData" type="textarea" :rows="6" />
|
|
</el-form-item>
|
|
</el-form>
|
|
<template #footer>
|
|
<el-button @click="showGenerate = false">取消</el-button>
|
|
<el-button type="primary" @click="doGenerate">生成</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
|
|
<el-dialog v-model="showXml" title="CDA文档XML" width="800px">
|
|
<el-input v-model="xmlContent" type="textarea" :rows="20" readonly />
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
<script setup>
|
|
import { ref, onMounted } from 'vue'
|
|
import { ElMessage } from 'element-plus'
|
|
import { generateCda, getCdaPage, publishCdaDocument } from './api'
|
|
|
|
const typeMap = { admission: '入院记录', discharge: '出院记录', lab_report: '检验报告', referral: '转诊记录' }
|
|
const docList = ref([])
|
|
const pageTotal = ref(0)
|
|
const page = ref({ pageNo: 1, pageSize: 20 })
|
|
const showGenerate = ref(false)
|
|
const genForm = ref({ encounterId: '', patientId: '', documentType: 'admission', documentTitle: '', clinicalData: '' })
|
|
const showXml = ref(false)
|
|
const xmlContent = ref('')
|
|
|
|
const loadPage = async () => {
|
|
const r = await getCdaPage(page.value)
|
|
docList.value = r.data?.records || []
|
|
pageTotal.value = r.data?.total || 0
|
|
}
|
|
|
|
const doGenerate = async () => {
|
|
if (!genForm.value.encounterId || !genForm.value.documentType) {
|
|
ElMessage.warning('就诊ID和文档类型必填'); return
|
|
}
|
|
const r = await generateCda(genForm.value)
|
|
if (r.code === 200) {
|
|
ElMessage.success('CDA文档已生成')
|
|
showGenerate.value = false
|
|
loadPage()
|
|
} else {
|
|
ElMessage.error(r.msg || '生成失败')
|
|
}
|
|
}
|
|
|
|
const doPublish = async (id) => {
|
|
const r = await publishCdaDocument(id)
|
|
if (r.code === 200) { ElMessage.success('已发布'); loadPage() }
|
|
else ElMessage.error(r.msg || '发布失败')
|
|
}
|
|
|
|
const viewCda = (row) => { xmlContent.value = row.cdaXml || ''; showXml.value = true }
|
|
|
|
onMounted(() => { loadPage() })
|
|
</script>
|