已修改17个文件
已添加2个文件
5232 ■■■■ 文件已修改
src/components/CaseBasicInfo/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/assessInfoComponents/OrganAssessmentForm.vue 138 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/OrganUtilization/OrganUtilizationInfo.vue 243 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/affirm/index.vue 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/allocation/index.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/appear/caseDetail.vue 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/appear/index copy.vue 1801 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/appear/index.vue 495 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/assess/assessInfo.vue 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/assess/index.vue 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/decide/DecideInfo copy.vue 816 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/decide/DecideInfo.vue 958 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/decide/index.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/ethicalReview/index.vue 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/maintain/index.vue 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/transfer/index.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donatebaseinfo/EditCaseModal.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donatebaseinfo/index.vue 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/CaseBasicInfo/index.vue
@@ -13,9 +13,9 @@
    </div>
    <el-descriptions v-if="basicData" :column="column" border>
      <!-- 1. æ¡ˆä¾‹ç¼–号 -->
      <el-descriptions-item label="案例编号">
        {{ basicData.caseNo || "--" }}
      <!-- 1. ä½é™¢å· -->
      <el-descriptions-item label="住院号">
        {{ basicData.inpatientno || "--" }}
      </el-descriptions-item>
      <!-- 2. æ½œåœ¨æçŒ®è€…姓名 -->
@@ -59,7 +59,7 @@
      <!-- 7. æ‰€åœ¨åŒ»ç–—机构 -->
      <el-descriptions-item label="所在医疗机构">
        {{ basicData.treatmenthospitalname || basicData.hospitalName || "--" }}
        {{ basicData.currentMedicalInstitution || "--" }}
      </el-descriptions-item>
      <!-- 8. åè°ƒå‘˜ -->
@@ -273,6 +273,8 @@
        sex: apiData.sex,
        age: apiData.age,
        ageunit: apiData.ageunit,
        inpatientno: apiData.inpatientno,
        currentMedicalInstitution: apiData.currentMedicalInstitution,
        workflow: apiData.workflow,
        bloodType: apiData.bloodType || apiData.bloodtype,
        idcardno: apiData.idcardno || apiData.idCardNo,
src/components/assessInfoComponents/OrganAssessmentForm.vue
@@ -1,6 +1,20 @@
<template>
  <div class="organ-assessment-form">
    <el-form :model="formData" label-width="120px">
      <!-- æ·»åŠ è¯„ä¼°æ—¶é—´å­—æ®µ -->
      <el-form-item label="评估时间">
        <el-date-picker
          v-model="formData.assessmentTime"
          type="datetime"
          placeholder="选择评估时间"
          format="yyyy-MM-dd HH:mm:ss"
          value-format="yyyy-MM-dd HH:mm:ss"
          :default-value="new Date()"
          style="width: 100%"
        />
      </el-form-item>
      <!-- åªè¯»æ¨¡å¼ä¸‹æ˜¾ç¤ºè¯„ä¼°æ—¶é—´ -->
      <el-form-item label="功能状态">
        <el-select v-model="formData.functionStatus">
          <el-option label="正常" value="1" />
@@ -77,7 +91,7 @@
              </el-table-column>
              <el-table-column label="上传时间" width="160">
                <template slot-scope="scope">
                  <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
                  <span>{{ scope.row.uploadTime }}</span>
                </template>
              </el-table-column>
              <el-table-column label="文件大小" width="100">
@@ -179,6 +193,7 @@
      formData: {
        functionStatus: "",
        assessmentOpinion: "",
        assessmentTime: "", // æ–°å¢žè¯„估时间字段
        attachments: []
      },
      // é¢„览相关
@@ -215,6 +230,14 @@
  },
  created() {
    this.initData();
    // å¦‚果评估时间为空,设置默认值
    if (!this.formData.assessmentTime) {
      this.$set(
        this.formData,
        "assessmentTime",
        this.getDefaultAssessmentTime()
      );
    }
  },
  methods: {
    // åˆå§‹åŒ–数据
@@ -223,6 +246,7 @@
        this.formData = {
          functionStatus: "",
          assessmentOpinion: "",
          assessmentTime: this.getDefaultAssessmentTime(),
          attachments: []
        };
        this.attachmentFileList = [];
@@ -241,14 +265,26 @@
        ) {
          this.currentAssessment = assessData[this.assessmentIndex];
          // æ·±æ‹·è´æ•°æ®ï¼Œé¿å…ä¿®æ”¹åŽŸå§‹æ•°æ®
          // æ·±æ‹·è´æ•°æ®
          const assessmentCopy = JSON.parse(
            JSON.stringify(this.currentAssessment)
          );
          // å¤„理评估时间
          let assessmentTime = assessmentCopy.assessmentTime;
          // å¦‚果时间不是有效的日期字符串,使用默认值
          if (!this.isValidDate(assessmentTime)) {
            assessmentTime = this.getDefaultAssessmentTime();
          } else {
            // ç¡®ä¿æ—¶é—´æ ¼å¼æ­£ç¡®
            assessmentTime = this.formatDateForPicker(assessmentTime);
          }
          this.formData = {
            functionStatus: assessmentCopy.functionStatus || "",
            assessmentOpinion: assessmentCopy.assessmentOpinion || "",
            assessmentTime: assessmentTime, // å¤„理后的时间
            attachments: Array.isArray(assessmentCopy.attachments)
              ? [...assessmentCopy.attachments]
              : []
@@ -272,17 +308,64 @@
        this.resetForm();
      }
    },
    // éªŒè¯æ—¥æœŸæ˜¯å¦æœ‰æ•ˆ
    isValidDate(dateString) {
      if (!dateString) return false;
      try {
        const date = new Date(dateString);
        return !isNaN(date.getTime()) && dateString.trim() !== "";
      } catch (error) {
        return false;
      }
    },
    // ä¸ºæ—¥æœŸé€‰æ‹©å™¨æ ¼å¼åŒ–日期
    formatDateForPicker(dateString) {
      if (!dateString) return "";
      try {
        const date = new Date(dateString);
        if (isNaN(date.getTime())) {
          return this.getDefaultAssessmentTime();
        }
        // æ ¼å¼åŒ–为 yyyy-MM-dd HH:mm:ss
        const year = date.getFullYear();
        const month = String(date.getMonth() + 1).padStart(2, "0");
        const day = String(date.getDate()).padStart(2, "0");
        const hours = String(date.getHours()).padStart(2, "0");
        const minutes = String(date.getMinutes()).padStart(2, "0");
        const seconds = String(date.getSeconds()).padStart(2, "0");
        return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
      } catch (error) {
        console.error("日期格式化错误:", error);
        return this.getDefaultAssessmentTime();
      }
    },
    // é‡ç½®è¡¨å•
    resetForm() {
      this.formData = {
        functionStatus: "",
        assessmentOpinion: "",
        assessmentTime: this.getDefaultAssessmentTime(), // è®¾ç½®é»˜è®¤æ—¶é—´
        attachments: []
      };
      this.attachmentFileList = [];
    },
    // èŽ·å–é»˜è®¤è¯„ä¼°æ—¶é—´
    getDefaultAssessmentTime() {
      const now = new Date();
      const year = now.getFullYear();
      const month = String(now.getMonth() + 1).padStart(2, "0");
      const day = String(now.getDate()).padStart(2, "0");
      const hours = String(now.getHours()).padStart(2, "0");
      const minutes = String(now.getMinutes()).padStart(2, "0");
      const seconds = String(now.getSeconds()).padStart(2, "0");
      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
    },
    // ä¿å­˜è¯„ä¼°
    handleSave() {
      // éªŒè¯å¿…要字段
@@ -296,20 +379,31 @@
        return;
      }
      if (!this.formData.assessmentTime) {
        this.$message.warning("请选择评估时间");
        return;
      }
      // éªŒè¯æ—¶é—´æ ¼å¼
      if (!this.isValidDate(this.formData.assessmentTime)) {
        this.$message.warning("评估时间格式不正确,请重新选择");
        return;
      }
      // å‡†å¤‡ä¿å­˜çš„æ•°æ®
      const saveData = {
        functionStatus: this.formData.functionStatus,
        assessmentOpinion: this.formData.assessmentOpinion,
        assessmentTime: this.formData.assessmentTime,
        attachments: Array.isArray(this.formData.attachments)
          ? [...this.formData.attachments]
          : []
      };
      // æ·»åŠ è¯„ä¼°è€…å’Œè¯„ä¼°æ—¶é—´
      // æ·»åŠ è¯„ä¼°è€…
      const assessmentData = {
        ...saveData,
        assessor: this.currentUser.name,
        assessmentTime: new Date().toISOString()
        assessor: this.currentUser.name
      };
      console.log("发送保存请求:", assessmentData);
@@ -320,7 +414,6 @@
        assessmentIndex: this.assessmentIndex
      });
    },
    handleCancel() {
      this.$emit("cancel");
    },
@@ -369,7 +462,7 @@
    /** ä¸Šä¼ æˆåŠŸå¤„ç† */
    handleUploadSuccess({ file, fileList, response }) {
      console.log(response,'response');
      console.log(response, "response");
      if (response.code === 200) {
        console.log(response, "上传数据");
@@ -509,26 +602,6 @@
      const sizes = ["B", "KB", "MB", "GB"];
      const i = Math.floor(Math.log(bytes) / Math.log(k));
      return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
    },
    /** æ—¥æœŸæ—¶é—´æ ¼å¼åŒ– */
    formatDateTime(dateTime) {
      if (!dateTime) return "";
      try {
        const date = new Date(dateTime);
        if (isNaN(date.getTime())) return dateTime;
        const year = date.getFullYear();
        const month = String(date.getMonth() + 1).padStart(2, "0");
        const day = String(date.getDate()).padStart(2, "0");
        const hours = String(date.getHours()).padStart(2, "0");
        const minutes = String(date.getMinutes()).padStart(2, "0");
        return `${year}-${month}-${day} ${hours}:${minutes}`;
      } catch (error) {
        return dateTime;
      }
    }
  }
};
@@ -581,7 +654,16 @@
  font-size: 13px;
  margin-left: 8px;
}
.readonly-time {
  font-size: 14px;
  color: #606266;
  font-weight: 500;
  padding: 8px 15px;
  background: #f5f7fa;
  border-radius: 4px;
  display: inline-block;
  min-width: 200px;
}
::v-deep .el-upload__tip {
  font-size: 12px;
  color: #909399;
src/views/business/OrganUtilization/OrganUtilizationInfo.vue
@@ -1,53 +1,28 @@
<template>
  <div class="organ-utilization-detail">
    <case-basic-info :case-id="caseId" :show-attachment="true" />
    <!-- åŸºæœ¬ä¿¡æ¯ -->
    <el-card class="detail-card">
      <div slot="header" class="clearfix">
        <span class="detail-title">器官利用基本信息</span>
        <div style="float: right;">
          <el-button type="primary" @click="handleSave" :loading="saveLoading">
            ä¿å­˜
          </el-button>
          <el-button
            type="success"
            @click="handleComplete"
            :loading="confirmLoading"
          >
            å®Œæˆåˆ©ç”¨
          </el-button>
        </div>
      </div>
      <el-form :model="form" ref="form" :rules="rules" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="6">
            <el-form-item align="left" label="遗体捐献" prop="isbodydonation">
              <el-radio-group v-model="form.isbodydonation">
                <el-radio
                  v-for="dict in dict.type.sys_0_1 || []"
                  :key="dict.value"
                  :label="dict.value"
                  >{{ dict.label }}</el-radio
                >
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="18">
            <el-form-item
              align="left"
              label="接收单位"
              prop="receivingunitname"
    <el-form :model="form" ref="form" :rules="rules" label-width="120px">
      <!-- åŸºæœ¬ä¿¡æ¯ -->
      <el-card class="detail-card">
        <div slot="header" class="clearfix">
          <span class="detail-title">器官利用基本信息</span>
          <div style="float: right;">
            <el-button
              type="primary"
              @click="handleSave"
              :loading="saveLoading"
            >
              <el-input
                v-model="form.receivingunitname"
                placeholder="请输入接收单位"
                :disabled="form.isbodydonation !== '1'"
              />
            </el-form-item>
          </el-col>
        </el-row>
              ä¿å­˜
            </el-button>
            <el-button
              type="success"
              @click="handleComplete"
              :loading="confirmLoading"
            >
              å®Œæˆåˆ©ç”¨
            </el-button>
          </div>
        </div>
        <el-row :gutter="20">
          <el-col :span="6">
@@ -103,15 +78,58 @@
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </el-card>
      </el-card>
      <el-card class="detail-card">
        <div slot="header" class="clearfix">
          <span class="detail-title">遗体捐献信息</span>
        </div>
         <el-row :gutter="20">
            <el-col :span="6">
              <el-form-item align="left" label="遗体捐献" prop="isbodydonation">
                <el-radio-group v-model="form.isbodydonation">
                  <el-radio
                    v-for="dict in dict.type.sys_0_1 || []"
                    :key="dict.value"
                    :label="dict.value"
                    >{{ dict.label }}</el-radio
                  >
                </el-radio-group>
              </el-form-item>
            </el-col>
            <el-col :span="18" v-if="form.isbodydonation==1">
              <el-form-item
                align="left"
                label="接收单位"
                prop="receivingunitname"
              >
                <el-input
                  v-model="form.receivingunitname"
                  placeholder="请输入接收单位"
                />
              </el-form-item>
            </el-col>
            <el-col :span="8" v-else>
              <el-form-item
                align="left"
                label="接收家属"
                prop="relationname"
              >
                <el-input
                  v-model="form.relationname"
                  placeholder="请输入接收家属"
                />
              </el-form-item>
            </el-col>
          </el-row>
      </el-card>
    </el-form>
    <!-- å™¨å®˜åˆ©ç”¨è®°å½•部分 - æ•´åˆå—者详情 -->
    <el-card class="utilization-card">
      <div slot="header" class="clearfix">
        <span class="detail-title">器官利用记录</span>
        <div style="float: right;">
        <dict-tag
          <dict-tag
            :options="dict.type.utilize_statue"
            :value="form.completeState"
          />
@@ -451,34 +469,6 @@
                    <el-input v-model="scope.row.name" placeholder="受者姓名" />
                  </template>
                </el-table-column>
                <el-table-column
                  label="操作"
                  align="center"
                  class-name="small-padding fixed-width"
                  v-if="form.completeState !== '3'"
                >
                  <template slot-scope="scope">
                    <el-button
                      size="mini"
                      type="text"
                      icon="el-icon-edit"
                      @click="handleEditUtilization(scope.row)"
                    >
                      ç¼–辑
                    </el-button>
                    <el-button
                      size="mini"
                      type="text"
                      icon="el-icon-delete"
                      style="color: #F56C6C;"
                      @click="handleRemoveOrgan(scope.$index)"
                      v-if="!scope.row.id"
                    >
                      åˆ é™¤
                    </el-button>
                  </template>
                </el-table-column>
              </el-table>
            </el-form-item>
          </el-col>
@@ -584,76 +574,6 @@
      </div>
    </el-card>
    <!-- ç¼–辑利用记录对话框 -->
    <el-dialog
      title="编辑器官利用记录"
      :visible.sync="editDialogVisible"
      width="600px"
    >
      <el-form :model="currentRecord" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="器官名称">
              <el-input v-model="currentRecord.organname" readonly />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="移植状态">
              <el-select
                v-model="currentRecord.transplantstate"
                style="width: 100%"
              >
                <el-option
                  v-for="dict in transplantStatusList"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item
          label="未移植原因"
          v-if="currentRecord.transplantstate === '0'"
        >
          <el-input
            type="textarea"
            :rows="3"
            v-model="currentRecord.abandonreason"
            placeholder="请输入未移植原因"
          />
        </el-form-item>
        <el-form-item
          label="移植医院"
          v-if="currentRecord.transplantstate === '1'"
        >
          <el-select
            v-model="currentRecord.hospitalno"
            placeholder="请选择移植医院"
            style="width: 100%"
          >
            <el-option
              v-for="hospital in hospitalList"
              :key="hospital.hospitalNo"
              :label="hospital.hospitalName"
              :value="hospital.hospitalNo"
            />
          </el-select>
        </el-form-item>
        <el-form-item
          label="受者姓名"
          v-if="currentRecord.transplantstate === '1'"
        >
          <el-input v-model="currentRecord.name" placeholder="请输入受者姓名" />
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="editDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleEditConfirm">确认</el-button>
      </div>
    </el-dialog>
    <!-- æ–‡ä»¶é¢„览对话框 -->
    <FilePreviewDialog
      :visible="filePreviewVisible"
@@ -682,7 +602,7 @@
    FilePreviewDialog,
    CaseBasicInfo
  },
  dicts: ["sys_BloodType", "sys_Organ", "sys_0_1",'utilize_statue'],
  dicts: ["sys_BloodType", "sys_Organ", "sys_0_1", "utilize_statue"],
  data() {
    return {
      caseId: null,
@@ -1093,31 +1013,6 @@
    // è¡Œå±•开事件
    handleExpandChange(row, expandedRows) {
      this.expandedRows = expandedRows.map(item => item.organno);
    },
    // ç¼–辑利用记录
    handleEditUtilization(row) {
      const index = this.utilizationData.serviceDonatecomporganList.findIndex(
        item => item.organno === row.organno
      );
      if (index !== -1) {
        this.currentRecord = { ...row };
        this.currentEditIndex = index;
        this.editDialogVisible = true;
      }
    },
    // ç¡®è®¤ç¼–辑
    handleEditConfirm() {
      if (this.currentEditIndex !== -1) {
        this.utilizationData.serviceDonatecomporganList[
          this.currentEditIndex
        ] = {
          ...this.currentRecord
        };
        this.$message.success("利用记录更新成功");
        this.editDialogVisible = false;
      }
    },
    // åˆ é™¤å™¨å®˜è®°å½•
@@ -1854,6 +1749,7 @@
  .recipient-form {
    padding: 15px;
  }
  .attachment-header {
    flex-wrap: wrap;
  }
@@ -1863,6 +1759,7 @@
    margin-top: 8px;
    margin-left: 0;
  }
  .form-section {
    margin-bottom: 20px;
    padding-bottom: 15px;
src/views/business/affirm/index.vue
@@ -8,7 +8,7 @@
        :inline="true"
        label-width="100px"
      >
        <el-form-item label="捐献者姓名" prop="donorName">
        <el-form-item label="姓名" prop="donorName">
          <el-input
            v-model="queryParams.donorName"
            placeholder="请输入捐献者姓名"
@@ -17,19 +17,10 @@
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="所在医疗机构" prop="hospitalName">
        <el-form-item label="上报医院" prop="hospitalName">
          <el-input
            v-model="queryParams.hospitalName"
            placeholder="请输入医疗机构"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="业务人员" prop="assignee">
          <el-input
            v-model="queryParams.assignee"
            placeholder="请输入业务人员"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
@@ -56,6 +47,15 @@
            end-placeholder="结束日期"
            value-format="yyyy-MM-dd"
            style="width: 240px"
          />
        </el-form-item>
        <el-form-item label="协调员" prop="assignee">
          <el-input
            v-model="queryParams.assignee"
            placeholder="请输入协调员"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item>
@@ -112,13 +112,13 @@
      >
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column
          label="住院号"
          label="案例编号"
          align="center"
          prop="inpatientno"
          width="120"
        />
        <el-table-column
          label="潜在捐献者姓名"
          label="姓名"
          align="center"
          prop="name"
          width="120"
@@ -139,13 +139,6 @@
          min-width="180"
          show-overflow-tooltip
        />
        <el-table-column
          label="所在医疗机构"
          align="center"
          prop="treatmenthospitalname"
          width="150"
          show-overflow-tooltip
        />
        <!-- <el-table-column
          label="确认状态"
          align="center"
@@ -158,14 +151,6 @@
            </el-tag>
          </template>
        </el-table-column> -->
        <el-table-column
          label="家属意见"
          align="center"
          prop="relativeRemark"
          width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="确认时间"
          align="center"
@@ -180,11 +165,13 @@
            }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="业务人员"
          label="家属意见"
          align="center"
          prop="responsibleusername"
          width="100"
          prop="relativeRemark"
          width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="协调员1"
@@ -199,6 +186,19 @@
          width="100"
        />
        <el-table-column
          label="上报医院"
          align="center"
          prop="treatmenthospitalname"
          width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="上报人员"
          align="center"
          prop="responsibleusername"
          width="100"
        />
        <el-table-column
          label="操作"
          align="center"
          width="120"
src/views/business/allocation/index.vue
@@ -17,7 +17,7 @@
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="捐献者姓名" prop="name">
        <el-form-item label="姓名" prop="name">
          <el-input
            v-model="queryParams.name"
            placeholder="请输入捐献者姓名"
@@ -26,6 +26,7 @@
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="案例编号" prop="caseNo">
          <el-input
            v-model="queryParams.caseNo"
@@ -35,6 +36,7 @@
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="分配状态" prop="allocationStatus">
          <el-select
            v-model="queryParams.allocationStatus"
@@ -109,34 +111,23 @@
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55" align="center" />
<<<<<<< HEAD
        <!--
        <el-table-column
=======
        <!-- <el-table-column
>>>>>>> 059398ad3ad81ea49dfb75ac09f268bc0b0f6145
          label="案例编号"
          align="center"
          prop="caseNo"
          width="120"
        /> -->
        <el-table-column label="姓名" align="center" prop="name" width="100" />
        <el-table-column
          label="住院号"
          align="center"
          prop="inpatientno"
          width="120"
<<<<<<< HEAD
        />
        <el-table-column label="性别" align="center" prop="sex" width="80">
          <template slot-scope="scope">
            <dict-tag
              :options="dict.type.sys_user_sex"
              :value="scope.row.sex"
            />
          </template>
        </el-table-column>
        <el-table-column label="年龄" align="center" prop="age" width="80" />
        <el-table-column
          label="血型"
          label="捐献者编号"
          align="center"
          prop="bloodtype"
          width="80"
          prop="donorno"
          width="120"
        />
        <el-table-column
          label="证件号码"
@@ -145,12 +136,12 @@
          width="180"
        />
        <el-table-column
          label="疾病诊断"
          label="血型"
          align="center"
          prop="diagnosisname"
          min-width="180"
          show-overflow-tooltip
          prop="bloodtype"
          width="80"
        />
        <el-table-column
          label="医疗机构"
          align="center"
@@ -158,6 +149,35 @@
          min-width="150"
          show-overflow-tooltip
        />
        -->
=======
        /> -->
        <el-table-column label="姓名" align="center" prop="name" width="100" />
>>>>>>> 059398ad3ad81ea49dfb75ac09f268bc0b0f6145
        <el-table-column
          label="住院号"
          align="center"
          prop="inpatientno"
          width="120"
        />
        <el-table-column label="姓名" align="center" prop="name" width="100" />
        <el-table-column label="性别" align="center" prop="sex" width="80">
          <template slot-scope="scope">
            <dict-tag
              :options="dict.type.sys_user_sex"
              :value="scope.row.sex"
            />
          </template>
        </el-table-column>
        <el-table-column label="年龄" align="center" prop="age" width="80" />
        <el-table-column
          label="疾病诊断"
          align="center"
          prop="diagnosisname"
          min-width="180"
          show-overflow-tooltip
        />
        <el-table-column
          label="分配状态"
          align="center"
src/views/business/appear/caseDetail.vue
@@ -132,7 +132,6 @@
        <!-- <el-descriptions-item label="部门编号">{{
          caseData.deptNo || "-"
        }}</el-descriptions-item> -->
      </el-descriptions>
    </el-card>
@@ -142,7 +141,7 @@
        <span class="section-title">上报信息</span>
      </div>
      <el-descriptions :column="2" border>
         <el-descriptions-item label="上报医院">{{
        <el-descriptions-item label="上报医院">{{
          caseData.toHospital || "-"
        }}</el-descriptions-item>
        <el-descriptions-item label="报告者姓名">{{
@@ -295,6 +294,15 @@
            {{ caseData.reportStatus === "3" ? "已同意" : "已驳回" }}
          </el-tag>
        </el-descriptions-item>
        <el-descriptions-item
          label="驳回原因"
          v-if="caseData.reportStatus == 4"
        >
          <dict-tag
            :options="dict.type.reject_type"
            :value="caseData.rejectType"
          />
        </el-descriptions-item>
        <el-descriptions-item label="审批人">{{
          caseData.updateBy || "-"
        }}</el-descriptions-item>
@@ -302,7 +310,7 @@
          formatDateTime(caseData.updateTime)
        }}</el-descriptions-item>
        <el-descriptions-item label="审批意见">{{
          caseData.remark || "无"
          caseData.confirmResult || "无"
        }}</el-descriptions-item>
      </el-descriptions>
    </el-card>
@@ -424,7 +432,7 @@
      default: true
    }
  },
  dicts: ["sys_user_sex", "sys_BloodType",'sys_Infectious'],
  dicts: ["sys_user_sex", "sys_BloodType", "sys_Infectious", "reject_type"],
  data() {
    return {
      // é¢„览相关
@@ -432,7 +440,14 @@
      currentPreviewFile: null,
      // å›¾ç‰‡é¢„览相关
      imagePreviewUrls: []
      imagePreviewUrls: [],
      rejectOptions: [
        { label: "好转", value: "1" },
        { label: "死亡", value: "2" },
        { label: "不符合捐献标准", value: "3" },
        { label: "家属放弃捐献", value: "4" },
        { label: "其他", value: "5" }
      ]
    };
  },
  computed: {
@@ -523,8 +538,9 @@
    /** åˆ›å»ºè½¬è¿å• */
    handleCreateTransport() {
      this.$router.push({
        path: "/business/transport/create",
        path: "/report/transfer",
        query: {
          autoCreate: "true",
          caseId: this.caseData.id,
          caseNo: this.caseData.caseNo,
          patName: this.caseData.name,
src/views/business/appear/index copy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1801 @@
<template>
  <div class="app-container">
    <!-- æœç´¢ç­›é€‰åŒºåŸŸ -->
    <el-card class="filter-card">
      <el-form
        :model="queryParams"
        ref="queryForm"
        :inline="true"
        class="demo-form-inline"
      >
        <el-form-item label="姓名" prop="name">
          <el-input
            v-model="queryParams.name"
            placeholder="请输入患者姓名"
            clearable
            style="width: 200px"
          />
        </el-form-item>
        <el-form-item label="上报医院" prop="caseNo">
          <el-input
            v-model="queryParams.caseNo"
            placeholder="请输入上报案例编号"
            clearable
            style="width: 200px"
          />
        </el-form-item>
        <el-form-item label="上报状态" prop="reportStatus">
          <el-select
            v-model="queryParams.reportStatus"
            placeholder="请选择状态"
            clearable
            style="width: 200px"
          >
            <el-option label="全部" value="" />
            <el-option label="已阅读" value="2" />
            <el-option label="已同意" value="3" />
            <el-option label="已驳回" value="4" />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" icon="el-icon-search" @click="handleQuery"
            >搜索</el-button
          >
          <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
        </el-form-item>
      </el-form>
    </el-card>
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <el-row :gutter="10" class="mb8">
      <!-- <el-col :span="1.5">
        <el-button type="primary" plain icon="el-icon-plus" @click="handleAdd"
          >新增案例</el-button
        >
      </el-col> -->
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="el-icon-delete"
          :disabled="multiple"
          @click="handleDelete"
          >删除</el-button
        >
      </el-col>
    </el-row>
    <!-- æ•°æ®è¡¨æ ¼ -->
    <!-- æ•°æ®è¡¨æ ¼ -->
    <el-table
      v-loading="loading"
      :data="caseList"
      @selection-change="handleSelectionChange"
    >
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column
        label="编号"
        align="center"
        prop="caseNo"
        width="150"
        fixed
      />
      <el-table-column
        label="姓名"
        align="center"
        prop="name"
        width="100"
        fixed
      />
      <el-table-column
        label="上报状态"
        align="center"
        prop="reportStatus"
        width="100"
      >
        <template #default="scope">
          <el-tag :type="scope.row.reportStatus | statusFilter">
            {{ scope.row.reportStatus | statusTextFilter }}
          </el-tag>
        </template>
      </el-table-column>
      <el-table-column label="转运" align="center" width="100">
        <template #default="scope">
          <el-tag :type="getTransportStatusTag(scope.row)">
            {{ getTransportStatusText(scope.row) }}
          </el-tag>
        </template>
      </el-table-column>
      <el-table-column label="性别" align="center" prop="sex" width="80">
        <template #default="scope">
          <dict-tag :options="dict.type.sys_user_sex" :value="scope.row.sex" />
        </template>
      </el-table-column>
      <el-table-column label="年龄" align="center" prop="age" width="80" />
      <el-table-column label="血型" align="center" prop="bloodType" width="80">
        <template #default="scope">
          <dict-tag
            :options="dict.type.sys_BloodType"
            :value="scope.row.bloodType"
          />
        </template>
      </el-table-column>
      <el-table-column
        label="疾病诊断"
        align="center"
        prop="diagnosisname"
        min-width="200"
        show-overflow-tooltip
      />
      <el-table-column
        label="GCS评分"
        align="center"
        prop="gcsScore"
        width="80"
        show-overflow-tooltip
      />
      <el-table-column
        label="上报医院"
        align="center"
        prop="treatmenthospitalname"
        width="150"
      />
      <el-table-column
        label="上报时间"
        align="center"
        prop="reporttime"
        width="160"
      />
      <el-table-column label="操作" align="center" fixed="right" width="300">
        <template #default="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-view"
            @click="handleDetail(scope.row)"
            >详情</el-button
          >
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleEdit(scope.row)"
            v-if="
              scope.row.reportStatus !== '3' &&
                scope.row.reportStatus !== '4' &&
                scope.row.delFlag === 0
            "
            >编辑</el-button
          >
          <el-button
            size="mini"
            type="text"
            icon="el-icon-check"
            @click="handleApprove(scope.row)"
            v-if="scope.row.reportStatus === '2' && scope.row.delFlag === 0"
            >确认</el-button
          >
          <el-button
            size="mini"
            type="text"
            icon="el-icon-truck"
            :type="getTransportStatustype(scope.row)"
            @click="handleTransport(scope.row)"
            v-if="shouldShowTransportButton(scope.row)"
            :disabled="!canGoToTransport(scope.row)"
          >
            {{ getTransportButtonText(scope.row) }}
          </el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- åˆ†é¡µ -->
    <pagination
      v-show="total > 0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- æ¡ˆä¾‹è¯¦æƒ…弹框 -->
    <el-dialog
      :title="detailTitle"
      :visible.sync="detailOpen"
      width="900px"
      append-to-body
      :close-on-click-modal="false"
    >
      <case-detail :caseData="currentCase" @close="detailOpen = false" />
    </el-dialog>
    <!-- ç¡®è®¤å¼¹æ¡† -->
    <el-dialog
      title="案例确认"
      :visible.sync="approveOpen"
      width="80vw"
      append-to-body
      class="approve-dialog"
    >
      <el-container style="height: 800px;">
        <!-- å·¦ä¾§ï¼šæ¡ˆä¾‹è¯¦æƒ… -->
        <el-aside
          width="50vw"
          style="background: #f8f9fa; padding: 20px; overflow-y: auto;"
        >
          <div class="approve-detail-preview">
            <h3 style="margin-bottom: 15px; color: #303133;">案例详情预览</h3>
            <case-detail :caseData="currentCase" :showtitle="false" />
          </div>
        </el-aside>
        <!-- å³ä¾§ï¼šç¡®è®¤è¡¨å• -->
        <el-main style="padding: 20px;">
          <el-form
            ref="approveForm"
            :model="approveForm"
            :rules="approveRules"
            label-width="100px"
          >
            <el-form-item label="确认结果" prop="approveResult">
              <el-radio-group v-model="approveForm.approveResult">
                <el-radio label="3">同意</el-radio>
                <el-radio label="4">驳回</el-radio>
              </el-radio-group>
            </el-form-item>
            <el-form-item label="确认意见" prop="approveOpinion">
              <el-input
                type="textarea"
                v-model="approveForm.approveOpinion"
                placeholder="请输入详细的确认意见,包括通过或驳回的理由"
                :rows="6"
                maxlength="500"
                show-word-limit
              />
            </el-form-item>
          </el-form>
        </el-main>
      </el-container>
      <div slot="footer" class="dialog-footer">
        <el-button @click="approveOpen = false">取消</el-button>
        <el-button type="primary" @click="submitApprove">确定</el-button>
      </div>
    </el-dialog>
    <!-- æ–°å¢ž/编辑案例弹框 -->
    <el-dialog
      :title="`${isEditing ? '编辑' : '新增'}案例`"
      :visible.sync="editOpen"
      width="68%"
      append-to-body
      :close-on-click-modal="false"
      @close="handleEditClose"
    >
      <el-form
        ref="editForm"
        :model="editForm"
        :rules="editRules"
        label-width="120px"
      >
        <!-- åŸºæœ¬ä¿¡æ¯ -->
        <el-card class="form-section" shadow="never">
          <div slot="header" class="section-header">
            <i
              class="el-icon-user"
              style="color: #409EFF; margin-right: 8px;"
            ></i>
            <span>基本信息</span>
          </div>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="案例编号" prop="caseNo">
                <el-input
                  v-model="editForm.caseNo"
                  placeholder="请输入案例编号"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="患者姓名" prop="name">
                <el-input
                  v-model="editForm.name"
                  placeholder="请输入患者姓名"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="性别" prop="sex">
                <el-select
                  v-model="editForm.sex"
                  placeholder="请选择性别"
                  style="width: 100%"
                >
                  <el-option label="男" value="0" />
                  <el-option label="女" value="1" />
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="年龄" prop="age">
                <el-input-number
                  v-model="editForm.age"
                  :min="0"
                  :max="120"
                  placeholder="请输入年龄"
                  style="width: 100%"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="年龄单位" prop="ageunit">
                <el-select
                  v-model="editForm.ageunit"
                  placeholder="请选择年龄单位"
                  style="width: 100%"
                >
                  <el-option label="岁" value="year" />
                  <el-option label="月" value="month" />
                  <el-option label="天" value="day" />
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="血型" prop="bloodType">
                <el-select
                  v-model="editForm.bloodType"
                  placeholder="请选择血型"
                  style="width: 100%"
                >
                  <el-option label="A型" :value="1" />
                  <el-option label="B型" :value="2" />
                  <el-option label="O型" :value="3" />
                  <el-option label="AB型" :value="4" />
                </el-select>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="Rh阴性" prop="rhYin">
                <el-radio-group v-model="editForm.rhYin">
                  <el-radio label="0">否</el-radio>
                  <el-radio label="1">是</el-radio>
                </el-radio-group>
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="出生日期" prop="birthday">
                <el-date-picker
                  v-model="editForm.birthday"
                  type="date"
                  placeholder="选择出生日期"
                  value-format="yyyy-MM-dd"
                  style="width: 100%"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="证件类型" prop="idcardtype">
                <el-select
                  v-model="editForm.idcardtype"
                  placeholder="请选择证件类型"
                  style="width: 100%"
                >
                  <el-option
                    v-for="item in dict.type.sys_IDType"
                    :label="item.label"
                    :value="item.value"
                  />
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="证件号码" prop="idcardno">
                <el-input
                  v-model="editForm.idcardno"
                  placeholder="请输入证件号码"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="民族" prop="nation">
                <el-input v-model="editForm.nation" placeholder="请输入民族" />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="国籍" prop="nationality">
                <el-input
                  v-model="editForm.nationality"
                  placeholder="请输入国籍"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="籍贯" prop="nativeplace">
                <el-input
                  v-model="editForm.nativeplace"
                  placeholder="请输入籍贯"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="学历" prop="education">
                <el-input
                  v-model="editForm.education"
                  placeholder="请输入学历"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="职业" prop="occupation">
                <el-input
                  v-model="editForm.occupation"
                  placeholder="请输入职业"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="联系电话" prop="phone">
                <el-input
                  v-model="editForm.phone"
                  placeholder="请输入联系电话"
                />
              </el-form-item>
            </el-col>
          </el-row>
        </el-card>
        <!-- åœ°å€ä¿¡æ¯ -->
        <el-card class="form-section" shadow="never">
          <div slot="header" class="section-header">
            <i
              class="el-icon-location-information"
              style="color: #67C23A; margin-right: 8px;"
            ></i>
            <span>地址信息</span>
          </div>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="户籍地址省">
                <el-input
                  v-model="editForm.registerprovincename"
                  placeholder="请输入户籍地址省"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="户籍地址市">
                <el-input
                  v-model="editForm.registercityname"
                  placeholder="请输入户籍地址市"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="户籍街道">
                <el-input
                  v-model="editForm.registertownname"
                  placeholder="请输入户籍街道"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="户籍社区">
                <el-input
                  v-model="editForm.registercommunityname"
                  placeholder="请输入户籍社区"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-form-item label="户籍详细地址" prop="registeraddress">
            <el-input
              v-model="editForm.registeraddress"
              type="textarea"
              :rows="2"
              placeholder="请输入详细的户籍地址"
            />
          </el-form-item>
          <el-divider>现住地址</el-divider>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="现住地址省">
                <el-input
                  v-model="editForm.residenceprovincename"
                  placeholder="请输入现住地址省"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="现住地址市/区">
                <el-input
                  v-model="editForm.residencecountyname"
                  placeholder="请输入现住地址市/区"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="现住地址街道">
                <el-input
                  v-model="editForm.residencetownname"
                  placeholder="请输入现住地址街道"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="现住地址社区">
                <el-input
                  v-model="editForm.residencecommunityname"
                  placeholder="请输入现住地址社区"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-form-item label="现住详细地址" prop="residenceaddress">
            <el-input
              v-model="editForm.residenceaddress"
              type="textarea"
              :rows="2"
              placeholder="请输入详细的现住地址"
            />
          </el-form-item>
        </el-card>
        <!-- åŒ»ç–—信息 -->
        <el-card class="form-section" shadow="never">
          <div slot="header" class="section-header">
            <i
              class="el-icon-first-aid-kit"
              style="color: #E6A23C; margin-right: 8px;"
            ></i>
            <span>医疗信息</span>
          </div>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="疾病诊断" prop="diagnosisname">
                <el-input
                  v-model="editForm.diagnosisname"
                  placeholder="请输入疾病诊断名称"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="GCS评分" prop="gcsScore">
                <el-input
                  v-model="editForm.gcsScore"
                  placeholder="请输入GCS评分"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-form-item label="病情概况" prop="illnessoverview">
            <el-input
              v-model="editForm.illnessoverview"
              type="textarea"
              :rows="3"
              placeholder="请输入病情概况"
              maxlength="500"
              show-word-limit
            />
          </el-form-item>
          <el-form-item label="病人状况" prop="patientstate">
            <el-input
              v-model="editForm.patientstate"
              type="textarea"
              :rows="2"
              placeholder="请输入病人状况"
              maxlength="200"
              show-word-limit
            />
          </el-form-item>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="传染病情况" prop="infectious">
                <el-checkbox-group v-model="editForm.infectious">
                  <el-checkbox
                    v-for="item in dict.type.sys_Infectious"
                    :label="item.value"
                    :value="item.value"
                    >{{ item.label }}</el-checkbox
                  >
                </el-checkbox-group>
                <!-- <el-input
                  v-model="editForm.infectious"
                  placeholder="请输入传染病情况"
                /> -->
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="传染病其他说明">
                <el-input
                  v-model="editForm.infectiousOther"
                  placeholder="请输入传染病其他说明"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-form-item label="是否需要转运" prop="isTransport">
            <el-radio-group v-model="editForm.isTransport">
              <el-radio label="1">不需要</el-radio>
              <el-radio label="2">需要</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-card>
        <!-- åŒ»é™¢ä¿¡æ¯ -->
        <el-card class="form-section" shadow="never">
          <div slot="header" class="section-header">
            <i
              class="el-icon-office-building"
              style="color: #909399; margin-right: 8px;"
            ></i>
            <span>医院信息</span>
          </div>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="治疗医院" prop="treatmenthospitalname">
                <el-input
                  v-model="editForm.treatmenthospitalname"
                  placeholder="请输入治疗医院名称"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="治疗科室" prop="treatmentdeptname">
                <el-input
                  v-model="editForm.treatmentdeptname"
                  placeholder="请输入治疗科室名称"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="住院号" prop="inpatientno">
                <el-input
                  v-model="editForm.inpatientno"
                  placeholder="请输入住院号"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="部门名称" prop="deptName">
                <el-input
                  v-model="editForm.deptName"
                  placeholder="请输入部门名称"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="部门编号" prop="deptNo">
                <el-input
                  v-model="editForm.deptNo"
                  placeholder="请输入部门编号"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="上报医院" prop="toHospital">
                <el-input
                  v-model="editForm.toHospital"
                  placeholder="请输入上报的医院"
                />
              </el-form-item>
            </el-col>
          </el-row>
        </el-card>
        <!-- ä¸ŠæŠ¥ä¿¡æ¯ -->
        <el-card class="form-section" shadow="never">
          <div slot="header" class="section-header">
            <i
              class="el-icon-s-data"
              style="color: #F56C6C; margin-right: 8px;"
            ></i>
            <span>上报信息</span>
          </div>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="报告者姓名" prop="infoName">
                <el-input
                  v-model="editForm.infoName"
                  placeholder="请输入报告者姓名"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="报告者电话" prop="reporterphone">
                <el-input
                  v-model="editForm.phone"
                  placeholder="请输入报告者联系电话"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="协调员姓名" prop="coordinatorName">
                <el-input
                  v-model="editForm.coordinatorName"
                  placeholder="请输入协调员姓名"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="协调员编号" prop="coordinatorNo">
                <el-input
                  v-model="editForm.coordinatorNo"
                  placeholder="请输入协调员编号"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-form-item label="上报状态" prop="reportStatus">
            <el-select
              v-model="editForm.reportStatus"
              placeholder="请选择上报状态"
              style="width: 100%"
              :disabled="isEditing"
            >
              <el-option label="已上报" value="1" />
              <el-option label="已阅读" value="2" />
              <el-option label="已同意" value="3" />
              <el-option label="已驳回" value="4" />
            </el-select>
          </el-form-item>
        </el-card>
        <!-- é™„件信息 -->
        <el-card class="form-section" shadow="never">
          <div slot="header" class="section-header">
            <i
              class="el-icon-folder"
              style="color: #409EFF; margin-right: 8px;"
            ></i>
            <span>附件信息</span>
          </div>
          <div class="attachment-section">
            <div class="attachment-header">
              <i class="el-icon-paperclip"></i>
              <span class="attachment-title">附件上传</span>
              <span class="attachment-tip"
                >支持上传病历、检验报告等文件 (最多{{
                  attachmentLimit
                }}个)</span
              >
            </div>
            <!-- ä½¿ç”¨ UploadAttachment ç»„ä»¶ -->
            <UploadAttachment
              ref="uploadAttachment"
              :file-list="attachmentFileList"
              :limit="attachmentLimit"
              :accept="attachmentAccept"
              @change="handleAttachmentChange"
              @upload-success="handleUploadSuccess"
              @upload-error="handleUploadError"
              @remove="handleAttachmentRemove"
            />
          </div>
          <!-- é™„件列表 -->
          <div
            class="attachment-list"
            v-if="editForm.annexfilesList && editForm.annexfilesList.length > 0"
          >
            <div class="list-title">
              å·²ä¸Šä¼ é™„ä»¶ ({{ editForm.annexfilesList.length }})
            </div>
            <el-table
              :data="editForm.annexfilesList"
              style="width: 100%"
              size="small"
              border
            >
              <el-table-column label="文件名" min-width="200">
                <template #default="scope">
                  <i
                    class="el-icon-document"
                    style="margin-right: 8px; color: #409EFF;"
                  ></i>
                  <span class="file-name">{{ scope.row.fileName }}</span>
                </template>
              </el-table-column>
              <el-table-column label="文件类型" width="100">
                <template #default="scope">
                  <el-tag size="small">{{
                    getFileType(scope.row.fileName)
                  }}</el-tag>
                </template>
              </el-table-column>
              <el-table-column label="创建时间" width="160">
                <template #default="scope">
                  <span>{{ formatDateTime(scope.row.createTime) }}</span>
                </template>
              </el-table-column>
              <el-table-column
                label="备注"
                min-width="150"
                show-overflow-tooltip
              >
                <template #default="scope">
                  <span>{{ scope.row.remart || "无" }}</span>
                </template>
              </el-table-column>
              <el-table-column label="操作" width="200" fixed="right">
                <template #default="scope">
                  <el-button
                    size="mini"
                    type="primary"
                    @click="handlePreview(scope.row)"
                  >
                    é¢„览
                  </el-button>
                  <el-button
                    size="mini"
                    type="danger"
                    @click="handleRemoveAttachment(scope.$index)"
                  >
                    åˆ é™¤
                  </el-button>
                </template>
              </el-table-column>
            </el-table>
          </div>
        </el-card>
        <!-- å¤‡æ³¨ä¿¡æ¯ -->
        <el-card class="form-section" shadow="never">
          <div slot="header" class="section-header">
            <i
              class="el-icon-edit"
              style="color: #67C23A; margin-right: 8px;"
            ></i>
            <span>备注信息</span>
          </div>
          <el-form-item prop="remark">
            <el-input
              v-model="editForm.remark"
              type="textarea"
              :rows="4"
              placeholder="请输入备注信息"
              maxlength="500"
              show-word-limit
            />
          </el-form-item>
        </el-card>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="handleEditClose">取消</el-button>
        <el-button type="primary" :loading="saveLoading" @click="handleSave"
          >保存</el-button
        >
      </div>
    </el-dialog>
    <!-- æ–‡ä»¶é¢„览弹窗 -->
    <FilePreviewDialog
      :visible="previewVisible"
      :file="currentPreviewFile"
      @close="previewVisible = false"
      @download="handleDownload"
    />
  </div>
</template>
<script>
import CaseDetail from "./caseDetail";
import UploadAttachment from "@/components/UploadAttachment";
import FilePreviewDialog from "@/components/FilePreviewDialog";
import {
  donateList,
  donateInfo,
  donateDel,
  donateEdit,
  donateAdd
} from "@/api/businessApi/index";
import dayjs from "dayjs";
export default {
  name: "CaseList",
  components: {
    CaseDetail,
    UploadAttachment,
    FilePreviewDialog
  },
  dicts: ["sys_user_sex", "sys_BloodType", "sys_Infectious", "sys_IDType"],
  data() {
    return {
      // é®ç½©å±‚
      loading: false,
      saveLoading: false,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ€»æ¡æ•°
      total: 0,
      // æ¡ˆä¾‹è¡¨æ ¼æ•°æ®
      caseList: [],
      // è¯¦æƒ…弹框是否显示
      detailOpen: false,
      // ç¡®è®¤å¼¹æ¡†æ˜¯å¦æ˜¾ç¤º
      approveOpen: false,
      // ç¼–辑弹框是否显示
      editOpen: false,
      // ç¼–辑状态
      isEditing: false,
      // è¯¦æƒ…弹框标题
      detailTitle: "",
      // å½“前操作的案例
      currentCase: {},
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        caseNo: undefined,
        name: undefined,
        reportStatus: undefined
      },
      // ç¡®è®¤è¡¨å•
      approveForm: {
        id: null,
        approveResult: "3",
        approveOpinion: ""
      },
      // ç¡®è®¤è¡¨å•验证
      approveRules: {
        approveResult: [
          { required: true, message: "请选择确认结果", trigger: "change" }
        ],
        approveOpinion: [
          { required: true, message: "请输入确认意见", trigger: "blur" }
        ]
      },
      // ç¼–辑表单
      editForm: this.getDefaultFormData(),
      // è¡¨å•验证规则
      editRules: {
        caseNo: [
          { required: true, message: "请输入案例编号", trigger: "blur" }
        ],
        name: [{ required: true, message: "请输入患者姓名", trigger: "blur" }],
        sex: [{ required: true, message: "请选择性别", trigger: "change" }],
        age: [{ required: true, message: "请输入年龄", trigger: "blur" }],
        diagnosisname: [
          { required: true, message: "请输入疾病诊断", trigger: "blur" }
        ],
        treatmenthospitalname: [
          { required: true, message: "请输入治疗医院", trigger: "blur" }
        ],
        reportStatus: [
          { required: true, message: "请选择上报状态", trigger: "change" }
        ]
      },
      // é™„件相关配置
      attachmentLimit: 10,
      attachmentAccept: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx",
      attachmentFileList: [],
      // é¢„览相关
      previewVisible: false,
      currentPreviewFile: null
    };
  },
  filters: {
    statusFilter(reportStatus) {
      const statusMap = {
        "1": "info", // å·²ä¸ŠæŠ¥
        "2": "warning", // å·²é˜…读(待确认)
        "3": "success", // å·²åŒæ„
        "4": "danger" // å·²é©³å›ž
      };
      return statusMap[reportStatus] || "info";
    },
    statusTextFilter(reportStatus) {
      const statusMap = {
        "1": "已上报",
        "2": "已阅读",
        "3": "已同意",
        "4": "已驳回"
      };
      return statusMap[reportStatus] || "未知状态";
    }
  },
  created() {
    this.getList();
  },
  methods: {
    /** æŸ¥è¯¢æ¡ˆä¾‹åˆ—表 */
    async getList() {
      this.loading = true;
      try {
        const response = await donateList(this.queryParams);
        this.caseList = response.rows || response.data || [];
        this.total = response.total || this.caseList.length;
      } catch (error) {
        console.error("获取案例列表失败:", error);
        this.$modal.msgError("获取案例列表失败");
        this.caseList = [];
        this.total = 0;
      } finally {
        this.loading = false;
      }
    },
    // è½¬è¿------------------
    /** åˆ¤æ–­æ˜¯å¦éœ€è¦æ˜¾ç¤ºè½¬è¿æŒ‰é’® */
    shouldShowTransportButton(row) {
      // åªæœ‰å·²åŒæ„çš„æ¡ˆä¾‹æ‰èƒ½è¿›è¡Œè½¬è¿æ“ä½œ
      // return row.reportStatus == "3" && row.delFlag == 0;
      return row.reportStatus != "4";
    },
    /** åˆ¤æ–­æ˜¯å¦å¯ä»¥è·³è½¬åˆ°è½¬è¿å• */
    canGoToTransport(row) {
      // éœ€è¦è½¬è¿ï¼ˆisTransport === "2")且没有转运信息(serviceTransport不存在或为空数组)
      return row.isTransport == "2" && row.serviceTransport;
    },
    /** èŽ·å–è½¬è¿æŒ‰é’®æ–‡æœ¬ */
    getTransportButtonText(row) {
      if (row.isTransport == "2") {
        if (
          row.serviceTransport &&
          Array.isArray(row.serviceTransport) &&
          row.serviceTransport.length > 0
        ) {
          return "查看转运单";
        } else {
          return "创建转运单";
        }
      }
      return "无需转运";
    },
    getTransportStatustype(row) {
      if (row.isTransport == "1") {
        return "info"; // ä¸éœ€è¦è½¬è¿
      }
      if (
        row.serviceTransport &&
        Array.isArray(row.serviceTransport) &&
        row.serviceTransport.length > 0
      ) {
        // æ ¹æ®è½¬è¿å•状态显示不同颜色
        const transport = row.serviceTransport[0];
        if (transport.transitStatus) {
          return "primary"; // æœ‰è½¬è¿ä¿¡æ¯ä½†æ— çŠ¶æ€
        }
        return "primary"; // æœ‰è½¬è¿ä¿¡æ¯ä½†æ— çŠ¶æ€
      }
      return "success"; // éœ€è¦è½¬è¿ä½†æ— è½¬è¿ä¿¡æ¯
    },
    /** èŽ·å–è½¬è¿çŠ¶æ€æ ‡ç­¾æ ·å¼ */
    getTransportStatusTag(row) {
      if (row.isTransport === "1") {
        return "info"; // ä¸éœ€è¦è½¬è¿
      }
      if (
        row.serviceTransport &&
        Array.isArray(row.serviceTransport) &&
        row.serviceTransport.length > 0
      ) {
        // æ ¹æ®è½¬è¿å•状态显示不同颜色
        const transport = row.serviceTransport[0];
        if (transport.transitStatus) {
          switch (transport.transitStatus.toString()) {
            case "1":
              return "warning"; // å¾…转运
            case "2":
              return "primary"; // è½¬è¿ä¸­
            case "3":
              return "success"; // è½¬è¿å®Œæˆ
            case "4":
              return "danger"; // è½¬è¿å–消
            case "5":
              return "info"; // æš‚å­˜
            default:
              return "info";
          }
        }
        return "primary"; // æœ‰è½¬è¿ä¿¡æ¯ä½†æ— çŠ¶æ€
      }
      return "success"; // éœ€è¦è½¬è¿ä½†æ— è½¬è¿ä¿¡æ¯
    },
    /** èŽ·å–è½¬è¿çŠ¶æ€æ–‡æœ¬ */
    getTransportStatusText(row) {
      if (row.isTransport === "1") {
        return "无需转运";
      }
      if (
        row.serviceTransport &&
        Array.isArray(row.serviceTransport) &&
        row.serviceTransport.length > 0
      ) {
        const transport = row.serviceTransport[0];
        if (transport.transitStatus) {
          switch (transport.transitStatus.toString()) {
            case "1":
              return "待转运";
            case "2":
              return "转运中";
            case "3":
              return "转运完成";
            case "4":
              return "转运取消";
            case "5":
              return "暂存";
            default:
              return "有转运单";
          }
        }
        return "有转运单";
      }
      return "需转运";
    },
    /** å¤„理转运操作 */
    async handleTransport(row) {
      try {
        // å…ˆèŽ·å–æœ€æ–°çš„æ¡ˆä¾‹ä¿¡æ¯
        const caseData = row;
        if (caseData.isTransport == "2") {
          if (
            caseData.serviceTransport &&
            Array.isArray(caseData.serviceTransport) &&
            caseData.serviceTransport.length > 0
          ) {
            // å·²æœ‰è½¬è¿å•,跳转到转运单详情页
            const transport = caseData.serviceTransport[0];
            this.goToTransportDetail(transport.id, row.name);
          } else {
            // æ²¡æœ‰è½¬è¿å•,跳转到创建转运单页面
            this.goToCreateTransport(row);
          }
        } else {
          this.$message.warning("该案例不需要转运");
        }
      } catch (error) {
        console.error("获取案例信息失败:", error);
        this.$message.error("获取案例信息失败");
      }
    },
    /** è·³è½¬åˆ°åˆ›å»ºè½¬è¿å•页面 */
    goToCreateTransport(caseData) {
      // æ–¹å¼1:在新页面打开
      this.$router.push({
        path: "/report/transfer",
        query: {
          autoCreate: "true", //跳转转运标识
          caseId: caseData.id,
          caseNo: caseData.caseNo,
          patName: caseData.name,
          age: caseData.age,
          sex: caseData.sex,
          diagnosisname: caseData.diagnosisname,
          treatmentHospitalName: caseData.treatmenthospitalname
        }
      });
    },
    /** æ‰“开转运单弹框 */
    openTransportDialog(caseData) {
      this.$modal.confirm({
        title: "创建转运单",
        message: `您将创建案例【${caseData.caseNo} - ${caseData.name}】的转运单,是否继续?`,
        confirmButtonText: "前往创建",
        cancelButtonText: "取消",
        type: "warning",
        beforeClose: (action, instance, done) => {
          if (action === "confirm") {
            // è·³è½¬åˆ°è½¬è¿å•创建页面
            this.$router.push({
              path: "/report/transfer",
              query: {
                caseId: caseData.id,
                caseNo: caseData.caseNo,
                patName: caseData.name,
                age: caseData.age,
                sex: caseData.sex,
                diagnosisname: caseData.diagnosisname,
                treatmentHospitalName: caseData.treatmenthospitalname
              }
            });
            done();
          } else {
            done();
          }
        }
      });
    },
    /** è·³è½¬åˆ°è½¬è¿å•详情页 */
    goToTransportDetail(transportId, name) {
      this.$router.push({
        path: "/report/transfer",
        query: {
          autoCreate: "true",
          patName: name
        }
      });
    },
    // ---------------------------------end
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.id);
      this.single = selection.length !== 1;
      this.multiple = !selection.length;
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.queryParams = {
        pageNum: 1,
        pageSize: 10,
        caseNo: undefined,
        name: undefined,
        reportStatus: undefined
      };
      this.getList();
    },
    /** è¯¦æƒ…按钮操作 */
    async handleDetail(row) {
      try {
        this.currentCase = row;
        // å¦‚果状态是"已上报"(1),则更新为"已阅读"(2)
        if (this.currentCase.reportStatus === "1") {
          try {
            const updateData = {
              ...this.currentCase,
              reportStatus: "2",
              updateTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
              updateBy: this.$store.state.user?.name || "当前用户"
            };
            await donateEdit(updateData);
            this.currentCase.reportStatus = "2";
            this.currentCase.updateTime = updateData.updateTime;
            row.reportStatus = "2";
            this.$modal.msgSuccess("状态已更新为已阅读");
          } catch (updateError) {
            console.error("状态更新失败:", updateError);
          }
        }
        this.detailTitle = `案例详情 - ${this.currentCase.caseNo ||
          row.caseNo}`;
        this.detailOpen = true;
        console.log(this.currentCase, "this.currentCase");
      } catch (error) {
        console.error("获取案例详情失败:", error);
        this.currentCase = row;
        this.detailTitle = `案例详情 - ${row.caseNo}`;
        this.detailOpen = true;
      }
    },
    /** ç¼–辑按钮操作 */
    async handleEdit(row) {
      try {
        const response = await donateInfo(row.id);
        if (response.code === 200 || response.data) {
          this.isEditing = true;
          const data = response.data || response;
          // å¤„理附件
          if (data.annexfilesList) {
            this.attachmentFileList = this.parseAttachmentToFileList(
              data.annexfilesList
            );
          } else {
            this.attachmentFileList = [];
          }
          this.currentCase = data;
          this.editForm = { ...data };
          this.editForm.idcardtype = this.editForm.idcardtype.toString();
          console.log(this.editForm.idcardtype);
          this.editForm.infectious = this.editForm.infectious
            .split(",")
            .filter(item => item.trim() !== "");
          this.editOpen = true;
          this.$nextTick(() => {
            this.$refs.editForm && this.$refs.editForm.clearValidate();
          });
        } else {
          this.$message.error(response.msg || "获取记录失败");
        }
      } catch (error) {
        console.error("获取记录失败:", error);
        this.$modal.msgError("获取记录失败");
      }
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.isEditing = false;
      this.editForm = this.getDefaultFormData();
      this.attachmentFileList = [];
      this.editOpen = true;
      this.$nextTick(() => {
        this.$refs.editForm && this.$refs.editForm.clearValidate();
      });
    },
    /** ç¡®è®¤æŒ‰é’®æ“ä½œ */
    async handleApprove(row) {
      try {
        const response = await donateInfo(row.id);
        this.currentCase = response.data || response || row;
        this.approveForm.id = row.id;
        this.approveForm.approveResult = "3";
        this.approveForm.approveOpinion = "";
        this.$nextTick(() => {
          if (this.$refs.approveForm) {
            this.$refs.approveForm.clearValidate();
          }
        });
        this.approveOpen = true;
      } catch (error) {
        console.error("获取案例详情失败:", error);
        this.currentCase = row;
        this.approveForm.id = row.id;
        this.approveForm.approveResult = "3";
        this.approveForm.approveOpinion = "";
        this.approveOpen = true;
        this.$modal.msgError("获取详情失败,但已打开确认窗口");
      }
    },
    /** æäº¤ç¡®è®¤ */
    async submitApprove() {
      try {
        const valid = await this.$refs.approveForm.validate();
        if (valid) {
          const approveData = {
            ...this.currentCase,
            reportStatus: this.approveForm.approveResult,
            remark: this.approveForm.approveOpinion,
            approvername: this.$store.state.user?.name || "当前用户",
            approvetime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
            updateTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
            updateBy: this.$store.state.user?.name || "当前用户"
          };
          await donateEdit(approveData);
          this.$modal.msgSuccess("确认成功");
          this.approveOpen = false;
          this.getList();
        }
      } catch (error) {
        console.error("确认失败:", error);
        if (error !== "cancel") {
          this.$modal.msgError("确认失败");
        }
      }
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    async handleDelete(row) {
      const ids = row.id || this.ids;
      try {
        await this.$modal.confirm(
          '是否确认删除案例编号为"' + ids + '"的数据项?'
        );
        await donateDel(ids);
        this.$modal.msgSuccess("删除成功");
        this.getList();
      } catch (error) {
        if (error !== "cancel") {
          console.error("删除失败:", error);
          this.$modal.msgError("删除失败");
        }
      }
    },
    /** èŽ·å–é»˜è®¤è¡¨å•æ•°æ® */
    getDefaultFormData() {
      return {
        id: undefined,
        caseNo: undefined,
        name: undefined,
        sex: undefined,
        age: undefined,
        ageunit: "year",
        bloodType: undefined,
        rhYin: "0",
        birthday: undefined,
        idcardtype: "1",
        idcardno: undefined,
        nation: undefined,
        nationality: undefined,
        nativeplace: undefined,
        education: undefined,
        occupation: undefined,
        phone: undefined,
        // æˆ·ç±åœ°å€
        registerprovincename: undefined,
        registercityname: undefined,
        registertownname: undefined,
        registercommunityname: undefined,
        registeraddress: undefined,
        // çŽ°ä½åœ°å€
        residenceprovincename: undefined,
        residencecountyname: undefined,
        residencetownname: undefined,
        residencecommunityname: undefined,
        residenceaddress: undefined,
        // åŒ»ç–—信息
        diagnosisname: undefined,
        illnessoverview: undefined,
        patientstate: undefined,
        gcsScore: undefined,
        infectious: undefined,
        infectiousOther: undefined,
        isTransport: "1",
        // åŒ»é™¢ä¿¡æ¯
        treatmenthospitalname: undefined,
        treatmentdeptname: undefined,
        inpatientno: undefined,
        deptName: undefined,
        deptNo: undefined,
        toHospital: undefined,
        // ä¸ŠæŠ¥ä¿¡æ¯
        infoName: undefined,
        infoNo: undefined,
        reporterphone: undefined,
        coordinatorName: undefined,
        coordinatorNo: undefined,
        terminationCase: "0",
        reportStatus: "1", // é»˜è®¤å·²ä¸ŠæŠ¥
        // é™„ä»¶
        annexfilesList: [],
        // å…¶ä»–
        remark: undefined,
        createBy: undefined,
        createTime: undefined,
        updateBy: undefined,
        updateTime: undefined,
        delFlag: 0
      };
    },
    /** é™„件转换 */
    parseAttachmentToFileList(attachments) {
      if (!attachments || !Array.isArray(attachments)) return [];
      return attachments.map((item, index) => ({
        uid: item.id || `attachment-${index}-${Date.now()}`,
        name: item.fileName,
        url: item.path || item.fileUrl,
        status: "success",
        raw: item
      }));
    },
    /** é™„件变化处理 */
    handleAttachmentChange(fileList) {
      this.attachmentFileList = fileList;
    },
    /** é™„件上传成功处理 */
    handleUploadSuccess({ file, fileList, response }) {
      if (response && response.code === 200) {
        if (!this.editForm.annexfilesList) {
          this.editForm.annexfilesList = [];
        }
        const attachmentObj = {
          fileName: file.name,
          path: response.data || file.url,
          fileUrl: response.data || file.url,
          type: this.getFileExtension(file.name),
          createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
          remart: file.raw?.remart || "",
          caseNo: this.editForm.caseNo
        };
        this.editForm.annexfilesList.push(attachmentObj);
        this.$message.success("文件上传成功");
      }
    },
    /** é™„件上传错误处理 */
    handleUploadError({ file, fileList, error }) {
      console.error("附件上传失败:", error);
      this.$message.error("文件上传失败,请重试");
    },
    /** é™„件移除处理 */
    handleAttachmentRemove(file) {
      if (file.url && this.editForm.annexfilesList) {
        const index = this.editForm.annexfilesList.findIndex(
          item => item.path === file.url || item.fileUrl === file.url
        );
        if (index > -1) {
          this.editForm.annexfilesList.splice(index, 1);
        }
      }
    },
    /** æ‰‹åŠ¨åˆ é™¤é™„ä»¶ */
    handleRemoveAttachment(index) {
      this.editForm.annexfilesList.splice(index, 1);
      this.attachmentFileList.splice(index, 1);
      this.$message.success("附件删除成功");
    },
    /** æ–‡ä»¶é¢„览 */
    handlePreview(file) {
      this.currentPreviewFile = {
        fileName: file.fileName,
        fileUrl: file.path || file.fileUrl,
        fileType: this.getFileType(file.fileName)
      };
      this.previewVisible = true;
    },
    /** æ–‡ä»¶ä¸‹è½½ */
    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("文件路径不存在,无法下载");
      }
    },
    /** èŽ·å–æ–‡ä»¶ç±»åž‹ */
    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"];
      if (imageTypes.includes(extension)) return "image";
      if (pdfTypes.includes(extension)) return "pdf";
      if (officeTypes.includes(extension)) return "office";
      return "other";
    },
    /** èŽ·å–æ–‡ä»¶æ‰©å±•å */
    getFileExtension(filename) {
      if (!filename) return "";
      return filename
        .split(".")
        .pop()
        .toLowerCase();
    },
    /** æ—¥æœŸæ—¶é—´æ ¼å¼åŒ– */
    formatDateTime(dateTime) {
      if (!dateTime) return "";
      return dayjs(dateTime).format("YYYY-MM-DD HH:mm:ss");
    },
    /** å…³é—­ç¼–辑对话框 */
    handleEditClose() {
      this.editOpen = false;
      this.currentCase = {};
      this.editForm = this.getDefaultFormData();
      this.attachmentFileList = [];
      this.$nextTick(() => {
        this.$refs.editForm && this.$refs.editForm.clearValidate();
      });
    },
    /** ä¿å­˜è¡¨å• */
    async handleSave() {
      try {
        const valid = await this.$refs.editForm.validate();
        if (!valid) return;
        const pendingFiles = this.attachmentFileList.filter(
          item => item.status !== "success"
        );
        if (pendingFiles.length > 0) {
          this.$message.warning(
            "还有文件未上传完成,请先上传所有文件或移除未上传的文件"
          );
          return;
        }
        this.saveLoading = true;
        const requestData = { ...this.editForm };
        requestData.infectious = requestData.infectious.join(",");
        let response;
        if (this.isEditing) {
          response = await donateEdit(requestData);
        } else {
          // æ–°å¢žæ—¶è®¾ç½®åˆ›å»ºä¿¡æ¯
          requestData.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
          requestData.createBy = this.$store.state.user?.name || "当前用户";
          response = await donateAdd(requestData);
        }
        if (response.code === 200) {
          this.$message.success(this.isEditing ? "修改成功" : "新增成功");
          this.handleEditClose();
          this.getList();
        } else {
          this.$message.error(response.msg || "操作失败");
        }
      } catch (error) {
        console.error("保存失败:", error);
        this.$message.error("操作失败,请稍后重试");
      } finally {
        this.saveLoading = false;
      }
    }
  }
};
</script>
<style scoped>
.app-container {
  padding: 20px;
}
.filter-card {
  margin-bottom: 20px;
}
.mb8 {
  margin-bottom: 8px;
}
/* è¡¨å•区域样式 */
.form-section {
  margin-bottom: 16px;
}
.section-header {
  display: flex;
  align-items: center;
  font-weight: bold;
  color: #303133;
}
.dialog-footer {
  text-align: right;
  padding: 20px 0 0;
}
/* é™„件样式 */
.attachment-section {
  margin-bottom: 16px;
}
.attachment-header {
  display: flex;
  align-items: center;
  margin-bottom: 16px;
  padding: 8px 0;
  border-bottom: 1px solid #ebeef5;
}
.attachment-title {
  font-weight: bold;
  margin: 0 8px;
}
.attachment-tip {
  font-size: 12px;
  color: #909399;
}
.attachment-list {
  margin-top: 16px;
}
.list-title {
  font-weight: bold;
  margin-bottom: 12px;
  color: #303133;
}
.file-name {
  font-size: 13px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* ç¡®è®¤å¼¹æ¡†æ ·å¼ */
.approve-dialog >>> .el-dialog__body {
  padding: 0;
}
.approve-detail-preview {
  height: 100%;
}
/* å“åº”式设计 */
@media (max-width: 1200px) {
  .approve-dialog {
    width: 95% !important;
  }
  .el-aside {
    width: 50% !important;
  }
}
</style>
src/views/business/appear/index.vue
@@ -8,15 +8,7 @@
        :inline="true"
        class="demo-form-inline"
      >
        <el-form-item label="案例编号" prop="caseNo">
          <el-input
            v-model="queryParams.caseNo"
            placeholder="请输入案例编号"
            clearable
            style="width: 200px"
          />
        </el-form-item>
        <el-form-item label="患者姓名" prop="name">
        <el-form-item label="姓名" prop="name">
          <el-input
            v-model="queryParams.name"
            placeholder="请输入患者姓名"
@@ -24,7 +16,15 @@
            style="width: 200px"
          />
        </el-form-item>
        <el-form-item label="案例状态" prop="reportStatus">
        <el-form-item label="上报医院" prop="caseNo">
          <el-input
            v-model="queryParams.caseNo"
            placeholder="请输入上报案例编号"
            clearable
            style="width: 200px"
          />
        </el-form-item>
        <el-form-item label="上报状态" prop="reportStatus">
          <el-select
            v-model="queryParams.reportStatus"
            placeholder="请选择状态"
@@ -48,12 +48,6 @@
    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
    <el-row :gutter="10" class="mb8">
      <!-- <el-col :span="1.5">
        <el-button type="primary" plain icon="el-icon-plus" @click="handleAdd"
          >新增案例</el-button
        >
      </el-col> -->
      <el-col :span="1.5">
        <el-button
          type="danger"
@@ -67,28 +61,29 @@
    </el-row>
    <!-- æ•°æ®è¡¨æ ¼ -->
    <!-- æ•°æ®è¡¨æ ¼ -->
    <el-table
      v-loading="loading"
      :data="caseList"
      @selection-change="handleSelectionChange"
    >
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column
        label="案例编号"
        label="编号"
        align="center"
        prop="caseNo"
        width="150"
        fixed
      />
      <el-table-column
        label="上报时间"
        label="姓名"
        align="center"
        prop="reporttime"
        width="160"
        prop="name"
        width="100"
        fixed
      />
      <el-table-column
        label="状态"
        label="上报状态"
        align="center"
        prop="reportStatus"
        width="100"
@@ -99,19 +94,13 @@
          </el-tag>
        </template>
      </el-table-column>
      <el-table-column label="转运状态" align="center" width="100">
      <el-table-column label="转运" align="center" width="100">
        <template #default="scope">
          <el-tag :type="getTransportStatusTag(scope.row)">
            {{ getTransportStatusText(scope.row) }}
          </el-tag>
        </template>
      </el-table-column>
      <el-table-column
        label="患者姓名"
        align="center"
        prop="name"
        width="100"
      />
      <el-table-column label="性别" align="center" prop="sex" width="80">
        <template #default="scope">
          <dict-tag :options="dict.type.sys_user_sex" :value="scope.row.sex" />
@@ -127,13 +116,6 @@
        </template>
      </el-table-column>
      <el-table-column
        label="GCS评分"
        align="center"
        prop="gcsScore"
        width="80"
        show-overflow-tooltip
      />
      <el-table-column
        label="疾病诊断"
        align="center"
        prop="diagnosisname"
@@ -141,13 +123,25 @@
        show-overflow-tooltip
      />
      <el-table-column
        label="治疗医院"
        label="GCS评分"
        align="center"
        prop="gcsScore"
        width="80"
        show-overflow-tooltip
      />
      <el-table-column
        label="上报医院"
        align="center"
        prop="treatmenthospitalname"
        width="150"
      />
      <el-table-column label="操作" align="center" fixed="right" width="350">
      <el-table-column
        label="上报时间"
        align="center"
        prop="reporttime"
        width="160"
      />
      <el-table-column label="操作" align="center" fixed="right" width="300">
        <template #default="scope">
          <el-button
            size="mini"
@@ -164,7 +158,7 @@
            v-if="
              scope.row.reportStatus !== '3' &&
                scope.row.reportStatus !== '4' &&
                scope.row.delFlag === 0
                scope.row.delFlag == 0
            "
            >编辑</el-button
          >
@@ -173,20 +167,28 @@
            type="text"
            icon="el-icon-check"
            @click="handleApprove(scope.row)"
            v-if="scope.row.reportStatus === '2' && scope.row.delFlag === 0"
            v-if="scope.row.reportStatus == '2' && scope.row.delFlag == 0"
            >确认</el-button
          >
          <!-- ç§»é™¤è½¬è¿æŒ‰é’® -->
          <el-button
            v-if="scope.row.serviceTransport.length"
            size="mini"
            type="text"
            icon="el-icon-truck"
            :type="getTransportStatustype(scope.row)"
            @click="handleTransport(scope.row)"
            v-if="shouldShowTransportButton(scope.row)"
            :disabled="!canGoToTransport(scope.row)"
            type="primary"
            @click="goToTransportDetail(scope.row.name)"
            >查看转运单</el-button
          >
            {{ getTransportButtonText(scope.row) }}
          </el-button>
          <el-button
            v-if="
              scope.row.reportStatus == 3 &&
                !scope.row.serviceTransport.length &&
                scope.row.isTransport == 2
            "
            size="mini"
            type="success"
            @click="Createatransferorder(scope.row)"
            >创建转运单</el-button
          >
        </template>
      </el-table-column>
    </el-table>
@@ -219,20 +221,18 @@
      append-to-body
      class="approve-dialog"
    >
      <el-container style="height: 800px;">
      <!-- ä½¿ç”¨ div å¸ƒå±€æ›¿ä»£ el-container -->
      <div class="approve-dialog-content">
        <!-- å·¦ä¾§ï¼šæ¡ˆä¾‹è¯¦æƒ… -->
        <el-aside
          width="50vw"
          style="background: #f8f9fa; padding: 20px; overflow-y: auto;"
        >
        <div class="approve-detail-left">
          <div class="approve-detail-preview">
            <h3 style="margin-bottom: 15px; color: #303133;">案例详情预览</h3>
            <case-detail :caseData="currentCase" :showtitle="false" />
          </div>
        </el-aside>
        </div>
        <!-- å³ä¾§ï¼šç¡®è®¤è¡¨å• -->
        <el-main style="padding: 20px;">
        <div class="approve-form-right">
          <el-form
            ref="approveForm"
            :model="approveForm"
@@ -240,24 +240,69 @@
            label-width="100px"
          >
            <el-form-item label="确认结果" prop="approveResult">
              <el-radio-group v-model="approveForm.approveResult">
              <el-radio-group
                v-model="approveForm.approveResult"
                @change="handleApproveResultChange"
              >
                <el-radio label="3">同意</el-radio>
                <el-radio label="4">驳回</el-radio>
              </el-radio-group>
            </el-form-item>
            <el-form-item label="确认意见" prop="approveOpinion">
            <!-- å½“选择"同意"时显示转运选项 -->
            <el-form-item
              v-if="approveForm.approveResult == '3'"
              label="是否需要转运"
              prop="isTransport"
            >
              <el-radio-group v-model="approveForm.isTransport">
                <el-radio label="1">不需要</el-radio>
                <el-radio label="2">需要</el-radio>
              </el-radio-group>
            </el-form-item>
            <!-- å½“选择"驳回"时显示驳回原因 -->
            <div v-if="approveForm.approveResult == '4'">
              <el-form-item label="驳回原因" prop="rejectType">
                <el-radio-group v-model="approveForm.rejectType">
                  <el-radio label="1">好转</el-radio>
                  <el-radio label="2">死亡</el-radio>
                  <el-radio label="3">不符合捐献标准</el-radio>
                  <el-radio label="4">家属放弃捐献</el-radio>
                  <el-radio label="5">其他</el-radio>
                </el-radio-group>
              </el-form-item>
              <el-form-item label="驳回意见" prop="confirmResult">
                <el-input
                  type="textarea"
                  v-model="approveForm.confirmResult"
                  placeholder="请输入详细的驳回意见"
                  :rows="6"
                  maxlength="500"
                  show-word-limit
                />
              </el-form-item>
            </div>
            <!-- å½“选择"同意"时显示确认意见 -->
            <el-form-item
              v-if="approveForm.approveResult == '3'"
              label="确认意见"
              prop="confirmResult"
            >
              <el-input
                type="textarea"
                v-model="approveForm.approveOpinion"
                placeholder="请输入详细的确认意见,包括通过或驳回的理由"
                v-model="approveForm.confirmResult"
                placeholder="请输入确认意见"
                :rows="6"
                maxlength="500"
                show-word-limit
              />
            </el-form-item>
          </el-form>
        </el-main>
      </el-container>
        </div>
      </div>
      <div slot="footer" class="dialog-footer">
        <el-button @click="approveOpen = false">取消</el-button>
@@ -992,15 +1037,33 @@
      approveForm: {
        id: null,
        approveResult: "3",
        approveOpinion: ""
        confirmResult: "",
        rejectType: "", // é©³å›žåŽŸå› 
        isTransport: "1", // æ˜¯å¦éœ€è¦è½¬è¿
        createTransport: false, // æ˜¯å¦éœ€è¦åˆ›å»ºè½¬è¿å•
        isDonate: "0" // æ˜¯å¦æçŒ®ï¼Œ0-未捐献,1-已捐献
      },
      // ç¡®è®¤è¡¨å•验证
      approveRules: {
        approveResult: [
          { required: true, message: "请选择确认结果", trigger: "change" }
        ],
        approveOpinion: [
        confirmResult: [
          { required: true, message: "请输入确认意见", trigger: "blur" }
        ],
        rejectType: {
          required: false,
          validator: (rule, value, callback) => {
            if (this.approveForm.approveResult == "4" && !value) {
              callback(new Error("请选择驳回原因"));
            } else {
              callback();
            }
          },
          trigger: "change"
        },
        isTransport: [
          { required: true, message: "请选择是否需要转运", trigger: "change" }
        ]
      },
      // ç¼–辑表单
@@ -1072,56 +1135,31 @@
        this.loading = false;
      }
    },
    // è½¬è¿------------------
    /** åˆ¤æ–­æ˜¯å¦éœ€è¦æ˜¾ç¤ºè½¬è¿æŒ‰é’® */
    shouldShowTransportButton(row) {
      // åªæœ‰å·²åŒæ„çš„æ¡ˆä¾‹æ‰èƒ½è¿›è¡Œè½¬è¿æ“ä½œ
      // return row.reportStatus == "3" && row.delFlag == 0;
      return row.reportStatus != "4";
    /** ç¡®è®¤ç»“果变化处理 */
    handleApproveResultChange(value) {
      if (value == "3") {
        // é€‰æ‹©åŒæ„æ—¶ï¼Œé‡ç½®é©³å›žåŽŸå› 
        this.approveForm.rejectType = "";
        this.approveForm.isDonate = "0"; // é‡ç½®ä¸ºæœªæçŒ®
      } else if (value == "4") {
        // é€‰æ‹©é©³å›žæ—¶ï¼Œé‡ç½®è½¬è¿é€‰é¡¹
        this.approveForm.isTransport = "1";
        this.approveForm.createTransport = false;
      }
      // æ¸…除验证
      this.$nextTick(() => {
        if (this.$refs.approveForm) {
          this.$refs.approveForm.clearValidate();
        }
      });
    },
    /** åˆ¤æ–­æ˜¯å¦å¯ä»¥è·³è½¬åˆ°è½¬è¿å• */
    canGoToTransport(row) {
      // éœ€è¦è½¬è¿ï¼ˆisTransport === "2")且没有转运信息(serviceTransport不存在或为空数组)
      return row.isTransport == "2" && row.serviceTransport;
    },
    /** èŽ·å–è½¬è¿æŒ‰é’®æ–‡æœ¬ */
    getTransportButtonText(row) {
      if (row.isTransport == "2") {
        if (
          row.serviceTransport &&
          Array.isArray(row.serviceTransport) &&
          row.serviceTransport.length > 0
        ) {
          return "查看转运单";
        } else {
          return "创建转运单";
        }
      }
      return "无需转运";
    },
    getTransportStatustype(row) {
      if (row.isTransport == "1") {
        return "info"; // ä¸éœ€è¦è½¬è¿
      }
      if (
        row.serviceTransport &&
        Array.isArray(row.serviceTransport) &&
        row.serviceTransport.length > 0
      ) {
        // æ ¹æ®è½¬è¿å•状态显示不同颜色
        const transport = row.serviceTransport[0];
        if (transport.transitStatus) {
          return "primary"; // æœ‰è½¬è¿ä¿¡æ¯ä½†æ— çŠ¶æ€
        }
        return "primary"; // æœ‰è½¬è¿ä¿¡æ¯ä½†æ— çŠ¶æ€
      }
      return "success"; // éœ€è¦è½¬è¿ä½†æ— è½¬è¿ä¿¡æ¯
    },
    // è½¬è¿ç›¸å…³æ–¹æ³•
    /** èŽ·å–è½¬è¿çŠ¶æ€æ ‡ç­¾æ ·å¼ */
    getTransportStatusTag(row) {
      if (row.isTransport === "1") {
      if (row.isTransport == "1") {
        return "info"; // ä¸éœ€è¦è½¬è¿
      }
      if (
@@ -1154,7 +1192,7 @@
    /** èŽ·å–è½¬è¿çŠ¶æ€æ–‡æœ¬ */
    getTransportStatusText(row) {
      if (row.isTransport === "1") {
      if (row.isTransport == "1") {
        return "无需转运";
      }
      if (
@@ -1184,95 +1222,26 @@
      return "需转运";
    },
    /** å¤„理转运操作 */
    async handleTransport(row) {
      try {
        // å…ˆèŽ·å–æœ€æ–°çš„æ¡ˆä¾‹ä¿¡æ¯
        const caseData = row;
        if (caseData.isTransport == "2") {
          if (
            caseData.serviceTransport &&
            Array.isArray(caseData.serviceTransport) &&
            caseData.serviceTransport.length > 0
          ) {
            // å·²æœ‰è½¬è¿å•,跳转到转运单详情页
            const transport = caseData.serviceTransport[0];
            this.goToTransportDetail(transport.id, row.name);
          } else {
            // æ²¡æœ‰è½¬è¿å•,跳转到创建转运单页面
            this.goToCreateTransport(row);
          }
        } else {
          this.$message.warning("该案例不需要转运");
        }
      } catch (error) {
        console.error("获取案例信息失败:", error);
        this.$message.error("获取案例信息失败");
      }
    },
    /** è·³è½¬åˆ°åˆ›å»ºè½¬è¿å•页面 */
    goToCreateTransport(caseData) {
      // æ–¹å¼1:在新页面打开
      this.$router.push({
        path: "/report/transfer",
        query: {
          autoCreate: "true", //跳转转运标识
          caseId: caseData.id,
          caseNo: caseData.caseNo,
          patName: caseData.name,
          age: caseData.age,
          sex: caseData.sex,
          diagnosisname: caseData.diagnosisname,
          treatmentHospitalName: caseData.treatmenthospitalname
        }
      });
    },
    Createatransferorder(res) {
      console.log(res);
    /** æ‰“开转运单弹框 */
    openTransportDialog(caseData) {
      this.$modal.confirm({
        title: "创建转运单",
        message: `您将创建案例【${caseData.caseNo} - ${caseData.name}】的转运单,是否继续?`,
        confirmButtonText: "前往创建",
        cancelButtonText: "取消",
        type: "warning",
        beforeClose: (action, instance, done) => {
          if (action === "confirm") {
            // è·³è½¬åˆ°è½¬è¿å•创建页面
            this.$router.push({
              path: "/report/transfer",
              query: {
                caseId: caseData.id,
                caseNo: caseData.caseNo,
                patName: caseData.name,
                age: caseData.age,
                sex: caseData.sex,
                diagnosisname: caseData.diagnosisname,
                treatmentHospitalName: caseData.treatmenthospitalname
              }
            });
            done();
          } else {
            done();
          }
        }
      });
    },
    /** è·³è½¬åˆ°è½¬è¿å•详情页 */
    goToTransportDetail(transportId, name) {
      this.$router.push({
        path: "/report/transfer",
        query: {
          autoCreate: "true",
          patName: name
          caseId: res.id,
          caseNo: res.caseNo,
          patName: res.name,
          age: res.age,
          sex: res.sex,
          diagnosisname: res.diagnosisname,
          treatmentHospitalName: res.treatmenthospitalname
        }
      });
    },
    // ---------------------------------end
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    /** å¤šé€‰æ¡†é€‰ä¸­æ•°æ® */
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.id);
      this.single = selection.length !== 1;
@@ -1303,7 +1272,7 @@
        this.currentCase = row;
        // å¦‚果状态是"已上报"(1),则更新为"已阅读"(2)
        if (this.currentCase.reportStatus === "1") {
        if (this.currentCase.reportStatus == "1") {
          try {
            const updateData = {
              ...this.currentCase,
@@ -1338,7 +1307,7 @@
    async handleEdit(row) {
      try {
        const response = await donateInfo(row.id);
        if (response.code === 200 || response.data) {
        if (response.code == 200 || response.data) {
          this.isEditing = true;
          const data = response.data || response;
@@ -1391,7 +1360,10 @@
        this.approveForm.id = row.id;
        this.approveForm.approveResult = "3";
        this.approveForm.approveOpinion = "";
        this.approveForm.confirmResult = "";
        this.approveForm.rejectType = "";
        this.approveForm.isTransport = row.isTransport || "1";
        this.approveForm.isDonate = "0";
        this.$nextTick(() => {
          if (this.$refs.approveForm) {
@@ -1405,7 +1377,7 @@
        this.currentCase = row;
        this.approveForm.id = row.id;
        this.approveForm.approveResult = "3";
        this.approveForm.approveOpinion = "";
        this.approveForm.confirmResult = "";
        this.approveOpen = true;
        this.$modal.msgError("获取详情失败,但已打开确认窗口");
      }
@@ -1415,21 +1387,66 @@
    async submitApprove() {
      try {
        const valid = await this.$refs.approveForm.validate();
        if (valid) {
          const approveData = {
            ...this.currentCase,
            reportStatus: this.approveForm.approveResult,
            remark: this.approveForm.approveOpinion,
            approvername: this.$store.state.user?.name || "当前用户",
            approvetime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
            updateTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
            updateBy: this.$store.state.user?.name || "当前用户"
          };
        if (!valid) return;
          await donateEdit(approveData);
          this.$modal.msgSuccess("确认成功");
          this.approveOpen = false;
          this.getList();
        // å‡†å¤‡ç¡®è®¤æ•°æ®
        const approveData = {
          ...this.currentCase,
          reportStatus: this.approveForm.approveResult,
          confirmResult: this.approveForm.confirmResult,
          approvername: this.$store.state.user?.name || "当前用户",
          approvetime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
          updateTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
          updateBy: this.$store.state.user?.name || "当前用户"
        };
        // å¤„理确认结果
        if (this.approveForm.approveResult == "3") {
          // åŒæ„
          approveData.isTransport = this.approveForm.isTransport;
          // å¦‚果不需要转运,设置isDonate为1
          if (this.approveForm.isTransport == "1") {
            approveData.isDonate = "1";
          } else {
            approveData.isDonate = "0";
          }
        } else if (this.approveForm.approveResult == "4") {
          // é©³å›ž
          approveData.rejectType = this.approveForm.rejectType;
          approveData.isTransport = "1"; // é©³å›žçš„æ¡ˆä¾‹ä¸éœ€è¦è½¬è¿
          approveData.isDonate = "1"; // é©³å›žçš„æ¡ˆä¾‹æ ‡è®°ä¸ºå·²æçŒ®
        }
        // ä¿å­˜æ¡ˆä¾‹ç¡®è®¤ä¿¡æ¯
        await donateEdit(approveData);
        this.$modal.msgSuccess("确认成功");
        // å…³é—­ç¡®è®¤å¯¹è¯æ¡†
        this.approveOpen = false;
        // åˆ·æ–°åˆ—表
        this.getList();
        // å¦‚果同意且需要转运,跳转到转运单创建页面
        if (
          this.approveForm.approveResult == "3" &&
          this.approveForm.isTransport == "2"
        ) {
          this.$router.push({
            path: "/report/transfer",
            query: {
              autoCreate: "true",
              caseId: this.currentCase.id,
              caseNo: this.currentCase.caseNo,
              patName: this.currentCase.name,
              age: this.currentCase.age,
              sex: this.currentCase.sex,
              diagnosisname: this.currentCase.diagnosisname,
              treatmentHospitalName: this.currentCase.treatmenthospitalname
            }
          });
        }
      } catch (error) {
        console.error("确认失败:", error);
@@ -1497,6 +1514,8 @@
        infectious: undefined,
        infectiousOther: undefined,
        isTransport: "1",
        isDonate: "0", // æ–°å¢žï¼šæ˜¯å¦æçŒ®
        rejectType: undefined, // æ–°å¢žï¼šé©³å›žåŽŸå› 
        // åŒ»é™¢ä¿¡æ¯
        treatmenthospitalname: undefined,
        treatmentdeptname: undefined,
@@ -1543,7 +1562,7 @@
    /** é™„件上传成功处理 */
    handleUploadSuccess({ file, fileList, response }) {
      if (response && response.code === 200) {
      if (response && response.code == 200) {
        if (!this.editForm.annexfilesList) {
          this.editForm.annexfilesList = [];
        }
@@ -1572,7 +1591,7 @@
    handleAttachmentRemove(file) {
      if (file.url && this.editForm.annexfilesList) {
        const index = this.editForm.annexfilesList.findIndex(
          item => item.path === file.url || item.fileUrl === file.url
          item => item.path == file.url || item.fileUrl == file.url
        );
        if (index > -1) {
          this.editForm.annexfilesList.splice(index, 1);
@@ -1658,7 +1677,15 @@
        this.$refs.editForm && this.$refs.editForm.clearValidate();
      });
    },
    goToTransportDetail(name) {
      this.$router.push({
        path: "/report/transfer",
        query: {
          autoCreate: "true",
          patName: name
        }
      });
    },
    /** ä¿å­˜è¡¨å• */
    async handleSave() {
      try {
@@ -1690,7 +1717,7 @@
          response = await donateAdd(requestData);
        }
        if (response.code === 200) {
        if (response.code == 200) {
          this.$message.success(this.isEditing ? "修改成功" : "新增成功");
          this.handleEditClose();
          this.getList();
@@ -1786,7 +1813,49 @@
.approve-detail-preview {
  height: 100%;
}
.approve-dialog-content {
  display: flex;
  height: 600px; /* å¯ä»¥è°ƒæ•´é«˜åº¦ */
  overflow: hidden;
}
.approve-detail-left {
  width: 50%;
  background: #f8f9fa;
  padding: 20px;
  overflow-y: auto;
  border-right: 1px solid #e4e7ed;
}
.approve-form-right {
  width: 50%;
  padding: 20px;
  overflow-y: auto;
}
.approve-detail-preview {
  height: 100%;
}
/* å“åº”式调整 */
@media (max-width: 1200px) {
  .approve-dialog-content {
    flex-direction: column;
    height: auto;
    max-height: 80vh;
  }
  .approve-detail-left,
  .approve-form-right {
    width: 100%;
    height: auto;
  }
  .approve-detail-left {
    border-right: none;
    border-bottom: 1px solid #e4e7ed;
  }
}
/* å“åº”式设计 */
@media (max-width: 1200px) {
  .approve-dialog {
src/views/business/assess/assessInfo.vue
@@ -1,63 +1,7 @@
<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">
@@ -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'
              "
@@ -554,14 +508,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 +539,7 @@
        return (
          assessments &&
          assessments.length > 0 &&
          assessments.every(assessment => assessment.status === "assessed")
          assessments.every(assessment => assessment.status == "assessed")
        );
      });
    },
@@ -611,20 +565,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 +610,7 @@
    // æ˜¾ç¤ºé™„件列表
    showAttachmentList(attachments, assessmentNumber) {
      if (!attachments || attachments.length === 0) {
      if (!attachments || attachments.length == 0) {
        this.$message.info(`第${assessmentNumber}次评估暂无附件`);
        return;
      }
@@ -694,7 +653,7 @@
      if (!organ.assesscontent) return [];
      try {
        const assessData =
          typeof organ.assesscontent === "string"
          typeof organ.assesscontent == "string"
            ? JSON.parse(organ.assesscontent)
            : organ.assesscontent;
@@ -780,7 +739,7 @@
        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 +765,7 @@
    async handleOrganDecisionChange(newDecision) {
      const oldDecision = [...this.prevOrgandecisionValues];
      this.autoHandleDecisionChange(newDecision);
      console.log(newDecision);
      const removedDecisions = oldDecision.filter(
        item => !newDecision.includes(item)
@@ -818,7 +778,7 @@
      this.prevOrgandecisionValues = [...newDecision];
      this.$forceUpdate();
      if (newDecision.length === 0) {
      if (newDecision.length == 0) {
        this.expandedRowKeys = [];
      }
    },
@@ -917,7 +877,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 +919,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 +951,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 +1025,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 +1041,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 +1061,7 @@
      return {
        index: index,
        status: "pending",
        assessmentTime: "",
        assessmentTime: new Date().toLocaleString("zh-CN"), // æ·»åŠ é»˜è®¤è¯„ä¼°æ—¶é—´
        assessor: "",
        functionStatus: "",
        assessmentOpinion: "",
@@ -1125,20 +1085,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 +1127,7 @@
      } else {
        this.expandedRowKeys = [key];
        this.organAssessmentList.forEach(item => {
          item.expanded = item.organno === key;
          item.expanded = item.organno == key;
        });
      }
    },
@@ -1185,14 +1145,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 +1164,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 +1192,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 +1233,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 +1255,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 +1328,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 +1367,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 +1475,7 @@
.fixed-width .el-button {
  margin: 0 2px;
}
/* æ±‡æ€»é¡µé¢æ ·å¼ */
.assessment-summary {
  padding: 10px;
src/views/business/assess/index.vue
@@ -8,7 +8,7 @@
        :inline="true"
        label-width="100px"
      >
        <el-form-item label="捐献者姓名" prop="name">
        <el-form-item label="姓名" prop="name">
          <el-input
            v-model="queryParams.name"
            placeholder="请输入捐献者姓名"
@@ -26,7 +26,7 @@
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="业务人员" prop="coordinatorName">
        <el-form-item label="协调员" prop="coordinatorName">
          <el-input
            v-model="queryParams.coordinatorName"
            placeholder="请输入业务人员"
@@ -35,10 +35,10 @@
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="评估状态" prop="assessState">
        <el-form-item label="评估结果" prop="assessState">
          <el-select
            v-model="queryParams.assessState"
            placeholder="请选择评估状态"
            placeholder="请选择评估结果"
            clearable
            style="width: 200px"
          >
@@ -48,7 +48,7 @@
            <el-option label="已关闭" value="4" />
          </el-select>
        </el-form-item>
        <el-form-item label="申请时间" prop="applyTimeRange">
        <el-form-item label="首次评估时间" prop="applyTimeRange">
          <el-date-picker
            v-model="queryParams.applyTimeRange"
            type="daterange"
@@ -59,7 +59,7 @@
            style="width: 240px"
          />
        </el-form-item>
        <el-form-item label="评估时间" prop="assessTimeRange">
        <el-form-item label="最新评估时间" prop="assessTimeRange">
          <el-date-picker
            v-model="queryParams.assessTimeRange"
            type="daterange"
@@ -130,7 +130,7 @@
          width="120"
        />
        <el-table-column
          label="捐献者姓名"
          label="姓名"
          align="center"
          prop="name"
          width="120"
@@ -151,6 +151,7 @@
          min-width="180"
          show-overflow-tooltip
        />
        <!--
        <el-table-column
          label="所在医疗机构"
          align="center"
@@ -168,6 +169,20 @@
            <span>{{ parseTime(scope.row.applyTime, "{y}-{m}-{d}") }}</span>
          </template>
        </el-table-column>
        -->
        <el-table-column
          label="评估状态"
          align="center"
          prop="assessState"
          width="100"
        >
          <template slot-scope="scope">
            <el-tag :type="statusFilter(scope.row.assessState)">
              {{ statusTextFilter(scope.row.assessState) }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column
          label="评估时间"
          align="center"
@@ -183,19 +198,7 @@
          </template>
        </el-table-column>
        <el-table-column
          label="评估状态"
          align="center"
          prop="assessState"
          width="100"
        >
          <template slot-scope="scope">
            <el-tag :type="statusFilter(scope.row.assessState)">
              {{ statusTextFilter(scope.row.assessState) }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column
          label="业务人员"
          label="协调员"
          align="center"
          prop="coordinatorName"
          width="100"
src/views/business/decide/DecideInfo copy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,816 @@
<template>
  <div class="death-judgment-detail">
    <case-basic-info :case-id="caseId" :show-attachment="true" />
    <el-card class="detail-card">
      <!-- åŸºç¡€ä¿¡æ¯ -->
      <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-input v-model="form.deathreason" :readonly="!isEdit" />
              <!-- <el-select
                v-model="form.deathreason"
                :disabled="!isEdit"
                style="width: 100%"
              >
                <el-option label="脑死亡" value="brain_death" />
                <el-option label="心死亡" value="heart_death" />
                <el-option label="其他" value="other" />
              </el-select> -->
            </el-form-item>
          </el-col>
          <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>
        <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-row :gutter="20">
          <el-col :span="8">
            <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-form-item label="死亡判定说明" prop="remark">
          <el-input
            type="textarea"
            :rows="3"
            v-model="form.remark"
            :readonly="!isEdit"
            placeholder="详细记录死亡判定过程和依据"
          />
        </el-form-item>
      </el-form>
    </el-card>
    <!-- è¯„估表附件 -->
    <el-card class="attachment-card">
      <div slot="header" class="clearfix">
        <span class="detail-title">死亡判定评估表附件</span>
        <!-- <el-button
          v-if="isEdit"
          type="primary"
          size="mini"
          @click="openUploadDialog"
          :loading="uploadLoading"
        >
          ä¸Šä¼ é™„ä»¶
        </el-button> -->
      </div>
      <!-- é™„件类型选项卡 -->
      <el-tabs v-model="activeAttachmentType" type="card">
        <el-tab-pane
          v-for="type in attachmentTypes"
          :key="type.value"
          :label="type.label"
          :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)"
              v-loading="attachmentLoading"
              style="width: 100%; margin-top: 15px;"
            >
              <el-table-column label="文件名称" min-width="200">
                <template slot-scope="scope">
                  <div class="file-info">
                    <i
                      class="el-icon-document"
                      style="margin-right: 8px; color: #409EFF;"
                    ></i>
                    <span>{{ scope.row.fileName }}</span>
                  </div>
                </template>
              </el-table-column>
              <el-table-column label="文件类型" width="100" align="center">
                <template slot-scope="scope">
                  <el-tag size="small">{{
                    getFileType(scope.row.fileName)
                  }}</el-tag>
                </template>
              </el-table-column>
              <el-table-column label="文件大小" width="100" align="center">
                <template slot-scope="scope">
                  <span>{{ formatFileSize(scope.row.fileSize) }}</span>
                </template>
              </el-table-column>
              <el-table-column label="上传时间" width="160" align="center">
                <template slot-scope="scope">
                  <span>{{ parseTime(scope.row.uploadTime) }}</span>
                </template>
              </el-table-column>
              <el-table-column label="上传人" width="100" align="center">
                <template slot-scope="scope">
                  <span>{{ scope.row.uploader }}</span>
                </template>
              </el-table-column>
              <el-table-column label="操作" width="180" align="center">
                <template slot-scope="scope">
                  <el-button
                    size="mini"
                    type="text"
                    icon="el-icon-view"
                    @click="handlePreview(scope.row)"
                    >预览</el-button
                  >
                  <el-button
                    size="mini"
                    type="text"
                    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>
            </el-table>
            <div
              v-if="getAttachmentsByType(type.value).length === 0"
              class="empty-attachment"
            >
              <el-empty
                description="暂无评估表附件"
                :image-size="80"
              ></el-empty>
            </div>
          </div>
        </el-tab-pane>
      </el-tabs>
    </el-card>
    <!-- ä¸Šä¼ å¯¹è¯æ¡† -->
    <el-dialog
      :title="`上传${getCurrentTypeLabel}评估表`"
      :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>
  </div>
</template>
<script>
import {
  deathinfoedit,
  deathinfoadd,
  queryDathInfoBaseInfo
} from "@/api/businessApi";
import { getToken } from "@/utils/auth";
import CaseBasicInfo from "@/components/CaseBasicInfo";
export default {
  name: "DeathJudgmentDetail",
  components: { CaseBasicInfo },
  data() {
    return {
      caseId: null,
      // æ˜¯å¦ç¼–辑模式
      isEdit: false,
      // ä¿å­˜åŠ è½½çŠ¶æ€
      saveLoading: false,
      infoid: undefined,
      // è¡¨å•数据
      form: {
        id: undefined,
        infoid: undefined,
        donorno: "",
        name: "",
        sex: "",
        age: "",
        diagnosisname: "",
        deathreason: "",
        deathtime: "",
        deathjudgedocto: "",
        deathjudgedoctt: "",
        gainhospitalno: "",
        gainhospitalname: "",
        isspendremember: 0,
        isrestoreremains: 0,
        rememberAnnex: "",
        responsibleuserid: "",
        responsibleusername: "",
        recordstate: "0",
        judgmentDescription: ""
      },
      // è¡¨å•验证规则
      rules: {
        name: [
          { required: true, message: "捐献者姓名不能为空", trigger: "blur" }
        ],
        deathreason: [
          { required: true, message: "死亡原因不能为空", trigger: "change" }
        ],
        deathtime: [
          { required: true, message: "死亡时间不能为空", trigger: "change" }
        ],
        deathjudgedocto: [
          { required: true, message: "判定医生一不能为空", trigger: "blur" }
        ]
      },
      // é™„件相关数据
      activeAttachmentType: "1",
      attachmentLoading: false,
      uploadDialogVisible: false,
      uploadLoading: false,
      tempFileList: [],
      currentUploadType: "",
      uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
      headers: {
        Authorization: "Bearer " + getToken()
      },
      // è¯„估表类型定义
      attachmentTypes: [
        { value: "1", label: "脑死亡判定表" },
        { value: "2", label: "脑电图评估表" },
        { value: "3", label: "短潜伏期体感诱发电位评估表" },
        { value: "4", label: "经颅多普勒超声评估记录" },
        { value: "5", label: "卫健委脑损伤质控中心 - ä¸´åºŠç»¼åˆè¯„估表" },
        { value: "6", label: "UW评分表" },
        { value: "7", label: "心死亡判定表" }
      ],
      // é™„件列表数据
      attachmentList: []
    };
  },
  computed: {
    getCurrentTypeLabel() {
      const type = this.attachmentTypes.find(
        t => t.value === this.currentUploadType
      );
      return type ? type.label : "";
    }
  },
  created() {
    this.infoid = this.$route.query.infoid;
    this.caseId = this.infoid;
    const id = this.$route.query.id;
    this.isEdit = this.$route.query.isEdit;
    this.getDetail(this.infoid);
    // if (id && !this.$route.path.includes("/add")) {
    //   this.getDetail(id);
    // } else if (this.$route.path.includes("/add")) {
    //   this.generateDonorNo();
    // }
    this.getAttachmentList();
  },
  methods: {
    // ç”ŸæˆæçŒ®è€…编号
    generateDonorNo() {
      const timestamp = Date.now().toString();
      this.form.donorno = "DONOR" + timestamp.slice(-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;
        }
        // æ˜ å°„字段到表单
        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.attachmentLoading = false;
      }, 500);
    },
    // æ ¹æ®ç±»åž‹èŽ·å–é™„ä»¶
    getAttachmentsByType(type) {
      return this.attachmentList.filter(item => item.type === type);
    },
    // èŽ·å–æ–‡ä»¶ç±»åž‹
    getFileType(fileName) {
      const ext = fileName
        .split(".")
        .pop()
        .toLowerCase();
      const typeMap = {
        pdf: "PDF",
        doc: "DOC",
        docx: "DOCX",
        xls: "XLS",
        xlsx: "XLSX",
        jpg: "JPG",
        jpeg: "JPEG",
        png: "PNG"
      };
      return typeMap[ext] || ext.toUpperCase();
    },
    // æ‰“开上传对话框
    openUploadDialog(type = null) {
      this.currentUploadType = type || this.activeAttachmentType;
      this.tempFileList = [];
      this.uploadDialogVisible = true;
      this.$nextTick(() => {
        if (this.$refs.uploadRef) {
          this.$refs.uploadRef.clearFiles();
        }
      });
    },
    // ä¸Šä¼ å‰æ ¡éªŒ
    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"
      ];
      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");
      if (!isTypeOk) {
        this.$message.error(
          "文件格式不支持,请上传pdf、jpg、png、doc、docx、xls或xlsx格式文件"
        );
        return false;
      }
      if (file.size > maxSize) {
        this.$message.error("文件大小不能超过10MB");
        return false;
      }
      return true;
    },
    // æ–‡ä»¶é€‰æ‹©å˜åŒ–
    handleFileChange(file, fileList) {
      this.tempFileList = fileList;
    },
    // ç§»é™¤ä¸´æ—¶æ–‡ä»¶
    handleTempRemove(file, fileList) {
      this.tempFileList = fileList;
    },
    /** ä¸Šä¼ æˆåŠŸå¤„ç† */
    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(),
            type: this.currentUploadType,
            typeName: this.getCurrentTypeLabel,
            fileName: file.name,
            fileSize: file.size,
            uploadTime: new Date().toISOString(),
            uploader: "当前用户",
            fileUrl: file.url
          };
          this.attachmentList.push(newAttachment);
        }
        // æ›´æ–°é™„ä»¶JSON数据到表单
        this.form.rememberAnnex = this.buildAttachmentJson();
        this.$message.success("文件上传成功");
        this.uploadDialogVisible = false;
        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(() => {});
    },
    // é¢„览附件
    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("该文件类型暂不支持在线预览,请下载后查看");
      }
    },
    // ä¸‹è½½é™„ä»¶
    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;
    },
    // ä¿å­˜ä¿¡æ¯
    async handleSave() {
      this.$refs.form.validate(async valid => {
        if (valid) {
          this.saveLoading = true;
          try {
            // æž„建提交数据
            const submitData = {
              ...this.form,
              infoid: this.infoid,
              // ç¡®ä¿é™„件数据最新
              rememberannex: this.buildAttachmentJson()
            };
            let response = null;
            if (submitData.id) {
              response = await deathinfoedit(submitData);
            } else {
              response = await deathinfoadd(submitData);
            }
            // const response = await deathinfoedit(submitData);
            if (response.code === 200) {
              this.$message.success("保存成功");
              this.isEdit = false;
              if (!this.form.id) {
                this.form.id = response.data;
              }
              if (this.$route.path.includes("/add")) {
                this.$router.push("/case/deathJudgment");
              }
            } else {
              this.$message.error(response.message || "保存失败");
            }
          } catch (error) {
            console.error("保存失败:", error);
            this.$message.error("保存失败");
          } finally {
            this.saveLoading = false;
          }
        }
      });
    },
    // æ–‡ä»¶å¤§å°æ ¼å¼åŒ–
    formatFileSize(size) {
      if (size === 0) return "0 B";
      const k = 1024;
      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];
    },
    // æ—¶é—´æ ¼å¼åŒ–
    parseTime(time) {
      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")}`;
    }
  }
};
</script>
<style scoped>
.death-judgment-detail {
  padding: 20px;
}
.detail-card {
  margin-bottom: 20px;
}
.attachment-card {
  margin-bottom: 20px;
}
.detail-title {
  font-size: 16px;
  font-weight: bold;
}
.attachment-upload-section {
  padding: 10px;
}
.upload-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 15px;
}
.upload-title {
  font-size: 14px;
  font-weight: 600;
  color: #303133;
}
.file-info {
  display: flex;
  align-items: center;
}
.empty-attachment {
  text-align: center;
  padding: 40px 0;
  color: #909399;
}
/* å›¾ç‰‡é¢„览对话框样式 */
:deep(.image-preview-dialog) {
  width: auto;
  max-width: 90vw;
}
:deep(.image-preview-dialog .el-message-box__content) {
  text-align: center;
}
</style>
src/views/business/decide/DecideInfo.vue
@@ -1,45 +1,36 @@
<template>
  <div class="death-judgment-detail">
    <case-basic-info :case-id="caseId" :show-attachment="true" />
    <el-card class="detail-card">
      <!-- åŸºç¡€ä¿¡æ¯ -->
<!-- å…¬å…±ä¿¡æ¯æ¨¡å—(独立显示) -->
    <!-- åˆ¤å®šç±»åž‹æ ‡ç­¾é¡µ -->
    <el-card class="type-card">
      <el-tabs
        v-model="activeJudgmentType"
        type="card"
        @tab-click="handleTabChange"
      >
        <el-tab-pane label="脑死亡判定" name="brain">
          <span slot="label">
            <i class="el-icon-s-promotion" style="margin-right: 5px;"></i>
            è„‘死亡判定
          </span>
        </el-tab-pane>
        <el-tab-pane label="心死亡判定" name="heart">
          <span slot="label">
            <i class="el-icon-help" style="margin-right: 5px;"></i>
            å¿ƒæ­»äº¡åˆ¤å®š
          </span>
        </el-tab-pane>
      </el-tabs>
    </el-card>
<el-card class="detail-card common-info-card">
      <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>
        <span class="detail-title">公共信息</span>
      </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-input v-model="form.deathreason" :readonly="!isEdit" />
              <!-- <el-select
                v-model="form.deathreason"
                :disabled="!isEdit"
                style="width: 100%"
              >
                <el-option label="脑死亡" value="brain_death" />
                <el-option label="心死亡" value="heart_death" />
                <el-option label="其他" value="other" />
              </el-select> -->
            </el-form-item>
          </el-col>
      <el-form :model="form" label-width="120px">
        <el-row>
          <el-col :span="8">
            <el-form-item label="负责人" prop="responsibleusername">
              <el-input
@@ -48,39 +39,7 @@
              />
            </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>
        <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-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="器官获取机构" prop="gainhospitalname">
@@ -112,148 +71,370 @@
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="死亡判定说明" prop="remark">
          <el-input
            type="textarea"
            :rows="3"
            v-model="form.remark"
            :readonly="!isEdit"
            placeholder="详细记录死亡判定过程和依据"
          />
        </el-form-item>
      </el-form>
    </el-card>
    <!-- è¯„估表附件 -->
    <el-card class="attachment-card">
    <!-- è„‘死亡判定模块 -->
    <el-card v-if="activeJudgmentType === 'brain'" class="detail-card">
      <div slot="header" class="clearfix">
        <span class="detail-title">死亡判定评估表附件</span>
        <!-- <el-button
        <span class="detail-title">脑死亡判定信息</span>
        <el-button
          v-if="isEdit"
          type="primary"
          size="mini"
          @click="openUploadDialog"
          :loading="uploadLoading"
          style="float: right; margin-left: 10px;"
          type="success"
          @click="handleSave"
          :loading="saveLoading"
        >
          ä¸Šä¼ é™„ä»¶
        </el-button> -->
          ä¿å­˜ä¿¡æ¯
        </el-button>
        <el-button
          v-else
          style="float: right; margin-left: 10px;"
          type="primary"
          @click="handleEdit"
        >
          ç¼–辑信息
        </el-button>
      </div>
      <!-- é™„件类型选项卡 -->
      <el-tabs v-model="activeAttachmentType" type="card">
        <el-tab-pane
          v-for="type in attachmentTypes"
          :key="type.value"
          :label="type.label"
          :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>
      <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>
      <!-- è„‘死亡评估表附件 -->
      <div class="attachment-section">
        <div class="attachment-header">
          <h3>脑死亡判定评估表附件</h3>
        </div>
        <!-- é™„件类型选项卡 -->
        <el-tabs v-model="activeAttachmentType" type="card">
          <el-tab-pane
            v-for="type in brainDeathAttachmentTypes"
            :key="type.value"
            :label="type.label"
            :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)"
                v-loading="attachmentLoading"
                style="width: 100%; margin-top: 15px;"
              >
                <el-table-column label="文件名称" min-width="200">
                  <template slot-scope="scope">
                    <div class="file-info">
                      <i
                        class="el-icon-document"
                        style="margin-right: 8px; color: #409EFF;"
                      ></i>
                      <span>{{ scope.row.fileName }}</span>
                    </div>
                  </template>
                </el-table-column>
                <el-table-column label="文件类型" width="100" align="center">
                  <template slot-scope="scope">
                    <el-tag size="small">{{
                      getFileType(scope.row.fileName)
                    }}</el-tag>
                  </template>
                </el-table-column>
                <el-table-column label="文件大小" width="100" align="center">
                  <template slot-scope="scope">
                    <span>{{ formatFileSize(scope.row.fileSize) }}</span>
                  </template>
                </el-table-column>
                <el-table-column label="上传时间" width="160" align="center">
                  <template slot-scope="scope">
                    <span>{{ parseTime(scope.row.uploadTime) }}</span>
                  </template>
                </el-table-column>
                <el-table-column label="上传人" width="100" align="center">
                  <template slot-scope="scope">
                    <span>{{ scope.row.uploader }}</span>
                  </template>
                </el-table-column>
                <el-table-column label="操作" width="180" align="center">
                  <template slot-scope="scope">
                    <el-button
                      size="mini"
                      type="text"
                      icon="el-icon-view"
                      @click="handlePreview(scope.row)"
                      >预览</el-button
                    >
                    <el-button
                      size="mini"
                      type="text"
                      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>
              </el-table>
              <div
                v-if="getAttachmentsByType(type.value).length === 0"
                class="empty-attachment"
              >
                <el-empty
                  description="暂无评估表附件"
                  :image-size="80"
                ></el-empty>
              </div>
            </div>
            <!-- é™„件列表 -->
            <el-table
              :data="getAttachmentsByType(type.value)"
              v-loading="attachmentLoading"
              style="width: 100%; margin-top: 15px;"
            >
              <el-table-column label="文件名称" min-width="200">
                <template slot-scope="scope">
                  <div class="file-info">
                    <i
                      class="el-icon-document"
                      style="margin-right: 8px; color: #409EFF;"
                    ></i>
                    <span>{{ scope.row.fileName }}</span>
                  </div>
                </template>
              </el-table-column>
              <el-table-column label="文件类型" width="100" align="center">
                <template slot-scope="scope">
                  <el-tag size="small">{{
                    getFileType(scope.row.fileName)
                  }}</el-tag>
                </template>
              </el-table-column>
              <el-table-column label="文件大小" width="100" align="center">
                <template slot-scope="scope">
                  <span>{{ formatFileSize(scope.row.fileSize) }}</span>
                </template>
              </el-table-column>
              <el-table-column label="上传时间" width="160" align="center">
                <template slot-scope="scope">
                  <span>{{ parseTime(scope.row.uploadTime) }}</span>
                </template>
              </el-table-column>
              <el-table-column label="上传人" width="100" align="center">
                <template slot-scope="scope">
                  <span>{{ scope.row.uploader }}</span>
                </template>
              </el-table-column>
              <el-table-column label="操作" width="180" align="center">
                <template slot-scope="scope">
                  <el-button
                    size="mini"
                    type="text"
                    icon="el-icon-view"
                    @click="handlePreview(scope.row)"
                    >预览</el-button
                  >
                  <el-button
                    size="mini"
                    type="text"
                    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>
            </el-table>
            <div
              v-if="getAttachmentsByType(type.value).length === 0"
              class="empty-attachment"
            >
              <el-empty
                description="暂无评估表附件"
                :image-size="80"
              ></el-empty>
            </div>
          </div>
        </el-tab-pane>
      </el-tabs>
          </el-tab-pane>
        </el-tabs>
      </div>
    </el-card>
    <!-- ä¸Šä¼ å¯¹è¯æ¡† -->
    <!-- å¿ƒæ­»äº¡åˆ¤å®šæ¨¡å— -->
    <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>
      <!-- å¿ƒæ­»äº¡è¯„估表附件 -->
      <div class="attachment-section">
        <div class="attachment-header">
          <h3>心死亡判定评估表附件</h3>
        </div>
        <!-- å¿ƒæ­»äº¡é™„件类型选项卡 -->
        <el-tabs v-model="activeHeartDeathAttachmentType" type="card">
          <el-tab-pane
            v-for="type in heartDeathAttachmentTypes"
            :key="type.value"
            :label="type.label"
            :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)"
                v-loading="attachmentLoading"
                style="width: 100%; margin-top: 15px;"
              >
                <el-table-column label="文件名称" min-width="200">
                  <template slot-scope="scope">
                    <div class="file-info">
                      <i
                        class="el-icon-document"
                        style="margin-right: 8px; color: #409EFF;"
                      ></i>
                      <span>{{ scope.row.fileName }}</span>
                    </div>
                  </template>
                </el-table-column>
                <el-table-column label="文件类型" width="100" align="center">
                  <template slot-scope="scope">
                    <el-tag size="small">{{
                      getFileType(scope.row.fileName)
                    }}</el-tag>
                  </template>
                </el-table-column>
                <el-table-column label="文件大小" width="100" align="center">
                  <template slot-scope="scope">
                    <span>{{ formatFileSize(scope.row.fileSize) }}</span>
                  </template>
                </el-table-column>
                <el-table-column label="上传时间" width="160" align="center">
                  <template slot-scope="scope">
                    <span>{{ parseTime(scope.row.uploadTime) }}</span>
                  </template>
                </el-table-column>
                <el-table-column label="上传人" width="100" align="center">
                  <template slot-scope="scope">
                    <span>{{ scope.row.uploader }}</span>
                  </template>
                </el-table-column>
                <el-table-column label="操作" width="180" align="center">
                  <template slot-scope="scope">
                    <el-button
                      size="mini"
                      type="text"
                      icon="el-icon-view"
                      @click="handlePreview(scope.row)"
                      >预览</el-button
                    >
                    <el-button
                      size="mini"
                      type="text"
                      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>
              </el-table>
              <div
                v-if="getHeartDeathAttachmentsByType(type.value).length === 0"
                class="empty-attachment"
              >
                <el-empty
                  description="暂无评估表附件"
                  :image-size="80"
                ></el-empty>
              </div>
            </div>
          </el-tab-pane>
        </el-tabs>
      </div>
    </el-card>
    <!-- ä¸Šä¼ å¯¹è¯æ¡†ï¼ˆè„‘死亡) -->
    <el-dialog
      :title="`上传${getCurrentTypeLabel}评估表`"
      :title="`上传${getCurrentBrainDeathTypeLabel}评估表`"
      :visible.sync="uploadDialogVisible"
      width="500px"
      :close-on-click-modal="false"
@@ -293,6 +474,51 @@
        </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>
  </div>
</template>
@@ -312,11 +538,12 @@
  data() {
    return {
      caseId: null,
      // æ˜¯å¦ç¼–辑模式
      isEdit: false,
      // ä¿å­˜åŠ è½½çŠ¶æ€
      saveLoading: false,
      infoid: undefined,
      // åˆ¤å®šç±»åž‹æ ‡ç­¾
      activeJudgmentType: "brain", // é»˜è®¤æ˜¾ç¤ºè„‘死亡
      // è¡¨å•数据
      form: {
@@ -327,19 +554,28 @@
        sex: "",
        age: "",
        diagnosisname: "",
        // è„‘死亡相关字段
        deathreason: "",
        deathtime: "",
        deathjudgedocto: "",
        deathjudgedoctt: "",
        // å¿ƒæ­»äº¡ç›¸å…³å­—段
        heartdeathtime: "",
        heartdeathreason: "",
        heartdeathjudgedocto: "",
        heartdeathjudgedoctt: "",
        heartDeathRemark: "",
        // å…¬å…±å­—段
        gainhospitalno: "",
        gainhospitalname: "",
        isspendremember: 0,
        isrestoreremains: 0,
        rememberAnnex: "",
        heartdeathjudgeannex: "", // æ–°å¢žå¿ƒæ­»äº¡é™„件字段
        responsibleuserid: "",
        responsibleusername: "",
        recordstate: "0",
        judgmentDescription: ""
        remark: ""
      },
      // è¡¨å•验证规则
      rules: {
@@ -354,38 +590,67 @@
        ],
        deathjudgedocto: [
          { required: true, message: "判定医生一不能为空", trigger: "blur" }
        ],
        heartdeathreason: [
          { required: false, message: "心死亡原因不能为空", trigger: "blur" }
        ],
        heartdeathtime: [
          { required: false, message: "心死亡时间不能为空", trigger: "change" }
        ],
        heartdeathjudgedocto: [
          {
            required: false,
            message: "心死亡判定医生一不能为空",
            trigger: "blur"
          }
        ]
      },
      // é™„件相关数据
      activeAttachmentType: "1",
      activeHeartDeathAttachmentType: "heart_1", // å¿ƒæ­»äº¡é™„件类型
      attachmentLoading: false,
      uploadDialogVisible: false,
      heartDeathUploadDialogVisible: false, // å¿ƒæ­»äº¡ä¸Šä¼ å¯¹è¯æ¡†
      uploadLoading: false,
      heartDeathUploadLoading: false, // å¿ƒæ­»äº¡ä¸Šä¼ åŠ è½½çŠ¶æ€
      tempFileList: [],
      tempHeartDeathFileList: [], // å¿ƒæ­»äº¡ä¸´æ—¶æ–‡ä»¶åˆ—表
      currentUploadType: "",
      currentHeartDeathUploadType: "", // å½“前心死亡上传类型
      uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
      headers: {
        Authorization: "Bearer " + getToken()
      },
      // è¯„估表类型定义
      attachmentTypes: [
      // è„‘死亡评估表类型定义
      brainDeathAttachmentTypes: [
        { value: "1", label: "脑死亡判定表" },
        { value: "2", label: "脑电图评估表" },
        { value: "3", label: "短潜伏期体感诱发电位评估表" },
        { value: "4", label: "经颅多普勒超声评估记录" },
        { value: "5", label: "卫健委脑损伤质控中心 - ä¸´åºŠç»¼åˆè¯„估表" },
        { value: "6", label: "UW评分表" },
        { value: "7", label: "心死亡判定表" }
        { value: "6", label: "UW评分表" }
      ],
      // å¿ƒæ­»äº¡è¯„估表类型定义
      heartDeathAttachmentTypes: [
        { value: "heart_1", label: "心死亡判定表" },
        { value: "heart_2", label: "心电图评估表" }
      ],
      // é™„件列表数据
      attachmentList: []
      attachmentList: [], // è„‘死亡附件
      heartDeathAttachmentList: [] // å¿ƒæ­»äº¡é™„ä»¶
    };
  },
  computed: {
    getCurrentTypeLabel() {
      const type = this.attachmentTypes.find(
    getCurrentBrainDeathTypeLabel() {
      const type = this.brainDeathAttachmentTypes.find(
        t => t.value === this.currentUploadType
      );
      return type ? type.label : "";
    },
    getCurrentHeartDeathTypeLabel() {
      const type = this.heartDeathAttachmentTypes.find(
        t => t.value === this.currentHeartDeathUploadType
      );
      return type ? type.label : "";
    }
@@ -393,23 +658,29 @@
  created() {
    this.infoid = this.$route.query.infoid;
    this.caseId = this.infoid;
    const id = this.$route.query.id;
    this.isEdit = this.$route.query.isEdit;
    this.getDetail(this.infoid);
    this.isEdit = this.$route.query.isEdit === "true";
    // if (id && !this.$route.path.includes("/add")) {
    //   this.getDetail(id);
    // } else if (this.$route.path.includes("/add")) {
    //   this.generateDonorNo();
    // }
    // ä»Žè·¯ç”±å‚数获取默认显示类型
    if (this.$route.query.judgmentType) {
      this.activeJudgmentType = this.$route.query.judgmentType;
    }
    this.getDetail(this.infoid);
    this.getAttachmentList();
  },
  methods: {
    // æ ‡ç­¾é¡µåˆ‡æ¢
    handleTabChange(tab) {
      this.activeJudgmentType = tab.name;
      // å¯ä»¥åœ¨è¿™é‡Œæ·»åŠ å…¶ä»–åˆ‡æ¢é€»è¾‘
    },
    // ç”ŸæˆæçŒ®è€…编号
    generateDonorNo() {
      const timestamp = Date.now().toString();
      this.form.donorno = "DONOR" + timestamp.slice(-8);
    },
    // èŽ·å–è¯¦æƒ…
    async getDetail(infoid) {
      try {
@@ -437,30 +708,47 @@
        // è§£æžé™„件信息
        if (realData.rememberAnnex) {
          this.parseAttachmentData(realData.rememberAnnex);
          this.parseAttachmentData(realData.rememberAnnex, "brain");
        }
        // è§£æžå¿ƒæ­»äº¡é™„件信息
        if (realData.heartdeathjudgeannex) {
          this.parseAttachmentData(realData.heartdeathjudgeannex, "heart");
        }
      } catch (error) {
        console.error("获取死亡判定详情失败:", error);
        this.$message.error("数据加载失败");
      }
    },
    // è§£æžé™„件数据
    parseAttachmentData(attachmentJson) {
    parseAttachmentData(attachmentJson, type = "brain") {
      try {
        if (attachmentJson) {
          const attachments = JSON.parse(attachmentJson);
          if (Array.isArray(attachments)) {
            this.attachmentList = attachments;
            if (type === "brain") {
              this.attachmentList = attachments;
            } else if (type === "heart") {
              this.heartDeathAttachmentList = attachments;
            }
          }
        }
      } catch (error) {
        console.error("解析附件数据失败:", error);
      }
    },
    // æž„建附件JSON数据
    buildAttachmentJson() {
    // æž„建脑死亡附件JSON数据
    buildBrainDeathAttachmentJson() {
      return JSON.stringify(this.attachmentList);
    },
    // æž„建心死亡附件JSON数据
    buildHeartDeathAttachmentJson() {
      return JSON.stringify(this.heartDeathAttachmentList);
    },
    // èŽ·å–çŠ¶æ€æ ‡ç­¾æ ·å¼
    getStatusTag(status) {
      const statusMap = {
@@ -470,6 +758,7 @@
      };
      return statusMap[status] || "info";
    },
    // èŽ·å–çŠ¶æ€æ–‡æœ¬
    getStatusText(status) {
      const textMap = {
@@ -479,18 +768,25 @@
      };
      return textMap[status] || "未知状态";
    },
    // èŽ·å–é™„ä»¶åˆ—è¡¨
    getAttachmentList() {
      this.attachmentLoading = true;
      // å®žé™…项目中从接口获取附件数据
      setTimeout(() => {
        this.attachmentLoading = false;
      }, 500);
    },
    // æ ¹æ®ç±»åž‹èŽ·å–é™„ä»¶
    // æ ¹æ®ç±»åž‹èŽ·å–è„‘æ­»äº¡é™„ä»¶
    getAttachmentsByType(type) {
      return this.attachmentList.filter(item => item.type === type);
    },
    // æ ¹æ®ç±»åž‹èŽ·å–å¿ƒæ­»äº¡é™„ä»¶
    getHeartDeathAttachmentsByType(type) {
      return this.heartDeathAttachmentList.filter(item => item.type === type);
    },
    // èŽ·å–æ–‡ä»¶ç±»åž‹
    getFileType(fileName) {
      const ext = fileName
@@ -509,7 +805,8 @@
      };
      return typeMap[ext] || ext.toUpperCase();
    },
    // æ‰“开上传对话框
    // æ‰“开脑死亡上传对话框
    openUploadDialog(type = null) {
      this.currentUploadType = type || this.activeAttachmentType;
      this.tempFileList = [];
@@ -520,6 +817,20 @@
        }
      });
    },
    // æ‰“开心死亡上传对话框
    openHeartDeathUploadDialog(type = null) {
      this.currentHeartDeathUploadType =
        type || this.activeHeartDeathAttachmentType;
      this.tempHeartDeathFileList = [];
      this.heartDeathUploadDialogVisible = true;
      this.$nextTick(() => {
        if (this.$refs.heartDeathUploadRef) {
          this.$refs.heartDeathUploadRef.clearFiles();
        }
      });
    },
    // ä¸Šä¼ å‰æ ¡éªŒ
    beforeUpload(file) {
      const allowedTypes = [
@@ -559,24 +870,38 @@
      return true;
    },
    // æ–‡ä»¶é€‰æ‹©å˜åŒ–
    // è„‘死亡文件选择变化
    handleFileChange(file, fileList) {
      this.tempFileList = fileList;
    },
    // ç§»é™¤ä¸´æ—¶æ–‡ä»¶
    // å¿ƒæ­»äº¡æ–‡ä»¶é€‰æ‹©å˜åŒ–
    handleHeartDeathFileChange(file, fileList) {
      this.tempHeartDeathFileList = fileList;
    },
    // ç§»é™¤è„‘死亡临时文件
    handleTempRemove(file, fileList) {
      this.tempFileList = fileList;
    },
    /** ä¸Šä¼ æˆåŠŸå¤„ç† */
    // ç§»é™¤å¿ƒæ­»äº¡ä¸´æ—¶æ–‡ä»¶
    handleHeartDeathTempRemove(file, fileList) {
      this.tempHeartDeathFileList = fileList;
    },
    // è„‘死亡上传成功处理
    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(),
            type: this.currentUploadType,
            typeName: this.getCurrentTypeLabel,
            typeName: this.getCurrentBrainDeathTypeLabel,
            fileName: file.name,
            fileSize: file.size,
            uploadTime: new Date().toISOString(),
@@ -587,8 +912,8 @@
          this.attachmentList.push(newAttachment);
        }
        // æ›´æ–°é™„ä»¶JSON数据到表单
        this.form.rememberAnnex = this.buildAttachmentJson();
        // æ›´æ–°è„‘死亡附件JSON数据到表单
        this.form.rememberAnnex = this.buildBrainDeathAttachmentJson();
        this.$message.success("文件上传成功");
        this.uploadDialogVisible = false;
@@ -598,45 +923,60 @@
        this.$message.error(response.msg || "文件上传失败");
      }
    },
    // æäº¤ä¸Šä¼ 
    async submitUpload() {
    // å¿ƒæ­»äº¡ä¸Šä¼ æˆåŠŸå¤„ç†
    handleHeartDeathUploadSuccess(response, file, fileList) {
      if (response.code === 200) {
        file.url = response.data || response.url;
        for (const file of this.tempHeartDeathFileList) {
          const newAttachment = {
            id: Date.now() + Math.random(),
            type: this.currentHeartDeathUploadType,
            typeName: this.getCurrentHeartDeathTypeLabel,
            fileName: file.name,
            fileSize: file.size,
            uploadTime: new Date().toISOString(),
            uploader: "当前用户",
            fileUrl: file.url
          };
          this.heartDeathAttachmentList.push(newAttachment);
        }
        // æ›´æ–°å¿ƒæ­»äº¡é™„ä»¶JSON数据到表单
        this.form.heartdeathjudgeannex = this.buildHeartDeathAttachmentJson();
        this.$message.success("文件上传成功");
        this.heartDeathUploadDialogVisible = false;
        this.heartDeathUploadLoading = false;
        this.tempHeartDeathFileList = [];
      } else {
        this.$message.error(response.msg || "文件上传失败");
      }
    },
    // æäº¤è„‘死亡上传
    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;
      // }
    },
    // åˆ é™¤é™„ä»¶
    // æäº¤å¿ƒæ­»äº¡ä¸Šä¼ 
    submitHeartDeathUpload() {
      if (this.tempHeartDeathFileList.length === 0) {
        this.$message.warning("请先选择要上传的文件");
        return;
      }
      this.$refs.heartDeathUploadRef.submit();
      this.heartDeathUploadLoading = true;
    },
    // åˆ é™¤è„‘死亡附件
    handleRemoveAttachment(attachment) {
      this.$confirm("确定要删除这个评估表附件吗?", "提示", {
        confirmButtonText: "确定",
@@ -649,13 +989,33 @@
          );
          if (index !== -1) {
            this.attachmentList.splice(index, 1);
            // æ›´æ–°é™„ä»¶JSON数据到表单
            this.form.rememberAnnex = this.buildAttachmentJson();
            this.form.rememberAnnex = this.buildBrainDeathAttachmentJson();
            this.$message.success("评估表删除成功");
          }
        })
        .catch(() => {});
    },
    // åˆ é™¤å¿ƒæ­»äº¡é™„ä»¶
    handleRemoveHeartDeathAttachment(attachment) {
      this.$confirm("确定要删除这个评估表附件吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          const index = this.heartDeathAttachmentList.findIndex(
            item => item.id === attachment.id
          );
          if (index !== -1) {
            this.heartDeathAttachmentList.splice(index, 1);
            this.form.heartdeathjudgeannex = this.buildHeartDeathAttachmentJson();
            this.$message.success("评估表删除成功");
          }
        })
        .catch(() => {});
    },
    // é¢„览附件
    handlePreview(attachment) {
      if (attachment.fileName.endsWith(".pdf")) {
@@ -673,6 +1033,7 @@
        this.$message.info("该文件类型暂不支持在线预览,请下载后查看");
      }
    },
    // ä¸‹è½½é™„ä»¶
    handleDownload(attachment) {
      const link = document.createElement("a");
@@ -681,13 +1042,19 @@
      link.click();
      this.$message.success(`开始下载: ${attachment.fileName}`);
    },
    // ç¼–辑信息
    handleEdit() {
      this.isEdit = true;
    },
    // ä¿å­˜ä¿¡æ¯
    async handleSave() {
      this.$refs.form.validate(async valid => {
      // æ ¹æ®å½“前标签选择验证规则
      let formRef =
        this.activeJudgmentType === "brain" ? "brainForm" : "heartForm";
      this.$refs[formRef].validate(async valid => {
        if (valid) {
          this.saveLoading = true;
@@ -697,7 +1064,8 @@
              ...this.form,
              infoid: this.infoid,
              // ç¡®ä¿é™„件数据最新
              rememberannex: this.buildAttachmentJson()
              rememberAnnex: this.buildBrainDeathAttachmentJson(),
              heartdeathjudgeannex: this.buildHeartDeathAttachmentJson()
            };
            let response = null;
@@ -706,7 +1074,6 @@
            } else {
              response = await deathinfoadd(submitData);
            }
            // const response = await deathinfoedit(submitData);
            if (response.code === 200) {
              this.$message.success("保存成功");
@@ -729,6 +1096,7 @@
        }
      });
    },
    // æ–‡ä»¶å¤§å°æ ¼å¼åŒ–
    formatFileSize(size) {
      if (size === 0) return "0 B";
@@ -737,6 +1105,7 @@
      const i = Math.floor(Math.log(size) / Math.log(k));
      return parseFloat((size / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
    },
    // æ—¶é—´æ ¼å¼åŒ–
    parseTime(time) {
      if (!time) return "";
@@ -763,17 +1132,60 @@
  padding: 20px;
}
.detail-card {
.type-card {
  margin-bottom: 20px;
  border: none;
  box-shadow: none;
}
.attachment-card {
.type-card >>> .el-tabs__item {
  font-size: 16px;
  font-weight: bold;
  padding: 0 20px;
  height: 50px;
  line-height: 50px;
}
.type-card >>> .el-tabs__item.is-active {
  color: #409eff;
  border-bottom: 3px solid #409eff;
}
.detail-card {
  margin-bottom: 20px;
  border: 1px solid #e6ebf5;
  border-radius: 8px;
  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.common-info-card {
  border-top: 2px solid #67c23a;
}
.detail-card >>> .el-card__header {
  background-color: #f5f7fa;
  border-bottom: 1px solid #e6ebf5;
  padding: 15px 20px;
}
.detail-title {
  font-size: 16px;
  font-size: 18px;
  font-weight: bold;
  color: #303133;
}
.attachment-section {
  margin-top: 20px;
  padding-top: 20px;
  border-top: 1px solid #e6ebf5;
}
.attachment-header h3 {
  font-size: 16px;
  color: #303133;
  margin-bottom: 15px;
  padding-bottom: 10px;
  border-bottom: 1px solid #eee;
}
.attachment-upload-section {
@@ -785,6 +1197,7 @@
  justify-content: space-between;
  align-items: center;
  margin-bottom: 15px;
  padding: 10px 0;
}
.upload-title {
@@ -802,6 +1215,9 @@
  text-align: center;
  padding: 40px 0;
  color: #909399;
  border: 1px dashed #dcdfe6;
  border-radius: 4px;
  margin-top: 20px;
}
/* å›¾ç‰‡é¢„览对话框样式 */
src/views/business/decide/index.vue
@@ -95,12 +95,22 @@
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column
        <!--
         <el-table-column
          label="案例编号"
          align="center"
          prop="caseNo"
          width="120"
        />
         <el-table-column
          label="治疗医院"
          align="center"
          prop="treatmenthospitalname"
          width="180"
          show-overflow-tooltip
        />
        -->
        <el-table-column
          label="住院号"
          align="center"
@@ -108,7 +118,7 @@
          width="120"
        />
        <el-table-column
          label="捐献者姓名"
          label="姓名"
          align="center"
          prop="name"
          width="120"
@@ -122,13 +132,7 @@
          </template>
        </el-table-column>
        <el-table-column label="年龄" align="center" prop="age" width="80" />
        <el-table-column
          label="治疗医院"
          align="center"
          prop="treatmenthospitalname"
          width="180"
          show-overflow-tooltip
        />
        <el-table-column
          label="疾病诊断"
          align="center"
@@ -175,7 +179,7 @@
          width="120"
        />
        <el-table-column
          label="记录状态"
          label="判定状态"
          align="center"
          prop="recordstate"
          width="100"
@@ -187,7 +191,7 @@
          </template>
        </el-table-column>
        <el-table-column
          label="创建时间"
          label="判定时间"
          align="center"
          prop="createTime"
          width="160"
src/views/business/ethicalReview/index.vue
@@ -116,6 +116,30 @@
      >
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column
          label="住院号"
          align="center"
          prop="inpatientno"
          width="120"
        />
        <el-table-column
          label="姓名"
          align="center"
          prop="name"
          width="100"
        />
        <el-table-column label="性别" align="center" prop="sex" width="80">
          <template slot-scope="scope">
            <dict-tag
              :options="dict.type.sys_user_sex"
              :value="scope.row.sex"
            />
          </template>
        </el-table-column>
        <el-table-column label="年龄" align="center" prop="age" width="80" />
        <!--
        <el-table-column
          label="案例编号"
          align="center"
          prop="caseNo"
@@ -128,27 +152,6 @@
          width="120"
        />
        <el-table-column
          label="姓名"
          align="center"
          prop="name"
          width="100"
        />
        <el-table-column
          label="住院号"
          align="center"
          prop="inpatientno"
          width="120"
        />
        <el-table-column label="性别" align="center" prop="sex" width="80">
          <template slot-scope="scope">
            <dict-tag
              :options="dict.type.sys_user_sex"
              :value="scope.row.sex"
            />
          </template>
        </el-table-column>
        <el-table-column label="年龄" align="center" prop="age" width="80" />
        <el-table-column
          label="血型"
          align="center"
          prop="bloodtype"
@@ -160,6 +163,22 @@
          prop="idcardno"
          width="180"
        />
        <el-table-column
          label="医疗机构"
          align="center"
          prop="treatmenthospitalname"
          min-width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="专家姓名"
          align="center"
          prop="expertName"
          width="100"
        />
        -->
        <el-table-column
          label="疾病诊断"
          align="center"
@@ -168,14 +187,7 @@
          show-overflow-tooltip
        />
        <el-table-column
          label="医疗机构"
          align="center"
          prop="treatmenthospitalname"
          min-width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="伦理状态"
          label="审查状态"
          align="center"
          prop="status"
          width="100"
@@ -188,7 +200,7 @@
          </template>
        </el-table-column>
        <el-table-column
          label="专家结论"
          label="审查结论"
          align="center"
          prop="expertConclusion"
          width="120"
@@ -201,20 +213,14 @@
          </template>
        </el-table-column>
        <el-table-column
          label="专家意见"
          label="审查意见"
          align="center"
          prop="expertOpinion"
          min-width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="专家姓名"
          align="center"
          prop="expertName"
          width="100"
        />
        <el-table-column
          label="结论时间"
          label="审查时间"
          align="center"
          prop="expertTime"
          width="160"
src/views/business/maintain/index.vue
@@ -8,7 +8,7 @@
        :inline="true"
        label-width="100px"
      >
        <el-form-item label="捐献者姓名" prop="name">
        <el-form-item label="姓名" prop="name">
          <el-input
            v-model="queryParams.name"
            placeholder="请输入捐献者姓名"
@@ -17,25 +17,7 @@
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="所在医疗机构" prop="treatmenthospitalname">
          <el-input
            v-model="queryParams.treatmenthospitalname"
            placeholder="请输入医疗机构"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="协调员" prop="coordinatorName">
          <el-input
            v-model="queryParams.coordinatorName"
            placeholder="请输入协调员姓名"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="患者状态" prop="recordstate">
        <el-form-item label="案例进度" prop="recordstate">
          <el-select
            v-model="queryParams.recordstate"
            placeholder="请选择记录状态"
@@ -49,10 +31,10 @@
            <el-option label="未完成捐献" value="5" />
          </el-select>
        </el-form-item>
        <el-form-item label="年龄范围" prop="ageRange">
        <el-form-item label="年龄" prop="ageRange">
          <el-input
            v-model="queryParams.startAge"
            placeholder="最小年龄"
            placeholder="0"
            clearable
            style="width: 95px"
            @keyup.enter.native="handleQuery"
@@ -60,13 +42,13 @@
          <span style="margin: 0 5px">-</span>
          <el-input
            v-model="queryParams.endAge"
            placeholder="最大年龄"
            placeholder="70"
            clearable
            style="width: 95px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="档案录入时间" prop="recordTimeRange">
        <el-form-item label="入院时间" prop="recordTimeRange">
          <el-date-picker
            v-model="queryParams.recordTimeRange"
            type="daterange"
@@ -75,6 +57,16 @@
            end-placeholder="结束日期"
            value-format="yyyy-MM-dd"
            style="width: 240px"
          />
        </el-form-item>
        <el-form-item label="协调员" prop="coordinatorName">
          <el-input
            v-model="queryParams.coordinatorName"
            placeholder="请输入协调员姓名"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item>
@@ -113,20 +105,28 @@
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55" align="center" />
        <!-- <el-table-column
        <!--
        <el-table-column
          label="案例编号"
          align="center"
          prop="caseNo"
          width="120"
        /> -->
         <el-table-column
        />
        -->
        <el-table-column
          label="捐献编号"
          align="center"
          prop="inpatientno"
          width="120"
        />
        <el-table-column
          label="住院号"
          align="center"
          prop="inpatientno"
          width="120"
        />
        <el-table-column
          label="潜在捐献者姓名"
          label="姓名"
          align="center"
          prop="name"
          width="120"
@@ -159,6 +159,9 @@
          min-width="180"
          show-overflow-tooltip
        />
<<<<<<< HEAD
=======
        <el-table-column
          label="首诊医疗机构"
          align="center"
@@ -185,6 +188,7 @@
          prop="coordinatorName"
          width="100"
        />
>>>>>>> 059398ad3ad81ea49dfb75ac09f268bc0b0f6145
        <!-- <el-table-column
          label="维护项目"
          align="center"
@@ -192,6 +196,20 @@
          width="120"
          show-overflow-tooltip
        /> -->
        <el-table-column
          label="首次维护时间"
          align="center"
          prop="updateTime"
          width="140"
        >
          <template slot-scope="scope">
            <span>{{
              scope.row.updateTime
                ? parseTime(scope.row.updateTime)
                : "-"
            }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="最新维护时间"
          align="center"
@@ -211,6 +229,36 @@
          align="center"
          prop="updateBy"
          width="120"
        /><el-table-column
          label="入院时间"
          align="center"
          prop="treatmenthospitalname"
          width="150"
          show-overflow-tooltip
        /><el-table-column
          label="上报医院"
          align="center"
          prop="treatmenthospitalname"
          width="150"
          show-overflow-tooltip
        />
        <!-- <el-table-column
          label="状态"
          align="center"
          prop="recordstate"
          width="120"
        >
          <template slot-scope="scope">
            <el-tag :type="statusFilter(scope.row.recordstate)">
              {{ statusTextFilter(scope.row.recordstate) }}
            </el-tag>
          </template>
        </el-table-column> -->
        <el-table-column
          label="协调员"
          align="center"
          prop="coordinatorName"
          width="100"
        />
        <el-table-column
          label="操作"
src/views/business/transfer/index.vue
@@ -8,7 +8,7 @@
        :inline="true"
        label-width="80px"
      >
        <el-form-item label="案例编号" prop="caseNo">
        <el-form-item label="上报医院" prop="caseNo">
          <el-input
            v-model="queryParams.caseNo"
            placeholder="请输入案例编号"
@@ -17,7 +17,7 @@
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="患者姓名" prop="patName">
        <el-form-item label="姓名" prop="patName">
          <el-input
            v-model="queryParams.patName"
            placeholder="请输入患者姓名"
@@ -41,7 +41,7 @@
            <el-option label="暂存" :value="5" />
          </el-select>
        </el-form-item>
        <el-form-item label="创建时间">
        <el-form-item label="转运时间">
          <el-date-picker
            v-model="dateRange"
            style="width: 240px"
@@ -149,24 +149,7 @@
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="序号" type="index" width="60" align="center" />
      <el-table-column
        label="案例编号"
        align="center"
        prop="caseNo"
        width="140"
      />
      <el-table-column
        label="转运状态"
        align="center"
        prop="transitStatus"
        width="100"
      >
        <template slot-scope="scope">
          <el-tag :type="getStatusTagType(scope.row.transitStatus)">
            {{ getStatusText(scope.row.transitStatus) }}
          </el-tag>
        </template>
      </el-table-column>
      <el-table-column label="编号" align="center" prop="caseNo" width="140" />
      <el-table-column label="患者信息" align="center" width="260">
        <template slot-scope="scope">
          <div class="donor-info">
@@ -189,11 +172,17 @@
        show-overflow-tooltip
      />
      <el-table-column
        label="治疗医院"
        label="转运状态"
        align="center"
        prop="treatmentHospitalName"
        width="150"
      />
        prop="transitStatus"
        width="100"
      >
        <template slot-scope="scope">
          <el-tag :type="getStatusTagType(scope.row.transitStatus)">
            {{ getStatusText(scope.row.transitStatus) }}
          </el-tag>
        </template>
      </el-table-column>
      <el-table-column
        label="计划转运时间"
        align="center"
@@ -201,12 +190,18 @@
        width="160"
      />
      <el-table-column
        label="负责协调员"
        label="协调员"
        align="center"
        prop="contactPerson"
        width="100"
      />
      <el-table-column
        label="上报医院"
        align="center"
        prop="treatmentHospitalName"
        width="150"
      />
      <el-table-column
        label="创建时间"
        align="center"
@@ -430,7 +425,9 @@
      append-to-body
    >
      <div class="action-confirm">
        <p>确定要{{ actionText }}转运单 "{{ currentTransport.id }}" å—?</p>
        <p>
          ç¡®å®šè¦{{ actionText }}转运单 "{{ currentTransport.patName }}" å—?
        </p>
      </div>
      <div slot="footer" class="dialog-footer">
        <el-button @click="actionOpen = false">取 æ¶ˆ</el-button>
@@ -447,7 +444,9 @@
  transportEdit,
  transportDel,
  transportInfo,
  donateList
  donateInfo,
  donateList,
  donateEdit
} from "@/api/businessApi/index";
import TransportDetail from "./transportDetail";
import TransportEdit from "./TransportEdit";
@@ -800,7 +799,7 @@
    async confirmAction() {
      try {
        let requestData = {
          id: this.currentTransport.id
          ...this.currentTransport
        };
        if (this.actionText === "开始") {
@@ -811,8 +810,17 @@
        const response = await transportEdit(requestData);
        if (response.code === 200) {
        if (response.code == 200) {
          this.$modal.msgSuccess(`${this.actionText}转运成功`);
          if (requestData.transitStatus==3) {
            const resappear = await donateInfo(requestData.reportId);
            if (resappear.code) {
              let obj = resappear.data;
              obj.isDonate = 1;
              await donateEdit(obj);
              this.$modal.msgSuccess(`对应上报案例已进入正式案例流程`);
            }
          }
          this.getList();
        } else {
          this.$modal.msgError(response.msg || `${this.actionText}转运失败`);
src/views/project/donatebaseinfo/EditCaseModal.vue
@@ -180,10 +180,10 @@
        <el-card header="医疗信息" class="form-section">
          <el-row :gutter="20">
            <el-col :span="8">
              <el-form-item label="当前医院" prop="Reporttothehospital">
              <el-form-item label="入院时间" prop="Reporttothehospital">
                <el-input
                  v-model="formData.Reporttothehospital"
                  placeholder="请输入上报医院"
                  placeholder="请输入入院时间"
                />
              </el-form-item>
src/views/project/donatebaseinfo/index.vue
@@ -10,7 +10,7 @@
    >
      <el-row :gutter="8">
        <el-col :span="5">
          <el-form-item label="捐献者姓名" prop="name">
          <el-form-item label="姓名" prop="name">
            <el-input
              v-model="queryParams.name"
              placeholder="请输入姓名"
@@ -21,7 +21,7 @@
          </el-form-item>
        </el-col>
        <el-col :span="5">
          <el-form-item label="上报医院" prop="treatmenthospitalname">
          <el-form-item label="报告医院" prop="treatmenthospitalname">
            <org-selecter
              ref="orgSelecter"
              :org-type="'3'"
@@ -30,7 +30,7 @@
          </el-form-item>
        </el-col>
        <el-col :span="9">
          <el-form-item label="上报时间">
          <el-form-item label="报告时间">
            <el-date-picker
              style="width: 100%"
              v-model="selecttime"
@@ -89,6 +89,7 @@
      border
      :default-sort="{ prop: 'donatetime', order: 'descending' }"
    >
      <el-table-column label="姓名" align="center" prop="name" width="100" />
      <el-table-column
        label="案例时间"
        align="center"
@@ -100,12 +101,40 @@
        </template>
      </el-table-column>
      <el-table-column
        label="捐献进度"
        align="center"
        prop="workflow"
        width="120"
      >
        <template slot-scope="scope">
          <div v-if="!scope.row.terminationCase">
            <dict-tag
              :options="dict.type.sys_donornode"
              :value="scope.row.workflow"
            />
          </div>
          <div v-else><el-button type="danger" plain>任务终止</el-button></div>
        </template>
      </el-table-column>
      <el-table-column
        label="捐献类别"
        align="center"
        prop="donationcategory"
        width="150"
      >
        <template slot-scope="scope">
          <dict-tag
            :options="dict.type.sys_DonationCategory"
            :value="scope.row.donationcategory"
          />
        </template>
      </el-table-column>
      <el-table-column
        label="案例编号"
        align="center"
        prop="caseNo"
        width="200"
      />
      <el-table-column label="捐献者姓名" align="center" prop="name" width="100" />
      <el-table-column label="性别" align="center" prop="sex" width="100">
        <template slot-scope="scope">
          <dict-tag
@@ -129,12 +158,16 @@
          }}
        </template>
      </el-table-column>
<<<<<<< HEAD
      <el-table-column label="GCS评分" align="center" prop="gcsScore" width="100"/>
=======
      <el-table-column
        label="上报医院"
        align="center"
        prop="treatmenthospitalname"
      />
      <el-table-column label="GCS评分" align="center" prop="gcsScore" />
>>>>>>> 059398ad3ad81ea49dfb75ac09f268bc0b0f6145
      <el-table-column label="血型" align="center" prop="bloodtype" width="100">
        <template slot-scope="scope">
          <dict-tag
@@ -144,40 +177,16 @@
        </template>
      </el-table-column>
      <el-table-column
        label="捐献类别"
        label="报告医院"
        align="center"
        prop="donationcategory"
        width="150"
      >
        <template slot-scope="scope">
          <dict-tag
            :options="dict.type.sys_DonationCategory"
            :value="scope.row.donationcategory"
          />
        </template>
      </el-table-column>
        prop="treatmenthospitalname"
      />
      <el-table-column
        label="报告人"
        align="center"
        prop="reportername"
        width="100"
      />
      <el-table-column
        label="捐献进度"
        align="center"
        prop="workflow"
        width="120"
      >
        <template slot-scope="scope">
          <div v-if="!scope.row.terminationCase">
            <dict-tag
              :options="dict.type.sys_donornode"
              :value="scope.row.workflow"
            />
          </div>
          <div v-else><el-button type="danger" plain>任务终止</el-button></div>
        </template>
      </el-table-column>
      <el-table-column
        label="操作"
        width="190"
vue.config.js
@@ -33,8 +33,8 @@
    proxy: {
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        // target:`http://localhost:8080`,
        target:`http://192.168.100.10:8080`,
        target:`http://localhost:8080`,
        // target:`http://192.168.100.10:8080`,
        // target:`http://192.168.100.137:8080`,
        // target: `https://slb.hospitalstar.com:9093`,
        changeOrigin: true,