WXL
4 天以前 c4599aa279fd2f90b741608392e056fbae2282d5
src/views/business/course/components/DeathJudgmentStage.vue
@@ -1,5 +1,6 @@
<template>
  <div class="death-judgment-detail">
    <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
    <!-- 公共信息模块(独立显示) -->
    <!-- 判定类型标签页 -->
@@ -45,30 +46,7 @@
              <el-input v-model="form.gainhospitalname" :readonly="!isEdit" />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="是否默哀缅怀" prop="isspendremember">
              <el-select
                v-model="form.isspendremember"
                :disabled="!isEdit"
                style="width: 100%"
              >
                <el-option label="是" :value="1" />
                <el-option label="否" :value="0" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="恢复遗体仪容" prop="isrestoreremains">
              <el-select
                v-model="form.isrestoreremains"
                :disabled="!isEdit"
                style="width: 100%"
              >
                <el-option label="是" :value="1" />
                <el-option label="否" :value="0" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </el-card> -->
@@ -76,67 +54,17 @@
    <el-card v-if="activeJudgmentType === 'brain'" class="detail-card">
      <div slot="header" class="clearfix">
        <span class="detail-title">脑死亡判定信息</span>
        <el-button
          v-if="isEdit"
          style="float: right; margin-left: 10px;"
          type="success"
          @click="handleSave"
          :loading="saveLoading"
        >
          保存信息
        </el-button>
        <el-button
          v-if="isEdit"
          style="float: right; margin-left: 10px;"
          type="success"
          @click="accomplish"
          :loading="saveLoading"
        >
          完成判定
        </el-button>
        <el-button
          v-else
          style="float: right; margin-left: 10px;"
          type="primary"
          @click="handleEdit"
        >
          编辑信息
        </el-button>
      </div>
      <el-form :model="form" ref="brainForm" :rules="rules" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="死亡原因" prop="deathreason">
              <el-input v-model="form.deathreason" :readonly="!isEdit" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="死亡时间" prop="deathtime">
              <el-date-picker
                v-model="form.deathtime"
                type="datetime"
                value-format="yyyy-MM-dd HH:mm:ss"
                style="width: 100%"
                :disabled="!isEdit"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="判定医生一" prop="deathjudgedocto">
              <el-input v-model="form.deathjudgedocto" :readonly="!isEdit" />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="判定医生二" prop="deathjudgedoctt">
              <el-input v-model="form.deathjudgedoctt" :readonly="!isEdit" />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <el-descriptions title="脑死亡判定信息" :column="descriptionColumn" border size="small">
        <el-descriptions-item label="死亡原因">{{ form.deathreason || '-' }}</el-descriptions-item>
        <el-descriptions-item label="死亡时间">{{ form.deathtime || '-' }}</el-descriptions-item>
        <el-descriptions-item label="判定医生一">{{ form.deathjudgedocto || '-' }}</el-descriptions-item>
        <el-descriptions-item label="判定医生二">{{ form.deathjudgedoctt || '-' }}</el-descriptions-item>
        <el-descriptions-item label="其他判定医生">
          {{ brainExtraDoctors.filter(d => d && d.trim()).join('、') || '-' }}
        </el-descriptions-item>
      </el-descriptions>
      <!-- 脑死亡评估表附件 -->
      <div class="attachment-section">
@@ -153,21 +81,6 @@
            :name="type.value"
          >
            <div class="attachment-upload-section">
              <div class="upload-header">
                <span class="upload-title">{{ type.label }}</span>
                <el-tooltip content="点击上传该类型评估表" placement="top">
                  <el-button
                    size="mini"
                    type="primary"
                    icon="el-icon-plus"
                    @click="openUploadDialog(type.value)"
                    :disabled="!isEdit"
                  >
                    添加评估表
                  </el-button>
                </el-tooltip>
              </div>
              <!-- 附件列表 -->
              <el-table
                :data="getAttachmentsByType(type.value)"
@@ -212,7 +125,7 @@
                  </template>
                </el-table-column>
                <el-table-column label="操作" width="180" align="center">
                <el-table-column label="操作" width="140" align="center">
                  <template slot-scope="scope">
                    <el-button
                      size="mini"
@@ -227,15 +140,6 @@
                      icon="el-icon-download"
                      @click="handleDownload(scope.row)"
                      >下载</el-button
                    >
                    <el-button
                      v-if="isEdit"
                      size="mini"
                      type="text"
                      icon="el-icon-delete"
                      style="color: #F56C6C;"
                      @click="handleRemoveAttachment(scope.row)"
                      >删除</el-button
                    >
                  </template>
                </el-table-column>
@@ -260,64 +164,17 @@
    <el-card v-else class="detail-card">
      <div slot="header" class="clearfix">
        <span class="detail-title">心死亡判定信息</span>
        <el-button
          v-if="isEdit"
          style="float: right; margin-left: 10px;"
          type="success"
          @click="handleSave"
          :loading="saveLoading"
        >
          保存信息
        </el-button>
        <el-button
          v-else
          style="float: right; margin-left: 10px;"
          type="primary"
          @click="handleEdit"
        >
          编辑信息
        </el-button>
      </div>
      <el-form :model="form" ref="heartForm" :rules="rules" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="心死亡原因" prop="heartdeathreason">
              <el-input v-model="form.heartdeathreason" :readonly="!isEdit" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="心死亡时间" prop="heartdeathtime">
              <el-date-picker
                v-model="form.heartdeathtime"
                type="datetime"
                value-format="yyyy-MM-dd HH:mm:ss"
                style="width: 100%"
                :disabled="!isEdit"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="判定医生一" prop="heartdeathjudgedocto">
              <el-input
                v-model="form.heartdeathjudgedocto"
                :readonly="!isEdit"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="判定医生二" prop="heartdeathjudgedoctt">
              <el-input
                v-model="form.heartdeathjudgedoctt"
                :readonly="!isEdit"
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <el-descriptions title="心死亡判定信息" :column="descriptionColumn" border size="small">
        <el-descriptions-item label="心死亡原因">{{ form.heartdeathreason || '-' }}</el-descriptions-item>
        <el-descriptions-item label="心死亡判定完成时间">{{ form.heartdeathtime || '-' }}</el-descriptions-item>
        <el-descriptions-item label="判定医生一">{{ form.heartdeathjudgedocto || '-' }}</el-descriptions-item>
        <el-descriptions-item label="判定医生二">{{ form.heartdeathjudgedoctt || '-' }}</el-descriptions-item>
        <el-descriptions-item label="其他判定医生">
          {{ heartExtraDoctors.filter(d => d && d.trim()).join('、') || '-' }}
        </el-descriptions-item>
      </el-descriptions>
      <!-- 心死亡评估表附件 -->
      <div class="attachment-section">
@@ -334,21 +191,6 @@
            :name="type.value"
          >
            <div class="attachment-upload-section">
              <div class="upload-header">
                <span class="upload-title">{{ type.label }}</span>
                <el-tooltip content="点击上传该类型评估表" placement="top">
                  <el-button
                    size="mini"
                    type="primary"
                    icon="el-icon-plus"
                    @click="openHeartDeathUploadDialog(type.value)"
                    :disabled="!isEdit"
                  >
                    添加评估表
                  </el-button>
                </el-tooltip>
              </div>
              <!-- 心死亡附件列表 -->
              <el-table
                :data="getHeartDeathAttachmentsByType(type.value)"
@@ -393,7 +235,7 @@
                  </template>
                </el-table-column>
                <el-table-column label="操作" width="180" align="center">
                <el-table-column label="操作" width="140" align="center">
                  <template slot-scope="scope">
                    <el-button
                      size="mini"
@@ -408,15 +250,6 @@
                      icon="el-icon-download"
                      @click="handleDownload(scope.row)"
                      >下载</el-button
                    >
                    <el-button
                      v-if="isEdit"
                      size="mini"
                      type="text"
                      icon="el-icon-delete"
                      style="color: #F56C6C;"
                      @click="handleRemoveHeartDeathAttachment(scope.row)"
                      >删除</el-button
                    >
                  </template>
                </el-table-column>
@@ -436,94 +269,13 @@
        </el-tabs>
      </div>
    </el-card>
    <!-- 上传对话框(脑死亡) -->
    <el-dialog
      :title="`上传${getCurrentBrainDeathTypeLabel}评估表`"
      :visible.sync="uploadDialogVisible"
      width="500px"
      :close-on-click-modal="false"
    >
      <el-upload
        ref="uploadRef"
        class="upload-demo"
        drag
        :action="uploadAction"
        :headers="headers"
        multiple
        :file-list="tempFileList"
        :before-upload="beforeUpload"
        :on-change="handleFileChange"
        :on-remove="handleTempRemove"
        :on-success="handleUploadSuccess"
        :auto-upload="false"
      >
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">
          将评估表文件拖到此处,或<em>点击上传</em>
        </div>
        <div class="el-upload__tip" slot="tip">
          支持上传pdf、jpg、png、doc、docx、xls、xlsx格式文件,单个文件不超过10MB
        </div>
      </el-upload>
      <div slot="footer" class="dialog-footer">
        <el-button @click="uploadDialogVisible = false">取消</el-button>
        <el-button
          type="primary"
          @click="submitUpload"
          :loading="uploadLoading"
          :disabled="tempFileList.length === 0"
        >
          确认上传
        </el-button>
      </div>
    </el-dialog>
    <!-- 上传对话框(心死亡) -->
    <el-dialog
      :title="`上传${getCurrentHeartDeathTypeLabel}评估表`"
      :visible.sync="heartDeathUploadDialogVisible"
      width="500px"
      :close-on-click-modal="false"
    >
      <el-upload
        ref="heartDeathUploadRef"
        class="upload-demo"
        drag
        :action="uploadAction"
        :headers="headers"
        multiple
        :file-list="tempHeartDeathFileList"
        :before-upload="beforeUpload"
        :on-change="handleHeartDeathFileChange"
        :on-remove="handleHeartDeathTempRemove"
        :on-success="handleHeartDeathUploadSuccess"
        :auto-upload="false"
      >
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">
          将评估表文件拖到此处,或<em>点击上传</em>
        </div>
        <div class="el-upload__tip" slot="tip">
          支持上传pdf、jpg、png、doc、docx、xls、xlsx格式文件,单个文件不超过10MB
        </div>
      </el-upload>
      <div slot="footer" class="dialog-footer">
        <el-button @click="heartDeathUploadDialogVisible = false"
          >取消</el-button
        >
        <el-button
          type="primary"
          @click="submitHeartDeathUpload"
          :loading="heartDeathUploadLoading"
          :disabled="tempHeartDeathFileList.length === 0"
        >
          确认上传
        </el-button>
      </div>
    </el-dialog>
    <!-- 附件预览 -->
    <FilePreviewDialog
      :visible="previewVisible"
      :file="currentPreviewFile"
      @close="previewVisible = false"
      @download="handleDownload"
    />
  </div>
</template>
@@ -535,10 +287,13 @@
} from "@/api/businessApi";
import { getToken } from "@/utils/auth";
import CaseBasicInfo from "@/components/CaseBasicInfo";
import FilePreviewDialog from "@/components/FilePreviewDialog";
import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
export default {
  name: "DeathJudgmentDetail",
  components: { CaseBasicInfo },
  components: { CaseBasicInfo, FilePreviewDialog },
  mixins: [readonlyDescriptionsMixin],
  props: {
    infoid: {
      type: String,
@@ -548,12 +303,15 @@
  data() {
    return {
      caseId: null,
      isEdit: false,
      isEdit: true,
      saveLoading: false,
      brainExtraDoctors: [], // 脑死亡其他判定医生
      heartExtraDoctors: [], // 心死亡其他判定医生
      // 判定类型标签
      activeJudgmentType: "brain", // 默认显示脑死亡
      // 预览相关
      previewVisible: false,
      currentPreviewFile: null,
      // 表单数据
      form: {
        id: undefined,
@@ -604,7 +362,11 @@
          { required: false, message: "心死亡原因不能为空", trigger: "blur" }
        ],
        heartdeathtime: [
          { required: false, message: "心死亡时间不能为空", trigger: "change" }
          {
            required: false,
            message: "心死亡判定完成时间不能为空",
            trigger: "change"
          }
        ],
        heartdeathjudgedocto: [
          {
@@ -637,12 +399,14 @@
        { value: "3", label: "短潜伏期体感诱发电位评估表" },
        { value: "4", label: "经颅多普勒超声评估记录" },
        { value: "5", label: "卫健委脑损伤质控中心 - 临床综合评估表" },
        { value: "6", label: "UW评分表" }
        { value: "7", label: "AT前" },
        { value: "8", label: "AT后" },
        { value: "6", label: "UW评分表(脑死亡)" }
      ],
      // 心死亡评估表类型定义
      heartDeathAttachmentTypes: [
        { value: "heart_1", label: "心死亡判定表" },
        { value: "heart_2", label: "心电图评估表" }
        { value: "heart_2", label: "UW评分表(心死亡)" }
      ],
      // 附件列表数据
@@ -665,10 +429,13 @@
    }
  },
  created() {
    this.infoid = this.infoid;
    this.caseId = this.infoid;
    this.activeJudgmentType = this.$route.query.type;
    // 从路由参数获取默认显示类型
    if (this.$route.query.judgmentType) {
      this.activeJudgmentType = this.$route.query.type;
      this.activeJudgmentType = this.$route.query.judgmentType;
    }
    this.getDetail(this.infoid);
@@ -680,7 +447,32 @@
      this.activeJudgmentType = tab.name;
      // 可以在这里添加其他切换逻辑
    },
    addBrainDoctor() {
      this.brainExtraDoctors.push("");
    },
    removeBrainDoctor(index) {
      this.brainExtraDoctors.splice(index, 1);
    },
    addHeartDoctor() {
      this.heartExtraDoctors.push("");
    },
    removeHeartDoctor(index) {
      this.heartExtraDoctors.splice(index, 1);
    },
    // 序列化额外医生列表为字符串(用中文逗号分隔)
    serializeExtraDoctors(list) {
      return list.filter(name => name && name.trim()).join(",");
    },
    // 从字符串解析出医生列表(按中文逗号拆分)
    parseExtraDoctors(str) {
      if (!str) return [];
      return str
        .split(",")
        .map(s => s.trim())
        .filter(s => s);
    },
    // 生成捐献者编号
    generateDonorNo() {
      const timestamp = Date.now().toString();
@@ -691,13 +483,8 @@
    async getDetail(infoid) {
      try {
        const response = await queryDathInfoBaseInfo({ infoid });
        let realData = {};
        if (response && response.data) {
          realData = response.data[0];
        } else if (response) {
          realData = response;
        }
        let realData = response?.data?.[0] || response || {};
        // 映射字段到表单
        this.form = {
@@ -716,7 +503,18 @@
        if (realData.rememberAnnex) {
          this.parseAttachmentData(realData.rememberAnnex, "brain");
        }
        if (realData.remark) {
          const parts = realData.remark.split(" | ");
          parts.forEach(part => {
            if (part.includes("脑死亡其他医生:")) {
              const doctorsStr = part.replace("脑死亡其他医生:", "");
              this.brainExtraDoctors = this.parseExtraDoctors(doctorsStr);
            } else if (part.includes("心死亡其他医生:")) {
              const doctorsStr = part.replace("心死亡其他医生:", "");
              this.heartExtraDoctors = this.parseExtraDoctors(doctorsStr);
            }
          });
        }
        // 解析心死亡附件信息
        if (realData.heartdeathjudgeannex) {
          this.parseAttachmentData(realData.heartdeathjudgeannex, "heart");
@@ -1023,30 +821,63 @@
    },
    // 预览附件
    handlePreview(attachment) {
      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}">`,
          "图片预览",
          {
            dangerouslyUseHTMLString: true,
            customClass: "image-preview-dialog"
          }
        );
      } else {
        this.$message.info("该文件类型暂不支持在线预览,请下载后查看");
      }
    },
    handlePreview(file) {
      console.log(file, "file");
      this.currentPreviewFile = {
        fileName: file.fileName,
        fileUrl: file.path || file.fileUrl,
        fileType: this.getFileType(file.fileName)
      };
      this.previewVisible = true;
      // 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}">`,
      //     "图片预览",
      //     {
      //       dangerouslyUseHTMLString: true,
      //       customClass: "image-preview-dialog"
      //     }
      //   );
      // } else {
      //   this.$message.info("该文件类型暂不支持在线预览,请下载后查看");
      // }
    },
    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";
    },
    // 下载附件
    handleDownload(attachment) {
      const link = document.createElement("a");
      link.href = attachment.fileUrl;
      link.download = attachment.fileName;
      link.click();
      this.$message.success(`开始下载: ${attachment.fileName}`);
    handleDownload(file) {
      const fileUrl = file.path || file.fileUrl;
      const fileName = file.fileName;
      if (fileUrl) {
        const link = document.createElement("a");
        link.href = fileUrl;
        link.download = fileName;
        link.style.display = "none";
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        this.$message.success("开始下载文件");
      } else {
        this.$message.warning("文件路径不存在,无法下载");
      }
    },
    // 编辑信息
@@ -1077,13 +908,32 @@
          this.saveLoading = true;
          try {
            // 构建额外医生字符串
            const brainExtraStr = this.serializeExtraDoctors(
              this.brainExtraDoctors
            );
            const heartExtraStr = this.serializeExtraDoctors(
              this.heartExtraDoctors
            );
            let remark = this.form.remark || "";
            // 如果已有备注,用 ' | ' 分隔;否则直接赋值
            if (brainExtraStr) {
              remark +=
                (remark ? " | " : "") + "脑死亡其他医生:" + brainExtraStr;
            }
            if (heartExtraStr) {
              remark +=
                (remark ? " | " : "") + "心死亡其他医生:" + heartExtraStr;
            }
            // 构建提交数据
            const submitData = {
              ...this.form,
              infoid: this.infoid,
              // 确保附件数据最新
              rememberAnnex: this.buildBrainDeathAttachmentJson(),
              heartdeathjudgeannex: this.buildHeartDeathAttachmentJson()
              rememberannex: this.buildBrainDeathAttachmentJson(),
              heartdeathjudgeannex: this.buildHeartDeathAttachmentJson(),
              remark: remark // 使用合并后的 remark
            };
            if (submitData.state == 1 || !submitData.state) {
              submitData.state = 2;