| | |
| | | /> |
| | | </div> |
| | | </el-card> |
| | | |
| | | <el-dialog |
| | | title="会议纪要" |
| | | :visible.sync="minutesDialogVisible" |
| | | width="600px" |
| | | width="700px" |
| | | > |
| | | <div v-if="currentRecord.meetingMinutes"> |
| | | <el-alert |
| | |
| | | <div class="minutes-content"> |
| | | <el-card> |
| | | <div |
| | | style="white-space: pre-line; line-height: 1.6; max-height: 400px; overflow-y: auto;" |
| | | style="white-space: pre-line; line-height: 1.6; max-height: 300px; overflow-y: auto;" |
| | | > |
| | | {{ currentRecord.meetingMinutes }} |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | |
| | | <!-- 会议纪要附件展示 --> |
| | | <div |
| | | class="minutes-attachments" |
| | | v-if=" |
| | | currentRecord.minutesAttachments && |
| | | currentRecord.minutesAttachments.length > 0 |
| | | " |
| | | > |
| | | <el-divider content-position="left">会议纪要附件</el-divider> |
| | | <div class="attachment-list"> |
| | | <div |
| | | v-for="file in currentRecord.minutesAttachments" |
| | | :key="file.id" |
| | | class="attachment-item" |
| | | > |
| | | <el-link |
| | | type="primary" |
| | | :href="file.url" |
| | | target="_blank" |
| | | class="file-link" |
| | | > |
| | | <i |
| | | :class="getFileIcon(file.type)" |
| | | style="margin-right: 8px;" |
| | | ></i> |
| | | {{ file.name }} |
| | | <span class="file-size">({{ formatFileSize(file.size) }})</span> |
| | | </el-link> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div |
| | | class="minutes-meta" |
| | | style="margin-top: 16px; color: #909399; font-size: 12px;" |
| | |
| | | {{ currentRecord.content }} |
| | | </div> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="附件" |
| | | :span="2" |
| | | v-if="currentRecord.attachments && currentRecord.attachments.length" |
| | | <el-descriptions-item label="会议详情附件" :span="2"> |
| | | <div class="detail-attachments"> |
| | | <div |
| | | v-if=" |
| | | currentRecord.detailAttachments && |
| | | currentRecord.detailAttachments.length > 0 |
| | | " |
| | | class="attachment-grid" |
| | | > |
| | | <div |
| | | v-for="file in currentRecord.attachments" |
| | | v-for="file in currentRecord.detailAttachments" |
| | | :key="file.id" |
| | | class="attachment-card" |
| | | > |
| | | <el-card shadow="hover" class="file-card"> |
| | | <div class="file-content"> |
| | | <i :class="getFileIcon(file.type)" class="file-icon"></i> |
| | | <div class="file-info"> |
| | | <div class="file-name" :title="file.name"> |
| | | {{ file.name }} |
| | | </div> |
| | | <div class="file-meta"> |
| | | <span class="file-size">{{ |
| | | formatFileSize(file.size) |
| | | }}</span> |
| | | <span class="file-time">{{ |
| | | formatDateTime(file.uploadTime) |
| | | }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="file-actions"> |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click="handlePreview(file)" |
| | | >预览</el-button |
| | | > |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click="handleDownload(file)" |
| | | >下载</el-button |
| | | > |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </div> |
| | | <div v-else class="no-attachment"> |
| | | <el-empty |
| | | description="暂无会议详情附件" |
| | | :image-size="50" |
| | | ></el-empty> |
| | | </div> |
| | | </div> |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 会议概要附件 --> |
| | | <el-descriptions-item label="会议概要附件" :span="2"> |
| | | <div class="summary-attachments"> |
| | | <div |
| | | v-if=" |
| | | currentRecord.summaryAttachments && |
| | | currentRecord.summaryAttachments.length > 0 |
| | | " |
| | | class="attachment-list" |
| | | > |
| | | <div |
| | | v-for="file in currentRecord.summaryAttachments" |
| | | :key="file.id" |
| | | class="attachment-item" |
| | | > |
| | | <el-link type="primary" :href="file.url" target="_blank"> |
| | | <i class="el-icon-document"></i> {{ file.name }} |
| | | <el-link |
| | | type="primary" |
| | | :href="file.url" |
| | | target="_blank" |
| | | class="file-link" |
| | | > |
| | | <i |
| | | :class="getFileIcon(file.type)" |
| | | style="margin-right: 8px;" |
| | | ></i> |
| | | {{ file.name }} |
| | | <span class="file-size" |
| | | >({{ formatFileSize(file.size) }})</span |
| | | > |
| | | </el-link> |
| | | </div> |
| | | </div> |
| | | <div v-else class="no-attachment"> |
| | | <el-empty |
| | | description="暂无会议概要附件" |
| | | :image-size="50" |
| | | ></el-empty> |
| | | </div> |
| | | </div> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | |
| | | <el-form-item label="会议地点" prop="location"> |
| | | <el-input v-model="editForm.location" placeholder="请输入会议地点" /> |
| | | </el-form-item> |
| | | <el-form-item label="会议详情附件"> |
| | | <div class="attachment-upload-section"> |
| | | <div class="section-title">会议相关资料</div> |
| | | <div class="upload-tip">上传会议讨论材料、背景资料等相关文件</div> |
| | | <el-upload |
| | | class="detail-upload" |
| | | action="#" |
| | | :auto-upload="false" |
| | | :on-change="handleDetailFileChange" |
| | | :file-list="editForm.detailAttachments" |
| | | :limit="10" |
| | | multiple |
| | | > |
| | | <el-button size="small" type="primary" icon="el-icon-upload"> |
| | | 上传详情附件 |
| | | </el-button> |
| | | <div slot="tip" class="el-upload__tip"> |
| | | 支持文档、图片等格式,单个文件不超过20MB |
| | | </div> |
| | | </el-upload> |
| | | <div |
| | | v-if=" |
| | | editForm.detailAttachments && |
| | | editForm.detailAttachments.length > 0 |
| | | " |
| | | class="uploaded-files" |
| | | > |
| | | <div |
| | | v-for="(file, index) in editForm.detailAttachments" |
| | | :key="file.uid || index" |
| | | class="file-item" |
| | | > |
| | | <span class="file-name">{{ file.name }}</span> |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click="handleRemoveDetailFile(index)" |
| | | style="color: #F56C6C;" |
| | | > |
| | | 删除 |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="会议概要" prop="summary"> |
| | | <el-input |
| | | v-model="editForm.summary" |
| | | type="textarea" |
| | | :rows="2" |
| | | placeholder="请输入会议概要" |
| | | maxlength="200" |
| | | show-word-limit |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <!-- 会议概要附件上传 --> |
| | | <el-form-item label="会议概要附件"> |
| | | <div class="attachment-upload-section"> |
| | | <div class="section-title">会议纪要材料</div> |
| | | <div class="upload-tip">上传会议纪要、决议文件等相关材料</div> |
| | | <el-upload |
| | | class="summary-upload" |
| | | action="#" |
| | | :auto-upload="false" |
| | | :on-change="handleSummaryFileChange" |
| | | :file-list="editForm.summaryAttachments" |
| | | :limit="5" |
| | | multiple |
| | | > |
| | | <el-button size="small" type="primary" icon="el-icon-upload"> |
| | | 上传概要附件 |
| | | </el-button> |
| | | <div slot="tip" class="el-upload__tip"> |
| | | 支持PDF、Word等文档格式,单个文件不超过10MB |
| | | </div> |
| | | </el-upload> |
| | | <div |
| | | v-if=" |
| | | editForm.summaryAttachments && |
| | | editForm.summaryAttachments.length > 0 |
| | | " |
| | | class="uploaded-files" |
| | | > |
| | | <div |
| | | v-for="(file, index) in editForm.summaryAttachments" |
| | | :key="file.uid || index" |
| | | class="file-item" |
| | | > |
| | | <span class="file-name">{{ file.name }}</span> |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click="handleRemoveSummaryFile(index)" |
| | | style="color: #F56C6C;" |
| | | > |
| | | 删除 |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-form-item> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="开始时间" prop="startTime"> |
| | |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="附件上传"> |
| | | <!-- 会议纪要附件上传 --> |
| | | <el-form-item label="会议纪要附件"> |
| | | <div class="attachment-upload-section"> |
| | | <div class="upload-tip">上传与会议纪要相关的补充材料</div> |
| | | <el-upload |
| | | class="minutes-upload" |
| | | action="#" |
| | | :auto-upload="false" |
| | | :on-change="handleFileChange" |
| | | :file-list="editForm.attachments" |
| | | :on-change="handleMinutesFileChange" |
| | | :file-list="editForm.minutesAttachments" |
| | | :limit="5" |
| | | multiple |
| | | > |
| | | <el-button size="small" type="primary">点击上传</el-button> |
| | | <el-button size="small" type="primary" icon="el-icon-upload"> |
| | | 上传纪要附件 |
| | | </el-button> |
| | | <div slot="tip" class="el-upload__tip"> |
| | | 支持上传文档、图片等文件,单个文件不超过10MB |
| | | 支持图片、文档等格式,单个文件不超过10MB |
| | | </div> |
| | | </el-upload> |
| | | </div> |
| | | </el-form-item> |
| | | <el-form-item label="会议纪要" prop="meetingMinutes"> |
| | | <el-input |
| | |
| | | endTime: "", |
| | | summary: "", |
| | | content: "", |
| | | attachments: [] |
| | | attachments: [], |
| | | detailAttachments: [], // 会议详情附件 |
| | | summaryAttachments: [], // 会议概要附件 |
| | | minutesAttachments: [] // 会议纪要附件 |
| | | }, |
| | | // 表单验证规则 |
| | | editRules: { |
| | |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | getFileIcon(fileType) { |
| | | const iconMap = { |
| | | pdf: "el-icon-document", |
| | | doc: "el-icon-document", |
| | | docx: "el-icon-document", |
| | | xls: "el-icon-document", |
| | | xlsx: "el-icon-document", |
| | | ppt: "el-icon-document", |
| | | pptx: "el-icon-document", |
| | | jpg: "el-icon-picture", |
| | | jpeg: "el-icon-picture", |
| | | png: "el-icon-picture", |
| | | gif: "el-icon-picture", |
| | | zip: "el-icon-folder", |
| | | rar: "el-icon-folder" |
| | | }; |
| | | return iconMap[fileType] || "el-icon-document"; |
| | | }, |
| | | // 查看会议纪要 |
| | | handleViewMinutes(record) { |
| | |
| | | const meetingMinutes = hasMinutes |
| | | ? minutesExamples[Math.floor(Math.random() * minutesExamples.length)] |
| | | : ""; |
| | | |
| | | const hasDetailAttachments = Math.random() > 0.5; |
| | | const hasSummaryAttachments = Math.random() > 0.6; |
| | | const hasMinutesAttachments = Math.random() > 0.7; |
| | | return { |
| | | id: index + 1, |
| | | title: `关于${ |
| | |
| | | Math.floor(Math.random() * 4) |
| | | ] |
| | | }的会议`, |
| | | // 添加分类型附件 |
| | | detailAttachments: hasDetailAttachments ? [ |
| | | { |
| | | id: `detail-${index}-1`, |
| | | name: `会议材料-${index}.pdf`, |
| | | type: 'pdf', |
| | | size: 2048000, |
| | | url: '/api/files/meeting-material.pdf', |
| | | uploadTime: new Date(startTime.getTime() - 3600000).toISOString() |
| | | }, |
| | | { |
| | | id: `detail-${index}-2`, |
| | | name: `背景资料-${index}.docx`, |
| | | type: 'docx', |
| | | size: 1024000, |
| | | url: '/api/files/background.docx', |
| | | uploadTime: new Date(startTime.getTime() - 7200000).toISOString() |
| | | } |
| | | ] : [], |
| | | |
| | | summaryAttachments: hasSummaryAttachments ? [ |
| | | { |
| | | id: `summary-${index}-1`, |
| | | name: `会议纪要-${index}.pdf`, |
| | | type: 'pdf', |
| | | size: 512000, |
| | | url: '/api/files/meeting-summary.pdf', |
| | | uploadTime: new Date(startTime.getTime() + 3600000).toISOString() |
| | | } |
| | | ] : [], |
| | | |
| | | minutesAttachments: hasMinutesAttachments ? [ |
| | | { |
| | | id: `minutes-${index}-1`, |
| | | name: `补充材料-${index}.jpg`, |
| | | type: 'jpg', |
| | | size: 1024000, |
| | | url: '/api/files/supplement.jpg', |
| | | uploadTime: new Date(startTime.getTime() + 7200000).toISOString() |
| | | } |
| | | ] : [], |
| | | meetingType: |
| | | meetingTypes[Math.floor(Math.random() * meetingTypes.length)], |
| | | participants: uniqueParticipants, |
| | |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // 新增方法:格式化文件大小 |
| | | formatFileSize(bytes) { |
| | | if (!bytes) return "0 B"; |
| | | const k = 1024; |
| | | const sizes = ["B", "KB", "MB", "GB"]; |
| | | const i = Math.floor(Math.log(bytes) / Math.log(k)); |
| | | return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i]; |
| | | }, |
| | | |
| | | // 分类型文件上传处理 |
| | | handleDetailFileChange(file, fileList) { |
| | | this.editForm.detailAttachments = fileList; |
| | | }, |
| | | |
| | | handleSummaryFileChange(file, fileList) { |
| | | this.editForm.summaryAttachments = fileList; |
| | | }, |
| | | |
| | | handleMinutesFileChange(file, fileList) { |
| | | this.editForm.minutesAttachments = fileList; |
| | | }, |
| | | |
| | | // 删除已上传的文件 |
| | | handleRemoveDetailFile(index) { |
| | | this.editForm.detailAttachments.splice(index, 1); |
| | | }, |
| | | |
| | | handleRemoveSummaryFile(index) { |
| | | this.editForm.summaryAttachments.splice(index, 1); |
| | | }, |
| | | |
| | | // 文件预览和下载 |
| | | handlePreview(file) { |
| | | // 实现文件预览逻辑 |
| | | this.$message.info(`预览文件: ${file.name}`); |
| | | }, |
| | | |
| | | handleDownload(file) { |
| | | // 实现文件下载逻辑 |
| | | const link = document.createElement("a"); |
| | | link.href = file.url; |
| | | link.download = file.name; |
| | | link.click(); |
| | | this.$message.success(`开始下载: ${file.name}`); |
| | | }, |
| | | // 保存记录 |
| | | async handleSave() { |
| | | try { |
| | |
| | | meetingMinutes: "", |
| | | minutesCreateTime: "", |
| | | minutesCreator: "", |
| | | attachments: [] |
| | | detailAttachments: [], |
| | | summaryAttachments: [], |
| | | minutesAttachments: [] |
| | | }; |
| | | } |
| | | } |
| | |
| | | justify-content: space-between; |
| | | } |
| | | } |
| | | /* 新增附件相关样式 */ |
| | | .attachment-upload-section { |
| | | border: 1px solid #ebeef5; |
| | | border-radius: 4px; |
| | | padding: 15px; |
| | | background-color: #fafafa; |
| | | } |
| | | |
| | | .section-title { |
| | | font-weight: bold; |
| | | margin-bottom: 8px; |
| | | color: #303133; |
| | | } |
| | | |
| | | .upload-tip { |
| | | font-size: 12px; |
| | | color: #909399; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .uploaded-files { |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | .file-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 8px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .file-item:last-child { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | .file-name { |
| | | flex: 1; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .attachment-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); |
| | | gap: 10px; |
| | | } |
| | | |
| | | .file-card { |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .file-card:hover { |
| | | transform: translateY(-2px); |
| | | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .file-content { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .file-icon { |
| | | font-size: 24px; |
| | | color: #409EFF; |
| | | margin-right: 10px; |
| | | } |
| | | |
| | | .file-info { |
| | | flex: 1; |
| | | } |
| | | |
| | | .file-name { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | margin-bottom: 4px; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .file-meta { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | font-size: 12px; |
| | | color: #909399; |
| | | } |
| | | |
| | | .file-actions { |
| | | margin-top: 8px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .file-link { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .no-attachment { |
| | | text-align: center; |
| | | padding: 20px; |
| | | color: #909399; |
| | | } |
| | | |
| | | /* 响应式设计 */ |
| | | @media (max-width: 768px) { |
| | | .attachment-grid { |
| | | grid-template-columns: 1fr; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="案例编号" prop="caseNo"> |
| | | <el-form-item label="住院号" prop="caseNo"> |
| | | <el-input v-model="form.caseNo" readonly /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | this.getCoordinatorData(); |
| | | }, |
| | | methods: { |
| | | // 生成案例编号 |
| | | // 生成住院号 |
| | | generateCaseNo() { |
| | | const timestamp = Date.now().toString(); |
| | | this.form.hospitalNo = "D" + timestamp.slice(-6); |
| | |
| | | <el-table-column |
| | | label="操作" |
| | | align="center" |
| | | width="150" |
| | | width="210" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | hospitalNo: "D202512001", |
| | | caseNo: "C202512001", |
| | | donorName: "张三", |
| | | gender: "0", |
| | | gender: "2", |
| | | age: 45, |
| | | birthDate: "1978-05-15", |
| | | diagnosis: "脑外伤", |
| | |
| | | hospitalNo: "D202512003", |
| | | caseNo: "C202512003", |
| | | donorName: "王五", |
| | | gender: "0", |
| | | gender: "2", |
| | | age: 52, |
| | | birthDate: "1971-03-10", |
| | | diagnosis: "脑梗死", |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="案例编号" prop="caseNo"> |
| | | <el-form-item label="住院号" prop="caseNo"> |
| | | <el-input v-model="form.caseNo" readonly /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | this.getCoordinatorData(); |
| | | }, |
| | | methods: { |
| | | // 生成案例编号 |
| | | // 生成住院号 |
| | | generateCaseNo() { |
| | | const timestamp = Date.now().toString(); |
| | | this.form.hospitalNo = "D" + timestamp.slice(-6); |
| | |
| | | <el-table-column |
| | | label="操作" |
| | | align="center" |
| | | width="150" |
| | | width="210" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | hospitalNo: "D202512001", |
| | | caseNo: "C202512001", |
| | | donorName: "张三", |
| | | gender: "0", |
| | | gender: "2", |
| | | age: 45, |
| | | diagnosis: "脑外伤", |
| | | registrant: "李协调员", |
| | |
| | | hospitalNo: "D202512003", |
| | | caseNo: "C202512003", |
| | | donorName: "王五", |
| | | gender: "0", |
| | | gender: "2", |
| | | age: 52, |
| | | diagnosis: "脑梗死", |
| | | registrant: "赵协调员", |
| | |
| | | <el-form :model="form" ref="form" label-width="120px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="案例编号" prop="caseNo"> |
| | | <el-form-item label="住院号" prop="caseNo"> |
| | | <el-input v-model="form.caseNo" :readonly="!isEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | <el-form-item label="确认状态" prop="confirmationStatus"> |
| | | <el-select |
| | | v-model="form.confirmationStatus" |
| | | :disabled="!isEdit" |
| | | |
| | | style="width: 100%" |
| | | > |
| | | <el-option label="未确认" value="0" /> |
| | |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | style="width: 100%" |
| | | :disabled="!isEdit" |
| | | |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column |
| | | label="案例编号" |
| | | label="住院号" |
| | | align="center" |
| | | prop="caseNo" |
| | | width="120" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="案例编号" prop="caseNo"> |
| | | <el-form-item label="住院号" prop="caseNo"> |
| | | <el-input v-model="form.caseNo" readonly /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | this.getHospitalData(); |
| | | }, |
| | | methods: { |
| | | // 生成案例编号 |
| | | // 生成住院号 |
| | | generateCaseNo() { |
| | | const timestamp = Date.now().toString(); |
| | | this.form.hospitalNo = "D" + timestamp.slice(-6); |
| | |
| | | <el-table-column |
| | | label="操作" |
| | | align="center" |
| | | width="150" |
| | | width="210" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | hospitalNo: "D202512001", |
| | | caseNo: "C202512001", |
| | | donorName: "张三", |
| | | gender: "0", |
| | | gender: "2", |
| | | age: 45, |
| | | birthDate: "1978-05-15", |
| | | diagnosis: "脑外伤", |
| | |
| | | hospitalNo: "D202512003", |
| | | caseNo: "C202512003", |
| | | donorName: "王五", |
| | | gender: "0", |
| | | gender: "2", |
| | | age: 52, |
| | | birthDate: "1971-03-10", |
| | | diagnosis: "脑梗死", |
| | |
| | | <el-option label="全部" value="" /> |
| | | <el-option label="待审批" value="0" /> |
| | | <el-option label="已通过" value="1" /> |
| | | <el-option label="已驳回" value="2" /> |
| | | <el-option label="已终止" value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | |
| | | <el-form-item label="审批结果" prop="approveResult"> |
| | | <el-radio-group v-model="approveForm.approveResult"> |
| | | <el-radio label="1">通过</el-radio> |
| | | <el-radio label="2">驳回</el-radio> |
| | | <el-radio label="2">终止</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="审批意见" prop="approveOpinion"> |
| | | <el-input |
| | | type="textarea" |
| | | v-model="approveForm.approveOpinion" |
| | | placeholder="请输入详细的审批意见,包括通过或驳回的理由" |
| | | placeholder="请输入详细的审批意见,包括通过或终止的理由" |
| | | :rows="6" |
| | | maxlength="500" |
| | | show-word-limit |
| | |
| | | const statusMap = { |
| | | "0": "warning", // 待审批 |
| | | "1": "success", // 已通过 |
| | | "2": "danger" // 已驳回 |
| | | "2": "danger" // 已终止 |
| | | }; |
| | | return statusMap[status]; |
| | | }, |
| | |
| | | const statusMap = { |
| | | "0": "待审批", |
| | | "1": "已通过", |
| | | "2": "已驳回" |
| | | "2": "已终止" |
| | | }; |
| | | return statusMap[status]; |
| | | } |
| | |
| | | handleDelete(row) { |
| | | const ids = row.id || this.ids; |
| | | this.$modal |
| | | .confirm('是否确认删除案例编号为"' + ids + '"的数据项?') |
| | | .confirm('是否确认删除住院号为"' + ids + '"的数据项?') |
| | | .then(() => { |
| | | // 模拟删除操作 |
| | | this.caseList = this.caseList.filter(item => !ids.includes(item.id)); |
| | |
| | | </div> |
| | | |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="案例编号">{{ |
| | | <el-descriptions-item label="住院号">{{ |
| | | assessmentData.caseNo |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="潜在捐献者姓名">{{ |
| | |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column |
| | | label="案例编号" |
| | | label="住院号" |
| | | align="center" |
| | | prop="caseNo" |
| | | width="120" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="判定医生" prop="judgmentDoctor"> |
| | | <el-input v-model="form.judgmentDoctor" :readonly="!isEdit" /> |
| | | <el-form-item label="判定医生一" prop="judgmentDoctor"> |
| | | <el-input v-model="form.judgmentDoctorone" :readonly="!isEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="判定医生二" prop="judgmentDoctor"> |
| | | <el-input v-model="form.judgmentDoctortwo" :readonly="!isEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="登记人" prop="registrant"> |
| | | <el-input v-model="form.registrant" :readonly="!isEdit" /> |
| | |
| | | |
| | | <el-table-column label="文件类型" width="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-tag size="small">{{ getFileType(scope.row.fileName) }}</el-tag> |
| | | <el-tag size="small">{{ |
| | | getFileType(scope.row.fileName) |
| | | }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="操作" |
| | | width="180" |
| | | align="center" |
| | | > |
| | | <el-table-column label="操作" width="180" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | |
| | | v-if="getAttachmentsByType(type.value).length === 0" |
| | | class="empty-attachment" |
| | | > |
| | | <el-empty description="暂无评估表附件" :image-size="80"></el-empty> |
| | | <el-empty |
| | | description="暂无评估表附件" |
| | | :image-size="80" |
| | | ></el-empty> |
| | | </div> |
| | | </div> |
| | | </el-tab-pane> |
| | |
| | | :auto-upload="false" |
| | | > |
| | | <i class="el-icon-upload"></i> |
| | | <div class="el-upload__text">将评估表文件拖到此处,或<em>点击上传</em></div> |
| | | <div class="el-upload__text"> |
| | | 将评估表文件拖到此处,或<em>点击上传</em> |
| | | </div> |
| | | <div class="el-upload__tip" slot="tip"> |
| | | 支持上传pdf、jpg、png、doc、docx、xls、xlsx格式文件,单个文件不超过10MB |
| | | </div> |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { getDeathJudgmentDetail, updateDeathJudgment } from "./api/mockDeathJudgmentApi"; |
| | | import { |
| | | getDeathJudgmentDetail, |
| | | updateDeathJudgment |
| | | } from "./api/mockDeathJudgmentApi"; |
| | | |
| | | export default { |
| | | name: "DeathJudgmentDetail", |
| | |
| | | }, |
| | | created() { |
| | | const id = this.$route.query.id; |
| | | this.isEdit = this.$route.path.includes('/edit') || this.$route.path.includes('/add'); |
| | | if (id && !this.$route.path.includes('/add')) { |
| | | this.isEdit = |
| | | this.$route.path.includes("/edit") || this.$route.path.includes("/add"); |
| | | if (id && !this.$route.path.includes("/add")) { |
| | | this.getDetail(id); |
| | | } else if (this.$route.path.includes('/add')) { |
| | | } else if (this.$route.path.includes("/add")) { |
| | | this.generateHospitalNo(); |
| | | } |
| | | this.getAttachmentList(); |
| | | }, |
| | | methods: { |
| | | // 生成案例编号 |
| | | // 生成住院号 |
| | | generateHospitalNo() { |
| | | // 模拟生成案例编号:D + 时间戳后6位 |
| | | // 模拟生成住院号:D + 时间戳后6位 |
| | | const timestamp = Date.now().toString(); |
| | | this.form.hospitalNo = 'D' + timestamp.slice(-6); |
| | | this.form.hospitalNo = "D" + timestamp.slice(-6); |
| | | }, |
| | | // 获取详情 |
| | | getDetail(id) { |
| | |
| | | }, |
| | | // 获取文件类型 |
| | | getFileType(fileName) { |
| | | const ext = fileName.split('.').pop().toLowerCase(); |
| | | const ext = fileName |
| | | .split(".") |
| | | .pop() |
| | | .toLowerCase(); |
| | | const typeMap = { |
| | | 'pdf': 'PDF', |
| | | 'doc': 'DOC', |
| | | 'docx': 'DOCX', |
| | | 'xls': 'XLS', |
| | | 'xlsx': 'XLSX', |
| | | 'jpg': 'JPG', |
| | | 'jpeg': 'JPEG', |
| | | 'png': 'PNG' |
| | | pdf: "PDF", |
| | | doc: "DOC", |
| | | docx: "DOCX", |
| | | xls: "XLS", |
| | | xlsx: "XLSX", |
| | | jpg: "JPG", |
| | | jpeg: "JPEG", |
| | | png: "PNG" |
| | | }; |
| | | return typeMap[ext] || ext.toUpperCase(); |
| | | }, |
| | |
| | | // 上传前校验 |
| | | beforeUpload(file) { |
| | | const allowedTypes = [ |
| | | 'application/pdf', |
| | | 'image/jpeg', |
| | | 'image/png', |
| | | 'application/msword', |
| | | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', |
| | | 'application/vnd.ms-excel', |
| | | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' |
| | | "application/pdf", |
| | | "image/jpeg", |
| | | "image/png", |
| | | "application/msword", |
| | | "application/vnd.openxmlformats-officedocument.wordprocessingml.document", |
| | | "application/vnd.ms-excel", |
| | | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" |
| | | ]; |
| | | |
| | | const maxSize = 10 * 1024 * 1024; // 10MB |
| | | |
| | | // 校验文件类型 |
| | | const isTypeOk = allowedTypes.includes(file.type) || |
| | | file.name.endsWith('.pdf') || |
| | | file.name.endsWith('.jpg') || |
| | | file.name.endsWith('.jpeg') || |
| | | file.name.endsWith('.png') || |
| | | file.name.endsWith('.doc') || |
| | | file.name.endsWith('.docx') || |
| | | file.name.endsWith('.xls') || |
| | | file.name.endsWith('.xlsx'); |
| | | const isTypeOk = |
| | | allowedTypes.includes(file.type) || |
| | | file.name.endsWith(".pdf") || |
| | | file.name.endsWith(".jpg") || |
| | | file.name.endsWith(".jpeg") || |
| | | file.name.endsWith(".png") || |
| | | file.name.endsWith(".doc") || |
| | | file.name.endsWith(".docx") || |
| | | file.name.endsWith(".xls") || |
| | | file.name.endsWith(".xlsx"); |
| | | |
| | | if (!isTypeOk) { |
| | | this.$message.error('文件格式不支持,请上传pdf、jpg、png、doc、docx、xls或xlsx格式文件'); |
| | | this.$message.error( |
| | | "文件格式不支持,请上传pdf、jpg、png、doc、docx、xls或xlsx格式文件" |
| | | ); |
| | | return false; |
| | | } |
| | | |
| | | // 校验文件大小 |
| | | if (file.size > maxSize) { |
| | | this.$message.error('文件大小不能超过10MB'); |
| | | this.$message.error("文件大小不能超过10MB"); |
| | | return false; |
| | | } |
| | | |
| | |
| | | // 提交上传 |
| | | async submitUpload() { |
| | | if (this.tempFileList.length === 0) { |
| | | this.$message.warning('请先选择要上传的文件'); |
| | | this.$message.warning("请先选择要上传的文件"); |
| | | return; |
| | | } |
| | | |
| | |
| | | fileName: file.name, |
| | | fileSize: file.size, |
| | | uploadTime: new Date().toISOString(), |
| | | uploader: '当前用户', |
| | | uploader: "当前用户", |
| | | fileUrl: URL.createObjectURL(file.raw) |
| | | }; |
| | | |
| | | this.attachmentList.push(newAttachment); |
| | | } |
| | | |
| | | this.$message.success('文件上传成功'); |
| | | this.$message.success("文件上传成功"); |
| | | this.uploadDialogVisible = false; |
| | | this.tempFileList = []; |
| | | } catch (error) { |
| | | this.$message.error('文件上传失败'); |
| | | console.error('上传失败:', error); |
| | | this.$message.error("文件上传失败"); |
| | | console.error("上传失败:", error); |
| | | } finally { |
| | | this.uploadLoading = false; |
| | | } |
| | | }, |
| | | // 删除附件 |
| | | handleRemoveAttachment(attachment) { |
| | | this.$confirm('确定要删除这个评估表附件吗?', '提示', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | const index = this.attachmentList.findIndex(item => item.id === attachment.id); |
| | | this.$confirm("确定要删除这个评估表附件吗?", "提示", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | const index = this.attachmentList.findIndex( |
| | | item => item.id === attachment.id |
| | | ); |
| | | if (index !== -1) { |
| | | this.attachmentList.splice(index, 1); |
| | | this.$message.success('评估表删除成功'); |
| | | this.$message.success("评估表删除成功"); |
| | | } |
| | | }).catch(() => {}); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // 预览附件 |
| | | handlePreview(attachment) { |
| | | if (attachment.fileName.endsWith('.pdf')) { |
| | | window.open(attachment.fileUrl, '_blank'); |
| | | if (attachment.fileName.endsWith(".pdf")) { |
| | | window.open(attachment.fileUrl, "_blank"); |
| | | } else if (attachment.fileName.match(/\.(jpg|jpeg|png)$/i)) { |
| | | this.$alert(`<img src="${attachment.fileUrl}" style="max-width: 100%;" alt="${attachment.fileName}">`, |
| | | '图片预览', { |
| | | this.$alert( |
| | | `<img src="${attachment.fileUrl}" style="max-width: 100%;" alt="${attachment.fileName}">`, |
| | | "图片预览", |
| | | { |
| | | dangerouslyUseHTMLString: true, |
| | | customClass: 'image-preview-dialog' |
| | | }); |
| | | customClass: "image-preview-dialog" |
| | | } |
| | | ); |
| | | } else { |
| | | this.$message.info('该文件类型暂不支持在线预览,请下载后查看'); |
| | | this.$message.info("该文件类型暂不支持在线预览,请下载后查看"); |
| | | } |
| | | }, |
| | | // 下载附件 |
| | | handleDownload(attachment) { |
| | | // 实际项目中调用下载接口 |
| | | const link = document.createElement('a'); |
| | | const link = document.createElement("a"); |
| | | link.href = attachment.fileUrl; |
| | | link.download = attachment.fileName; |
| | | link.click(); |
| | |
| | | updateDeathJudgment(this.form) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success('保存成功'); |
| | | if (this.$route.path.includes('/add')) { |
| | | this.$router.push('/case/deathJudgment'); |
| | | this.$message.success("保存成功"); |
| | | if (this.$route.path.includes("/add")) { |
| | | this.$router.push("/case/deathJudgment"); |
| | | } else { |
| | | this.isEdit = false; |
| | | } |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error('保存失败:', error); |
| | | this.$message.error('保存失败'); |
| | | console.error("保存失败:", error); |
| | | this.$message.error("保存失败"); |
| | | }) |
| | | .finally(() => { |
| | | this.saveLoading = false; |
| | |
| | | }, |
| | | // 文件大小格式化 |
| | | formatFileSize(size) { |
| | | if (size === 0) return '0 B'; |
| | | if (size === 0) return "0 B"; |
| | | const k = 1024; |
| | | const sizes = ['B', 'KB', 'MB', 'GB']; |
| | | const sizes = ["B", "KB", "MB", "GB"]; |
| | | const i = Math.floor(Math.log(size) / Math.log(k)); |
| | | return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; |
| | | return parseFloat((size / Math.pow(k, i)).toFixed(2)) + " " + sizes[i]; |
| | | }, |
| | | // 时间格式化 |
| | | parseTime(time) { |
| | | if (!time) return ''; |
| | | if (!time) return ""; |
| | | const date = new Date(time); |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`; |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1) |
| | | .toString() |
| | | .padStart(2, "0")}-${date |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0")} ${date |
| | | .getHours() |
| | | .toString() |
| | | .padStart(2, "0")}:${date |
| | | .getMinutes() |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | } |
| | | } |
| | | }; |
| | |
| | | <el-card class="expert-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title" |
| | | >专家审查情况 (18位专家 + 1位主任专家)</span |
| | | >专家审查情况 (18位专家 + 1位主委专家)</span |
| | | > |
| | | <div style="float: right;"> |
| | | <el-button |
| | |
| | | @click="handleSendToChiefExpert" |
| | | :disabled="!canSendToChiefExpert" |
| | | > |
| | | 发送主任专家 |
| | | 发送主委专家 |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="stat-item"> |
| | | <span class="stat-label">主任专家状态:</span> |
| | | <span class="stat-label">主委专家状态:</span> |
| | | <span class="stat-value">{{ chiefExpertStatus }}</span> |
| | | </div> |
| | | </el-col> |
| | |
| | | size="mini" |
| | | type="danger" |
| | | style="margin-left: 5px;" |
| | | >主任</el-tag |
| | | >主委</el-tag |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column label="专家类型" width="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span :class="scope.row.isChief ? 'chief-expert' : 'normal-expert'"> |
| | | {{ scope.row.isChief ? "主任专家" : "专家" }} |
| | | {{ scope.row.isChief ? "主委专家" : "专家" }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-form-item label="专家类型" prop="expertType"> |
| | | <el-radio-group v-model="sendForm.expertType"> |
| | | <el-radio label="normal">专家</el-radio> |
| | | <el-radio label="chief">主任专家</el-radio> |
| | | <el-radio label="chief">主委专家</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item |
| | |
| | | // 专家(18位)- 初始状态为申请中 |
| | | { |
| | | id: 1, |
| | | expertName: "张教授", |
| | | expertName: "陶昊", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 2, |
| | | expertName: "李教授", |
| | | expertName: "刘斌", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 3, |
| | | expertName: "王教授", |
| | | expertName: "于海初 ", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 4, |
| | | expertName: "刘教授", |
| | | expertName: "王红梅", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 5, |
| | | expertName: "陈教授", |
| | | expertName: "王春光", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 6, |
| | | expertName: "杨教授", |
| | | expertName: "王静", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 7, |
| | | expertName: "黄教授", |
| | | expertName: "边文超", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 8, |
| | | expertName: "赵教授", |
| | | expertName: "闫志勇", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 9, |
| | | expertName: "周教授", |
| | | expertName: "许凤", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 10, |
| | | expertName: "吴教授", |
| | | expertName: "许传屾", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 11, |
| | | expertName: "徐教授", |
| | | expertName: "张红岩", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 12, |
| | | expertName: "孙教授", |
| | | expertName: "杨苏民", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 13, |
| | | expertName: "朱教授", |
| | | expertName: "宋玉强", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 14, |
| | | expertName: "马教授", |
| | | expertName: "周传利", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 15, |
| | | expertName: "胡教授", |
| | | expertName: "荆凡波", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 16, |
| | | expertName: "林教授", |
| | | expertName: "矫文捷", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 17, |
| | | expertName: "郭教授", |
| | | expertName: "董震", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | }, |
| | | { |
| | | id: 18, |
| | | expertName: "何教授", |
| | | expertName: "蔡金贞", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | // 主任专家(1位) |
| | | // 主委专家(1位) |
| | | { |
| | | id: 19, |
| | | expertName: "主任专家", |
| | | expertName: "孔心涓", |
| | | isChief: true, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | { id: 1, name: "张教授", type: "normal" }, |
| | | { id: 2, name: "李教授", type: "normal" }, |
| | | { id: 3, name: "王教授", type: "normal" }, |
| | | { id: 4, name: "赵主任", type: "chief" } |
| | | { id: 4, name: "赵主委", type: "chief" } |
| | | ] |
| | | }; |
| | | }, |
| | |
| | | expert => !expert.isChief && expert.expertConclusion === "approved" |
| | | ).length; |
| | | }, |
| | | // 计算属性:主任专家状态 |
| | | // 计算属性:主委专家状态 |
| | | chiefExpertStatus() { |
| | | const chiefExpert = this.expertReviews.find(expert => expert.isChief); |
| | | return chiefExpert |
| | |
| | | ).length > 0 |
| | | ); |
| | | }, |
| | | // 是否可以发送给主任专家(需要至少12个专家同意) |
| | | // 是否可以发送给主委专家(需要至少12个专家同意) |
| | | canSendToChiefExpert() { |
| | | return ( |
| | | this.approvedNormalExperts >= 12 && |
| | |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | // 主任专家(1位) |
| | | // 主委专家(1位) |
| | | { |
| | | id: 19, |
| | | expertName: "赵主任", |
| | | expertName: "赵主委", |
| | | isChief: true, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | this.sendDialogVisible = true; |
| | | }, |
| | | |
| | | // 发送给主任专家 |
| | | // 发送给主委专家 |
| | | handleSendToChiefExpert() { |
| | | const chiefExpert = this.expertReviews.find( |
| | | expert => expert.isChief && expert.reviewStatus === "applying" |
| | |
| | | <div> |
| | | <p><strong>专家姓名:</strong>${expert.expertName}</p> |
| | | <p><strong>专家类型:</strong>${ |
| | | expert.isChief ? "主任专家" : "专家" |
| | | expert.isChief ? "主委专家" : "专家" |
| | | }</p> |
| | | <p><strong>审查状态:</strong>${this.statusTextFilter( |
| | | expert.reviewStatus |
| | |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | /* 主任专家行高亮 */ |
| | | /* 主委专家行高亮 */ |
| | | :deep(.chief-expert-row) { |
| | | background-color: #fff7e6 !important; |
| | | } |
| | |
| | | setTimeout(() => { |
| | | // 模拟导出数据处理 |
| | | const exportData = maintenanceData.rows.map(item => ({ |
| | | '案例编号': item.caseNo, |
| | | '住院号': item.caseNo, |
| | | '捐献者姓名': item.donorName, |
| | | '性别': item.gender === '0' ? '男' : '女', |
| | | '年龄': item.age, |
| | |
| | | </div> |
| | | |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="案例编号"> |
| | | <el-descriptions-item label="住院号"> |
| | | {{ caseInfo.caseNo }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="住院号"> |
| | |
| | | <el-form :model="form" ref="form" :rules="rules" label-width="120px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="案例编号" prop="hospitalNo"> |
| | | <el-form-item label="住院号" prop="hospitalNo"> |
| | | <el-input |
| | | v-model="form.hospitalNo" |
| | | :readonly="!isEdit" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="判定医生" prop="judgmentDoctor"> |
| | | <el-input v-model="form.judgmentDoctor" :readonly="!isEdit" /> |
| | | <el-form-item label="判定医生一" prop="judgmentDoctor"> |
| | | <el-input v-model="form.judgmentDoctorone" :readonly="!isEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="判定医生二" prop="judgmentDoctor"> |
| | | <el-input v-model="form.judgmentDoctortwo" :readonly="!isEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="登记人" prop="registrant"> |
| | | <el-input v-model="form.registrant" :readonly="!isEdit" /> |
| | |
| | | this.getAttachmentList(); |
| | | }, |
| | | methods: { |
| | | // 生成案例编号 |
| | | // 生成住院号 |
| | | generateHospitalNo() { |
| | | // 模拟生成案例编号:D + 时间戳后6位 |
| | | // 模拟生成住院号:D + 时间戳后6位 |
| | | const timestamp = Date.now().toString(); |
| | | this.form.hospitalNo = 'D' + timestamp.slice(-6); |
| | | }, |
| | |
| | | width="120" |
| | | /> |
| | | <el-table-column |
| | | label="判定医生二" |
| | | align="center" |
| | | prop="judgmentDoctortwo" |
| | | width="120" |
| | | /> |
| | | <el-table-column |
| | | label="登记时间" |
| | | align="center" |
| | | prop="registrationTime" |
| | |
| | | <el-table-column |
| | | label="操作" |
| | | align="center" |
| | | width="180" |
| | | width="210" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | <el-card class="expert-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title" |
| | | >专家审查情况 (18位专家 + 1位主任专家)</span |
| | | >专家审查情况 (18位专家 + 1位主委专家)</span |
| | | > |
| | | <div style="float: right;"> |
| | | <el-button |
| | |
| | | @click="handleSendToChiefExpert" |
| | | :disabled="!canSendToChiefExpert" |
| | | > |
| | | 发送主任专家 |
| | | 发送主委专家 |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="stat-item"> |
| | | <span class="stat-label">主任专家状态:</span> |
| | | <span class="stat-label">主委专家状态:</span> |
| | | <span class="stat-value">{{ chiefExpertStatus }}</span> |
| | | </div> |
| | | </el-col> |
| | |
| | | size="mini" |
| | | type="danger" |
| | | style="margin-left: 5px;" |
| | | >主任</el-tag |
| | | >主委</el-tag |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column label="专家类型" width="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span :class="scope.row.isChief ? 'chief-expert' : 'normal-expert'"> |
| | | {{ scope.row.isChief ? "主任专家" : "专家" }} |
| | | {{ scope.row.isChief ? "主委专家" : "专家" }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-form-item label="专家类型" prop="expertType"> |
| | | <el-radio-group v-model="sendForm.expertType"> |
| | | <el-radio label="normal">专家</el-radio> |
| | | <el-radio label="chief">主任专家</el-radio> |
| | | <el-radio label="chief">主委专家</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item |
| | |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | // 主任专家(1位) |
| | | // 主委专家(1位) |
| | | { |
| | | id: 19, |
| | | expertName: "孔心涓", |
| | |
| | | { id: 1, name: "张教授", type: "normal" }, |
| | | { id: 2, name: "李教授", type: "normal" }, |
| | | { id: 3, name: "王教授", type: "normal" }, |
| | | { id: 4, name: "赵主任", type: "chief" } |
| | | { id: 4, name: "赵主委", type: "chief" } |
| | | ] |
| | | }; |
| | | }, |
| | |
| | | expert => !expert.isChief && expert.expertConclusion === "approved" |
| | | ).length; |
| | | }, |
| | | // 计算属性:主任专家状态 |
| | | // 计算属性:主委专家状态 |
| | | chiefExpertStatus() { |
| | | const chiefExpert = this.expertReviews.find(expert => expert.isChief); |
| | | return chiefExpert |
| | |
| | | ).length > 0 |
| | | ); |
| | | }, |
| | | // 是否可以发送给主任专家(需要至少12个专家同意) |
| | | // 是否可以发送给主委专家(需要至少12个专家同意) |
| | | canSendToChiefExpert() { |
| | | return ( |
| | | this.approvedNormalExperts >= 12 && |
| | |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | // 主任专家(1位) |
| | | // 主委专家(1位) |
| | | { |
| | | id: 19, |
| | | expertName: "赵主任", |
| | | expertName: "赵主委", |
| | | isChief: true, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | |
| | | this.sendDialogVisible = true; |
| | | }, |
| | | |
| | | // 发送给主任专家 |
| | | // 发送给主委专家 |
| | | handleSendToChiefExpert() { |
| | | const chiefExpert = this.expertReviews.find( |
| | | expert => expert.isChief && expert.reviewStatus === "applying" |
| | |
| | | <div> |
| | | <p><strong>专家姓名:</strong>${expert.expertName}</p> |
| | | <p><strong>专家类型:</strong>${ |
| | | expert.isChief ? "主任专家" : "专家" |
| | | expert.isChief ? "主委专家" : "专家" |
| | | }</p> |
| | | <p><strong>审查状态:</strong>${this.statusTextFilter( |
| | | expert.reviewStatus |
| | |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | /* 主任专家行高亮 */ |
| | | /* 主委专家行高亮 */ |
| | | :deep(.chief-expert-row) { |
| | | background-color: #fff7e6 !important; |
| | | } |
| | |
| | | <el-table-column |
| | | label="操作" |
| | | align="center" |
| | | width="200" |
| | | width="260" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column |
| | | label="案例编号" |
| | | label="住院号" |
| | | align="center" |
| | | prop="caseNo" |
| | | width="120" |
| | |
| | | <el-form :model="form" ref="form" label-width="120px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="案例编号" prop="caseNo"> |
| | | <el-form-item label="住院号" prop="caseNo"> |
| | | <el-input v-model="form.caseNo" :readonly="!isEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | setTimeout(() => { |
| | | // 模拟导出数据处理 |
| | | const exportData = maintenanceData.rows.map(item => ({ |
| | | '案例编号': item.caseNo, |
| | | '住院号': item.caseNo, |
| | | '捐献者姓名': item.donorName, |
| | | '性别': item.gender === '0' ? '男' : '女', |
| | | '年龄': item.age, |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="案例编号" prop="caseNo"> |
| | | <el-input v-model="formData.caseNo" placeholder="请输入案例编号" /> |
| | | <el-form-item label="住院号" prop="caseNo"> |
| | | <el-input v-model="formData.caseNo" placeholder="请输入住院号" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | formData: this.getDefaultFormData(), |
| | | formRules: { |
| | | caseNo: [ |
| | | { required: true, message: '请输入案例编号', trigger: 'blur' } |
| | | { required: true, message: '请输入住院号', trigger: 'blur' } |
| | | ], |
| | | donorName: [ |
| | | { required: true, message: '请输入捐献者姓名', trigger: 'blur' } |
| | |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="案例编号" prop="caseNo"> |
| | | <el-form-item label="住院号" prop="caseNo"> |
| | | <el-input |
| | | v-model="queryParams.caseNo" |
| | | placeholder="请输入案例编号" |
| | | placeholder="请输入住院号" |
| | | clearable |
| | | style="width: 200px" |
| | | @keyup.enter.native="handleQuery" |
| | |
| | | <el-table-column label="序号" type="index" width="60" align="center" /> |
| | | <el-table-column label="转运单号" align="center" prop="id" width="140" /> |
| | | <el-table-column |
| | | label="案例编号" |
| | | label="住院号" |
| | | align="center" |
| | | prop="caseNo" |
| | | width="140" |
| | |
| | | </div> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="转运单号">{{ transportData.id }}</el-descriptions-item> |
| | | <el-descriptions-item label="案例编号">{{ transportData.caseNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="住院号">{{ transportData.caseNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="捐献者姓名">{{ transportData.donorName }}</el-descriptions-item> |
| | | <el-descriptions-item label="性别">{{ transportData.gender }}</el-descriptions-item> |
| | | <el-descriptions-item label="年龄">{{ transportData.age }}岁</el-descriptions-item> |
| | |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="状态" prop="recordstate"> |
| | | <el-select v-model="queryParams.recordstate" placeholder="请选择状态" clearable size="small"> |
| | | <el-select |
| | | v-model="queryParams.recordstate" |
| | | placeholder="请选择状态" |
| | | clearable |
| | | size="small" |
| | | > |
| | | <el-option label="全部" value="" /> |
| | | <el-option label="待审核" value="0" /> |
| | | <el-option label="已审核" value="1" /> |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery" |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="mini" |
| | | @click="handleQuery" |
| | | >搜索</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> |
| | | <el-button icon="el-icon-refresh" size="mini" @click="resetQuery" |
| | | >重置</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | |
| | | <div class="stat-icon">⏳</div> |
| | | <div class="stat-info"> |
| | | <div class="stat-count">{{ stats.pendingCount }}</div> |
| | | <div class="stat-label">待审核</div> |
| | | 捐献中 |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | |
| | | <div class="stat-icon">✅</div> |
| | | <div class="stat-info"> |
| | | <div class="stat-count">{{ stats.approvedCount }}</div> |
| | | <div class="stat-label">已审核</div> |
| | | <div class="stat-label">已完成</div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | |
| | | :default-sort="{ prop: 'donatetime', order: 'descending' }" |
| | | style="width: 100%; margin-top: 20px;" |
| | | > |
| | | <el-table-column label="上报时间" align="center" prop="donatetime" width="110" fixed="left"> |
| | | <el-table-column |
| | | label="上报时间" |
| | | align="center" |
| | | prop="donatetime" |
| | | width="110" |
| | | fixed="left" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.donatetime, "{y}-{m}-{d}") }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="进度" align="center" prop="coreteamassessconclusion" width="100" fixed="left"> |
| | | <el-table-column |
| | | label="进度" |
| | | align="center" |
| | | prop="coreteamassessconclusion" |
| | | width="100" |
| | | fixed="left" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="getStatusTag(scope.row.recordstate)"> |
| | | {{ getStatusText(scope.row.recordstate) }} |
| | |
| | | |
| | | <el-table-column label="性别" align="center" prop="sex" width="80"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row.sex === 1 ? '男' : '女' }}</span> |
| | | <span>{{ scope.row.sex === 1 ? "男" : "女" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="年龄" align="center" prop="age" width="80" /> |
| | | |
| | | <el-table-column label="证件号码" align="center" prop="idcardno" width="180" /> |
| | | <el-table-column |
| | | label="证件号码" |
| | | align="center" |
| | | prop="idcardno" |
| | | width="180" |
| | | /> |
| | | |
| | | <el-table-column label="协调员" align="center" prop="reportername" width="100" /> |
| | | <el-table-column |
| | | label="协调员" |
| | | align="center" |
| | | prop="reportername" |
| | | width="100" |
| | | /> |
| | | |
| | | <el-table-column label="治疗医院" align="center" prop="treatmenthospitalname" width="150" show-overflow-tooltip /> |
| | | |
| | | <el-table-column label="转为案例时间" align="center" prop="donatetime" width="110"> |
| | | <el-table-column |
| | | label="转为案例时间" |
| | | align="center" |
| | | prop="donatetime" |
| | | width="110" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.donatetime, "{y}-{m}-{d}") }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <!-- 第一次医学评估 --> |
| | | <el-table-column label="第一次评估结论" align="center" prop="coreteamassessconclusion" width="120"> |
| | | <el-table-column |
| | | label="第一次评估结论" |
| | | align="center" |
| | | prop="coreteamassessconclusion" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_BaseAssessConclusion" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="第一次评估时间" align="center" prop="coreteamassesstime" width="110"> |
| | | <el-table-column |
| | | label="第一次评估时间" |
| | | align="center" |
| | | prop="coreteamassesstime" |
| | | width="110" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.coreteamassesstime, "{y}-{m}-{d}") }}</span> |
| | | <span>{{ |
| | | parseTime(scope.row.coreteamassesstime, "{y}-{m}-{d}") |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <!-- 第二次医学评估 --> |
| | | <el-table-column label="第二次评估结论" align="center" prop="coreteamassessconclusion" width="120"> |
| | | <el-table-column |
| | | label="第二次评估结论" |
| | | align="center" |
| | | prop="coreteamassessconclusion" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_BaseAssessConclusion" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="第二次评估时间" align="center" prop="coreteamassesstime" width="110"> |
| | | <el-table-column |
| | | label="第二次评估时间" |
| | | align="center" |
| | | prop="coreteamassesstime" |
| | | width="110" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.coreteamassesstime, "{y}-{m}-{d}") }}</span> |
| | | <span>{{ |
| | | parseTime(scope.row.coreteamassesstime, "{y}-{m}-{d}") |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="亲属确认时间" align="center" prop="signdate" width="110"> |
| | | <el-table-column |
| | | label="亲属确认时间" |
| | | align="center" |
| | | prop="signdate" |
| | | width="110" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.signdate, "{y}-{m}-{d}") }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="伦理审查结论" align="center" prop="expertconclusion" width="120"> |
| | | <el-table-column |
| | | label="伦理审查结论" |
| | | align="center" |
| | | prop="expertconclusion" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_EthicalReview" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="伦理审查时间" align="center" prop="conclusiontime" width="110"> |
| | | <el-table-column |
| | | label="伦理审查时间" |
| | | align="center" |
| | | prop="conclusiontime" |
| | | width="110" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.conclusiontime, "{y}-{m}-{d}") }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="器官分配数量" align="center" prop="organcount" width="100" /> |
| | | <el-table-column |
| | | label="器官分配数量" |
| | | align="center" |
| | | prop="organcount" |
| | | width="100" |
| | | /> |
| | | |
| | | <el-table-column label="获取见证时间" align="center" prop="operationbegtime" width="110"> |
| | | <el-table-column |
| | | label="获取见证时间" |
| | | align="center" |
| | | prop="operationbegtime" |
| | | width="110" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.operationbegtime, "{y}-{m}-{d}") }}</span> |
| | | <span>{{ |
| | | parseTime(scope.row.operationbegtime, "{y}-{m}-{d}") |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="完成登记时间" align="center" prop="completetime" width="110"> |
| | | <el-table-column |
| | | label="完成登记时间" |
| | | align="center" |
| | | prop="completetime" |
| | | width="110" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.completetime, "{y}-{m}-{d}") }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="捐献进度" align="center" prop="workflow" width="120" fixed="right"> |
| | | <el-table-column |
| | | label="捐献进度" |
| | | align="center" |
| | | prop="workflow" |
| | | width="120" |
| | | fixed="right" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <div v-if="!scope.row.terminationCase"> |
| | | <dict-tag |
| | |
| | | |
| | | <script> |
| | | // 导入模拟数据生成工具 |
| | | import Mock from 'mockjs'; |
| | | import Mock from "mockjs"; |
| | | |
| | | export default { |
| | | name: "Donatebaseinfo", |
| | |
| | | /** 生成模拟数据 */ |
| | | generateMockData() { |
| | | const mockTemplate = { |
| | | 'list|15-30': [{ |
| | | 'id|+1': 1001, |
| | | 'name': '@cname', |
| | | 'sex|1': [1, 2], // 1:男, 2:女 |
| | | 'age|18-65': 1, |
| | | 'idcardno': /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dX]$/, |
| | | 'reportername': '@cname', |
| | | 'treatmenthospitalname': '@ctitle(3, 5)医院', |
| | | 'donatetime': '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | 'coreteamassessconclusion|1': ['1', '2', '3'], // 评估结论 |
| | | 'coreteamassesstime': '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | 'signdate': '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | 'expertconclusion|1': ['1', '2', '3'], // 伦理审查结论 |
| | | 'conclusiontime': '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | 'organcount|0-5': 1, |
| | | 'operationbegtime': '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | 'completetime': '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | 'workflow|1': ['1', '2', '3', '4', '5'], // 工作流状态 |
| | | 'recordstate|1': ['0', '1', '99'], // 0:待审核, 1:已审核, 99:已终止 |
| | | 'terminationCase|1': [true, false] |
| | | }] |
| | | "list|15-30": [ |
| | | { |
| | | "id|+1": 1001, |
| | | name: "@cname", |
| | | "sex|1": [1, 2], // 1:男, 2:女 |
| | | "age|18-65": 1, |
| | | idcardno: /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dX]$/, |
| | | reportername: "@cname", |
| | | treatmenthospitalname: "@ctitle(3, 5)医院", |
| | | donatetime: '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | "coreteamassessconclusion|1": ["1", "2", "3"], // 评估结论 |
| | | coreteamassesstime: '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | signdate: '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | "expertconclusion|1": ["1", "2", "3"], // 伦理审查结论 |
| | | conclusiontime: '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | "organcount|0-5": 1, |
| | | operationbegtime: '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | completetime: '@datetime("yyyy-MM-dd HH:mm:ss")', |
| | | "workflow|1": ["1", "2", "3", "4", "5"], // 工作流状态 |
| | | "recordstate|1": ["0", "1", "99"], // 0:待审核, 1:已审核, 99:已终止 |
| | | "terminationCase|1": [true, false] |
| | | } |
| | | ] |
| | | }; |
| | | |
| | | return Mock.mock(mockTemplate).list; |
| | |
| | | ); |
| | | } |
| | | if (this.queryParams.recordstate) { |
| | | filteredData = filteredData.filter(item => |
| | | item.recordstate === this.queryParams.recordstate |
| | | filteredData = filteredData.filter( |
| | | item => item.recordstate === this.queryParams.recordstate |
| | | ); |
| | | } |
| | | |
| | | // 分页处理 |
| | | const startIndex = (this.queryParams.pageNum - 1) * this.queryParams.pageSize; |
| | | const startIndex = |
| | | (this.queryParams.pageNum - 1) * this.queryParams.pageSize; |
| | | const endIndex = startIndex + this.queryParams.pageSize; |
| | | this.donatebaseinfoList = filteredData.slice(startIndex, endIndex); |
| | | this.total = filteredData.length; |
| | |
| | | /** 更新统计数据 */ |
| | | updateStats(data) { |
| | | this.stats.totalCount = data.length; |
| | | this.stats.pendingCount = data.filter(item => item.recordstate === '0').length; |
| | | this.stats.approvedCount = data.filter(item => item.recordstate === '1').length; |
| | | this.stats.terminatedCount = data.filter(item => item.recordstate === '99').length; |
| | | this.stats.pendingCount = data.filter( |
| | | item => item.recordstate === "0" |
| | | ).length; |
| | | this.stats.approvedCount = data.filter( |
| | | item => item.recordstate === "1" |
| | | ).length; |
| | | this.stats.terminatedCount = data.filter( |
| | | item => item.recordstate === "99" |
| | | ).length; |
| | | }, |
| | | |
| | | /** 获取状态标签样式 */ |
| | | getStatusTag(status) { |
| | | const statusMap = { |
| | | '0': 'warning', // 待审核 |
| | | '1': 'success', // 已审核 |
| | | '99': 'danger' // 已终止 |
| | | "0": "warning", // 待审核 |
| | | "1": "success", // 已审核 |
| | | "99": "danger" // 已终止 |
| | | }; |
| | | return statusMap[status] || 'info'; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | | |
| | | /** 获取状态文本 */ |
| | | getStatusText(status) { |
| | | const textMap = { |
| | | '0': '待审核', |
| | | '1': '已审核', |
| | | '99': '已终止' |
| | | "0": "捐献中", |
| | | "1": "已完成", |
| | | "99": "已终止" |
| | | }; |
| | | return textMap[status] || '未知状态'; |
| | | return textMap[status] || "未知状态"; |
| | | }, |
| | | |
| | | /** 时间格式化 */ |
| | | parseTime(time, format) { |
| | | if (!time) return '-'; |
| | | if (!time) return "-"; |
| | | const date = new Date(time); |
| | | const year = date.getFullYear(); |
| | | const month = (date.getMonth() + 1).toString().padStart(2, '0'); |
| | | const day = date.getDate().toString().padStart(2, '0'); |
| | | const month = (date.getMonth() + 1).toString().padStart(2, "0"); |
| | | const day = date |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0"); |
| | | |
| | | if (format === '{y}-{m}-{d}') { |
| | | if (format === "{y}-{m}-{d}") { |
| | | return `${year}-${month}-${day}`; |
| | | } |
| | | return time; |
| | |
| | | /** 提交审核 */ |
| | | submitApprove() { |
| | | // 模拟审核提交 |
| | | const index = this.donatebaseinfoList.findIndex(item => item.id === this.currentRecord.id); |
| | | const index = this.donatebaseinfoList.findIndex( |
| | | item => item.id === this.currentRecord.id |
| | | ); |
| | | if (index !== -1) { |
| | | this.donatebaseinfoList[index].recordstate = this.approveForm.approveResult; |
| | | this.$message.success('审核成功'); |
| | | this.donatebaseinfoList[ |
| | | index |
| | | ].recordstate = this.approveForm.approveResult; |
| | | this.$message.success("审核成功"); |
| | | this.approveVisible = false; |
| | | this.getList(); // 重新加载更新统计 |
| | | } |
| | |
| | | } |
| | | |
| | | .stats-card.total { |
| | | border-left: 4px solid #409EFF; |
| | | border-left: 4px solid #409eff; |
| | | } |
| | | |
| | | .stats-card.pending { |
| | | border-left: 4px solid #E6A23C; |
| | | border-left: 4px solid #e6a23c; |
| | | } |
| | | |
| | | .stats-card.approved { |
| | | border-left: 4px solid #67C23A; |
| | | border-left: 4px solid #67c23a; |
| | | } |
| | | |
| | | .stats-card.terminated { |
| | | border-left: 4px solid #F56C6C; |
| | | border-left: 4px solid #f56c6c; |
| | | } |
| | | |
| | | .stat-content { |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="捐献编号" |
| | | label="住院号" |
| | | align="center" |
| | | prop="donorno" |
| | | width="200" |
| | |
| | | > |
| | | <el-row style="margin-top: 40px"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="捐献编号" prop="donorno"> |
| | | <el-form-item label="住院号" prop="donorno"> |
| | | <el-input v-model="form.donorno" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | updatedatas: {}, |
| | | //当前选中捐献者姓名 |
| | | curdonordoname: "", |
| | | //当前选中捐献者案例编号 |
| | | //当前选中捐献者住院号 |
| | | curdonorno: "", |
| | | // 遮罩层 |
| | | loading: true, |
| | |
| | | <span>{{ parseTime(scope.row.donatetime, '{y}-{m}-{d}') }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="案例编号" align="center" prop="donateno" /> |
| | | <el-table-column label="住院号" align="center" prop="donateno" /> |
| | | <el-table-column label="捐献姓名" align="center" prop="name" /> |
| | | <el-table-column label="捐献类别" align="center" prop="donationcategory" /> |
| | | <el-table-column label="捐献器官" align="center" prop="donateorgan" /> |
| | |
| | | </el-col> </el-row |
| | | ><el-row |
| | | ><el-col :span="10" |
| | | ><el-form-item label="案例编号" prop="donateno"> |
| | | ><el-form-item label="住院号" prop="donateno"> |
| | | <el-input |
| | | v-model="form.donateno" |
| | | placeholder="请输入案例编号" |
| | | placeholder="请输入住院号" |
| | | :disabled="true" |
| | | /> |
| | | </el-form-item> |
| | |
| | | updatedatas: {}, |
| | | //当前选中捐献者姓名 |
| | | curdonordoname: "", |
| | | //当前选中捐献者案例编号 |
| | | //当前选中捐献者住院号 |
| | | curdonorno: "", |
| | | // 遮罩层 |
| | | loading: true, |
| | |
| | | updatedatas: {}, |
| | | //当前选中捐献者姓名 |
| | | curdonordoname: "", |
| | | //当前选中捐献者案例编号 |
| | | //当前选中捐献者住院号 |
| | | curdonorno: "", |
| | | // 遮罩层 |
| | | loading: true, |
| | |
| | | updatedatas: {}, |
| | | //当前选中捐献者姓名 |
| | | curdonordoname: "", |
| | | //当前选中捐献者案例编号 |
| | | //当前选中捐献者住院号 |
| | | curdonorno: "", |
| | | // 遮罩层 |
| | | loading: true, |
| | |
| | | updatedatas: {}, |
| | | //当前选中捐献者姓名 |
| | | curdonordoname: "", |
| | | //当前选中捐献者案例编号 |
| | | //当前选中捐献者住院号 |
| | | curdonorno: "", |
| | | // 遮罩层 |
| | | loading: true, |
| | |
| | | updatedatas: {}, |
| | | //当前选中捐献者姓名 |
| | | curdonordoname: "", |
| | | //当前选中捐献者案例编号 |
| | | //当前选中捐献者住院号 |
| | | curdonorno: "", |
| | | // 遮罩层 |
| | | loading: true, |
| | |
| | | city: null |
| | | }, |
| | | |
| | | //当前选中捐献案例编号 |
| | | //当前选中捐献住院号 |
| | | curdonorno: "", |
| | | //当前捐献者id |
| | | curInfoid: "", |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="医院性质" prop="hospitalnature"> |
| | | <el-select |
| | | v-model="form.hospitalnature" |
| | | placeholder="请选择医院性质" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_HospitalNature" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | <el-col :span="5"> |
| | | <el-form-item label="医院编码" prop="medicalcode"> |
| | | <el-input |
| | |
| | | placeholder="选择注册时间" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="10"> |
| | | <el-form-item label="医院性质" prop="hospitalnature"> |
| | | <el-select |
| | | v-model="form.hospitalnature" |
| | | placeholder="请选择医院性质" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_HospitalNature" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <el-form-item label="协调员" prop="coordinator"> |
| | | <el-input |
| | | v-model="form.coordinator" |
| | | placeholder="请输入机构协调员" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | { required: true, message: "组织名称不能为空", trigger: "blur" } |
| | | ], |
| | | hospitalnature: [ |
| | | { required: true, message: "医院性质不能为空", trigger: "blur" }, |
| | | { required: true, message: "医院性质不能为空", trigger: "blur" } |
| | | ], |
| | | regionallevel: [ |
| | | { required: true, message: "所属地市不能为空", trigger: "blur" } |