WXL
2026-03-19 5aa165156994b1b8a601063fa0a1107d1893ea57
src/views/business/course/components/DeathJudgmentStage.vue
@@ -4,14 +4,70 @@
      <!-- 基础信息 -->
      <div slot="header" class="clearfix">
        <span class="detail-title">死亡判定基本信息</span>
        <el-button
          v-if="isEdit"
          type="success"
          style="float: right"
          @click="handleSave"
          :loading="saveLoading"
        >
          保存信息
        </el-button>
        <el-button
          v-else
          type="primary"
          style="float: right"
          @click="handleEdit"
        >
          编辑信息
        </el-button>
      </div>
      <el-form :model="form" ref="form" :rules="rules" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="死亡原因" prop="deathReason">
            <el-form-item label="捐献者编号" prop="donorno">
              <el-input
                v-model="form.donorno"
                :readonly="!isEdit"
                placeholder="自动生成捐献者编号"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="捐献者姓名" prop="name">
              <el-input v-model="form.name" :readonly="!isEdit" />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="性别" prop="sex">
              <el-select
                v-model="form.deathReason"
                v-model="form.sex"
                :disabled="!isEdit"
                style="width: 100%"
              >
                <el-option label="男" value="1" />
                <el-option label="女" value="2" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="年龄" prop="age">
              <el-input v-model="form.age" :readonly="!isEdit" />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="疾病诊断" prop="diagnosisname">
              <el-input v-model="form.diagnosisname" :readonly="!isEdit" />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="死亡原因" prop="deathreason">
              <el-select
                v-model="form.deathreason"
                :disabled="!isEdit"
                style="width: 100%"
              >
@@ -25,9 +81,9 @@
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="死亡时间" prop="deathTime">
            <el-form-item label="死亡时间" prop="deathtime">
              <el-date-picker
                v-model="form.deathTime"
                v-model="form.deathtime"
                type="datetime"
                value-format="yyyy-MM-dd HH:mm:ss"
                style="width: 100%"
@@ -36,20 +92,63 @@
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="判定医生一" prop="judgmentDoctor">
              <el-input v-model="form.judgmentDoctorone" :readonly="!isEdit" />
            <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="judgmentDoctor">
              <el-input v-model="form.judgmentDoctortwo" :readonly="!isEdit" />
            <el-form-item label="判定医生二" prop="deathjudgedoctt">
              <el-input v-model="form.deathjudgedoctt" :readonly="!isEdit" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="登记人" prop="registrant">
              <el-input v-model="form.registrant" :readonly="!isEdit" />
            <el-form-item label="器官获取机构" prop="gainhospitalname">
              <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-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="负责人" prop="responsibleusername">
              <el-input
                v-model="form.responsibleusername"
                :readonly="!isEdit"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="记录状态" prop="recordstate">
              <el-tag :type="getStatusTag(form.recordstate)">
                {{ getStatusText(form.recordstate) }}
              </el-tag>
            </el-form-item>
          </el-col>
        </el-row>
@@ -70,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"
@@ -78,7 +177,7 @@
          :loading="uploadLoading"
        >
          上传附件
        </el-button>
        </el-button> -->
      </div>
      <!-- 附件类型选项卡 -->
@@ -203,12 +302,14 @@
        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>
@@ -236,13 +337,17 @@
</template>
<script>
import {
  getDeathJudgmentDetail,
  updateDeathJudgment
} from "./api/mockDeathJudgmentApi";
import { deathinfoedit, queryDathInfoBaseInfo } from "@/api/businessApi";
import { getToken } from "@/utils/auth";
export default {
  name: "DeathJudgmentDetail",
  props: {
    infoid: {
      type: String,
      default: true
    }
  },
  data() {
    return {
      // 是否编辑模式
@@ -252,31 +357,39 @@
      // 表单数据
      form: {
        id: undefined,
        hospitalNo: "",
        donorName: "",
        gender: "",
        infoid: undefined,
        donorno: "",
        name: "",
        sex: "",
        age: "",
        diagnosis: "",
        deathReason: "",
        deathTime: "",
        judgmentDoctor: "",
        judgmentDescription: "",
        registrant: "",
        registrationTime: ""
        diagnosisname: "",
        deathreason: "",
        deathtime: "",
        deathjudgedocto: "",
        deathjudgedoctt: "",
        gainhospitalno: "",
        gainhospitalname: "",
        isspendremember: 0,
        isrestoreremains: 0,
        rememberannex: "",
        responsibleuserid: "",
        responsibleusername: "",
        recordstate: "0",
        judgmentDescription: ""
      },
      // 表单验证规则
      rules: {
        donorName: [
        name: [
          { required: true, message: "捐献者姓名不能为空", trigger: "blur" }
        ],
        deathReason: [
        deathreason: [
          { required: true, message: "死亡原因不能为空", trigger: "change" }
        ],
        deathTime: [
        deathtime: [
          { required: true, message: "死亡时间不能为空", trigger: "change" }
        ],
        judgmentDoctor: [
          { required: true, message: "判定医生不能为空", trigger: "blur" }
        deathjudgedocto: [
          { required: true, message: "判定医生一不能为空", trigger: "blur" }
        ]
      },
      // 附件相关数据
@@ -286,7 +399,10 @@
      uploadLoading: false,
      tempFileList: [],
      currentUploadType: "",
      uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
      headers: {
        Authorization: "Bearer " + getToken()
      },
      // 评估表类型定义
      attachmentTypes: [
        { value: "1", label: "脑死亡判定表" },
@@ -311,58 +427,89 @@
    }
  },
  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.getDetail(id);
    } else if (this.$route.path.includes("/add")) {
      this.generateHospitalNo();
    }
    this.getDetail(this.infoid);
    this.getAttachmentList();
  },
  methods: {
    // 生成住院号
    generateHospitalNo() {
      // 模拟生成住院号:D + 时间戳后6位
    // 生成捐献者编号
    generateDonorNo() {
      const timestamp = Date.now().toString();
      this.form.hospitalNo = "D" + timestamp.slice(-6);
      this.form.donorno = "DONOR" + timestamp.slice(-8);
    },
    // 获取详情
    getDetail(id) {
      getDeathJudgmentDetail(id).then(response => {
        if (response.code === 200) {
          this.form = response.data;
    async getDetail(id) {
      try {
        const response = await queryDathInfoBaseInfo({ infoid: id });
        let realData = {};
        if (response && response.data) {
          realData = response.data[0];
        } else if (response) {
          realData = response;
        }
      });
        // 映射字段到表单
        this.form = {
          ...this.form,
          ...realData,
          // 确保数值类型字段正确转换
          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("数据加载失败");
      }
    },
    // 解析附件数据
    parseAttachmentData(attachmentJson) {
      try {
        if (attachmentJson) {
          const attachments = JSON.parse(attachmentJson);
          if (Array.isArray(attachments)) {
            this.attachmentList = attachments;
          }
        }
      } catch (error) {
        console.error("解析附件数据失败:", error);
      }
    },
    // 构建附件JSON数据
    buildAttachmentJson() {
      return JSON.stringify(this.attachmentList);
    },
    // 获取状态标签样式
    getStatusTag(status) {
      const statusMap = {
        "0": "warning", // 维护中
        "1": "success", // 已完成
        "99": "danger" // 已终止
      };
      return statusMap[status] || "info";
    },
    // 获取状态文本
    getStatusText(status) {
      const textMap = {
        "0": "维护中",
        "1": "已完成",
        "99": "已终止"
      };
      return textMap[status] || "未知状态";
    },
    // 获取附件列表
    getAttachmentList() {
      this.attachmentLoading = true;
      // 模拟附件数据 - 实际项目中从接口获取
      // 实际项目中从接口获取附件数据
      setTimeout(() => {
        this.attachmentList = [
          {
            id: 1,
            type: "1",
            typeName: "脑死亡判定表",
            fileName: "脑死亡判定表_202512001.pdf",
            fileSize: 2548321,
            uploadTime: "2025-12-01 10:30:00",
            uploader: "张医生",
            fileUrl: "/attachments/brain_death_1.pdf"
          },
          {
            id: 2,
            type: "2",
            typeName: "脑电图评估表",
            fileName: "脑电图评估表_202512001.docx",
            fileSize: 512345,
            uploadTime: "2025-12-01 14:20:00",
            uploader: "李医生",
            fileUrl: "/attachments/eeg_1.docx"
          }
        ];
        this.attachmentLoading = false;
      }, 500);
    },
@@ -413,7 +560,6 @@
      const maxSize = 10 * 1024 * 1024; // 10MB
      // 校验文件类型
      const isTypeOk =
        allowedTypes.includes(file.type) ||
        file.name.endsWith(".pdf") ||
@@ -432,7 +578,6 @@
        return false;
      }
      // 校验文件大小
      if (file.size > maxSize) {
        this.$message.error("文件大小不能超过10MB");
        return false;
@@ -448,17 +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(),
@@ -468,21 +607,60 @@
            fileSize: file.size,
            uploadTime: new Date().toISOString(),
            uploader: "当前用户",
            fileUrl: URL.createObjectURL(file.raw)
            fileUrl: file.url
          };
          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;
        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) {
@@ -497,6 +675,8 @@
          );
          if (index !== -1) {
            this.attachmentList.splice(index, 1);
            // 更新附件JSON数据到表单
            this.form.rememberannex = this.buildAttachmentJson();
            this.$message.success("评估表删除成功");
          }
        })
@@ -521,38 +701,48 @@
    },
    // 下载附件
    handleDownload(attachment) {
      // 实际项目中调用下载接口
      const link = document.createElement("a");
      link.href = attachment.fileUrl;
      link.download = attachment.fileName;
      link.click();
      this.$message.success(`开始下载: ${attachment.fileName}`);
    },
    // 编辑信息
    handleEdit() {
      this.isEdit = true;
    },
    // 保存信息
    handleSave() {
      this.$refs.form.validate(valid => {
    async handleSave() {
      this.$refs.form.validate(async valid => {
        if (valid) {
          this.saveLoading = true;
          // 模拟保存过程
          updateDeathJudgment(this.form)
            .then(response => {
          try {
            // 构建提交数据
            const submitData = {
              ...this.form,
              // 确保附件数据最新
              rememberannex: this.buildAttachmentJson()
            };
            const response = await deathinfoedit(submitData);
              if (response.code === 200) {
                this.$message.success("保存成功");
              this.isEdit = false;
                if (this.$route.path.includes("/add")) {
                  this.$router.push("/case/deathJudgment");
              }
                } else {
                  this.isEdit = false;
              this.$message.error(response.message || "保存失败");
                }
              }
            })
            .catch(error => {
          } catch (error) {
              console.error("保存失败:", error);
              this.$message.error("保存失败");
            })
            .finally(() => {
          } finally {
              this.saveLoading = false;
            });
          }
        }
      });
    },