WXL
2026-05-17 3453ba7e5243022ad4388da1515dc75ad8d81f94
src/views/business/assess/assessInfo.vue
@@ -1,68 +1,12 @@
<template>
  <div class="assessment-detail">
    <!-- 基础案例信息 -->
    <case-basic-info
      :case-id="caseId"
      :show-attachment="true"
    />
    <!-- <el-card class="basic-info-card">
      <div slot="header" class="clearfix">
        <span>案例基本信息</span>
        <el-button
          style="float: right; padding: 3px 0"
          type="text"
          @click="handleAttachmentPreview"
        >
          <i class="el-icon-folder-opened"></i> 查看附件
        </el-button>
      </div>
      <el-descriptions :column="2" border>
        <el-descriptions-item label="住院号">{{
          assessmentData.caseNo
        }}</el-descriptions-item>
        <el-descriptions-item label="潜在捐献者姓名">{{
          assessmentData.name || assessmentData.donorName
        }}</el-descriptions-item>
        <el-descriptions-item label="性别">
          <dict-tag
            :options="dict.type.sys_user_sex"
            :value="assessmentData.sex"
          />
        </el-descriptions-item>
        <el-descriptions-item label="年龄"
          >{{ assessmentData.age }}岁</el-descriptions-item
        >
        <el-descriptions-item label="血型">
          {{ assessmentData.bloodtype }}
        </el-descriptions-item>
        <el-descriptions-item label="证件号码">{{
          assessmentData.idcardno
        }}</el-descriptions-item>
        <el-descriptions-item label="疾病诊断">{{
          assessmentData.diagnosisname
        }}</el-descriptions-item>
        <el-descriptions-item label="所在医疗机构">{{
          assessmentData.treatmenthospitalname
        }}</el-descriptions-item>
        <el-descriptions-item label="协调员">{{
          assessmentData.coordinatorName
        }}</el-descriptions-item>
        <el-descriptions-item label="评估时间">{{
          assessmentData.assessTime
        }}</el-descriptions-item>
        <el-descriptions-item label="评估状态">
          <el-tag :type="statusFilter(assessmentData.assessState)">
            {{ statusTextFilter(assessmentData.assessState) }}
          </el-tag>
        </el-descriptions-item>
      </el-descriptions>
    </el-card> -->
    <case-basic-info :case-id="caseId" :show-attachment="true" />
    <el-card class="organ-assessment-card">
      <div slot="header" class="clearfix">
        <span>器官评估表</span>
        <el-button
        <!-- <el-button
          v-if="isCoordinator && allOrgansAssessed"
          style="float: right; margin-left: 10px"
          type="primary"
@@ -74,7 +18,7 @@
        </el-button>
        <span v-if="!isCoordinator" class="jstitle">
          当前角色:{{ currentDepartment }}评估人员
        </span>
        </span> -->
      </div>
      <!-- 捐献决定表单 -->
@@ -128,7 +72,7 @@
                  v-for="(assessment, index) in getOrganAssessments(scope.row)"
                  :key="`${scope.row.organno}_${index}`"
                  :label="`第${index + 1}次评估`"
                  :name="index"
                  :name="String(index)"
                >
                  <organ-assessment-form
                    :organ-data="scope.row"
@@ -195,7 +139,7 @@
                      class="assessment-detail-card"
                    >
                      <div
                        v-if="getOrganAssessments(scope.row).length === 0"
                        v-if="getOrganAssessments(scope.row).length == 0"
                        class="no-assessment"
                      >
                        <el-empty description="暂无评估记录"></el-empty>
@@ -229,18 +173,24 @@
                              border
                              class="detail-descriptions"
                            >
                              <!-- 评估时间 -->
                              <el-descriptions-item label="评估时间" :span="2">
                                <span class="time-text">{{
                                  assessment.assessmentTime || "-"
                                }}</span>
                                <span class="time-text">
                                  {{
                                    parseTime(assessment.assessmentTime) ||
                                      "未设置"
                                  }}
                                </span>
                              </el-descriptions-item>
                              <!-- 原有的评估人信息 -->
                              <el-descriptions-item label="评估人">
                                <el-tag type="info" size="small">
                                  {{ assessment.assessor || "未填写" }}
                                </el-tag>
                              </el-descriptions-item>
                              <!-- 功能状态 -->
                              <el-descriptions-item label="功能状态">
                                <el-tag
                                  :type="
@@ -258,6 +208,7 @@
                                </el-tag>
                              </el-descriptions-item>
                              <!-- 评估意见 -->
                              <el-descriptions-item label="评估意见" :span="2">
                                <div class="opinion-content">
                                  {{
@@ -267,6 +218,7 @@
                                </div>
                              </el-descriptions-item>
                              <!-- 附件数量 -->
                              <el-descriptions-item
                                label="附件数量"
                                :span="2"
@@ -308,52 +260,50 @@
                        <el-descriptions-item label="获取前活检">
                          <el-tag
                            :type="
                              scope.row.isbiopsybefore === '1'
                              scope.row.isbiopsybefore == '1'
                                ? 'success'
                                : 'info'
                            "
                            size="small"
                          >
                            {{ scope.row.isbiopsybefore === "1" ? "是" : "否" }}
                            {{ scope.row.isbiopsybefore == "1" ? "是" : "否" }}
                          </el-tag>
                        </el-descriptions-item>
                        <el-descriptions-item label="获取后活检">
                          <el-tag
                            :type="
                              scope.row.isbiopsyafter === '1'
                              scope.row.isbiopsyafter == '1'
                                ? 'success'
                                : 'info'
                            "
                            size="small"
                          >
                            {{ scope.row.isbiopsyafter === "1" ? "是" : "否" }}
                            {{ scope.row.isbiopsyafter == "1" ? "是" : "否" }}
                          </el-tag>
                        </el-descriptions-item>
                        <el-descriptions-item label="边缘器官">
                          <el-tag
                            :type="
                              scope.row.ismarginalorgan === '1'
                              scope.row.ismarginalorgan == '1'
                                ? 'warning'
                                : 'info'
                            "
                            size="small"
                          >
                            {{
                              scope.row.ismarginalorgan === "1" ? "是" : "否"
                            }}
                            {{ scope.row.ismarginalorgan == "1" ? "是" : "否" }}
                          </el-tag>
                        </el-descriptions-item>
                        <el-descriptions-item label="病原菌阳性">
                          <el-tag
                            :type="
                              scope.row.ispathogenpositive === '1'
                              scope.row.ispathogenpositive == '1'
                                ? 'danger'
                                : 'info'
                            "
                            size="small"
                          >
                            {{
                              scope.row.ispathogenpositive === "1" ? "是" : "否"
                              scope.row.ispathogenpositive == "1" ? "是" : "否"
                            }}
                          </el-tag>
                        </el-descriptions-item>
@@ -372,7 +322,11 @@
          </template>
        </el-table-column>
        <el-table-column label="器官编号" align="center" prop="organnumber" />
        <el-table-column label="器官编号" align="center" prop="organnumber">
          <template slot-scope="scope">
            {{ getOrganvalue(scope.row.organno) }}
          </template>
        </el-table-column>
        <el-table-column
          label="获取机构"
@@ -413,9 +367,9 @@
          <template slot-scope="scope">
            <el-tag
              :type="
                getOrganOverallStatus(scope.row) === 'completed'
                getOrganOverallStatus(scope.row) == 'completed'
                  ? 'success'
                  : getOrganOverallStatus(scope.row) === 'assessing'
                  : getOrganOverallStatus(scope.row) == 'assessing'
                  ? 'primary'
                  : 'warning'
              "
@@ -466,7 +420,9 @@
      <el-button type="primary" @click="handleSaveAll" :loading="saveLoading"
        >保存评估表</el-button
      >
      <el-button @click="handleCancel">取消</el-button>
      <el-button type="success" @click="accomplish" :loading="saveLoading"
        >评估完成</el-button
      >
    </div>
    <!-- 文件预览弹窗 -->
@@ -554,14 +510,14 @@
  },
  computed: {
    isCoordinator() {
      return this.currentUser.role === "coordinator";
      return this.currentUser.role == "coordinator";
    },
    currentDepartment() {
      return this.currentUser.department;
    },
    // 根据捐献决定过滤后的器官列表
    filteredOrganAssessmentList() {
      if (!this.organdecisionValues || this.organdecisionValues.length === 0) {
      if (!this.organdecisionValues || this.organdecisionValues.length == 0) {
        return [];
      }
@@ -585,7 +541,7 @@
        return (
          assessments &&
          assessments.length > 0 &&
          assessments.every(assessment => assessment.status === "assessed")
          assessments.every(assessment => assessment.status == "assessed")
        );
      });
    },
@@ -611,20 +567,25 @@
    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 = this.$route.query.assess == "true";
    this.getAssessmentDetail();
  },
  methods: {
    // 根据字典value获取label
    getOrganLabel(organValue) {
      const dictItem = this.organDict.find(item => item.value === organValue);
      const dictItem = this.organDict.find(item => item.value == organValue);
      return dictItem ? dictItem.label : organValue;
    },
    getOrganvalue(organValue) {
      const dictItem = this.organDict.find(item => item.value == organValue);
      return dictItem ? dictItem.value : organValue;
    },
    // Tab点击事件
    handleTabClick(organ, tab) {
      if (tab.name !== "add") {
        this.activeTabMap.set(organ.organno, tab.name);
        this.activeTabMap.set(organ.organno, String(tab.name));
      }
    },
    // 获取功能状态标签类型
@@ -651,7 +612,7 @@
    // 显示附件列表
    showAttachmentList(attachments, assessmentNumber) {
      if (!attachments || attachments.length === 0) {
      if (!attachments || attachments.length == 0) {
        this.$message.info(`第${assessmentNumber}次评估暂无附件`);
        return;
      }
@@ -694,7 +655,7 @@
      if (!organ.assesscontent) return [];
      try {
        const assessData =
          typeof organ.assesscontent === "string"
          typeof organ.assesscontent == "string"
            ? JSON.parse(organ.assesscontent)
            : organ.assesscontent;
@@ -731,7 +692,19 @@
        this.$forceUpdate();
      }
    },
    accomplish() {
      this.$confirm("是否完成该案例器官评估步骤?", "提醒", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          this.form.assessState = 3;
          this.handleSaveAll();
        })
        .catch(() => {});
    },
    // 整体保存方法
    async handleSaveAll() {
      this.saveLoading = true;
@@ -776,11 +749,13 @@
            })
          )
        };
        if (saveData.assessState == 1 || !saveData.assessState) {
          saveData.assessState = 2;
        }
        const saveMethod = this.assessmentData.id ? assessedit : assessAdd;
        const response = await saveMethod(saveData);
        if (response.code === 200) {
        if (response.code == 200) {
          this.$message.success("评估表保存成功!");
          if (!this.assessmentData.id && response.data) {
            this.assessmentData.id = response.data;
@@ -806,6 +781,7 @@
    async handleOrganDecisionChange(newDecision) {
      const oldDecision = [...this.prevOrgandecisionValues];
      this.autoHandleDecisionChange(newDecision);
      console.log(newDecision);
      const removedDecisions = oldDecision.filter(
        item => !newDecision.includes(item)
@@ -818,7 +794,7 @@
      this.prevOrgandecisionValues = [...newDecision];
      this.$forceUpdate();
      if (newDecision.length === 0) {
      if (newDecision.length == 0) {
        this.expandedRowKeys = [];
      }
    },
@@ -917,7 +893,7 @@
      for (const organValue of relatedOrgans) {
        const organIndex = this.organAssessmentList.findIndex(
          organ => organ.organno === organValue && organ.delFlag !== "1"
          organ => organ.organno == organValue && organ.delFlag !== "1"
        );
        if (organIndex !== -1) {
@@ -959,7 +935,7 @@
    // 确保器官存在
    ensureOrganExists(organValue) {
      const exists = this.organAssessmentList.some(
        organ => organ.organno === organValue && organ.delFlag !== "1"
        organ => organ.organno == organValue && organ.delFlag !== "1"
      );
      if (!exists) {
@@ -991,7 +967,7 @@
      try {
        const response = await evaluateBaseInfolist({ infoid: this.infoid });
        if (response.code === 200) {
        if (response.code == 200) {
          this.handleResponseData(response);
        } else {
          this.$message.error("获取详情失败:" + (response.msg || "未知错误"));
@@ -1065,7 +1041,7 @@
        const organno = organ.organno;
        // 如果 assesscontent 是字符串,确保它是有效的 JSON
        if (organ.assesscontent && typeof organ.assesscontent === "string") {
        if (organ.assesscontent && typeof organ.assesscontent == "string") {
          try {
            JSON.parse(organ.assesscontent);
          } catch (error) {
@@ -1081,9 +1057,9 @@
        const assessments = this.getOrganAssessments(organ);
        const activeTab = this.activeTabMap.has(organno)
          ? this.activeTabMap.get(organno)
          ? String(this.activeTabMap.get(organno))
          : assessments.length > 0
          ? 0
          ? "0"
          : "summary";
        return {
@@ -1101,7 +1077,7 @@
      return {
        index: index,
        status: "pending",
        assessmentTime: "",
        assessmentTime: new Date().toLocaleString("zh-CN"), // 添加默认评估时间
        assessor: "",
        functionStatus: "",
        assessmentOpinion: "",
@@ -1125,20 +1101,20 @@
    // 获取器官整体状态
    getOrganOverallStatus(organ) {
      const assessments = this.getOrganAssessments(organ);
      if (assessments.length === 0) {
      if (assessments.length == 0) {
        return "pending";
      }
      const validAssessments = assessments.filter(a => a.delFlag !== "1");
      if (validAssessments.length === 0) {
      if (validAssessments.length == 0) {
        return "pending";
      }
      const allAssessed = validAssessments.every(
        assessment => assessment.status === "assessed"
        assessment => assessment.status == "assessed"
      );
      const someAssessed = validAssessments.some(
        assessment => assessment.status === "assessed"
        assessment => assessment.status == "assessed"
      );
      if (allAssessed) return "completed";
@@ -1167,7 +1143,7 @@
      } else {
        this.expandedRowKeys = [key];
        this.organAssessmentList.forEach(item => {
          item.expanded = item.organno === key;
          item.expanded = item.organno == key;
        });
      }
    },
@@ -1185,14 +1161,15 @@
      const assessments = this.getOrganAssessments(organ);
      const newAssessment = {
        ...this.getDefaultAssessment(assessments.length),
        assessor: this.currentUser.name
        assessor: this.currentUser.name,
        assessmentTime: new Date().toLocaleString("zh-CN") // 设置具体的评估时间
      };
      const newAssessments = [...assessments, newAssessment];
      this.$set(organ, "assesscontent", JSON.stringify(newAssessments));
      organ.activeTab = assessments.length;
      this.activeTabMap.set(organ.organno, assessments.length);
      organ.activeTab = String(assessments.length);
      this.activeTabMap.set(organ.organno, String(assessments.length));
      this.$message.success("已添加新的评估");
    },
@@ -1203,32 +1180,25 @@
      this.deleteOrganAssessment(organData, assessmentIndex);
    },
    // 处理评估保存
    // 在 AssessmentDetail.vue 的 handleSaveAssessment 方法中
    handleSaveAssessment(data) {
      const { organData, assessmentData, assessmentIndex } = data;
      const assessments = this.getOrganAssessments(organData);
      console.log("保存评估数据:", data);
      if (assessments[assessmentIndex]) {
        // 创建新的评估数组
        const newAssessments = [...assessments];
        newAssessments[assessmentIndex] = {
          ...assessments[assessmentIndex],
          ...assessmentData,
          status: "assessed", // 标记为已评估
          assessmentTime: new Date().toISOString(), // 设置评估时间
          delFlag: "0" // 确保删除标志
          status: "assessed",
          assessmentTime:
            assessmentData.assessmentTime || new Date().toLocaleString("zh-CN"),
          delFlag: "0"
        };
        // 更新 assesscontent
        this.$set(organData, "assesscontent", JSON.stringify(newAssessments));
        // 强制重新渲染
        this.$forceUpdate();
        this.$message.success("评估保存成功");
        // 检查是否需要自动切换到下一个评估
        this.checkAndSwitchTab(organData, assessmentIndex);
      }
    },
@@ -1238,8 +1208,8 @@
      const assessments = this.getOrganAssessments(organData);
      if (currentIndex < assessments.length - 1) {
        // 如果还有下一个评估,自动切换到下一个
        organData.activeTab = currentIndex + 1;
        this.activeTabMap.set(organData.organno, currentIndex + 1);
        organData.activeTab = String(currentIndex + 1);
        this.activeTabMap.set(organData.organno, String(currentIndex + 1));
      } else {
        // 如果没有下一个评估,切换到汇总页
        organData.activeTab = "summary";
@@ -1279,14 +1249,14 @@
          this.$set(organ, "assesscontent", JSON.stringify(newAssessments));
          // 处理tab切换
          if (newAssessments.length === 0) {
          if (newAssessments.length == 0) {
            organ.activeTab = "summary";
            this.activeTabMap.set(organ.organno, "summary");
          } else if (organ.activeTab === assessmentIndex) {
          } else if (organ.activeTab == String(assessmentIndex)) {
            const newIndex = Math.max(0, assessmentIndex - 1);
            organ.activeTab = newIndex;
            this.activeTabMap.set(organ.organno, newIndex);
          } else if (organ.activeTab === "summary") {
            organ.activeTab = String(newIndex);
            this.activeTabMap.set(organ.organno, String(newIndex));
          } else if (organ.activeTab == "summary") {
            this.activeTabMap.set(organ.organno, "summary");
          }
@@ -1301,16 +1271,18 @@
    // 获取最新评估时间
    getLatestAssessmentTime(organ) {
      const assessments = this.getOrganAssessments(organ);
      if (assessments.length === 0) return null;
      if (assessments.length == 0) return null;
      const assessed = assessments.filter(
        a => a.assessmentTime && a.delFlag !== "1"
      );
      if (assessed.length === 0) return null;
      if (assessed.length == 0) return null;
      return assessed.sort(
        (a, b) => new Date(b.assessmentTime) - new Date(a.assessmentTime)
      )[0].assessmentTime;
      return this.parseTime(
        assessed.sort(
          (a, b) => new Date(b.assessmentTime) - new Date(a.assessmentTime)
        )[0].assessmentTime
      );
    },
    // 获取评估状态标签类型
@@ -1372,7 +1344,7 @@
      if (this.assessmentData.assessannex) {
        try {
          const annexData =
            typeof this.assessmentData.assessannex === "string"
            typeof this.assessmentData.assessannex == "string"
              ? JSON.parse(this.assessmentData.assessannex)
              : this.assessmentData.assessannex;
@@ -1411,7 +1383,7 @@
        const response = await assessedit(updateData);
        if (response.code === 200) {
        if (response.code == 200) {
          this.$message.success("评估完成确认成功");
          this.assessmentData.assessState = "3";
          this.isEdit = false;
@@ -1519,6 +1491,7 @@
.fixed-width .el-button {
  margin: 0 2px;
}
/* 汇总页面样式 */
.assessment-summary {
  padding: 10px;