WXL
2026-03-13 45680b99ccdfb0d323088c57c237e0bc714a8e0b
src/views/business/decide/DecideInfo.vue
@@ -6,8 +6,8 @@
        <span class="detail-title">死亡判定基本信息</span>
        <el-button
          v-if="isEdit"
          type="primary"
          style="float: right; padding: 3px 0"
          type="success"
          style="float: right"
          @click="handleSave"
          :loading="saveLoading"
        >
@@ -16,7 +16,7 @@
        <el-button
          v-else
          type="primary"
          style="float: right; padding: 3px 0"
          style="float: right"
          @click="handleEdit"
        >
          编辑信息
@@ -138,7 +138,10 @@
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="负责人" prop="responsibleusername">
              <el-input v-model="form.responsibleusername" :readonly="!isEdit" />
              <el-input
                v-model="form.responsibleusername"
                :readonly="!isEdit"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
@@ -166,7 +169,7 @@
    <el-card class="attachment-card">
      <div slot="header" class="clearfix">
        <span class="detail-title">死亡判定评估表附件</span>
        <el-button
        <!-- <el-button
          v-if="isEdit"
          type="primary"
          size="mini"
@@ -174,7 +177,7 @@
          :loading="uploadLoading"
        >
          上传附件
        </el-button>
        </el-button> -->
      </div>
      <!-- 附件类型选项卡 -->
@@ -221,7 +224,9 @@
              <el-table-column label="文件类型" width="100" align="center">
                <template slot-scope="scope">
                  <el-tag size="small">{{ getFileType(scope.row.fileName) }}</el-tag>
                  <el-tag size="small">{{
                    getFileType(scope.row.fileName)
                  }}</el-tag>
                </template>
              </el-table-column>
@@ -243,11 +248,7 @@
                </template>
              </el-table-column>
              <el-table-column
                label="操作"
                width="180"
                align="center"
              >
              <el-table-column label="操作" width="180" align="center">
                <template slot-scope="scope">
                  <el-button
                    size="mini"
@@ -280,7 +281,10 @@
              v-if="getAttachmentsByType(type.value).length === 0"
              class="empty-attachment"
            >
              <el-empty description="暂无评估表附件" :image-size="80"></el-empty>
              <el-empty
                description="暂无评估表附件"
                :image-size="80"
              ></el-empty>
            </div>
          </div>
        </el-tab-pane>
@@ -298,16 +302,20 @@
        ref="uploadRef"
        class="upload-demo"
        drag
        action="#"
        :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__text">
          将评估表文件拖到此处,或<em>点击上传</em>
        </div>
        <div class="el-upload__tip" slot="tip">
          支持上传pdf、jpg、png、doc、docx、xls、xlsx格式文件,单个文件不超过10MB
        </div>
@@ -330,6 +338,7 @@
<script>
import { deathinfoedit, deathinfoInfo } from "@/api/businessApi";
import { getToken } from "@/utils/auth";
export default {
  name: "DeathJudgmentDetail",
@@ -384,7 +393,10 @@
      uploadLoading: false,
      tempFileList: [],
      currentUploadType: "",
      uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
      headers: {
        Authorization: "Bearer " + getToken()
      },
      // 评估表类型定义
      attachmentTypes: [
        { value: "1", label: "脑死亡判定表" },
@@ -410,10 +422,10 @@
  },
  created() {
    const id = this.$route.query.id;
    this.isEdit = this.$route.path.includes('/edit') || this.$route.path.includes('/add');
    if (id && !this.$route.path.includes('/add')) {
    this.isEdit = this.$route.query.isEdit;
    if (id && !this.$route.path.includes("/add")) {
      this.getDetail(id);
    } else if (this.$route.path.includes('/add')) {
    } else if (this.$route.path.includes("/add")) {
      this.generateDonorNo();
    }
    this.getAttachmentList();
@@ -422,12 +434,12 @@
    // 生成捐献者编号
    generateDonorNo() {
      const timestamp = Date.now().toString();
      this.form.donorno = 'DONOR' + timestamp.slice(-8);
      this.form.donorno = "DONOR" + timestamp.slice(-8);
    },
    // 获取详情
    async getDetail(id) {
      try {
        const response = await deathinfoInfo({ id });
        const response = await deathinfoInfo(id);
        let realData = {};
        if (response && response.data) {
@@ -441,18 +453,21 @@
          ...this.form,
          ...realData,
          // 确保数值类型字段正确转换
          isspendremember: realData.isspendremember ? parseInt(realData.isspendremember) : 0,
          isrestoreremains: realData.isrestoreremains ? parseInt(realData.isrestoreremains) : 0
          isspendremember: realData.isspendremember
            ? parseInt(realData.isspendremember)
            : 0,
          isrestoreremains: realData.isrestoreremains
            ? parseInt(realData.isrestoreremains)
            : 0
        };
        // 解析附件信息
        if (realData.rememberannex) {
          this.parseAttachmentData(realData.rememberannex);
        }
      } catch (error) {
        console.error('获取死亡判定详情失败:', error);
        this.$message.error('数据加载失败');
        console.error("获取死亡判定详情失败:", error);
        this.$message.error("数据加载失败");
      }
    },
    // 解析附件数据
@@ -465,7 +480,7 @@
          }
        }
      } catch (error) {
        console.error('解析附件数据失败:', error);
        console.error("解析附件数据失败:", error);
      }
    },
    // 构建附件JSON数据
@@ -477,7 +492,7 @@
      const statusMap = {
        "0": "warning", // 维护中
        "1": "success", // 已完成
        "99": "danger"  // 已终止
        "99": "danger" // 已终止
      };
      return statusMap[status] || "info";
    },
@@ -504,16 +519,19 @@
    },
    // 获取文件类型
    getFileType(fileName) {
      const ext = fileName.split('.').pop().toLowerCase();
      const ext = fileName
        .split(".")
        .pop()
        .toLowerCase();
      const typeMap = {
        'pdf': 'PDF',
        'doc': 'DOC',
        'docx': 'DOCX',
        'xls': 'XLS',
        'xlsx': 'XLSX',
        'jpg': 'JPG',
        'jpeg': 'JPEG',
        'png': 'PNG'
        pdf: "PDF",
        doc: "DOC",
        docx: "DOCX",
        xls: "XLS",
        xlsx: "XLSX",
        jpg: "JPG",
        jpeg: "JPEG",
        png: "PNG"
      };
      return typeMap[ext] || ext.toUpperCase();
    },
@@ -531,34 +549,37 @@
    // 上传前校验
    beforeUpload(file) {
      const allowedTypes = [
        'application/pdf',
        'image/jpeg',
        'image/png',
        'application/msword',
        'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        'application/vnd.ms-excel',
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        "application/pdf",
        "image/jpeg",
        "image/png",
        "application/msword",
        "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        "application/vnd.ms-excel",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
      ];
      const maxSize = 10 * 1024 * 1024; // 10MB
      const isTypeOk = allowedTypes.includes(file.type) ||
                      file.name.endsWith('.pdf') ||
                      file.name.endsWith('.jpg') ||
                      file.name.endsWith('.jpeg') ||
                      file.name.endsWith('.png') ||
                      file.name.endsWith('.doc') ||
                      file.name.endsWith('.docx') ||
                      file.name.endsWith('.xls') ||
                      file.name.endsWith('.xlsx');
      const isTypeOk =
        allowedTypes.includes(file.type) ||
        file.name.endsWith(".pdf") ||
        file.name.endsWith(".jpg") ||
        file.name.endsWith(".jpeg") ||
        file.name.endsWith(".png") ||
        file.name.endsWith(".doc") ||
        file.name.endsWith(".docx") ||
        file.name.endsWith(".xls") ||
        file.name.endsWith(".xlsx");
      if (!isTypeOk) {
        this.$message.error('文件格式不支持,请上传pdf、jpg、png、doc、docx、xls或xlsx格式文件');
        this.$message.error(
          "文件格式不支持,请上传pdf、jpg、png、doc、docx、xls或xlsx格式文件"
        );
        return false;
      }
      if (file.size > maxSize) {
        this.$message.error('文件大小不能超过10MB');
        this.$message.error("文件大小不能超过10MB");
        return false;
      }
@@ -572,16 +593,11 @@
    handleTempRemove(file, fileList) {
      this.tempFileList = fileList;
    },
    // 提交上传
    async submitUpload() {
      if (this.tempFileList.length === 0) {
        this.$message.warning('请先选择要上传的文件');
        return;
      }
      this.uploadLoading = true;
      try {
    /** 上传成功处理 */
    handleUploadSuccess(response, file, fileList) {
      if (response.code === 200) {
        file.url = response.data || response.url;
        this.$message.success("文件上传成功");
        for (const file of this.tempFileList) {
          const newAttachment = {
            id: Date.now() + Math.random(),
@@ -590,8 +606,8 @@
            fileName: file.name,
            fileSize: file.size,
            uploadTime: new Date().toISOString(),
            uploader: '当前用户',
            fileUrl: URL.createObjectURL(file.raw)
            uploader: "当前用户",
            fileUrl: file.url
          };
          this.attachmentList.push(newAttachment);
@@ -600,49 +616,92 @@
        // 更新附件JSON数据到表单
        this.form.rememberannex = this.buildAttachmentJson();
        this.$message.success('文件上传成功');
        this.$message.success("文件上传成功");
        this.uploadDialogVisible = false;
        this.tempFileList = [];
      } catch (error) {
        this.$message.error('文件上传失败');
        console.error('上传失败:', error);
      } finally {
        this.uploadLoading = false;
        this.tempFileList = [];
      } else {
        this.$message.error(response.msg || "文件上传失败");
      }
    },
    // 提交上传
    async submitUpload() {
      if (this.tempFileList.length === 0) {
        this.$message.warning("请先选择要上传的文件");
        return;
      }
      this.$refs.uploadRef.submit();
      this.uploadLoading = true;
      // try {
      //   for (const file of this.tempFileList) {
      //     const newAttachment = {
      //       id: Date.now() + Math.random(),
      //       type: this.currentUploadType,
      //       typeName: this.getCurrentTypeLabel,
      //       fileName: file.name,
      //       fileSize: file.size,
      //       uploadTime: new Date().toISOString(),
      //       uploader: "当前用户",
      //       fileUrl: URL.createObjectURL(file.raw)
      //     };
      //     this.attachmentList.push(newAttachment);
      //   }
      //   // 更新附件JSON数据到表单
      //   this.form.rememberannex = this.buildAttachmentJson();
      //   this.$message.success("文件上传成功");
      //   this.uploadDialogVisible = false;
      //   this.tempFileList = [];
      // } catch (error) {
      //   this.$message.error("文件上传失败");
      //   console.error("上传失败:", error);
      // } finally {
      //   this.uploadLoading = false;
      // }
    },
    // 删除附件
    handleRemoveAttachment(attachment) {
      this.$confirm('确定要删除这个评估表附件吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        const index = this.attachmentList.findIndex(item => item.id === attachment.id);
        if (index !== -1) {
          this.attachmentList.splice(index, 1);
          // 更新附件JSON数据到表单
          this.form.rememberannex = this.buildAttachmentJson();
          this.$message.success('评估表删除成功');
        }
      }).catch(() => {});
      this.$confirm("确定要删除这个评估表附件吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          const index = this.attachmentList.findIndex(
            item => item.id === attachment.id
          );
          if (index !== -1) {
            this.attachmentList.splice(index, 1);
            // 更新附件JSON数据到表单
            this.form.rememberannex = this.buildAttachmentJson();
            this.$message.success("评估表删除成功");
          }
        })
        .catch(() => {});
    },
    // 预览附件
    handlePreview(attachment) {
      if (attachment.fileName.endsWith('.pdf')) {
        window.open(attachment.fileUrl, '_blank');
      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}">`,
          '图片预览', {
        this.$alert(
          `<img src="${attachment.fileUrl}" style="max-width: 100%;" alt="${attachment.fileName}">`,
          "图片预览",
          {
            dangerouslyUseHTMLString: true,
            customClass: 'image-preview-dialog'
          });
            customClass: "image-preview-dialog"
          }
        );
      } else {
        this.$message.info('该文件类型暂不支持在线预览,请下载后查看');
        this.$message.info("该文件类型暂不支持在线预览,请下载后查看");
      }
    },
    // 下载附件
    handleDownload(attachment) {
      const link = document.createElement('a');
      const link = document.createElement("a");
      link.href = attachment.fileUrl;
      link.download = attachment.fileName;
      link.click();
@@ -669,18 +728,18 @@
            const response = await deathinfoedit(submitData);
            if (response.code === 200) {
              this.$message.success('保存成功');
              this.$message.success("保存成功");
              this.isEdit = false;
              if (this.$route.path.includes('/add')) {
                this.$router.push('/case/deathJudgment');
              if (this.$route.path.includes("/add")) {
                this.$router.push("/case/deathJudgment");
              }
            } else {
              this.$message.error(response.message || '保存失败');
              this.$message.error(response.message || "保存失败");
            }
          } catch (error) {
            console.error('保存失败:', error);
            this.$message.error('保存失败');
            console.error("保存失败:", error);
            this.$message.error("保存失败");
          } finally {
            this.saveLoading = false;
          }
@@ -689,17 +748,28 @@
    },
    // 文件大小格式化
    formatFileSize(size) {
      if (size === 0) return '0 B';
      if (size === 0) return "0 B";
      const k = 1024;
      const sizes = ['B', 'KB', 'MB', 'GB'];
      const sizes = ["B", "KB", "MB", "GB"];
      const i = Math.floor(Math.log(size) / Math.log(k));
      return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
      return parseFloat((size / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
    },
    // 时间格式化
    parseTime(time) {
      if (!time) return '';
      if (!time) return "";
      const date = new Date(time);
      return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
      return `${date.getFullYear()}-${(date.getMonth() + 1)
        .toString()
        .padStart(2, "0")}-${date
        .getDate()
        .toString()
        .padStart(2, "0")} ${date
        .getHours()
        .toString()
        .padStart(2, "0")}:${date
        .getMinutes()
        .toString()
        .padStart(2, "0")}`;
    }
  }
};