| | |
| | | <el-card class="organ-assessment-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>器官评估表</span> |
| | | <!-- <el-button |
| | | v-if="isCoordinator && allOrgansAssessed" |
| | | style="float: right; margin-left: 10px" |
| | | type="primary" |
| | | size="mini" |
| | | @click="handleCompleteAssessment" |
| | | :loading="saveLoading" |
| | | > |
| | | 确认完成评估 |
| | | </el-button> |
| | | <span v-if="!isCoordinator" class="jstitle"> |
| | | 当前角色:{{ currentDepartment }}评估人员 |
| | | </span> --> |
| | | </div> |
| | | |
| | | <!-- 捐献决定表单 --> |
| | | <el-form> |
| | | <el-form-item label-width="100px" label="捐献决定"> |
| | | <el-checkbox-group |
| | | v-model="organdecisionValues" |
| | | @change="handleOrganDecisionChange" |
| | | :disabled="!isEdit" |
| | | > |
| | | <el-checkbox |
| | | v-for="dict in dict.type.sys_Organ" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | >{{ dict.label }} |
| | | <el-checkbox-group v-model="organdecisionValues" @change="handleOrganDecisionChange" :disabled="!isEdit"> |
| | | <el-checkbox v-for="dict in dict.type.sys_Organ" :key="dict.value" :label="dict.value">{{ dict.label }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | <el-input |
| | | v-if="showOtherInput" |
| | | v-model="organdecisionOther" |
| | | placeholder="请输入其他捐献决定的具体内容" |
| | | style="margin-top: 10px; width: 300px;" |
| | | :readonly="!isEdit" |
| | | @input="handleOtherDecisionInput" |
| | | ></el-input> |
| | | <el-input v-if="showOtherInput" v-model="organdecisionOther" placeholder="请输入其他捐献决定的具体内容" |
| | | style="margin-top: 10px; width: 300px;" :readonly="!isEdit" @input="handleOtherDecisionInput"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- 器官评估表格 --> |
| | | <el-table |
| | | :data="filteredOrganAssessmentList" |
| | | v-loading="assessmentLoading" |
| | | style="width: 100%" |
| | | :row-class-name="getRowClassName" |
| | | :expand-row-keys="expandedRowKeys" |
| | | @expand-change="handleExpandChange" |
| | | row-key="organno" |
| | | empty-text="当前捐献决定下暂无需要评估的器官" |
| | | > |
| | | <el-table :data="filteredOrganAssessmentList" v-loading="assessmentLoading" style="width: 100%" |
| | | :row-class-name="getRowClassName" :expand-row-keys="expandedRowKeys" @expand-change="handleExpandChange" |
| | | row-key="organno" empty-text="当前捐献决定下暂无需要评估的器官"> |
| | | <el-table-column type="expand"> |
| | | <template slot-scope="scope"> |
| | | <div class="organ-expand-content" v-if="scope.row.expanded"> |
| | | <el-tabs |
| | | v-model="scope.row.activeTab" |
| | | type="card" |
| | | class="organ-detail-tabs" |
| | | @tab-click="handleTabClick(scope.row, $event)" |
| | | > |
| | | <el-tabs v-model="scope.row.activeTab" type="card" class="organ-detail-tabs" |
| | | @tab-click="handleTabClick(scope.row, $event)"> |
| | | <!-- 动态生成评估Tab --> |
| | | <el-tab-pane |
| | | v-for="(assessment, index) in getOrganAssessments(scope.row)" |
| | | :key="`${scope.row.organno}_${index}`" |
| | | :label="`第${index + 1}次评估`" |
| | | :name="String(index)" |
| | | > |
| | | <organ-assessment-form |
| | | :organ-data="scope.row" |
| | | :assessment-index="index" |
| | | :readonly="!canAssessOrgan(scope.row)" |
| | | :current-user="currentUser" |
| | | @update-assessment="handleUpdateAssessment" |
| | | @delete-assessment="handleDeleteAssessment" |
| | | @save-assessment="handleSaveAssessment" |
| | | /> |
| | | <el-tab-pane v-for="(assessment, index) in getOrganAssessments(scope.row)" |
| | | :key="`${scope.row.organno}_${index}`" :label="`第${index + 1}次评估`" :name="String(index)"> |
| | | <organ-assessment-form :organ-data="scope.row" :assessment-index="index" |
| | | :readonly="!canAssessOrgan(scope.row)" :current-user="currentUser" |
| | | @update-assessment="handleUpdateAssessment" @delete-assessment="handleDeleteAssessment" |
| | | @save-assessment="handleSaveAssessment" /> |
| | | </el-tab-pane> |
| | | |
| | | <!-- 添加评估按钮 --> |
| | | <el-tab-pane |
| | | name="add" |
| | | v-if="canAssessOrgan(scope.row) && isEdit" |
| | | > |
| | | <el-tab-pane name="add" v-if="canAssessOrgan(scope.row) && isEdit"> |
| | | <template slot="label"> |
| | | <el-button |
| | | type="text" |
| | | icon="el-icon-plus" |
| | | @click.stop="handleAddNewAssessment(scope.row)" |
| | | size="mini" |
| | | > |
| | | <el-button type="text" icon="el-icon-plus" @click.stop="handleAddNewAssessment(scope.row)" |
| | | size="mini"> |
| | | 新增评估 |
| | | </el-button> |
| | | </template> |
| | |
| | | <el-descriptions-item label="器官类型"> |
| | | <span class="summary-item">{{ |
| | | getOrganLabel(scope.row.organno) |
| | | }}</span> |
| | | }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="获取机构"> |
| | | <span class="summary-item">{{ |
| | | scope.row.gainhospitalname |
| | | }}</span> |
| | | }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="评估次数" :span="2"> |
| | | <el-tag type="info" size="medium"> |
| | |
| | | <el-descriptions-item label="最新评估时间" :span="2"> |
| | | <span class="highlight-text">{{ |
| | | getLatestAssessmentTime(scope.row) || "-" |
| | | }}</span> |
| | | }}</span> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <!-- 评估详情汇总 --> |
| | | <el-card |
| | | header="评估详情列表" |
| | | style="margin-top: 20px;" |
| | | class="assessment-detail-card" |
| | | > |
| | | <div |
| | | v-if="getOrganAssessments(scope.row).length == 0" |
| | | class="no-assessment" |
| | | > |
| | | <el-card header="评估详情列表" style="margin-top: 20px;" class="assessment-detail-card"> |
| | | <div v-if="getOrganAssessments(scope.row).length == 0" class="no-assessment"> |
| | | <el-empty description="暂无评估记录"></el-empty> |
| | | </div> |
| | | |
| | | <div v-else> |
| | | <!-- 每次评估详情 --> |
| | | <div |
| | | v-for="(assessment, index) in getOrganAssessments( |
| | | scope.row |
| | | )" |
| | | :key="index" |
| | | class="assessment-item" |
| | | > |
| | | <div v-for="(assessment, index) in getOrganAssessments( |
| | | scope.row |
| | | )" :key="index" class="assessment-item"> |
| | | <el-card shadow="hover" class="assessment-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="assessment-title" |
| | | >第{{ index + 1 }}次评估</span |
| | | > |
| | | <el-tag |
| | | :type="getAssessmentTagType(assessment.status)" |
| | | size="small" |
| | | class="status-tag" |
| | | > |
| | | <span class="assessment-title">第{{ index + 1 }}次评估</span> |
| | | <el-tag :type="getAssessmentTagType(assessment.status)" size="small" class="status-tag"> |
| | | {{ getAssessmentStatusText(assessment.status) }} |
| | | </el-tag> |
| | | </div> |
| | | |
| | | <el-descriptions |
| | | :column="2" |
| | | border |
| | | class="detail-descriptions" |
| | | > |
| | | <el-descriptions :column="2" border class="detail-descriptions"> |
| | | <!-- 评估时间 --> |
| | | <el-descriptions-item label="评估时间" :span="2"> |
| | | <span class="time-text"> |
| | | {{ |
| | | parseTime(assessment.assessmentTime) || |
| | | "未设置" |
| | | "未设置" |
| | | }} |
| | | </span> |
| | | </el-descriptions-item> |
| | |
| | | |
| | | <!-- 功能状态 --> |
| | | <el-descriptions-item label="功能状态"> |
| | | <el-tag |
| | | :type=" |
| | | getFunctionStatusTagType( |
| | | assessment.functionStatus |
| | | ) |
| | | " |
| | | size="small" |
| | | > |
| | | <el-tag :type="getFunctionStatusTagType( |
| | | assessment.functionStatus |
| | | ) |
| | | " size="small"> |
| | | {{ |
| | | getFunctionStatusText( |
| | | assessment.functionStatus |
| | |
| | | <div class="opinion-content"> |
| | | {{ |
| | | assessment.assessmentOpinion || |
| | | "暂无评估意见" |
| | | "暂无评估意见" |
| | | }} |
| | | </div> |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 附件数量 --> |
| | | <el-descriptions-item |
| | | label="附件数量" |
| | | :span="2" |
| | | v-if=" |
| | | assessment.attachments && |
| | | assessment.attachments.length > 0 |
| | | " |
| | | > |
| | | <el-descriptions-item label="附件数量" :span="2" v-if=" |
| | | assessment.attachments && |
| | | assessment.attachments.length > 0 |
| | | "> |
| | | <el-tag type="success" size="small"> |
| | | {{ assessment.attachments.length }}个 |
| | | </el-tag> |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click=" |
| | | showAttachmentList( |
| | | assessment.attachments, |
| | | index + 1 |
| | | ) |
| | | " |
| | | style="margin-left: 10px;" |
| | | > |
| | | <el-button type="text" size="mini" @click=" |
| | | showAttachmentList( |
| | | assessment.attachments, |
| | | index + 1 |
| | | ) |
| | | " style="margin-left: 10px;"> |
| | | 查看附件列表 |
| | | </el-button> |
| | | </el-descriptions-item> |
| | |
| | | </el-card> |
| | | |
| | | <!-- 器官基本信息卡片 --> |
| | | <el-card |
| | | header="器官信息" |
| | | style="margin-top: 20px;" |
| | | class="organ-info-card" |
| | | > |
| | | <el-card header="器官信息" style="margin-top: 20px;" class="organ-info-card"> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="获取前活检"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.isbiopsybefore == '1' |
| | | ? 'success' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | <el-tag :type="scope.row.isbiopsybefore == '1' |
| | | ? 'success' |
| | | : 'info' |
| | | " size="small"> |
| | | {{ scope.row.isbiopsybefore == "1" ? "是" : "否" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="获取后活检"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.isbiopsyafter == '1' |
| | | ? 'success' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | <el-tag :type="scope.row.isbiopsyafter == '1' |
| | | ? 'success' |
| | | : 'info' |
| | | " size="small"> |
| | | {{ scope.row.isbiopsyafter == "1" ? "是" : "否" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="边缘器官"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.ismarginalorgan == '1' |
| | | ? 'warning' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | <el-tag :type="scope.row.ismarginalorgan == '1' |
| | | ? 'warning' |
| | | : 'info' |
| | | " size="small"> |
| | | {{ scope.row.ismarginalorgan == "1" ? "是" : "否" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="病原菌阳性"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.ispathogenpositive == '1' |
| | | ? 'danger' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | <el-tag :type="scope.row.ispathogenpositive == '1' |
| | | ? 'danger' |
| | | : 'info' |
| | | " size="small"> |
| | | {{ |
| | | scope.row.ispathogenpositive == "1" ? "是" : "否" |
| | | }} |
| | |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="获取机构" |
| | | align="center" |
| | | prop="gainhospitalname" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column label="获取机构" align="center" prop="gainhospitalname" show-overflow-tooltip /> |
| | | |
| | | <!-- 动态显示评估状态列 --> |
| | | <el-table-column |
| | | v-for="index in getMaxAssessmentCount()" |
| | | :key="index" |
| | | :label="`第${index}次评估`" |
| | | align="center" |
| | | width="120" |
| | | > |
| | | <el-table-column v-for="index in getMaxAssessmentCount()" :key="index" :label="`第${index}次评估`" align="center" |
| | | width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | v-if="getOrganAssessments(scope.row)[index - 1]" |
| | | :type=" |
| | | getAssessmentTagType( |
| | | getOrganAssessments(scope.row)[index - 1].status |
| | | ) |
| | | " |
| | | size="small" |
| | | > |
| | | <el-tag v-if="getOrganAssessments(scope.row)[index - 1]" :type="getAssessmentTagType( |
| | | getOrganAssessments(scope.row)[index - 1].status |
| | | ) |
| | | " size="small"> |
| | | {{ |
| | | getAssessmentStatusText( |
| | | getOrganAssessments(scope.row)[index - 1].status |
| | |
| | | |
| | | <el-table-column label="整体状态" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type=" |
| | | getOrganOverallStatus(scope.row) == 'completed' |
| | | ? 'success' |
| | | : getOrganOverallStatus(scope.row) == 'assessing' |
| | | <el-tag :type="getOrganOverallStatus(scope.row) == 'completed' |
| | | ? 'success' |
| | | : getOrganOverallStatus(scope.row) == 'assessing' |
| | | ? 'primary' |
| | | : 'warning' |
| | | " |
| | | size="small" |
| | | > |
| | | " size="small"> |
| | | {{ getOrganOverallStatusText(scope.row) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="操作" |
| | | align="center" |
| | | width="150" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | v-if="canAssessOrgan(scope.row) && isEdit" |
| | | size="mini" |
| | | type="text" |
| | | @click="handleToggleExpand(scope.row)" |
| | | > |
| | | <el-button v-if="canAssessOrgan(scope.row) && isEdit" size="mini" type="text" |
| | | @click="handleToggleExpand(scope.row)"> |
| | | {{ |
| | | expandedRowKeys.includes(scope.row.organno) ? "收起" : "详情" |
| | | }} |
| | | </el-button> |
| | | <el-button |
| | | v-else-if="!isEdit" |
| | | size="mini" |
| | | type="text" |
| | | @click="handleToggleExpand(scope.row)" |
| | | > |
| | | <el-button v-else-if="!isEdit" size="mini" type="text" @click="handleToggleExpand(scope.row)"> |
| | | {{ |
| | | expandedRowKeys.includes(scope.row.organno) ? "收起" : "查看" |
| | | }} |
| | | </el-button> |
| | | <el-button v-else size="mini" type="text" disabled |
| | | >无权限</el-button |
| | | > |
| | | <el-button v-else size="mini" type="text" disabled>无权限</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | |
| | | <!-- 整体保存按钮 --> |
| | | <div class="footer-actions" v-if="isEdit"> |
| | | <el-button type="primary" @click="handleSaveAll" :loading="saveLoading" |
| | | >保存评估表</el-button |
| | | > |
| | | <el-button type="success" @click="accomplish" :loading="saveLoading" |
| | | >评估完成</el-button |
| | | > |
| | | <el-button type="primary" @click="handleSaveAll" :loading="saveLoading">保存评估表</el-button> |
| | | <el-button type="success" @click="accomplish" :loading="saveLoading">评估完成</el-button> |
| | | </div> |
| | | |
| | | <!-- 文件预览弹窗 --> |
| | | <FilePreviewDialog |
| | | :visible="attachmentVisible" |
| | | :file="currentPreviewFile" |
| | | @close="attachmentVisible = false" |
| | | /> |
| | | <FilePreviewDialog :visible="attachmentVisible" :file="currentPreviewFile" @close="attachmentVisible = false" /> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | this.infoid = this.$route.query.infoid; |
| | | this.caseId = this.infoid; |
| | | this.assessmentId = this.$route.query.id; |
| | | this.isEdit = this.$route.query.assess == "true"; |
| | | this.isEdit = true; |
| | | this.getAssessmentDetail(); |
| | | }, |
| | | methods: { |
| | |
| | | <h4>第${assessmentNumber}次评估附件列表</h4> |
| | | <ul style="list-style: none; padding-left: 0;"> |
| | | ${attachments |
| | | .map( |
| | | (item, index) => ` |
| | | .map( |
| | | (item, index) => ` |
| | | <li style="margin: 5px 0; padding: 5px; background: #f5f7fa; border-radius: 4px;"> |
| | | <i class="el-icon-document"></i> |
| | | <span style="margin-left: 8px;">${item.fileName}</span> |
| | |
| | | </el-button> |
| | | </li> |
| | | ` |
| | | ) |
| | | .join("")} |
| | | ) |
| | | .join("")} |
| | | </ul> |
| | | </div>`, |
| | | "附件列表", |
| | |
| | | this.handleSaveAll(); |
| | | }) |
| | | |
| | | .catch(() => {}); |
| | | .catch(() => { }); |
| | | }, |
| | | // 整体保存方法 |
| | | async handleSaveAll() { |
| | |
| | | if (!this.assessmentData.id && response.data) { |
| | | this.assessmentData.id = response.data; |
| | | } |
| | | this.getAssessmentDetail() |
| | | this.refreshKey += 1; // 触发重新渲染 |
| | | } else { |
| | | this.$message.error("保存失败:" + (response.msg || "未知错误")); |
| | |
| | | // 显示创建提示 |
| | | if (organsToCreate.length > 0) { |
| | | this.$message.success( |
| | | `已为【${this.getOrganLabel(decision)}】创建${ |
| | | organsToCreate.length |
| | | `已为【${this.getOrganLabel(decision)}】创建${organsToCreate.length |
| | | }个评估项` |
| | | ); |
| | | } |
| | |
| | | const activeTab = this.activeTabMap.has(organno) |
| | | ? String(this.activeTabMap.get(organno)) |
| | | : assessments.length > 0 |
| | | ? "0" |
| | | : "summary"; |
| | | ? "0" |
| | | : "summary"; |
| | | |
| | | return { |
| | | ...organ, |
| | |
| | | background-color: #fafafa; |
| | | } |
| | | |
| | | ::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td { |
| | | ::v-deep .el-table--enable-row-hover .el-table__body tr:hover>td { |
| | | background-color: #ecf5ff; |
| | | } |
| | | |
| | |
| | | background-color: #e4e7ed; |
| | | } |
| | | |
| | | ::v-deep .el-tabs--card > .el-tabs__header .el-tabs__item.is-active { |
| | | ::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active { |
| | | background-color: #fff; |
| | | border-bottom-color: #fff; |
| | | } |