Files
his/healthlink-his-ui/src/views/esbmanage/cdadocument/index.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>