From e7aa4843b7ff2bc874b0e024697f3928e9e9becc Mon Sep 17 00:00:00 2001 From: yelan Date: Thu, 27 Aug 2026 16:47:31 +0800 Subject: [PATCH] feat(documents): implement document library management --- .../components/DocumentFilterTabs.vue | 122 +++++++ .../components/DocumentLibraryHeader.vue | 148 ++++++++ .../components/DocumentPreviewDialog.vue | 320 ++++++++++++++++++ .../components/DocumentTemplateCard.vue | 216 ++++++++++++ .../src/views/management/documents/index.vue | 295 +++++++++++++++- .../src/views/management/documents/mock.ts | 240 +++++++++++++ .../src/views/management/documents/types.ts | 54 ++- 7 files changed, 1378 insertions(+), 17 deletions(-) create mode 100644 clinical-web/src/views/management/documents/components/DocumentFilterTabs.vue create mode 100644 clinical-web/src/views/management/documents/components/DocumentLibraryHeader.vue create mode 100644 clinical-web/src/views/management/documents/components/DocumentPreviewDialog.vue create mode 100644 clinical-web/src/views/management/documents/components/DocumentTemplateCard.vue create mode 100644 clinical-web/src/views/management/documents/mock.ts diff --git a/clinical-web/src/views/management/documents/components/DocumentFilterTabs.vue b/clinical-web/src/views/management/documents/components/DocumentFilterTabs.vue new file mode 100644 index 0000000..9b2f410 --- /dev/null +++ b/clinical-web/src/views/management/documents/components/DocumentFilterTabs.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/clinical-web/src/views/management/documents/components/DocumentLibraryHeader.vue b/clinical-web/src/views/management/documents/components/DocumentLibraryHeader.vue new file mode 100644 index 0000000..5138e52 --- /dev/null +++ b/clinical-web/src/views/management/documents/components/DocumentLibraryHeader.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/clinical-web/src/views/management/documents/components/DocumentPreviewDialog.vue b/clinical-web/src/views/management/documents/components/DocumentPreviewDialog.vue new file mode 100644 index 0000000..4624197 --- /dev/null +++ b/clinical-web/src/views/management/documents/components/DocumentPreviewDialog.vue @@ -0,0 +1,320 @@ + + + + + diff --git a/clinical-web/src/views/management/documents/components/DocumentTemplateCard.vue b/clinical-web/src/views/management/documents/components/DocumentTemplateCard.vue new file mode 100644 index 0000000..016ba1a --- /dev/null +++ b/clinical-web/src/views/management/documents/components/DocumentTemplateCard.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/clinical-web/src/views/management/documents/index.vue b/clinical-web/src/views/management/documents/index.vue index 707c6de..69d6b34 100644 --- a/clinical-web/src/views/management/documents/index.vue +++ b/clinical-web/src/views/management/documents/index.vue @@ -1,12 +1,293 @@ + + diff --git a/clinical-web/src/views/management/documents/mock.ts b/clinical-web/src/views/management/documents/mock.ts new file mode 100644 index 0000000..ac499fe --- /dev/null +++ b/clinical-web/src/views/management/documents/mock.ts @@ -0,0 +1,240 @@ +import type { DocumentDepartment, DocumentStatus, LibraryDocument } from './types' + +const documentStatusLabels: Record = { + enabled: '启用中', + draft: '草稿', + archived: '归档', + review: '需复审', +} + +export const documentStatusOptions = Object.entries(documentStatusLabels).map(([key, label]) => ({ + key: key as DocumentStatus, + label, +})) + +export { documentStatusLabels } + +function createDocument( + id: string, + name: string, + code: string, + version: string, + description: string, + status: DocumentStatus = 'enabled', +): LibraryDocument { + return { id, name, code, version, description, status } +} + +export const documentLibrary: DocumentDepartment[] = [ + { + key: 'radiology', + name: '放射科', + campus: 'all', + categories: [ + { + name: '核磁相关', + documents: [ + createDocument( + 'doc-rad-mri-001', + 'MRI磁共振检查知情同意书', + 'TPL-RAD-MRI-001', + 'v2.3.1', + '适用于 MRI 检查前风险告知,含幽闭恐惧症、金属植入物、造影剂过敏等注意事项。', + ), + createDocument( + 'doc-rad-mri-002', + '磁共振安全风险告知书', + 'TPL-RAD-MRI-002', + 'v1.8.0', + '磁共振室安全筛查及禁忌证告知,适用于所有进入磁体间人员。', + ), + createDocument( + 'doc-rad-mri-003', + '造影剂注射知情同意书', + 'TPL-RAD-CM-001', + 'v2.1.0', + '含碘、钆造影剂使用风险、过敏史询问及肾功能评估要求。', + ), + ], + }, + { + name: 'CT相关', + documents: [ + createDocument( + 'doc-rad-ct-001', + 'CT增强检查知情同意书', + 'TPL-RAD-CT-001', + 'v2.0.1', + 'CT 增强扫描造影剂风险、注意事项及不良反应处理告知。', + ), + createDocument( + 'doc-rad-ct-002', + 'CT检查辐射告知书', + 'TPL-RAD-CT-002', + 'v1.5.0', + 'CT 检查电离辐射风险说明,覆盖孕妇、儿童等特殊人群注意事项。', + 'review', + ), + ], + }, + { + name: '普放相关', + documents: [ + createDocument( + 'doc-rad-xr-001', + 'X线检查告知书', + 'TPL-RAD-XR-001', + 'v1.2.0', + '普通 X 线检查注意事项及辐射防护告知。', + ), + ], + }, + ], + }, + { + key: 'cardiology', + name: '心内科', + campus: 'all', + categories: [ + { + name: '介入手术', + documents: [ + createDocument( + 'doc-cvd-iv-001', + '心脏介入手术知情同意书', + 'TPL-CVD-IV-001', + 'v2.4.0', + '冠状动脉造影、PCI 等介入操作风险、并发症及替代方案告知。', + ), + createDocument( + 'doc-cvd-cag-001', + '冠状动脉造影知情同意书', + 'TPL-CVD-CAG-001', + 'v2.2.1', + '冠脉造影检查适应证、禁忌证、术中术后风险及造影剂相关风险。', + ), + ], + }, + { + name: '常规诊疗', + documents: [ + createDocument( + 'doc-cvd-pc-001', + '心包穿刺知情同意书', + 'TPL-CVD-PC-001', + 'v1.9.0', + '心包穿刺操作风险、可能并发症及配合事项告知。', + 'draft', + ), + ], + }, + ], + }, + { + key: 'orthopedics', + name: '骨科', + campus: '本部院区', + categories: [ + { + name: '手术相关', + documents: [ + createDocument( + 'doc-ort-op-001', + '骨科手术知情同意书', + 'TPL-ORT-OP-001', + 'v2.1.0', + '骨科手术麻醉方式、术中术后风险、内固定材料及术后康复说明。', + ), + createDocument( + 'doc-ort-ane-001', + '麻醉知情同意书', + 'TPL-ORT-ANE-001', + 'v1.7.0', + '麻醉方式选择、麻醉风险、术后镇痛及可能出现的不良反应。', + 'draft', + ), + createDocument( + 'doc-ort-bt-001', + '输血治疗同意书', + 'TPL-ORT-BT-001', + 'v1.4.0', + '输血适应证、输血反应及经血传播疾病风险告知。', + ), + ], + }, + ], + }, + { + key: 'health-management', + name: '健康管理中心', + campus: '东院区', + categories: [ + { + name: '体检告知', + documents: [ + createDocument( + 'doc-pe-rpt-001', + '体检报告发放及知情同意书', + 'TPL-PE-RPT-001', + 'v1.6.0', + '体检报告领取方式、隐私保护、异常结果随访告知。', + ), + createDocument( + 'doc-pe-pre-001', + '检前告知书', + 'TPL-PE-PRE-001', + 'v1.3.0', + '体检前准备事项、空腹要求及特殊检查注意事项。', + ), + ], + }, + ], + }, + { + key: 'general', + name: '全院通用', + campus: 'all', + categories: [ + { + name: '入院告知', + documents: [ + createDocument( + 'doc-gen-adm-001', + '住院须知及告知书', + 'TPL-GEN-ADM-001', + 'v2.0.0', + '住院期间权利义务、探视制度、费用结算及安全注意事项。', + ), + createDocument( + 'doc-gen-crit-001', + '病危通知书签收单', + 'TPL-GEN-CRIT-001', + 'v1.5.0', + '病危、病重病情告知、家属签收及医患沟通记录。', + 'review', + ), + ], + }, + { + name: '授权委托', + documents: [ + createDocument( + 'doc-gen-pow-001', + '患者授权委托书', + 'TPL-GEN-POW-001', + 'v2.1.0', + '患者授权委托代理人办理医疗相关事务及签署文件的授权书。', + 'archived', + ), + createDocument( + 'doc-gen-ref-001', + '拒绝检查治疗告知书', + 'TPL-GEN-REF-001', + 'v1.8.0', + '患者或代理人拒绝推荐检查、治疗时的风险告知及签字确认。', + ), + ], + }, + ], + }, +] diff --git a/clinical-web/src/views/management/documents/types.ts b/clinical-web/src/views/management/documents/types.ts index 425fc1f..687d82c 100644 --- a/clinical-web/src/views/management/documents/types.ts +++ b/clinical-web/src/views/management/documents/types.ts @@ -1,16 +1,50 @@ -export type DocumentFilterStatus = 'all' | 'draft' | 'published' | 'archived' +export type DocumentStatus = 'enabled' | 'draft' | 'archived' | 'review' + +export type DocumentFilterStatus = 'all' | DocumentStatus + +export type DocumentCampus = 'all' | '本部院区' | '东院区' | '西院区' + +export interface LibraryDocument { + id: string + name: string + code: string + version: string + status: DocumentStatus + description: string +} + +export interface DocumentCategory { + name: string + documents: LibraryDocument[] +} + +export interface DocumentDepartment { + key: string + name: string + campus: DocumentCampus + categories: DocumentCategory[] +} + +export interface DocumentTemplate extends LibraryDocument { + departmentKey: string + department: string + category: string +} export interface DocumentFilterForm { keyword: string - status: DocumentFilterStatus + department: string | null + status: DocumentStatus } -export interface DocumentTableRow { - id: string - name: string - category: string - version: string - status: DocumentFilterStatus - updatedBy: string - updatedAt: string +export interface DepartmentTab { + key: string | null + label: string + count: number +} + +export interface StatusTab { + key: DocumentStatus + label: string + count: number }