WXL
昨天 c8e9849cb5f24848df0174c13bfbbff37bb08a5a
src/views/business/course/components/MedicalAssessmentStage.vue
@@ -5,88 +5,43 @@
    <el-card class="organ-assessment-card">
      <div slot="header" class="clearfix">
        <span>器官评估表</span>
        <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>
@@ -103,12 +58,12 @@
                      <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">
@@ -118,57 +73,36 @@
                      <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>
@@ -182,14 +116,10 @@
                              <!-- 功能状态 -->
                              <el-descriptions-item label="功能状态">
                                <el-tag
                                  :type="
                                    getFunctionStatusTagType(
                                      assessment.functionStatus
                                    )
                                  "
                                  size="small"
                                >
                                <el-tag :type="getFunctionStatusTagType(
                                  assessment.functionStatus
                                )
                                  " size="small">
                                  {{
                                    getFunctionStatusText(
                                      assessment.functionStatus
@@ -203,34 +133,25 @@
                                <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>
@@ -241,57 +162,37 @@
                    </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" ? "是" : "否"
                            }}
@@ -318,31 +219,16 @@
          </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
@@ -355,51 +241,31 @@
        <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>
@@ -407,18 +273,12 @@
    <!-- 整体保存按钮 -->
    <div class="footer-actions" v-if="isEdit">
      <el-button type="primary" @click="handleSaveAll" :loading="saveLoading"
        >保存评估表</el-button
      >
      <el-button @click="handleCancel">取消</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>
@@ -436,7 +296,7 @@
  name: "AssessmentDetail",
  components: { OrganAssessmentForm, FilePreviewDialog, CaseBasicInfo },
  dicts: ["sys_user_sex", "sys_Organ", "sys_0_1"],
  props: {
   props: {
    infoid: {
      type: String,
      default: true
@@ -557,9 +417,9 @@
    }
  },
  created() {
    this.caseId = this.infoid;
    this.assessmentId = this.$route.query.id;
    this.isEdit = this.$route.query.assess == "true";
    this.isEdit = true;
    this.getAssessmentDetail();
  },
  methods: {
@@ -614,8 +474,8 @@
        <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>
@@ -629,8 +489,8 @@
              </el-button>
            </li>
          `
            )
            .join("")}
          )
          .join("")}
        </ul>
      </div>`,
        "附件列表",
@@ -684,7 +544,19 @@
        this.$forceUpdate();
      }
    },
    accomplish() {
      this.$confirm("是否完成该案例器官评估步骤?", "提醒", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          this.form.assessState = 3;
          this.handleSaveAll();
        })
        .catch(() => { });
    },
    // 整体保存方法
    async handleSaveAll() {
      this.saveLoading = true;
@@ -729,7 +601,9 @@
            })
          )
        };
        if (saveData.assessState == 1 || !saveData.assessState) {
          saveData.assessState = 2;
        }
        const saveMethod = this.assessmentData.id ? assessedit : assessAdd;
        const response = await saveMethod(saveData);
@@ -738,6 +612,7 @@
          if (!this.assessmentData.id && response.data) {
            this.assessmentData.id = response.data;
          }
          this.getAssessmentDetail()
          this.refreshKey += 1; // 触发重新渲染
        } else {
          this.$message.error("保存失败:" + (response.msg || "未知错误"));
@@ -853,8 +728,7 @@
        // 显示创建提示
        if (organsToCreate.length > 0) {
          this.$message.success(
            `已为【${this.getOrganLabel(decision)}】创建${
              organsToCreate.length
            `已为【${this.getOrganLabel(decision)}】创建${organsToCreate.length
            }个评估项`
          );
        }
@@ -976,7 +850,7 @@
        detailData = response;
      }
      this.assessmentData = {
        id: detailData.id || this.assessmentId,
        id: detailData.id ,
        infoid: detailData.infoid || this.infoid,
        caseNo: detailData.caseNo || "",
        name: detailData.name || detailData.donorName || "",
@@ -1037,8 +911,8 @@
        const activeTab = this.activeTabMap.has(organno)
          ? String(this.activeTabMap.get(organno))
          : assessments.length > 0
          ? "0"
          : "summary";
            ? "0"
            : "summary";
        return {
          ...organ,
@@ -1340,32 +1214,25 @@
      }
    },
    handleCompleteAssessment() {
      this.$confirm("是否完成该案例所有器官的评估?", "提醒", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          this.assessmentData.assessState = 3;
          this.saveAssessment();
        })
        .catch(() => {});
    },
    // 保存评估
    async saveAssessment() {
    // 完成评估
    async handleCompleteAssessment() {
      try {
        await this.$confirm(
          "确认完成所有器官评估吗?完成后将无法修改",
          "确认操作",
          {
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            type: "warning"
          }
        );
        const updateData = {
          ...this.assessmentData
          ...this.assessmentData,
          assessState: "3",
          assessTime: new Date().toISOString()
        };
        if (
          this.assessmentData.assessState == 1 ||
          !this.assessmentData.assessState
        ) {
          this.assessmentData.assessState = 2;
        }
        const response = await assessedit(updateData);
        if (response.code == 200) {
@@ -1586,7 +1453,7 @@
  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;
}
@@ -1664,7 +1531,7 @@
  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;
}