| | |
| | | </div> |
| | | |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="案例编号">{{ |
| | | <el-descriptions-item label="住院号">{{ |
| | | assessmentData.caseNo |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="潜在捐献者姓名">{{ |
| | |
| | | 当前角色:{{ currentDepartment }}评估人员 |
| | | </span> |
| | | </div> |
| | | |
| | | <el-row> |
| | | <el-form-item label-width="100px" label="评估器官"> |
| | | <el-checkbox-group v-model="organdecision"> |
| | | <el-checkbox |
| | | v-for="item in organselection" |
| | | :key="item" |
| | | :label="item" |
| | | >{{ item }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | <el-input |
| | | v-if="organdecision.includes('其他')" |
| | | v-model="assessmentData.organdecisionOther" |
| | | placeholder="请输入其他捐献决定的具体内容" |
| | | style="margin-top: 10px; width: 300px;" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-row> |
| | | <el-table |
| | | :data="organAssessmentList" |
| | | v-loading="assessmentLoading" |
| | | style="width: 100%" |
| | | :row-class-name="getRowClassName" |
| | | :expand-row-keys="expandedRowKeys" |
| | | @expand-change="handleExpandChange" |
| | | row-key="organType" |
| | | > |
| | | <el-table-column type="expand" width="60"> |
| | | <template slot-scope="scope"> |
| | | <div class="organ-expand-content" v-if="scope.row.expanded"> |
| | | <el-tabs |
| | | v-model="scope.row.activeAssessmentTab" |
| | | type="card" |
| | | class="organ-detail-tabs" |
| | | > |
| | | <!-- 动态生成评估Tab --> |
| | | <el-tab-pane |
| | | v-for="(assessment, index) in scope.row.assessments" |
| | | :key="index" |
| | | :label="`第${index + 1}次评估`" |
| | | :name="`assessment_${index}`" |
| | | > |
| | | <organ-assessment-form |
| | | :organ-data="scope.row" |
| | | :assessment-data="assessment" |
| | | :assessment-index="index" |
| | | :readonly="!canAssessOrgan(scope.row)" |
| | | @save="handleSaveOrganAssessment" |
| | | @add-assessment="handleAddAssessment" |
| | | /> |
| | | </el-tab-pane> |
| | | |
| | | <!-- 添加评估按钮 --> |
| | | <el-tab-pane name="add" v-if="canAssessOrgan(scope.row)"> |
| | | <template slot="label"> |
| | | <el-button |
| | | type="text" |
| | | icon="el-icon-plus" |
| | | @click.stop="handleAddNewAssessment(scope.row)" |
| | | size="mini" |
| | | > |
| | | 新增评估 |
| | | </el-button> |
| | | </template> |
| | | <div class="add-assessment-prompt"> |
| | | <el-empty description="点击上方按钮添加新的评估"></el-empty> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <!-- 评估汇总Tab --> |
| | | <el-tab-pane label="评估汇总" name="summary"> |
| | | <div class="assessment-summary"> |
| | | <el-descriptions title="评估结果汇总" :column="2" border> |
| | | <el-descriptions-item label="器官类型">{{ |
| | | scope.row.organName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="评估科室">{{ |
| | | scope.row.department |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="评估次数" :span="2"> |
| | | <el-tag type="info" |
| | | >{{ scope.row.assessments.length }}次</el-tag |
| | | > |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="最新评估时间" :span="2"> |
| | | {{ getLatestAssessmentTime(scope.row) || "-" }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <!-- 附件汇总 --> |
| | | <el-card header="所有评估附件" style="margin-top: 20px;"> |
| | | <el-table |
| | | :data="getAllAttachments(scope.row)" |
| | | size="small" |
| | | empty-text="暂无附件" |
| | | > |
| | | <el-table-column label="附件名称" prop="fileName" /> |
| | | <el-table-column label="评估阶段" width="120"> |
| | | <template slot-scope="{ row }"> |
| | | 第{{ row.assessmentIndex + 1 }}次评估 |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="上传时间" |
| | | prop="uploadTime" |
| | | width="180" |
| | | /> |
| | | <el-table-column label="操作" width="120"> |
| | | <template slot-scope="{ row }"> |
| | | <el-button |
| | | type="text" |
| | | @click="handlePreviewAttachment(row)" |
| | | >预览</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="器官类型" |
| | | align="center" |
| | |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="评估科室" |
| | | align="center" |
| | | prop="department" |
| | | width="120" |
| | | /> |
| | | |
| | | <el-table-column label="评估人员" align="center" prop="assessor" /> |
| | | |
| | | <!-- 动态显示评估状态列 --> |
| | | <el-table-column |
| | | label="评估人员" |
| | | v-for="(assessment, index) in getMaxAssessmentCount()" |
| | | :key="index" |
| | | :label="`第${index + 1}次评估`" |
| | | align="center" |
| | | prop="assessor" |
| | | width="100" |
| | | /> |
| | | <el-table-column label="评估状态" align="center" width="100"> |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type="scope.row.assessmentStatus === '1' ? 'success' : 'warning'" |
| | | v-if="scope.row.assessments[index]" |
| | | :type="getAssessmentTagType(scope.row.assessments[index].status)" |
| | | size="small" |
| | | > |
| | | {{ scope.row.assessmentStatus === "1" ? "已评估" : "待评估" }} |
| | | {{ getAssessmentStatusText(scope.row.assessments[index].status) }} |
| | | </el-tag> |
| | | <el-tag v-else type="info" size="small">未评估</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="整体状态" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type="scope.row.assessmentStatus === '1' ? 'success' : 'primary'" |
| | | size="small" |
| | | > |
| | | {{ scope.row.assessmentStatus === "1" ? "已完成" : "评估中" }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="功能状态" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type="getFunctionStatusType(scope.row.functionStatus)" |
| | | size="small" |
| | | > |
| | | {{ getFunctionStatusText(scope.row.functionStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="评估意见" |
| | | align="center" |
| | | prop="assessmentOpinion" |
| | | min-width="150" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column label="评估时间" align="center" width="120"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row.assessmentTime || "-" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="操作" |
| | | align="center" |
| | |
| | | v-if="canAssessOrgan(scope.row)" |
| | | size="mini" |
| | | type="text" |
| | | @click="handleOrganAssess(scope.row)" |
| | | >{{ |
| | | scope.row.assessmentStatus === "1" ? "查看/修改" : "评估" |
| | | }}</el-button |
| | | @click="handleToggleExpand(scope.row)" |
| | | > |
| | | {{ |
| | | expandedRowKeys.includes(scope.row.organType) ? "收起" : "详情" |
| | | }} |
| | | </el-button> |
| | | <el-button v-else size="mini" type="text" disabled |
| | | >无权限</el-button |
| | | > |
| | | <el-button |
| | | v-if="isCoordinator" |
| | | size="mini" |
| | | type="text" |
| | | @click="handleViewOrganDetail(scope.row)" |
| | | >详情</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- 器官评估详情 --> |
| | | <el-collapse v-model="activeOrgans" accordion class="organ-detail-collapse"> |
| | | <el-collapse-item |
| | | v-for="organ in organAssessmentList" |
| | | :key="organ.organType" |
| | | :name="organ.organType" |
| | | :title="getOrganTitle(organ)" |
| | | > |
| | | <div class="organ-detail-header"> |
| | | <span class="organ-name">{{ getOrganName(organ.organType) }}评估详情</span> |
| | | <span class="attachment-count" v-if="organ.attachments && organ.attachments.length > 0"> |
| | | 附件数量: {{ organ.attachments.length }} |
| | | </span> |
| | | </div> |
| | | <organ-assessment-form |
| | | :organ-data="organ" |
| | | :readonly="!canAssessOrgan(organ)" |
| | | @save="handleSaveOrganAssessment" |
| | | /> |
| | | </el-collapse-item> |
| | | </el-collapse> |
| | | </el-card> |
| | | |
| | | <!-- 附件预览弹窗 --> |
| | | <attachment-preview |
| | | <!-- 文件预览弹窗 --> |
| | | <FilePreviewDialog |
| | | :visible="attachmentVisible" |
| | | :attachment-list="attachmentList" |
| | | :file="currentPreviewFile" |
| | | @close="attachmentVisible = false" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | // import { getAssessment, updateOrganAssessment, completeAssessment } from "@/api/case/assessment"; |
| | | import { |
| | | getAssessment, |
| | | updateOrganAssessment, |
| | | completeAssessment |
| | | } from "./mockAssessmentApi"; |
| | | |
| | | import FilePreviewDialog from "@/components/FilePreviewDialog"; |
| | | import OrganAssessmentForm from "./components/OrganAssessmentForm.vue"; |
| | | import AttachmentPreview from "./components/AttachmentPreview.vue"; |
| | | |
| | | export default { |
| | | name: "AssessmentDetail", |
| | | components: { OrganAssessmentForm, AttachmentPreview }, |
| | | components: { OrganAssessmentForm, FilePreviewDialog }, |
| | | data() { |
| | | return { |
| | | // 评估ID |
| | | assessmentId: undefined, |
| | | // 评估数据 |
| | | assessmentData: {}, |
| | | // 器官评估列表 |
| | | organAssessmentList: [], |
| | | // 附件列表 |
| | | attachmentList: [], |
| | | // 加载状态 |
| | | assessmentLoading: false, |
| | | // 当前用户信息 |
| | | organdecision: [], |
| | | // 展开行相关 |
| | | expandedRowKeys: [], |
| | | currentPreviewFile: null, |
| | | attachmentVisible: false, |
| | | |
| | | currentUser: { |
| | | id: "001", |
| | | name: "张医生", |
| | | department: "心脏外科", |
| | | role: "department" // coordinator: 协调员, department: 科室人员 |
| | | department: "协调员", |
| | | role: "coordinator" |
| | | }, |
| | | // 展开的器官 |
| | | activeOrgans: [], |
| | | // 附件预览可见性 |
| | | attachmentVisible: false, |
| | | //department:心脏、coordinator:协调员 |
| | | // 字典选项 |
| | | genderOptions: [ |
| | | { value: "0", label: "男" }, |
| | |
| | | { value: "intestine", label: "肠道" }, |
| | | { value: "cornea", label: "角膜" }, |
| | | { value: "skin", label: "皮肤" } |
| | | ], |
| | | organselection: [ |
| | | "肝脏", |
| | | "双肾", |
| | | "左肾", |
| | | "右肾", |
| | | "心脏", |
| | | "肺脏", |
| | | "胰腺", |
| | | "小肠", |
| | | "双眼组织", |
| | | "遗体", |
| | | "其他" |
| | | ] |
| | | }; |
| | | }, |
| | | computed: { |
| | | // 是否是协调员 |
| | | isCoordinator() { |
| | | return this.currentUser.role === "coordinator"; |
| | | }, |
| | | // 当前科室 |
| | | currentDepartment() { |
| | | return this.currentUser.department; |
| | | }, |
| | | // 所有器官是否都已评估 |
| | | allOrgansAssessed() { |
| | | return this.organAssessmentList.every( |
| | | organ => organ.assessmentStatus === "1" |
| | | organ => |
| | | organ.assessments && |
| | | organ.assessments.length > 0 && |
| | | organ.assessments.every( |
| | | assessment => assessment.status === "assessed" |
| | | ) |
| | | ); |
| | | } |
| | | }, |
| | | created() { |
| | | this.assessmentId = this.$route.query.id; |
| | | this.getAssessmentDetail(); |
| | | |
| | | }, |
| | | methods: { |
| | | // 获取评估详情 - 使用Mock数据 |
| | | // 获取默认评估数据结构 |
| | | getDefaultAssessment() { |
| | | return { |
| | | status: "pending", |
| | | assessmentTime: "", |
| | | assessor: "", |
| | | functionStatus: "", |
| | | assessmentOpinion: "", |
| | | attachments: [], |
| | | clinicalData: {}, |
| | | labResults: {} |
| | | }; |
| | | }, |
| | | |
| | | // 获取评估详情 |
| | | getAssessmentDetail() { |
| | | this.assessmentLoading = true; |
| | | getAssessment(this.assessmentId) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.assessmentData = response.data.caseInfo; |
| | | this.organAssessmentList = response.data.organAssessments || []; |
| | | |
| | | // 确保每个器官评估数据都有attachments数组 |
| | | this.organAssessmentList.forEach(organ => { |
| | | if (!organ.attachments) { |
| | | organ.attachments = []; |
| | | } |
| | | }); |
| | | this.organAssessmentList = this.transformOrganData( |
| | | response.data.organAssessments || [] |
| | | ); |
| | | } |
| | | this.assessmentLoading = false; |
| | | }) |
| | |
| | | }); |
| | | }, |
| | | |
| | | // 新增方法:获取器官名称 |
| | | // 转换器官数据格式,支持多次评估 |
| | | transformOrganData(organList) { |
| | | return organList.map(organ => { |
| | | const organName = this.getOrganName(organ.organType); |
| | | |
| | | // 转换为多次评估的数据结构 |
| | | const assessments = []; |
| | | if (organ.firstAssessment) { |
| | | assessments.push({ ...organ.firstAssessment, index: 0 }); |
| | | } |
| | | if (organ.secondAssessment) { |
| | | assessments.push({ ...organ.secondAssessment, index: 1 }); |
| | | } |
| | | // 可以继续添加更多评估... |
| | | |
| | | // 设置器官名称和评估数据 |
| | | organ.organName = organName; |
| | | organ.assessments = assessments; |
| | | organ.activeAssessmentTab = |
| | | assessments.length > 0 ? "assessment_0" : "summary"; |
| | | organ.expanded = false; |
| | | |
| | | // 计算整体评估状态 |
| | | organ.assessmentStatus = this.calculateOverallStatus(organ); |
| | | |
| | | return organ; |
| | | }); |
| | | }, |
| | | |
| | | // 计算最大评估次数(用于表头显示) |
| | | getMaxAssessmentCount() { |
| | | const maxCount = Math.max( |
| | | ...this.organAssessmentList.map(organ => |
| | | organ.assessments ? organ.assessments.length : 0 |
| | | ) |
| | | ); |
| | | return Math.max(maxCount, 2); // 至少显示2列 |
| | | }, |
| | | |
| | | // 计算整体评估状态 |
| | | calculateOverallStatus(organ) { |
| | | if (!organ.assessments || organ.assessments.length === 0) return "0"; |
| | | |
| | | const allAssessed = organ.assessments.every( |
| | | assessment => assessment.status === "assessed" |
| | | ); |
| | | const someAssessed = organ.assessments.some( |
| | | assessment => assessment.status === "assessed" |
| | | ); |
| | | |
| | | if (allAssessed) return "1"; |
| | | if (someAssessed) return "2"; |
| | | return "0"; |
| | | }, |
| | | |
| | | // 切换展开行 |
| | | handleToggleExpand(row) { |
| | | const key = row.organType; |
| | | const index = this.expandedRowKeys.indexOf(key); |
| | | |
| | | if (index > -1) { |
| | | this.expandedRowKeys.splice(index, 1); |
| | | row.expanded = false; |
| | | } else { |
| | | this.expandedRowKeys = [key]; |
| | | this.organAssessmentList.forEach(item => { |
| | | item.expanded = item.organType === key; |
| | | }); |
| | | } |
| | | }, |
| | | |
| | | // 展开行变化 |
| | | handleExpandChange(row, expandedRows) { |
| | | this.expandedRowKeys = expandedRows.map(item => item.organType); |
| | | this.organAssessmentList.forEach(item => { |
| | | item.expanded = this.expandedRowKeys.includes(item.organType); |
| | | }); |
| | | }, |
| | | |
| | | // 添加新评估 |
| | | handleAddNewAssessment(organ) { |
| | | const newAssessment = { |
| | | ...this.getDefaultAssessment(), |
| | | index: organ.assessments.length |
| | | }; |
| | | |
| | | organ.assessments.push(newAssessment); |
| | | organ.activeAssessmentTab = `assessment_${organ.assessments.length - 1}`; |
| | | |
| | | // 更新整体状态 |
| | | organ.assessmentStatus = this.calculateOverallStatus(organ); |
| | | |
| | | this.$message.success("已添加新的评估"); |
| | | }, |
| | | |
| | | // 处理添加评估事件 |
| | | handleAddAssessment(data) { |
| | | const { organData, currentIndex } = data; |
| | | this.handleAddNewAssessment(organData); |
| | | }, |
| | | |
| | | // 保存评估 |
| | | handleSaveOrganAssessment(saveData) { |
| | | const { organData, assessmentData, assessmentIndex } = saveData; |
| | | |
| | | const organToUpdate = { |
| | | ...organData, |
| | | assessments: organData.assessments.map((assessment, index) => |
| | | index === assessmentIndex |
| | | ? { |
| | | ...assessmentData, |
| | | status: "assessed", |
| | | assessmentTime: new Date().toISOString(), |
| | | assessor: this.currentUser.name |
| | | } |
| | | : assessment |
| | | ) |
| | | }; |
| | | |
| | | // 更新整体状态 |
| | | organToUpdate.assessmentStatus = this.calculateOverallStatus( |
| | | organToUpdate |
| | | ); |
| | | |
| | | updateOrganAssessment(organToUpdate) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success(`第${assessmentIndex + 1}次评估保存成功`); |
| | | this.getAssessmentDetail(); |
| | | |
| | | // 更新当前展开行的数据 |
| | | const index = this.organAssessmentList.findIndex( |
| | | item => item.organType === organData.organType |
| | | ); |
| | | if (index !== -1) { |
| | | this.organAssessmentList.splice(index, 1, organToUpdate); |
| | | } |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("保存评估失败:", error); |
| | | this.$message.error("保存失败"); |
| | | }); |
| | | }, |
| | | |
| | | // 获取最新评估时间 |
| | | getLatestAssessmentTime(organ) { |
| | | if (!organ.assessments || organ.assessments.length === 0) return null; |
| | | |
| | | const assessed = organ.assessments.filter(a => a.assessmentTime); |
| | | if (assessed.length === 0) return null; |
| | | |
| | | return assessed.sort( |
| | | (a, b) => new Date(b.assessmentTime) - new Date(a.assessmentTime) |
| | | )[0].assessmentTime; |
| | | }, |
| | | |
| | | // 获取所有附件 |
| | | getAllAttachments(organ) { |
| | | const attachments = []; |
| | | |
| | | if (organ.assessments) { |
| | | organ.assessments.forEach((assessment, index) => { |
| | | if (assessment.attachments) { |
| | | assessment.attachments.forEach(att => { |
| | | attachments.push({ |
| | | ...att, |
| | | assessmentIndex: index, |
| | | assessmentNumber: index + 1 |
| | | }); |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | return attachments; |
| | | }, |
| | | |
| | | // 预览附件 |
| | | handlePreviewAttachment(attachment) { |
| | | this.currentPreviewFile = { |
| | | fileName: attachment.fileName, |
| | | fileUrl: attachment.path || attachment.fileUrl, |
| | | fileType: this.getFileType(attachment.fileName) |
| | | }; |
| | | this.attachmentVisible = true; |
| | | }, |
| | | |
| | | // 获取文件类型 |
| | | getFileType(fileName) { |
| | | if (!fileName) return "other"; |
| | | |
| | | const extension = fileName |
| | | .split(".") |
| | | .pop() |
| | | .toLowerCase(); |
| | | const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"]; |
| | | const pdfTypes = ["pdf"]; |
| | | const officeTypes = ["doc", "docx", "xls", "xlsx", "ppt", "pptx"]; |
| | | |
| | | if (imageTypes.includes(extension)) return "image"; |
| | | if (pdfTypes.includes(extension)) return "pdf"; |
| | | if (officeTypes.includes(extension)) return "office"; |
| | | return "other"; |
| | | }, |
| | | |
| | | // 获取评估状态标签类型 |
| | | getAssessmentTagType(status) { |
| | | const typeMap = { |
| | | pending: "warning", |
| | | assessing: "primary", |
| | | assessed: "success" |
| | | }; |
| | | return typeMap[status] || "info"; |
| | | }, |
| | | |
| | | // 获取评估状态文本 |
| | | getAssessmentStatusText(status) { |
| | | const textMap = { |
| | | pending: "待评估", |
| | | assessing: "评估中", |
| | | assessed: "已评估" |
| | | }; |
| | | return textMap[status] || "未知"; |
| | | }, |
| | | |
| | | // 获取器官名称 |
| | | getOrganName(organType) { |
| | | const organ = this.organTypeOptions.find(opt => opt.value === organType); |
| | | return organ ? organ.label : organType; |
| | | }, |
| | | |
| | | // 检查评估权限 |
| | | canAssessOrgan(organ) { |
| | | if (this.isCoordinator) return true; |
| | | return organ.department === this.currentDepartment; |
| | | }, |
| | | |
| | | // 获取行类名 |
| | | getRowClassName({ row }) { |
| | | return this.canAssessOrgan(row) ? "assessable-row" : "non-assessable-row"; |
| | | }, |
| | | |
| | | // 状态过滤器 |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | |
| | | }; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | | |
| | | statusTextFilter(status) { |
| | | const statusMap = { |
| | | "0": "待评估", |
| | |
| | | }; |
| | | return statusMap[status] || "未知"; |
| | | }, |
| | | // 获取功能状态类型 |
| | | getFunctionStatusType(status) { |
| | | const typeMap = { |
| | | "1": "success", // 正常 |
| | | "2": "warning", // 轻度异常 |
| | | "3": "danger", // 重度异常 |
| | | "4": "info" // 无法评估 |
| | | }; |
| | | return typeMap[status] || "info"; |
| | | }, |
| | | // 获取功能状态文本 |
| | | getFunctionStatusText(status) { |
| | | const textMap = { |
| | | "1": "正常", |
| | | "2": "轻度异常", |
| | | "3": "重度异常", |
| | | "4": "无法评估" |
| | | }; |
| | | return textMap[status] || "未知"; |
| | | }, |
| | | // 检查是否有权限评估该器官 |
| | | canAssessOrgan(organ) { |
| | | if (this.isCoordinator) return true; |
| | | return organ.department === this.currentDepartment; |
| | | }, |
| | | // 获取行类名 |
| | | getRowClassName({ row }) { |
| | | return this.canAssessOrgan(row) ? "assessable-row" : "non-assessable-row"; |
| | | }, |
| | | // 修改方法:更新器官标题显示 |
| | | getOrganTitle(organ) { |
| | | const organName = this.getOrganName(organ.organType); |
| | | const attachmentCount = organ.attachments ? organ.attachments.length : 0; |
| | | return `${organName}评估详情(${organ.department})${attachmentCount > 0 ? ` · ${attachmentCount}个附件` : ''}`; |
| | | }, |
| | | // 器官评估 |
| | | handleOrganAssess(organ) { |
| | | this.activeOrgans = [organ.organType]; |
| | | }, |
| | | // 查看器官详情 |
| | | handleViewOrganDetail(organ) { |
| | | this.activeOrgans = [organ.organType]; |
| | | }, |
| | | // 保存器官评估 - 使用Mock API |
| | | handleSaveOrganAssessment(organData) { |
| | | updateOrganAssessment(organData) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("评估保存成功"); |
| | | // 刷新数据 |
| | | this.getAssessmentDetail(); |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("保存评估失败:", error); |
| | | this.$message.error("保存失败"); |
| | | }); |
| | | }, |
| | | // 查看附件预览 |
| | | |
| | | handleAttachmentPreview() { |
| | | this.attachmentVisible = true; |
| | | }, |
| | | // 完成评估 - 使用Mock API |
| | | |
| | | handleCompleteAssessment() { |
| | | this.$confirm("确认完成所有器官评估吗?完成后将无法修改", "确认操作", { |
| | | confirmButtonText: "确定", |
| | |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .organ-detail-collapse { |
| | | margin-top: 20px; |
| | | } |
| | | .organ-detail-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 15px; |
| | | padding-bottom: 10px; |
| | | border-bottom: 1px solid #ebeef5; |
| | | } |
| | | |
| | | .organ-name { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | } |
| | | |
| | | .attachment-count { |
| | | font-size: 14px; |
| | | color: #409EFF; |
| | | background-color: #ecf5ff; |
| | | padding: 4px 8px; |
| | | /* 展开行样式 */ |
| | | .organ-expand-content { |
| | | padding: 20px; |
| | | background: #fafafa; |
| | | border-radius: 4px; |
| | | margin: 10px 0; |
| | | } |
| | | |
| | | .organ-detail-tabs { |
| | | background: white; |
| | | border-radius: 4px; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .add-assessment-prompt { |
| | | text-align: center; |
| | | padding: 40px 0; |
| | | } |
| | | |
| | | .assessment-summary { |
| | | padding: 10px; |
| | | } |
| | | |
| | | /* 响应式设计 */ |
| | | @media (max-width: 768px) { |
| | | .assessment-detail { |
| | | padding: 10px; |
| | | } |
| | | |
| | | .organ-expand-content { |
| | | padding: 10px; |
| | | } |
| | | } |
| | | |
| | | ::v-deep .assessable-row { |
| | | background-color: #f0f9ff; |
| | | } |
| | |
| | | background-color: #fafafa; |
| | | } |
| | | |
| | | .jstitle { |
| | | float: right; |
| | | font-size: 18px !important; |
| | | font-weight: 600; |
| | | color: #2645f7; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | /* 表格展开图标样式 */ |
| | | ::v-deep .el-table__expand-icon { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | ::v-deep .el-table__expanded-cell { |
| | | padding: 0 !important; |
| | | } |
| | | |
| | | /* 确保描述列表标签宽度一致 */ |
| | | ::v-deep .el-descriptions__label { |
| | | width: 120px; |
| | | background-color: #f5f7fa; |
| | |
| | | |
| | | .fixed-width .el-button { |
| | | margin: 0 2px; |
| | | } |
| | | .jstitle { |
| | | float: right; |
| | | font-size: 18px !important; |
| | | font-weight: 600; |
| | | color: #2645f7; |
| | | font-size: 12px; |
| | | } |
| | | </style> |