From dc082351978a1e9f75d7a1471a0ca7ebeac552a5 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期一, 01 六月 2026 11:07:50 +0800
Subject: [PATCH] opo维护

---
 src/views/project/travelexpensedeal/index.vue                         |    8 
 src/views/business/OrganUtilization/index.vue                         |   62 
 vue.config.js                                                         |  132 
 src/components/MaintainComponents/UrineRoutinePanel.vue               |    2 
 src/views/business/transfer/TransportEdit.vue                         |   45 
 src/views/project/donatebaseinfo/index.vue                            |  119 
 src/views/business/ethicalReview/ethicalReviewInfo.vue                |  724 ++++++-
 src/views/project/reimbursementpayee/index.vue                        |   12 
 src/views/business/course/components/DeathJudgmentStage.vue           |    4 
 src/views/business/GetWitness/GetWitnessInfo.vue                      |   32 
 src/views/project/donatereview/index.vue                              |    4 
 src/views/business/appear/index.vue                                   |   33 
 src/views/business/OrganUtilization/OrganUtilizationInfo.vue          |   57 
 src/views/business/course/components/components/BloodRoutinePanel.vue |    2 
 src/views/project/relativesconfirmation/index.vue                     |    4 
 src/views/project/funddetail/index.vue                                |    4 
 src/api/project/donatebaseinfo.js                                     |   83 
 src/components/CaseBasicInfo/index.vue                                |   37 
 src/views/business/affirm/affirmInfo.vue                              |  231 +
 src/views/business/maintain/maintainInfo.vue                          |  120 +
 src/components/CaseStageAttachmentsDialog/index.vue                   |  535 +++++
 src/api/businessApi/ethicalReview.js                                  |   61 
 src/views/project/donationdetails/index.vue                           |   14 
 管理端 (3).zip                                                           |    0 
 src/views/project/donatebaseinfo/EditCaseModal.vue                    |   47 
 src/views/business/course/components/DonationConfirmStage.vue         |    4 
 src/views/business/course/components/OrganAllocationStage.vue         |    2 
 src/views/business/decide/DecideInfo.vue                              |   29 
 管理端.zip                                                               |    0 
 src/views/business/decide/index.vue                                   |    6 
 src/components/MaintainComponents/LiverKidneyPanel.vue                |    2 
 src/components/MaintainComponents/BloodRoutinePanel.vue               |    1 
 src/utils/request.js                                                  |    2 
 src/views/business/course/index.vue                                   |  522 ++---
 src/views/project/donatebaseinfo/Archivedpage.vue                     |  322 +++
 /dev/null                                                             | 1536 ---------------
 src/views/business/transfer/index.vue                                 |   63 
 src/views/login.vue                                                   |    3 
 src/views/business/course/components/EthicalReviewStage.vue           |    6 
 src/views/project/DonationProcess/index.vue                           |   14 
 src/views/business/allocation/allocationInfo.vue                      |  860 +++++++-
 src/views/business/appear/caseDetail.vue                              |    8 
 src/views/business/course/components/components/UrineRoutinePanel.vue |    2 
 管理端 (2).zip                                                           |    0 
 src/views/project/externalperson/index.vue                            |    7 
 src/views/project/distributedetail/index.vue                          |    8 
 src/views/business/course/components/components/LiverKidneyPanel.vue  |    2 
 47 files changed, 3,270 insertions(+), 2,501 deletions(-)

diff --git a/src/api/businessApi/ethicalReview.js b/src/api/businessApi/ethicalReview.js
index cda4d19..ba15f35 100644
--- a/src/api/businessApi/ethicalReview.js
+++ b/src/api/businessApi/ethicalReview.js
@@ -1,57 +1,72 @@
-import request from '@/utils/request'
+import request from "@/utils/request";
 
 // 妗堜緥鍒楄〃鍙婅鎯�
 export function reviewinitiateBaseInfoList(data) {
   return request({
-    url: '/project/ethicalreviewinitiate/reviewinitiateBaseInfoList',
-    method: 'post',
+    url: "/project/ethicalreviewinitiate/reviewinitiateBaseInfoList",
+    method: "post",
     data: data
-  })
+  });
 }
 // 浼︾悊瀹℃煡淇℃伅淇敼
 export function ethicalreviewadd(data) {
   return request({
-    url: '/project/ethicalreviewinitiate/add',
-    method: 'post',
+    url: "/project/ethicalreviewinitiate/add",
+    method: "post",
     data: data
-  })
+  });
 }
 // 浼︾悊瀹℃煡淇℃伅淇敼
 export function ethicalreviewedit(data) {
   return request({
-    url: '/project/ethicalreviewinitiate/edit',
-    method: 'post',
+    url: "/project/ethicalreviewinitiate/edit",
+    method: "post",
     data: data
-  })
+  });
 }
 // 瀹℃煡涓撳缁熻
 export function ethicalreExpertTotal(query) {
   return request({
-    url: '/project/ethicalreviewopinions/expertTotal',
-   method: 'get',
+    url: "/project/ethicalreviewopinions/expertTotal",
+    method: "get",
     params: query
-  })
+  });
 }
 // 浼︾悊瀹℃煡淇℃伅璇︽儏
 export function ethicalreviewInfo(id) {
   return request({
-    url: '/project/ethicalreviewinitiate/getInfo/' + id,
-    method: 'get'
-  })
+    url: "/project/ethicalreviewinitiate/getInfo/" + id,
+    method: "get"
+  });
+}
+// 浼︾悊瀹℃煡淇℃伅infoid鏌ヨ璇︽儏
+export function ethicalreviewgetInfoID(query) {
+  return request({
+    url: "/project/ethicalreviewinitiate/getInfoID",
+    method: "get",
+    params: query
+  });
 }
 // 瀹℃煡鍗曠姸鎬佸彉鏇�
 export function ethicalreviewreceiveStatus(id) {
   return request({
-    url: '/project/ethicalreviewopinions/receiveStatus',
-    method: 'get'
-  })
+    url: "/project/ethicalreviewopinions/receiveStatus",
+    method: "get"
+  });
 }
 // 涓撳娑堟伅鎺ㄩ��
 export function sendNotification(data) {
   return request({
-    url: '/system/dingtalk/sendNotification',
-     method: 'post',
+    url: "/system/dingtalk/sendNotification",
+    method: "post",
     data: data
-  })
+  });
 }
-
+// 鐭俊
+export function sendcall(data) {
+  return request({
+    url: "/sms/send",
+    method: "post",
+    data: data
+  });
+}
diff --git a/src/api/project/donatebaseinfo.js b/src/api/project/donatebaseinfo.js
index ee6177b..7558e61 100644
--- a/src/api/project/donatebaseinfo.js
+++ b/src/api/project/donatebaseinfo.js
@@ -1,101 +1,110 @@
-import request from '@/utils/request'
+import request from "@/utils/request";
 
 // 鏌ヨ鎹愮尞鍩虹鍒楄〃
 export function listDonatebaseinfo(data) {
   return request({
-    url: '/project/donatebaseinfo/list',
-    method: 'post',
+    url: "/project/donatebaseinfo/list",
+    method: "post",
     data: data
-  })
+  });
 }
 export function listDonationProcess(query) {
   return request({
-    url: '/VDonationworkflow/donationworkflow/list',
-    method: 'get',
+    url: "/VDonationworkflow/donationworkflow/list",
+    method: "get",
     params: query
-  })
+  });
 }
 
 // 鏌ヨ鎹愮尞鍩虹璇︾粏
 export function getDonatebaseinfo(id) {
   return request({
-    url: '/project/donatebaseinfo/' + id,
-    method: 'get'
-  })
+    url: "/project/donatebaseinfo/" + id,
+    method: "get"
+  });
+}
+
+// 鑾峰彇鎹愮尞缂栧彿
+export function getfileList(data) {
+  return request({
+    url: "/project/donatebaseinfo/fileList",
+    method: "get",
+    params: data
+  });
 }
 // 鑾峰彇鎹愮尞缂栧彿
 export function getDonationNumber(data) {
   return request({
-    url: '/project/donatebaseinfo/donatenumber',
-    method: 'post',
+    url: "/project/donatebaseinfo/donatenumber",
+    method: "post",
     data: data
-  })
+  });
 }
 // 鏌ヨ鎹愮尞宸ヤ綔娴�
 export function getDonatebaseinfoflow(id) {
   return request({
-    url: '/project/donatebaseinfo/getWorkFlow/' + id,
-    method: 'get'
-  })
+    url: "/project/donatebaseinfo/getWorkFlow/" + id,
+    method: "get"
+  });
 }
 
 // 鏂板鎹愮尞鍩虹
 export function addDonatebaseinfo(data) {
   return request({
-    url: '/project/donatebaseinfo/add',
-    method: 'post',
+    url: "/project/donatebaseinfo/add",
+    method: "post",
     data: data
-  })
+  });
 }
 
 // 淇敼鎹愮尞鍩虹
 export function updateDonatebaseinfo(data) {
   return request({
-    url: '/project/donatebaseinfo/edit',
-    method: 'post',
+    url: "/project/donatebaseinfo/edit",
+    method: "post",
     data: data
-  })
+  });
 }
 
 // 鍒犻櫎鎹愮尞鍩虹
 export function delDonatebaseinfo(id) {
   return request({
-    url: '/project/donatebaseinfo/remove/' + id,
-    method: 'get',
-  })
+    url: "/project/donatebaseinfo/remove/" + id,
+    method: "get"
+  });
 }
 
 // 瀵煎嚭鎹愮尞鍩虹
 export function exportDonatebaseinfo(query) {
   return request({
-    url: '/project/donatebaseinfo/export',
-    method: 'get',
+    url: "/project/donatebaseinfo/export",
+    method: "get",
     params: query
-  })
+  });
 }
 
 // 鑾峰彇鎹愮尞缂栧彿
 export function getdonatorno(data) {
   // console.log("鑾峰彇鎹愮尞缂栧彿锛氬叆鍙傦細" + JSON.stringify(data));
   return request({
-    url: '/project/donatebaseinfo/donatenumber',
-    method: 'get',
+    url: "/project/donatebaseinfo/donatenumber",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 涓嬭浇浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃
 export function downloadbaseinfo(id) {
   return request({
-    url: '/project/donatebaseinfo/download/' + id,
-    method: 'get'
-  })
+    url: "/project/donatebaseinfo/download/" + id,
+    method: "get"
+  });
 }
 // 涓嬭浇浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃
 export function fileCase(data) {
   return request({
-    url: '/project/pdfmerge/merge',
-    method: 'get',
+    url: "/project/pdfmerge/merge",
+    method: "get",
     params: data
-  })
+  });
 }
diff --git a/src/components/CaseBasicInfo/index.vue b/src/components/CaseBasicInfo/index.vue
index 045e856..b992cc3 100644
--- a/src/components/CaseBasicInfo/index.vue
+++ b/src/components/CaseBasicInfo/index.vue
@@ -2,6 +2,16 @@
   <el-card class="basic-info-card" v-loading="loading">
     <div slot="header" class="clearfix">
       <span>妗堜緥鍩烘湰淇℃伅</span>
+
+      <el-button
+        v-if="showAttachment"
+        type="text"
+        style="float: right; margin-left: 12px"
+        @click="openStageAttachments"
+      >
+        <i class="el-icon-folder"></i> 鏌ョ湅鍚勯樁娈甸檮浠�
+      </el-button>
+
       <el-button
         v-if="showAttachment && hasAttachments"
         style="float: right; padding: 3px 0"
@@ -100,14 +110,24 @@
     <div v-else class="empty-state">
       <el-empty description="鏆傛棤妗堜緥淇℃伅" :image-size="100"></el-empty>
     </div>
+    <!-- 鍚勯樁娈甸檮浠跺脊妗� -->
+    <case-stage-attachments-dialog
+      ref="stageDialog"
+      :case-id="caseId"
+      :selected-ids="selectedAttachmentIds"
+      @confirm="onAttachmentsConfirm"
+    />
   </el-card>
 </template>
 
 <script>
-import { getDonatebaseinfo } from "@/api/project/donatebaseinfo";
+import { getDonatebaseinfo, getfileList } from "@/api/project/donatebaseinfo";
+import CaseStageAttachmentsDialog from "@/components/CaseStageAttachmentsDialog";
 
 export default {
   name: "CaseBasicInfoSimple",
+  components: { CaseStageAttachmentsDialog },
+
   props: {
     // 妗堜緥ID
     caseId: {
@@ -173,7 +193,9 @@
       basicData: null,
       // 瀛楀吀閫夐」
       sexOptions: [],
-      bloodTypeOptions: []
+      bloodTypeOptions: [],
+      selectedAttachmentIds: ["123", "456"],
+      finalAttachments: []
     };
   },
   computed: {
@@ -234,7 +256,16 @@
         console.warn("鍔犺浇瀛楀吀澶辫触:", error);
       }
     },
+    // 鎵撳紑鍚勯樁娈甸檮浠跺脊妗�
+    openStageAttachments() {
+      this.$refs.stageDialog.open();
+    },
 
+    onAttachmentsConfirm(list) {
+      this.finalAttachments = list;
+      console.log("閫変腑鐨勯樁娈甸檮浠讹細", list);
+      // 鍙洿鎺ユ彁浜ょ粰鎺ュ彛
+    },
     // 鍔犺浇鍩烘湰淇℃伅
     async loadBasicInfo() {
       if (!this.caseId) return;
@@ -245,7 +276,7 @@
 
         if (response.code === 200) {
           this.basicData = this.mapApiData(response.data);
-          console.log(this.basicData );
+          console.log(this.basicData);
 
           this.loading = false;
         } else {
diff --git a/src/components/CaseStageAttachmentsDialog/index.vue b/src/components/CaseStageAttachmentsDialog/index.vue
new file mode 100644
index 0000000..ddcd28d
--- /dev/null
+++ b/src/components/CaseStageAttachmentsDialog/index.vue
@@ -0,0 +1,535 @@
+<template>
+  <el-dialog
+    title="妗堜緥鍚勯樁娈甸檮浠�"
+    :visible.sync="visible"
+    width="1200px"
+    top="4vh"
+    append-to-body
+    :close-on-click-modal="false"
+    @closed="handleClosed"
+  >
+    <!-- 闃舵 Tabs -->
+    <el-tabs v-model="activeStage" type="card" @tab-click="handleStageChange">
+      <el-tab-pane
+        v-for="stage in stageTypes"
+        :key="stage.value"
+        :label="stage.label"
+        :name="stage.value"
+      >
+        <!-- 闃舵鍐呯殑闄勪欢绫诲瀷 Tabs -->
+        <div class="stage-content">
+          <el-tabs v-model="activeType" type="border-card">
+            <el-tab-pane
+              v-for="type in getTypesByStage(stage.value)"
+              :key="type.value"
+              :label="type.label"
+              :name="type.value"
+            >
+              <!-- 闄勪欢鍒楄〃 -->
+              <div class="attachment-list">
+                <el-table
+                  :data="getAttachmentsByStageAndType(stage.value, type.value)"
+                  size="small"
+                  v-loading="loading"
+                  style="width: 100%;"
+                  @row-click="handleRowClick"
+                  :row-class-name="tableRowClassName"
+                >
+                  <el-table-column label="鏂囦欢鍚�" min-width="220">
+                    <template slot-scope="scope">
+                      <i
+                        class="el-icon-document"
+                        style="color: #409EFF; margin-right: 8px;"
+                      ></i>
+                      <span class="file-name">{{ scope.row.fileName }}</span>
+                    </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>{{ formatDateTime(scope.row.uploadTime) }}</span>
+                    </template>
+                  </el-table-column>
+
+                  <el-table-column label="涓婁紶浜�" width="120" 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="primary"
+                        @click="handlePreview(scope.row)"
+                      >
+                        棰勮
+                      </el-button>
+                      <el-button
+                        size="mini"
+                        type="danger"
+                        @click="handleDownload(scope.row)"
+                      >
+                        涓嬭浇
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+
+                <!-- 绌虹姸鎬� -->
+                <div
+                  v-if="
+                    getAttachmentsByStageAndType(stage.value, type.value)
+                      .length === 0
+                  "
+                  class="empty-attachment"
+                >
+                  <el-empty
+                    :description="`鏆傛棤${type.label}闄勪欢`"
+                    :image-size="80"
+                  ></el-empty>
+                </div>
+              </div>
+            </el-tab-pane>
+          </el-tabs>
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="visible = false">鍏抽棴</el-button>
+      <!-- <el-button type="primary" @click="handleConfirm">
+        纭閫夋嫨 ({{ selectedCount }})
+      </el-button> -->
+    </span>
+
+    <!-- 鏂囦欢棰勮寮圭獥 -->
+    <FilePreviewDialog
+      :visible="previewVisible"
+      :file="currentPreviewFile"
+      @close="previewVisible = false"
+      @download="handleDownload"
+    />
+  </el-dialog>
+</template>
+
+<script>
+import { getfileList } from "@/api/project/donatebaseinfo";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
+import { parseTime } from "@/utils/ruoyi";
+
+export default {
+  name: "StageAttachmentsDialog",
+  components: {
+    FilePreviewDialog
+  },
+  props: {
+    caseId: {
+      type: [String, Number],
+      required: true
+    },
+    // 宸查�変腑鐨勯檮浠禝D闆嗗悎锛堢敤浜庡洖鏄撅級
+    selectedIds: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      loading: false,
+
+      // 闃舵瀹氫箟
+      stageTypes: [
+        { value: "death", label: "姝讳骸鍒ゅ畾" },
+        { value: "confirm", label: "鎹愮尞纭" },
+        { value: "maintain", label: "渚涜�呯淮鎶�" },
+        { value: "witness", label: "鍣ㄥ畼鑾峰彇瑙佽瘉" },
+        { value: "ethics", label: "浼︾悊瀹℃煡" }
+      ],
+
+      // 鍚勯樁娈甸檮浠剁被鍨嬪畾涔�
+      typeDefinitions: {
+        death: [
+          { value: "brain", label: "鑴戞浜″垽瀹�" },
+          { value: "heart", label: "蹇冩浜″垽瀹�" }
+        ],
+        confirm: [
+          { value: "1", label: "浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃" },
+          { value: "2", label: "浜轰綋鍣ㄥ畼鎹愮尞浜插睘纭鐧昏琛�" },
+          { value: "3", label: "鎹愮尞鑰呭強鐩寸郴浜插睘韬唤璇併�佹埛鍙g翱鐩稿叧璇佹槑" },
+          { value: "4", label: "鍏皯韬晠鍚庝汉浣撳櫒瀹橈紙瑙掕啘锛夐仐浣撴崘鐚憡鐭ヤ功" },
+          { value: "5", label: "鑴戞浜″垽瀹氱煡鎯呭悓鎰忎功" },
+          { value: "6", label: "蹇冩浜″垽瀹氱煡鎯呭悓鎰忎功" }
+        ],
+        maintain: [
+          { value: "urine", label: "灏垮父瑙�" },
+          { value: "blood", label: "琛�甯歌" },
+          { value: "liver", label: "鑲濊偩鍔熻兘" },
+          { value: "culture", label: "鍩瑰吇缁撴灉" },
+          { value: "nurse", label: "鎶ょ悊璁板綍" }
+        ],
+        witness: [{ value: "deathCert", label: "姝讳骸璇佹槑" }],
+        ethics: [{ value: "review", label: "浼︾悊瀹℃煡鏉愭枡" }]
+      },
+
+      // 褰撳墠婵�娲荤殑Tab
+      activeStage: "death",
+      activeType: "",
+
+      // 鍘熷鎺ュ彛鏁版嵁
+      rawData: null,
+
+      // 澶勭悊鍚庣殑闄勪欢鏁版嵁 stage -> type -> list
+      attachmentData: {},
+
+      // 閫変腑鐨勯檮浠堕泦鍚�
+      selectedAttachments: new Map(),
+
+      // 棰勮鐩稿叧
+      previewVisible: false,
+      currentPreviewFile: null
+    };
+  },
+  computed: {
+    // 褰撳墠闃舵涓嬬殑闄勪欢绫诲瀷
+    currentStageTypes() {
+      return this.typeDefinitions[this.activeStage] || [];
+    },
+
+    // 宸查�夋暟閲�
+    selectedCount() {
+      return this.selectedAttachments.size;
+    },
+      selectedCount() {
+    return this.selectedAttachments?.size || 0;
+  }
+  },
+  watch: {
+    selectedIds: {
+      handler(newVal) {
+        this.initSelectedState(newVal);
+      },
+      immediate: true
+    }
+  },
+  methods: {
+    open() {
+      this.visible = true;
+      this.loadData();
+    },
+
+    // 鍒濆鍖栭�変腑鐘舵��
+    initSelectedState(ids) {
+      this.selectedAttachments.clear();
+      ids.forEach(id => {
+        this.selectedAttachments.set(id, true);
+      });
+    },
+
+    // 鍔犺浇鏁版嵁
+    async loadData() {
+      this.loading = true;
+      try {
+        const res = await getfileList({ infoid: this.caseId });
+        if (res.code === 200) {
+          this.rawData = res.data || {};
+          this.processData();
+        }
+      } catch (e) {
+        console.error(e);
+      } finally {
+        this.loading = false;
+      }
+    },
+
+    // 澶勭悊鎺ュ彛鏁版嵁
+    processData() {
+      const d = this.rawData;
+      const result = {};
+
+      // 鍒濆鍖栫粨鏋�
+      this.stageTypes.forEach(stage => {
+        result[stage.value] = {};
+        (this.typeDefinitions[stage.value] || []).forEach(type => {
+          result[stage.value][type.value] = [];
+        });
+      });
+
+      // ===== 1. 姝讳骸鍒ゅ畾 =====
+      (d.deathinfo || []).forEach(item => {
+        this.pushAttachment(
+          result.death,
+          "brain",
+          this.parseAttachments(item.deathjudgeannex)
+        );
+        this.pushAttachment(
+          result.death,
+          "heart",
+          this.parseAttachments(item.heartdeathjudgeannex)
+        );
+      });
+
+      // ===== 2. 鎹愮尞纭 =====
+      (d.relativesconfirmation || []).forEach(item => {
+        this.pushAttachment(
+          result.confirm,
+          "1",
+          this.parseAttachments(item.assessannex)
+        );
+      });
+
+      // ===== 3. 渚涜�呯淮鎶� =====
+      (d.donatemaintenance || []).forEach(item => {
+        try {
+          const itemDesc = JSON.parse(item.itemDesc || "{}");
+          this.pushAttachment(
+            result.maintain,
+            "urine",
+            itemDesc.urineRoutine?.attachments || []
+          );
+          this.pushAttachment(
+            result.maintain,
+            "blood",
+            itemDesc.bloodRoutine?.attachments || []
+          );
+          this.pushAttachment(
+            result.maintain,
+            "liver",
+            itemDesc.liverKidney?.attachments || []
+          );
+          this.pushAttachment(
+            result.maintain,
+            "culture",
+            itemDesc.cultureResults?.flatMap(c => c.attachments || []) || []
+          );
+          this.pushAttachment(
+            result.maintain,
+            "nurse",
+            itemDesc.nursingRecords?.flatMap(n => n.attachments || []) || []
+          );
+        } catch {}
+      });
+
+      // ===== 4. 鍣ㄥ畼鑾峰彇瑙佽瘉 =====
+      (d.donationwitness || []).forEach(item => {
+        this.pushAttachment(
+          result.witness,
+          "deathCert",
+          this.parseAttachments(item.deathjudgeannex)
+        );
+      });
+
+      // ===== 5. 浼︾悊瀹℃煡 =====
+      (d.donateflowcharts || []).forEach(item => {
+        this.pushAttachment(
+          result.ethics,
+          "review",
+          this.parseAttachments(item.filePatch)
+        );
+      });
+
+      this.attachmentData = result;
+
+      this.$nextTick(() => {
+        if (this.currentStageTypes.length > 0) {
+          this.activeType = this.currentStageTypes[0].value;
+        }
+      });
+    },
+
+    // 杈呭姪锛氳В鏋愰檮浠跺瓧娈�
+    parseAttachments(val) {
+      if (!val) return [];
+      if (Array.isArray(val)) return val;
+      try {
+        const arr = JSON.parse(val);
+        return Array.isArray(arr) ? arr : [];
+      } catch {
+        return val
+          .split(";")
+          .filter(Boolean)
+          .map(p => ({ fileName: p.split("/").pop(), fileUrl: p }));
+      }
+    },
+
+    // 杈呭姪锛氭帹閫侀檮浠跺苟琛ュ厖瀛楁
+    pushAttachment(result, type, files) {
+      files.forEach(file => {
+        const attachment = {
+          id: file.id || `${Date.now()}_${Math.random()}`,
+          fileName: file.fileName,
+          fileUrl: file.path || file.fileUrl,
+          fileSize: file.fileSize,
+          uploadTime: file.uploadTime,
+          uploader: file.uploader,
+          type: type,
+          stage: this.activeStage
+        };
+        result[type].push(attachment);
+
+        // // 鍥炴樉閫変腑鐘舵��
+        // if (this.selectedAttachments.has(attachment.id)) {
+        //   attachment._selected = true;
+        // }
+      });
+    },
+
+    // 鑾峰彇鏌愰樁娈典笅鐨勯檮浠剁被鍨�
+    getTypesByStage(stage) {
+      return this.typeDefinitions[stage] || [];
+    },
+
+    // 鑾峰彇闄勪欢鍒楄〃
+    getAttachmentsByStageAndType(stage, type) {
+      return this.attachmentData[stage]?.[type] || [];
+    },
+
+    // 闃舵鍒囨崲
+    handleStageChange() {
+      this.$nextTick(() => {
+        if (this.currentStageTypes.length > 0) {
+          this.activeType = this.currentStageTypes[0].value;
+        }
+      });
+    },
+
+    // 鐐瑰嚮琛岄�夋嫨/鍙栨秷
+    handleRowClick(row) {
+  if (this.selectedAttachments.has(row.id)) {
+    this.selectedAttachments.delete(row.id);
+  } else {
+    this.selectedAttachments.set(row.id, row);
+  }
+},
+    tableRowClassName({ row }) {
+  return this.selectedAttachments.has(row.id)
+    ? "selected-row"
+    : "";
+},
+    // 棰勮
+    handlePreview(row) {
+      this.currentPreviewFile = {
+        fileName: row.fileName,
+        fileUrl: row.fileUrl,
+        fileType: this.getFileType(row.fileName)
+      };
+      this.previewVisible = true;
+    },
+
+    // 涓嬭浇
+    handleDownload(file) {
+      const link = document.createElement("a");
+      link.href = file.fileUrl || file.path;
+      link.download = file.fileName;
+      link.click();
+    },
+
+    // 鑾峰彇鏂囦欢绫诲瀷
+    getFileType(fileName) {
+      const ext = fileName
+        .split(".")
+        .pop()
+        .toLowerCase();
+      if (["jpg", "jpeg", "png"].includes(ext)) return "image";
+      if (ext === "pdf") return "pdf";
+      if (["doc", "docx"].includes(ext)) return "office";
+      return "other";
+    },
+
+    // 鏂囦欢澶у皬鏍煎紡鍖�
+    formatFileSize(size) {
+      if (!size) 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];
+    },
+
+    // 鏃ユ湡鏃堕棿鏍煎紡鍖�
+    formatDateTime(dateTime) {
+      return dateTime ? parseTime(dateTime) : "-";
+    },
+
+    // 纭閫夋嫨
+    handleConfirm() {
+      const result = [];
+      this.selectedAttachments.forEach(attachment => {
+        result.push({
+          id: attachment.id,
+          fileName: attachment.fileName,
+          fileUrl: attachment.fileUrl,
+          fileSize: attachment.fileSize,
+          uploadTime: attachment.uploadTime,
+          uploader: attachment.uploader,
+          stage: attachment.stage,
+          stageName:
+            this.stageTypes.find(s => s.value === attachment.stage)?.label ||
+            "",
+          type: attachment.type,
+          typeName:
+            this.typeDefinitions[attachment.stage]?.find(
+              t => t.value === attachment.type
+            )?.label || ""
+        });
+      });
+
+      this.$emit("confirm", result);
+      this.visible = false;
+    },
+
+    // 寮规鍏抽棴
+    handleClosed() {
+      this.attachmentData = {};
+      this.selectedAttachments.clear();
+    }
+  }
+};
+</script>
+
+<style scoped>
+.stage-content {
+  padding: 15px 0;
+}
+
+.attachment-list {
+  margin-top: 15px;
+}
+
+.empty-attachment {
+  text-align: center;
+  padding: 40px 0;
+  color: #909399;
+  border: 1px dashed #dcdfe6;
+  border-radius: 4px;
+  margin-top: 15px;
+}
+
+.file-name {
+  font-size: 13px;
+  color: #606266;
+}
+
+/* 閫変腑琛岄珮浜� */
+::v-deep .el-table__row:hover {
+  cursor: pointer;
+}
+::v-deep .el-table__row.selected-row {
+  background-color: #ecf5ff !important;
+}
+</style>
diff --git a/src/components/MaintainComponents/BloodRoutinePanel.vue b/src/components/MaintainComponents/BloodRoutinePanel.vue
index 6a76ef2..b91ec14 100644
--- a/src/components/MaintainComponents/BloodRoutinePanel.vue
+++ b/src/components/MaintainComponents/BloodRoutinePanel.vue
@@ -29,7 +29,6 @@
       border
       style="width: 100%"
       class="medical-table"
-      v-fit-columns
       :key="tableKey"
       @header-dragend="handleHeaderDragEnd"
       v-loading="tableLoading"
diff --git a/src/components/MaintainComponents/LiverKidneyPanel.vue b/src/components/MaintainComponents/LiverKidneyPanel.vue
index 6a1ac0c..d1ee0fd 100644
--- a/src/components/MaintainComponents/LiverKidneyPanel.vue
+++ b/src/components/MaintainComponents/LiverKidneyPanel.vue
@@ -19,7 +19,7 @@
       style="width: 100%"
       class="medical-table"
       :key="tableKey"
-      v-fit-columns
+
       @header-dragend="handleHeaderDragEnd"
     >
       <el-table-column
diff --git a/src/components/MaintainComponents/UrineRoutinePanel.vue b/src/components/MaintainComponents/UrineRoutinePanel.vue
index e482237..d8d8a26 100644
--- a/src/components/MaintainComponents/UrineRoutinePanel.vue
+++ b/src/components/MaintainComponents/UrineRoutinePanel.vue
@@ -29,7 +29,7 @@
       border
       style="width: 100%"
       class="medical-table"
-      v-fit-columns
+
       :key="tableKey"
       @header-dragend="handleHeaderDragEnd"
       v-loading="tableLoading"
diff --git a/src/utils/request.js b/src/utils/request.js
index d0a5db3..b6ed29e 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -61,7 +61,7 @@
       const s_url = sessionObj.url;                  // 璇锋眰鍦板潃
       const s_data = sessionObj.data;                // 璇锋眰鏁版嵁
       const s_time = sessionObj.time;                // 璇锋眰鏃堕棿
-      const interval = 500;                         // 闂撮殧鏃堕棿(ms)锛屽皬浜庢鏃堕棿瑙嗕负閲嶅鎻愪氦
+      const interval = 50;                         // 闂撮殧鏃堕棿(ms)锛屽皬浜庢鏃堕棿瑙嗕负閲嶅鎻愪氦
       if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
         const message = '鏁版嵁姝e湪澶勭悊锛岃鍕块噸澶嶆彁浜�';
         console.warn(`[${s_url}]: ` + message)
diff --git a/src/views/business/GetWitness/GetWitnessInfo.vue b/src/views/business/GetWitness/GetWitnessInfo.vue
index c55238e..7ae2546 100644
--- a/src/views/business/GetWitness/GetWitnessInfo.vue
+++ b/src/views/business/GetWitness/GetWitnessInfo.vue
@@ -136,19 +136,41 @@
         </el-row>
 
         <el-row :gutter="20">
-          <el-col :span="8">
+          <!-- <el-col :span="8">
             <el-form-item label="鍗忚皟鍛樼瀛�" prop="coordinatorSign">
               <el-input v-model="form.coordinatorSign" />
             </el-form-item>
-          </el-col>
+          </el-col> -->
           <el-col :span="8">
-            <el-form-item label="绛惧瓧鏃堕棿" prop="coordinatorSignTime">
+            <el-form-item label="鑾峰彇鏃堕棿" prop="coordinatorSignTime">
               <el-date-picker
                 v-model="form.coordinatorSignTime"
                 type="datetime"
                 value-format="yyyy-MM-dd HH:mm:ss"
                 style="width: 100%"
               />
+            </el-form-item>
+          </el-col>
+           <el-col :span="8">
+            <el-form-item label="鏄惁榛樺搥缂呮��" prop="isspendremember">
+              <el-select
+                v-model="form.isspendremember"
+                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"
+                style="width: 100%"
+              >
+                <el-option label="鏄�" :value="1" />
+                <el-option label="鍚�" :value="0" />
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
@@ -163,12 +185,12 @@
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="鑱旂粶浜轰竴" prop="coordinatedusernameo">
+            <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo">
               <el-input v-model="form.coordinatedusernameo" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="鑱旂粶浜轰簩" prop="coordinatedusernamet">
+            <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet">
               <el-input v-model="form.coordinatedusernamet" />
             </el-form-item>
           </el-col>
diff --git a/src/views/business/OrganUtilization/OrganUtilizationInfo.vue b/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
index 6106b5f..d6a0daa 100644
--- a/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
+++ b/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
@@ -85,7 +85,7 @@
         </div>
         <el-row :gutter="20">
           <el-col :span="6">
-            <el-form-item align="left" label="閬椾綋鎹愮尞" prop="isbodydonation">
+            <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 || []"
@@ -96,24 +96,28 @@
               </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-col :span="8">
             <el-form-item align="left" label="鎺ユ敹瀹跺睘" prop="relationname">
               <el-input
                 v-model="form.relationname"
                 placeholder="璇疯緭鍏ユ帴鏀跺灞�"
               />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="涓庢崘鐚�呭叧绯�" prop="signfamilyrelations">
+              <el-select
+                v-model="form.signfamilyrelations"
+                placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
+              >
+                <el-option
+                  v-for="dict in dict.type.sys_FamilyRelation || []"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
@@ -597,7 +601,13 @@
     FilePreviewDialog,
     CaseBasicInfo
   },
-  dicts: ["sys_BloodType", "sys_Organ", "sys_0_1", "utilize_statue"],
+  dicts: [
+    "sys_BloodType",
+    "sys_Organ",
+    "sys_FamilyRelation",
+    "sys_0_1",
+    "utilize_statue"
+  ],
   data() {
     return {
       caseId: null,
@@ -627,7 +637,7 @@
         coordinatedusernamet: "",
         assessannex: "",
         donateorgan: "",
-        isbodydonation: "0",
+        isbodydonation: "1",
         receivingunitname: "",
         createBy: "",
         createTime: "",
@@ -756,17 +766,8 @@
         .replace("T", " ")
         .substring(0, 19);
 
-      this.generateDonorNo();
       this.getDetail();
       this.getHospitalData();
-    },
-
-    // 鐢熸垚鎹愮尞鑰呯紪鍙�
-    generateDonorNo() {
-      const timestamp = Date.now().toString();
-      this.form.donorno = "D" + timestamp.slice(-8);
-      this.form.caseNo = "CASE" + timestamp.slice(-6);
-      this.form.inpatientno = "IP" + timestamp.slice(-6);
     },
 
     // 鑾峰彇璇︽儏
@@ -783,9 +784,10 @@
           if (!data.completeState || data.completeState == 1) {
             data.completeState = "2";
           }
+          this.form = data;
           // 濉厖琛ㄥ崟鏁版嵁
-          Object.assign(this.form, data);
-
+          // Object.assign(this.form, data);
+          this.form.signfamilyrelations = this.form.signfamilyrelations || "";
           // 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
           if (data.donateorgan) {
             const organArray = Array.isArray(data.donateorgan)
@@ -1180,7 +1182,6 @@
           return false;
         }
       );
-
 
       if (incompleteRecords.length > 0) {
         this.$message.warning("璇峰厛瀹屽杽鎵�鏈夊埄鐢ㄨ褰曠殑淇℃伅");
diff --git a/src/views/business/OrganUtilization/index.vue b/src/views/business/OrganUtilization/index.vue
index ee5d473..d98215e 100644
--- a/src/views/business/OrganUtilization/index.vue
+++ b/src/views/business/OrganUtilization/index.vue
@@ -26,17 +26,17 @@
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="璁板綍鐘舵��" prop="recordstate">
+        <el-form-item label="鍒╃敤鐘舵��" prop="completeState">
           <el-select
-            v-model="queryParams.recordstate"
-            placeholder="璇烽�夋嫨璁板綍鐘舵��"
+            v-model="queryParams.completeState"
+            placeholder="璇烽�夋嫨鍒╃敤鐘舵��"
             clearable
             style="width: 200px"
           >
-            <el-option label="宸插畬鎴�" value="completed" />
-            <el-option label="杩涜涓�" value="processing" />
-            <el-option label="寰呭鐞�" value="pending" />
-            <el-option label="宸插叧闂�" value="closed" />
+            <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-form-item>
@@ -113,7 +113,12 @@
           </template>
         </el-table-column>
         <el-table-column label="骞撮緞" align="center" prop="age" width="80" />
-        <el-table-column label="琛�鍨�" align="center" prop="bloodtype" width="80">
+        <el-table-column
+          label="琛�鍨�"
+          align="center"
+          prop="bloodtype"
+          width="80"
+        >
           <template slot-scope="scope">
             <dict-tag
               v-if="scope.row.bloodtype"
@@ -121,6 +126,19 @@
               :value="scope.row.bloodtype"
             />
             <span v-else>-</span>
+          </template>
+        </el-table-column>
+           <el-table-column
+          label="鍒╃敤鐘舵��"
+          align="center"
+          prop="recordstate"
+          width="100"
+        >
+          <template slot-scope="scope">
+            <dict-tag
+              :options="dict.type.utilize_statue"
+              :value="scope.row.completeState"
+            />
           </template>
         </el-table-column>
         <el-table-column
@@ -154,19 +172,7 @@
             <span>{{ scope.row.responsibleusername || "-" }}</span>
           </template>
         </el-table-column>
-        <el-table-column
-          label="璁板綍鐘舵��"
-          align="center"
-          prop="recordstate"
-          width="100"
-        >
-          <template slot-scope="scope">
-               <dict-tag
-              :options="dict.type.utilize_statue"
-              :value="scope.row.completeState"
-            />
-          </template>
-        </el-table-column>
+
         <el-table-column
           label="鎿嶄綔"
           fixed="right"
@@ -214,13 +220,17 @@
 </template>
 
 <script>
-import { completionList, completionadd, completionedit } from "@/api/businessApi";
+import {
+  completionList,
+  completionadd,
+  completionedit
+} from "@/api/businessApi";
 import Pagination from "@/components/Pagination";
 
 export default {
   name: "OrganUtilizationList",
   components: { Pagination },
-  dicts: ["sys_user_sex", "sys_BloodType",'utilize_statue'],
+  dicts: ["sys_user_sex", "sys_BloodType", "utilize_statue"],
   data() {
     return {
       // 閬僵灞�
@@ -262,13 +272,13 @@
           let data = response.data;
           if (Array.isArray(data)) {
             this.organUtilizationList = data;
-            this.total = data.length;
+            this.total = response.total;
           } else if (data && data.rows) {
             this.organUtilizationList = data.rows;
-            this.total = data.total || data.rows.length;
+            this.total = response.total;
           } else if (data && data.list) {
             this.organUtilizationList = data.list;
-            this.total = data.total || data.list.length;
+            this.total = response.total;
           } else {
             this.organUtilizationList = [];
             this.total = 0;
diff --git a/src/views/business/affirm/affirmInfo.vue b/src/views/business/affirm/affirmInfo.vue
index 613f64e..abd3036 100644
--- a/src/views/business/affirm/affirmInfo.vue
+++ b/src/views/business/affirm/affirmInfo.vue
@@ -126,7 +126,48 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row style="margin-bottom: 10px;">
+          <el-button
+            type="primary"
+            size="mini"
+            icon="el-icon-plus"
+            @click="openOtherFamilyDialog()"
+          >
+            娣诲姞鍏朵粬瀹跺睘
+          </el-button>
+        </el-row>
+        <el-table :data="otherFamilyList" size="small" border>
+          <el-table-column label="濮撳悕" prop="name" />
+          <el-table-column label="涓庢崘璧犺�呭叧绯�" prop="relation">
+            <template slot-scope="scope">
+              <dict-tag
+                :options="dict.type.sys_FamilyRelation"
+                :value="scope.row.relation"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="鑱旂郴鐢佃瘽" prop="phone" />
 
+          <el-table-column label="鎿嶄綔" width="120" align="center">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                @click="editOtherFamily(scope.$index)"
+              >
+                缂栬緫
+              </el-button>
+              <el-button
+                size="mini"
+                type="text"
+                style="color:red"
+                @click="deleteOtherFamily(scope.$index)"
+              >
+                鍒犻櫎
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
         <el-row>
           <el-form-item label-width="100px" label="鎹愮尞鍐冲畾">
             <el-checkbox-group v-model="organdecision">
@@ -259,7 +300,38 @@
         </el-tab-pane>
       </el-tabs>
     </el-card>
+    <!-- 鍏朵粬瀹跺睘寮圭獥 -->
+    <el-dialog
+      :title="isEditOtherFamily ? '缂栬緫鍏朵粬瀹跺睘' : '娣诲姞鍏朵粬瀹跺睘'"
+      :visible.sync="otherFamilyDialogVisible"
+      width="400px"
+    >
+      <el-form :model="currentOtherFamily" label-width="100px">
+        <el-form-item label="濮撳悕" prop="name">
+          <el-input v-model="currentOtherFamily.name" />
+        </el-form-item>
 
+        <el-form-item label="鍏崇郴" prop="relation">
+          <el-select v-model="currentOtherFamily.relation" style="width:100%">
+            <el-option
+              v-for="dict in dict.type.sys_FamilyRelation"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="鐢佃瘽" prop="phone">
+          <el-input v-model="currentOtherFamily.phone" />
+        </el-form-item>
+      </el-form>
+
+      <span slot="footer">
+        <el-button @click="otherFamilyDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="saveOtherFamily">纭畾</el-button>
+      </span>
+    </el-dialog>
     <!-- 涓婁紶瀵硅瘽妗� -->
     <el-dialog
       :title="`涓婁紶${getCurrentTypeLabel}闄勪欢`"
@@ -271,14 +343,15 @@
         ref="uploadRef"
         class="upload-demo"
         drag
-        action="#"
+        :action="uploadAction"
+        :headers="headers"
         multiple
         :file-list="tempFileList"
         :before-upload="beforeUpload"
         :on-change="handleFileChange"
         :on-remove="handleTempRemove"
+        :on-success="handleUploadSuccess"
         :auto-upload="false"
-        :http-request="handleHttpRequest"
       >
         <i class="el-icon-upload"></i>
         <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
@@ -314,6 +387,8 @@
 import { relativesList, relativesEdit, relativesAdd } from "@/api/businessApi";
 import FilePreviewDialog from "@/components/FilePreviewDialog";
 import CaseBasicInfo from "@/components/CaseBasicInfo";
+import { getToken } from "@/utils/auth";
+
 export default {
   name: "ConfirmationDetail",
   components: {
@@ -347,21 +422,39 @@
         relativeidcardno: "",
         relativephone: "",
         relativeRemark: "",
-        assessannex: "" // JSON瀛楃涓插瓨鍌ㄦ墍鏈夐檮浠�
+        assessannex: "", // JSON瀛楃涓插瓨鍌ㄦ墍鏈夐檮浠�
+        otherFamilyMembers: "" // 鉁� 鏂板
       },
+      uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+      headers: {
+        Authorization: "Bearer " + getToken()
+      },
+      // 鍏朵粬瀹跺睘琛ㄦ牸鏁版嵁
+      otherFamilyList: [],
+
+      // 褰撳墠缂栬緫鐨勫叾浠栧灞烇紙寮圭獥鐢級
+      currentOtherFamily: {
+        name: "",
+        relation: "",
+        phone: ""
+      },
+
+      // 鏄惁缂栬緫妯″紡锛堝叾浠栧灞烇級
+      isEditOtherFamily: false,
+      editOtherFamilyIndex: -1,
+
+      // 鍏朵粬瀹跺睘寮圭獥
+      otherFamilyDialogVisible: false,
       organdecision: [],
       organdecisionOther: "",
       organselection: [
         "鑲濊剰",
-        "鍙岃偩",
-        "宸﹁偩",
-        "鍙宠偩",
+        "鑲捐剰",
         "蹇冭剰",
         "鑲鸿剰",
         "鑳拌吅",
         "灏忚偁",
-        "鍙岀溂缁勭粐",
-        "閬椾綋",
+        "鐪艰鑶�",
         "鍏朵粬"
       ],
       // 鍔犺浇鐘舵��
@@ -454,7 +547,17 @@
       } else {
         detailData = response;
       }
-
+      // 澶勭悊鍏朵粬瀹跺睘鏁版嵁
+      if (detailData.otherFamilyMembers) {
+        try {
+          this.otherFamilyList =
+            typeof detailData.otherFamilyMembers === "string"
+              ? JSON.parse(detailData.otherFamilyMembers)
+              : detailData.otherFamilyMembers || [];
+        } catch (e) {
+          this.otherFamilyList = [];
+        }
+      }
       // 鏄犲皠瀛楁鍒拌〃鍗�
       this.form = {
         ...this.form,
@@ -586,55 +689,40 @@
       this.tempFileList = fileList;
     },
 
-    // 鑷畾涔変笂浼犺姹�
-    handleHttpRequest(options) {
-      return new Promise((resolve, reject) => {
-        this.uploadLoading = true;
+    handleUploadSuccess(response, file) {
+      if (response.code !== 200) {
+        this.$message.error(response.msg || "涓婁紶澶辫触");
+        return;
+      }
 
-        // 妯℃嫙涓婁紶杩囩▼
-        setTimeout(() => {
-          const newAttachment = {
-            id: Date.now(),
-            fileName: options.file.name,
-            fileUrl: URL.createObjectURL(options.file),
-            fileSize: options.file.size,
-            fileType: this.getFileExtension(options.file.name),
-            type: this.currentUploadType, // 璁板綍闄勪欢绫诲瀷
-            uploadTime: new Date().toISOString(),
-            uploader: "褰撳墠鐢ㄦ埛"
-          };
+      const newAttachment = {
+        id: Date.now(),
+        fileName: file.name,
+        fileUrl: response.url,
+        fileSize: file.size,
+        fileType: this.getFileExtension(file.name),
+        type: this.currentUploadType,
+        uploadTime: this.getCurrentTime(),
+        uploader: "褰撳墠鐢ㄦ埛"
+      };
 
-          // 娣诲姞鍒板搴旂被鍨嬬殑闄勪欢鍒楄〃
-          if (this.attachmentData[this.currentUploadType]) {
-            this.attachmentData[this.currentUploadType].push(newAttachment);
-          }
+      this.attachmentData[this.currentUploadType].push(newAttachment);
+      this.updateAssessannexField();
 
-          this.uploadLoading = false;
-          this.updateAssessannexField(); // 鏇存柊瀛樺偍瀛楁
-          resolve({ code: 200, data: newAttachment });
-        }, 1500);
-      });
+      this.$message.success("涓婁紶鎴愬姛");
+      this.uploadLoading = false;
+      this.uploadDialogVisible = false;
+      this.tempFileList = [];
     },
 
-    // 鎻愪氦涓婁紶
-    async submitUpload() {
+    submitUpload() {
       if (this.tempFileList.length === 0) {
         this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
         return;
       }
 
-      try {
-        for (const file of this.tempFileList) {
-          await this.$refs.uploadRef.submit();
-        }
-
-        this.$message.success("鏂囦欢涓婁紶鎴愬姛");
-        this.uploadDialogVisible = false;
-        this.tempFileList = [];
-      } catch (error) {
-        this.$message.error("鏂囦欢涓婁紶澶辫触");
-        console.error("涓婁紶澶辫触:", error);
-      }
+      this.uploadLoading = true;
+      this.$refs.uploadRef.submit(); // 鉁� 鍙皟鐢ㄤ竴娆�
     },
 
     // 鍒犻櫎闄勪欢
@@ -653,7 +741,51 @@
         })
         .catch(() => {});
     },
+    openOtherFamilyDialog(index) {
+      this.isEditOtherFamily = typeof index === "number";
+      this.editOtherFamilyIndex = index || -1;
 
+      this.currentOtherFamily = this.isEditOtherFamily
+        ? { ...this.otherFamilyList[index] }
+        : { name: "", relation: "", phone: "" };
+
+      this.otherFamilyDialogVisible = true;
+    },
+    editOtherFamily(index) {
+      this.openOtherFamilyDialog(index);
+    },
+    deleteOtherFamily(index) {
+      this.$confirm("纭鍒犻櫎璇ュ灞烇紵", "鎻愮ず", { type: "warning" }).then(
+        () => {
+          this.otherFamilyList.splice(index, 1);
+          this.updateOtherFamilyField();
+        }
+      );
+    },
+    saveOtherFamily() {
+      if (
+        !this.currentOtherFamily.name ||
+        !this.currentOtherFamily.relation ||
+        !this.currentOtherFamily.phone
+      ) {
+        this.$message.warning("璇峰~鍐欏畬鏁翠俊鎭�");
+        return;
+      }
+
+      if (this.isEditOtherFamily) {
+        this.otherFamilyList.splice(this.editOtherFamilyIndex, 1, {
+          ...this.currentOtherFamily
+        });
+      } else {
+        this.otherFamilyList.push({ ...this.currentOtherFamily });
+      }
+
+      this.updateOtherFamilyField();
+      this.otherFamilyDialogVisible = false;
+    },
+    updateOtherFamilyField() {
+      this.form.otherFamilyMembers = JSON.stringify(this.otherFamilyList);
+    },
     // 鏇存柊assessannex瀛樺偍瀛楁
     updateAssessannexField() {
       // 灏嗘墍鏈夌被鍨嬬殑闄勪欢鍚堝苟涓轰竴涓暟缁�
@@ -784,9 +916,8 @@
         await this.$refs.form.validate();
         this.saveLoading = true;
 
-        // 纭繚闄勪欢鏁版嵁鏄渶鏂扮殑
+        this.updateOtherFamilyField();
         this.updateAssessannexField();
-
         const saveData = {
           ...this.form,
           infoid: this.infoid,
diff --git a/src/views/business/allocation/allocationInfo.vue b/src/views/business/allocation/allocationInfo.vue
index c2106f3..c78d505 100644
--- a/src/views/business/allocation/allocationInfo.vue
+++ b/src/views/business/allocation/allocationInfo.vue
@@ -52,7 +52,7 @@
 
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鐧昏浜�" prop="registrationName">
+            <el-form-item label="璐熻矗浜�" prop="registrationName">
               <el-input v-model="form.registrationName" />
             </el-form-item>
           </el-col>
@@ -122,6 +122,7 @@
                 v-model="otherOrganInput"
                 placeholder="璇疯緭鍏ュ叾浠栧櫒瀹樺悕绉�"
                 style="margin-top: 10px; width: 300px;"
+                :disabled="form.allocationStatus == '1'"
               />
             </el-form-item>
           </el-col>
@@ -137,6 +138,33 @@
                 style="width: 100%"
                 :row-class-name="getOrganRowClassName"
               >
+                <el-table-column
+                  label="搴忓彿"
+                  type="index"
+                  width="60"
+                  align="center"
+                  fixed
+                ></el-table-column>
+
+                <el-table-column
+                  label="鍒嗛厤鐘舵��"
+                  align="center"
+                  width="100"
+                  prop="allocationstatus"
+                  fixed
+                >
+                  <template slot-scope="scope">
+                    <el-tag
+                      :type="
+                        getAllocationStatusTagType(scope.row.allocationstatus)
+                      "
+                      size="small"
+                    >
+                      {{ getAllocationStatusText(scope.row.allocationstatus) }}
+                    </el-tag>
+                  </template>
+                </el-table-column>
+
                 <el-table-column
                   label="鍣ㄥ畼鍚嶇О"
                   align="center"
@@ -162,13 +190,16 @@
                     <el-input
                       v-model="scope.row.caseno"
                       placeholder="鍒嗛厤绯荤粺缂栧彿"
-                      :disabled="form.allocationStatus == '1'"
+                      :disabled="
+                        form.allocationStatus == '1' ||
+                          scope.row.allocationstatus == '3'
+                      "
                     />
                   </template>
                 </el-table-column>
 
                 <el-table-column
-                  label="鍒嗛厤鎺ユ敹鏃堕棿"
+                  label="鍒嗛厤寮�濮嬫椂闂�"
                   align="center"
                   width="180"
                   prop="applicanttime"
@@ -181,8 +212,33 @@
                       v-model="scope.row.applicanttime"
                       type="datetime"
                       value-format="yyyy-MM-dd HH:mm:ss"
+                      placeholder="閫夋嫨寮�濮嬫帴鏀舵椂闂�"
+                      :disabled="
+                        form.allocationStatus == '1' ||
+                          scope.row.allocationstatus == '3'
+                      "
+                    />
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="鍒嗛厤鎺ユ敹鏃堕棿"
+                  align="center"
+                  width="180"
+                  prop="organgettime"
+                >
+                  <template slot-scope="scope">
+                    <el-date-picker
+                      clearable
+                      size="small"
+                      style="width: 100%"
+                      v-model="scope.row.organgettime"
+                      type="datetime"
+                      value-format="yyyy-MM-dd HH:mm:ss"
                       placeholder="閫夋嫨鍒嗛厤鎺ユ敹鏃堕棿"
-                      :disabled="form.allocationStatus == '1'"
+                      :disabled="
+                        form.allocationStatus == '1' ||
+                          scope.row.allocationstatus == '3'
+                      "
                     />
                   </template>
                 </el-table-column>
@@ -197,7 +253,10 @@
                     <el-input
                       v-model="scope.row.name"
                       placeholder="鍙椾綋濮撴皬"
-                      :disabled="form.allocationStatus == '1'"
+                      :disabled="
+                        form.allocationStatus == '1' ||
+                          scope.row.allocationstatus == '3'
+                      "
                     />
                   </template>
                 </el-table-column>
@@ -216,11 +275,16 @@
                         :dataList="dataList"
                         v-model="scope.row.transplanthospitalno"
                         style="width: 100%"
+                        :disabled="
+                          form.allocationStatus == '1' ||
+                            scope.row.allocationstatus == '3'
+                        "
                       />
                     </div>
                   </template>
                 </el-table-column>
 
+                <!-- 淇敼template涓殑璇存槑鍒� -->
                 <el-table-column
                   label="璇存槑"
                   align="center"
@@ -228,13 +292,51 @@
                   min-width="200"
                 >
                   <template slot-scope="scope">
-                    <el-input
-                      type="textarea"
-                      clearable
-                      v-model="scope.row.reallocationreason"
-                      placeholder="璇疯緭鍏ヨ鏄�"
-                      :disabled="form.allocationStatus == '1'"
-                    />
+                    <div v-if="scope.row.allocationstatus != '3'">
+                      <el-input
+                        type="textarea"
+                        clearable
+                        v-model="scope.row.reallocationreason"
+                        placeholder="璇疯緭鍏ヨ鏄�"
+                        :disabled="
+                          form.allocationStatus == '1' ||
+                            scope.row.allocationstatus == '3'
+                        "
+                      />
+                    </div>
+                    <div v-else>
+                      <!-- 閲嶅垎閰嶈褰曪細鏄剧ず璇︾粏鏌ョ湅鎸夐挳 -->
+                      <el-button
+                        v-if="scope.row.reallocationreason"
+                        type="text"
+                        size="small"
+                        @click="handleViewRedistributionDetail(scope.row)"
+                        style="color: #e6a23c;"
+                      >
+                        <i class="el-icon-document"></i>
+                        鏌ョ湅閲嶅垎閰嶈鎯�
+                      </el-button>
+                      <span v-else class="no-data">-</span>
+
+                      <!-- 淇濈暀鍘熸湁鐨勫伐鍏锋彁绀猴紙鍙Щ闄ゆ垨淇濈暀锛� -->
+                      <el-tooltip
+                        v-if="scope.row.redistributionInfo"
+                        :content="
+                          formatRedistributionTooltip(
+                            scope.row.redistributionInfo
+                          )
+                        "
+                        placement="top"
+                      >
+                        <el-button
+                          type="text"
+                          size="small"
+                          style="margin-left: 5px;"
+                        >
+                          <i class="el-icon-info"></i>
+                        </el-button>
+                      </el-tooltip>
+                    </div>
                   </template>
                 </el-table-column>
 
@@ -244,6 +346,7 @@
                   width="120"
                   class-name="small-padding fixed-width"
                   v-if="form.allocationStatus !== '1'"
+                  fixed="right"
                 >
                   <template slot-scope="scope">
                     <el-button
@@ -251,9 +354,16 @@
                       type="text"
                       icon="el-icon-copy-document"
                       @click="handleRedistribution(scope.row)"
-                      :disabled="!scope.row.caseno"
+                      :disabled="
+                        scope.row.allocationstatus == '3' || !scope.row.caseno
+                      "
+                      style="color: #e6a23c;"
                     >
-                      閲嶅垎閰�
+                      {{
+                        scope.row.allocationstatus == "3"
+                          ? "宸查噸鍒嗛厤"
+                          : "閲嶅垎閰�"
+                      }}
                     </el-button>
                   </template>
                 </el-table-column>
@@ -281,8 +391,8 @@
             </el-col>
             <el-col :span="6">
               <div class="stat-item">
-                <span class="stat-label">寰呭畬鍠勪俊鎭�:</span>
-                <span class="stat-value">{{ incompleteRecords }} 涓�</span>
+                <span class="stat-label">寰呭鏍�:</span>
+                <span class="stat-value">{{ pendingReviewCount }} 涓�</span>
               </div>
             </el-col>
             <el-col :span="6">
@@ -293,26 +403,8 @@
             </el-col>
             <el-col :span="6">
               <div class="stat-item">
-                <span class="stat-label">鍒嗛厤鐘舵��:</span>
-                <span class="stat-value">
-                  <el-tag
-                    :type="
-                      form.allocationStatus == '1'
-                        ? 'success'
-                        : form.allocationStatus == '2'
-                        ? 'danger'
-                        : 'warning'
-                    "
-                  >
-                    {{
-                      form.allocationStatus == "1"
-                        ? "宸插垎閰�"
-                        : form.allocationStatus == "2"
-                        ? "浣滃簾"
-                        : "鏈垎閰�"
-                    }}
-                  </el-tag>
-                </span>
+                <span class="stat-label">閲嶅垎閰�:</span>
+                <span class="stat-value">{{ redistributedCount }} 涓�</span>
               </div>
             </el-col>
           </el-row>
@@ -324,28 +416,6 @@
           </el-empty>
         </div>
       </el-form>
-
-      <!-- <div class="dialog-footer" v-if="form.allocationStatus !== '1'">
-        <el-button
-          type="primary"
-          @click="handleSaveAllocation"
-          :loading="saveLoading"
-          :disabled="
-            !allocationData.serviceDonateorganList ||
-              allocationData.serviceDonateorganList.length == 0
-          "
-        >
-          淇濆瓨鍒嗛厤璁板綍
-        </el-button>
-        <el-button
-          type="success"
-          @click="handleConfirmAllocation"
-          :loading="confirmLoading"
-          :disabled="incompleteRecords > 0"
-        >
-          纭瀹屾垚鍒嗛厤
-        </el-button>
-      </div> -->
     </el-card>
 
     <!-- 闄勪欢绠$悊閮ㄥ垎浼樺寲 -->
@@ -436,12 +506,18 @@
       title="鍣ㄥ畼閲嶅垎閰�"
       :visible.sync="redistributionDialogVisible"
       width="500px"
+      @close="handleRedistributionDialogClose"
     >
-      <el-form :model="redistributionForm" label-width="100px">
+      <el-form
+        :model="redistributionForm"
+        :rules="redistributionRules"
+        ref="redistributionFormRef"
+        label-width="100px"
+      >
         <el-form-item label="鍘熷櫒瀹樹俊鎭�">
           <el-input v-model="redistributionForm.organname" readonly />
         </el-form-item>
-        <el-form-item label="閲嶅垎閰嶅師鍥�" prop="reason">
+        <el-form-item label="閲嶅垎閰嶅師鍥�" prop="reason" required>
           <el-input
             type="textarea"
             :rows="4"
@@ -449,15 +525,170 @@
             placeholder="璇疯緭鍏ラ噸鍒嗛厤鍘熷洜"
           />
         </el-form-item>
+        <el-form-item label="閲嶅垎閰嶆椂闂�" prop="redistributionTime" required>
+          <el-date-picker
+            v-model="redistributionForm.redistributionTime"
+            type="datetime"
+            placeholder="璇烽�夋嫨閲嶅垎閰嶆椂闂�"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            style="width: 100%"
+          />
+        </el-form-item>
+        <el-form-item label="閲嶅垎閰嶉檮浠�">
+          <UploadAttachment
+            ref="redistributionAttachmentUpload"
+            :file-list="redistributionAttachmentList"
+            :limit="5"
+            :accept="attachmentAccept"
+            :multiple="true"
+            @change="handleRedistributionChange"
+            @upload-success="handleRedistributionUploadSuccess"
+            @upload-error="handleRedistributionUploadError"
+            @remove="handleRedistributionAttachmentRemove"
+          />
+          <div style="margin-top: 5px; font-size: 12px; color: #999;">
+            鏀寔涓婁紶閲嶅垎閰嶇浉鍏虫枃浠� (鏈�澶�5涓�)
+          </div>
+        </el-form-item>
       </el-form>
       <div slot="footer">
         <el-button @click="redistributionDialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleRedistributionConfirm"
-          >纭閲嶅垎閰�</el-button
+        <el-button
+          type="primary"
+          @click="handleRedistributionConfirm"
+          :loading="redistributionLoading"
+        >
+          纭閲嶅垎閰�
+        </el-button>
+      </div>
+    </el-dialog>
+    <!-- 鍦╰emplate涓坊鍔犻噸鍒嗛厤璇︽儏寮圭獥 -->
+    <el-dialog
+      title="閲嶅垎閰嶈鎯�"
+      :visible.sync="redistributionDetailDialogVisible"
+      width="600px"
+    >
+      <div v-loading="redistributionDetailLoading">
+        <div v-if="currentRedistributionDetail" style="padding: 20px;">
+          <!-- 鍩烘湰淇℃伅 -->
+          <el-descriptions title="閲嶅垎閰嶄俊鎭�" :column="2" border>
+            <el-descriptions-item label="鍣ㄥ畼鍚嶇О">
+              {{ currentRedistributionDetail.organname || "-" }}
+            </el-descriptions-item>
+            <el-descriptions-item label="鎿嶄綔浜�">
+              {{ currentRedistributionDetail.operator || "-" }}
+            </el-descriptions-item>
+            <el-descriptions-item label="鎿嶄綔鏃堕棿">
+              {{
+                currentRedistributionDetail.operatorTime
+                  ? formatDateTime(currentRedistributionDetail.operatorTime)
+                  : "-"
+              }}
+            </el-descriptions-item>
+            <el-descriptions-item label="閲嶅垎閰嶆椂闂�">
+              {{
+                currentRedistributionDetail.redistributionTime
+                  ? formatDateTime(
+                      currentRedistributionDetail.redistributionTime
+                    )
+                  : "-"
+              }}
+            </el-descriptions-item>
+          </el-descriptions>
+
+          <!-- 閲嶅垎閰嶅師鍥� -->
+          <div style="margin-top: 20px;">
+            <div class="section-title">閲嶅垎閰嶅師鍥�</div>
+            <div
+              class="section-content"
+              style="padding: 10px; background: #f5f7fa; border-radius: 4px;"
+            >
+              {{ currentRedistributionDetail.reason || "鏃�" }}
+            </div>
+          </div>
+
+          <!-- 閲嶅垎閰嶉檮浠� -->
+          <div
+            style="margin-top: 20px;"
+            v-if="
+              currentRedistributionDetail.attachments &&
+                currentRedistributionDetail.attachments.length > 0
+            "
+          >
+            <div class="section-title">
+              閲嶅垎閰嶉檮浠� ({{ currentRedistributionDetail.attachments.length }})
+            </div>
+            <div class="redistribution-attachments">
+              <el-table
+                :data="currentRedistributionDetail.attachments"
+                size="small"
+                style="width: 100%"
+              >
+                <el-table-column label="鏂囦欢鍚�" min-width="200">
+                  <template slot-scope="scope">
+                    <i
+                      class="el-icon-document"
+                      :style="{ color: getFileIconColor(scope.row.fileName) }"
+                    ></i>
+                    <span class="file-name">{{ scope.row.fileName }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="鏂囦欢绫诲瀷" width="100">
+                  <template slot-scope="scope">
+                    <el-tag
+                      :type="getFileTagType(scope.row.fileName)"
+                      size="small"
+                    >
+                      {{ getFileTypeText(scope.row.fileName) }}
+                    </el-tag>
+                  </template>
+                </el-table-column>
+                <el-table-column label="涓婁紶鏃堕棿" width="150">
+                  <template slot-scope="scope">
+                    <span>{{
+                      scope.row.uploadTime
+                        ? formatDateTime(scope.row.uploadTime)
+                        : "-"
+                    }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="鎿嶄綔" width="150" fixed="right">
+                  <template slot-scope="scope">
+                    <el-button
+                      size="mini"
+                      type="primary"
+                      @click="handleRedistributionAttachmentPreview(scope.row)"
+                      :disabled="!isPreviewable(scope.row.fileName)"
+                    >
+                      棰勮
+                    </el-button>
+                    <el-button
+                      size="mini"
+                      type="success"
+                      @click="handleRedistributionAttachmentDownload(scope.row)"
+                    >
+                      涓嬭浇
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </div>
+
+          <div
+            v-else
+            style="margin-top: 20px; text-align: center; color: #909399;"
+          >
+            鏃犻噸鍒嗛厤闄勪欢
+          </div>
+        </div>
+      </div>
+      <div slot="footer">
+        <el-button @click="redistributionDetailDialogVisible = false"
+          >鍏抽棴</el-button
         >
       </div>
     </el-dialog>
-
     <!-- 闄勪欢棰勮瀵硅瘽妗� -->
     <FilePreviewDialog
       :visible="filePreviewVisible"
@@ -499,7 +730,10 @@
   data() {
     return {
       caseId: null,
-
+      // 閲嶅垎閰嶈鎯呯浉鍏�
+      redistributionDetailDialogVisible: false,
+      redistributionDetailLoading: false,
+      currentRedistributionDetail: null,
       // 琛ㄥ崟鏁版嵁
       form: {
         id: undefined,
@@ -538,9 +772,19 @@
       },
       // 鍒嗛厤璁板綍楠岃瘉瑙勫垯
       allocationRules: {},
+      // 閲嶅垎閰嶉獙璇佽鍒�
+      redistributionRules: {
+        reason: [
+          { required: true, message: "閲嶅垎閰嶅師鍥犱笉鑳戒负绌�", trigger: "blur" }
+        ],
+        redistributionTime: [
+          { required: true, message: "閲嶅垎閰嶆椂闂翠笉鑳戒负绌�", trigger: "blur" }
+        ]
+      },
       // 淇濆瓨鍔犺浇鐘舵��
       saveLoading: false,
       confirmLoading: false,
+      redistributionLoading: false,
       // 鍔犺浇鐘舵��
       loading: false,
       // 閫変腑鐨勫櫒瀹橈紙瀛樺偍瀛楀吀value锛�
@@ -564,8 +808,11 @@
       redistributionDialogVisible: false,
       redistributionForm: {
         organname: "",
-        reason: ""
+        reason: "",
+        redistributionTime: ""
       },
+      redistributionAttachmentList: [],
+      redistributionFormRef: null,
       currentRedistributeRecord: null,
       // 鏂囦欢棰勮鐩稿叧
       filePreviewVisible: false,
@@ -585,8 +832,23 @@
         record =>
           !record.caseno ||
           !record.applicanttime ||
+          !record.organgettime ||
           !record.name ||
           !record.transplanthospitalno
+      ).length;
+    },
+    // 寰呭鏍歌褰曟暟閲�
+    pendingReviewCount() {
+      if (!this.allocationData.serviceDonateorganList) return 0;
+      return this.allocationData.serviceDonateorganList.filter(
+        record => record.allocationstatus == "0"
+      ).length;
+    },
+    // 閲嶅垎閰嶈褰曟暟閲�
+    redistributedCount() {
+      if (!this.allocationData.serviceDonateorganList) return 0;
+      return this.allocationData.serviceDonateorganList.filter(
+        record => record.allocationstatus == "3"
       ).length;
     },
     // 鍞竴鍖婚櫌鏁伴噺
@@ -604,6 +866,15 @@
     // 鍒ゆ柇鏄惁闇�瑕佹樉绀哄叾浠栬緭鍏ユ
     showOtherInput() {
       return this.selectedOrgans.includes("C01"); // 鍋囪"鍏朵粬"鐨勫瓧鍏稿�兼槸C01
+    },
+    // 鍒嗛厤鐘舵�佸瓧鍏告槧灏�
+    allocationStatusDict() {
+      return {
+        "0": { label: "鎻愪氦鍒嗛厤", type: "info" },
+        "1": { label: "瀹℃牳閫氳繃", type: "success" },
+        "2": { label: "瀹℃牳鎷掔粷", type: "danger" },
+        "3": { label: "閲嶅垎閰�", type: "warning" }
+      };
     }
   },
   watch: {
@@ -639,6 +910,100 @@
     this.initData();
   },
   methods: {
+    // 鑾峰彇鍒嗛厤鐘舵�佹爣绛剧被鍨�
+    getAllocationStatusTagType(status) {
+      const statusMap = this.allocationStatusDict;
+      return statusMap[status] ? statusMap[status].type : "info";
+    },
+
+    // 鑾峰彇鍒嗛厤鐘舵�佹枃鏈�
+    getAllocationStatusText(status) {
+      const statusMap = this.allocationStatusDict;
+      return statusMap[status] ? statusMap[status].label : "鏈煡鐘舵��";
+    },
+
+    // 鏌ョ湅閲嶅垎閰嶈鎯�
+    handleViewRedistributionDetail(row) {
+      this.redistributionDetailLoading = true;
+      this.redistributionDetailDialogVisible = true;
+
+      try {
+        if (row.redistributionInfo) {
+          // 瑙f瀽閲嶅垎閰嶄俊鎭�
+          const redistributionInfo = JSON.parse(row.redistributionInfo);
+          this.currentRedistributionDetail = {
+            organname: row.organname || "-",
+            ...redistributionInfo
+          };
+        } else {
+          this.currentRedistributionDetail = {
+            organname: row.organname || "-",
+            reason: "鏃犻噸鍒嗛厤鍘熷洜",
+            attachments: []
+          };
+        }
+      } catch (error) {
+        console.error("瑙f瀽閲嶅垎閰嶄俊鎭け璐�:", error);
+        this.$message.error("閲嶅垎閰嶄俊鎭В鏋愬け璐�");
+        this.currentRedistributionDetail = {
+          organname: row.organname || "-",
+          reason: "閲嶅垎閰嶄俊鎭牸寮忛敊璇�",
+          attachments: []
+        };
+      } finally {
+        this.redistributionDetailLoading = false;
+      }
+    },
+
+    // 棰勮閲嶅垎閰嶉檮浠�
+    handleRedistributionAttachmentPreview(file) {
+      this.currentPreviewFile = {
+        fileName: file.fileName,
+        fileUrl: file.path || file.fileUrl,
+        fileType: this.getFileType(file.fileName)
+      };
+      this.filePreviewVisible = true;
+    },
+
+    // 涓嬭浇閲嶅垎閰嶉檮浠�
+    handleRedistributionAttachmentDownload(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("鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇");
+      }
+    },
+
+    // 澧炲己鏍煎紡鍖栧伐鍏锋彁绀烘柟娉�
+    formatRedistributionTooltip(redistributionInfo) {
+      if (!redistributionInfo) return "";
+      try {
+        const info = JSON.parse(redistributionInfo);
+        let tooltip = `閲嶅垎閰嶅師鍥�: ${info.reason}\n閲嶅垎閰嶆椂闂�: ${info.redistributionTime}`;
+
+        // 娣诲姞闄勪欢淇℃伅
+        if (info.attachments && info.attachments.length > 0) {
+          tooltip += `\n\n闄勪欢(${info.attachments.length}涓�):`;
+          info.attachments.forEach((att, index) => {
+            tooltip += `\n${index + 1}. ${att.fileName}`;
+          });
+        }
+
+        return tooltip;
+      } catch (error) {
+        return redistributionInfo;
+      }
+    },
     // 鏍规嵁瀛楀吀value鑾峰彇label
     getOrganLabel(organValue) {
       const dictItem = this.organDict.find(item => item.value == organValue);
@@ -671,6 +1036,7 @@
 
       this.getHospitalData();
     },
+
     // 鐢熸垚鎹愮尞鑰呯紪鍙�
     generateDonorNo() {
       const timestamp = Date.now().toString();
@@ -692,10 +1058,10 @@
         this.form.attachments = [];
       }
     },
+
     // 鑾峰彇璇︽儏
     async getDetail(infoid, id) {
       this.loading = true;
-      donateorganBaseinfoInfo(id);
       try {
         const response = await allocationList({ infoid });
         if (response.code == 200 && response.data && response.data.length > 0) {
@@ -719,7 +1085,30 @@
             this.allocationData.serviceDonateorganList = Array.isArray(
               data.serviceDonateorganList
             )
-              ? data.serviceDonateorganList
+              ? data.serviceDonateorganList.map(item => {
+                  // 纭繚姣忔潯璁板綍閮芥湁鍒嗛厤鐘舵�佸瓧娈碉紝榛樿鍊间负0
+                  const allocationstatus = item.allocationstatus || "0";
+                  let redistributionInfo = null;
+
+                  // 瑙f瀽閲嶅垎閰嶄俊鎭�
+                  if (allocationstatus == "3" && item.reallocationreason) {
+                    try {
+                      redistributionInfo = JSON.parse(item.reallocationreason);
+                      console.log(redistributionInfo);
+                    } catch (error) {
+                      console.warn("瑙f瀽閲嶅垎閰嶄俊鎭け璐�:", error);
+                      redistributionInfo = item.reallocationreason;
+                    }
+                  }
+
+                  return {
+                    ...item,
+                    allocationstatus,
+                    redistributionInfo: redistributionInfo
+                      ? JSON.stringify(redistributionInfo)
+                      : null
+                  };
+                })
               : [];
 
             // 鏇存柊閫変腑鐨勫櫒瀹�
@@ -767,6 +1156,7 @@
         this.loading = false;
       }
     },
+
     // 鑾峰彇鍖婚櫌鏁版嵁
     async getHospitalData() {
       try {
@@ -784,6 +1174,7 @@
         this.$message.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触");
       }
     },
+
     // 鍣ㄥ畼閫夋嫨鐘舵�佸彉鍖�
     handleOrganSelectionChange(selectedValues) {
       if (!this.allocationData.serviceDonateorganList) {
@@ -884,10 +1275,13 @@
         organno: organValue,
         caseno: "",
         applicanttime: "",
+        organgettime: "",
         name: "",
         transplanthospitalno: "",
         transplantHospitalName: "",
         reallocationreason: "",
+        allocationstatus: "0", // 榛樿鎻愪氦鍒嗛厤鐘舵��
+        redistributionInfo: null,
         organState: 1
       });
     },
@@ -901,38 +1295,184 @@
         row.transplantHospitalName = hospital.hospitalName;
       }
     },
+
     // 閲嶅垎閰嶆搷浣�
     handleRedistribution(row) {
       this.currentRedistributeRecord = row;
       this.redistributionForm.organname = row.organname;
-      this.redistributionForm.reason = row.reallocationreason || "";
+      this.redistributionForm.reason = "";
+      this.redistributionForm.redistributionTime = new Date()
+        .toISOString()
+        .replace("T", " ")
+        .substring(0, 19);
+      this.redistributionAttachmentList = [];
       this.redistributionDialogVisible = true;
     },
-    // 纭閲嶅垎閰�
-    handleRedistributionConfirm() {
-      if (!this.redistributionForm.reason) {
-        this.$message.warning("璇疯緭鍏ラ噸鍒嗛厤鍘熷洜");
-        return;
-      }
 
-      if (this.currentRedistributeRecord) {
-        this.currentRedistributeRecord.reallocationreason = this.redistributionForm.reason;
-        this.$message.success("閲嶅垎閰嶅師鍥犲凡鏇存柊");
-        this.redistributionDialogVisible = false;
+    // 閲嶅垎閰嶅璇濇鍏抽棴
+    handleRedistributionDialogClose() {
+      this.redistributionForm = {
+        organname: "",
+        reason: "",
+        redistributionTime: ""
+      };
+      this.redistributionAttachmentList = [];
+      this.currentRedistributeRecord = null;
+    },
+
+    // 閲嶅垎閰嶉檮浠朵笂浼犳垚鍔�
+    handleRedistributionUploadSuccess({ file, fileList, response }) {
+      if (response.code == 200) {
+        const attachmentObj = {
+          fileName: file.name,
+          path: response.fileUrl || file.url,
+          fileUrl: response.fileUrl || file.url,
+          fileType: this.getFileExtension(file.name),
+          fileSize: file.size,
+          uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+        };
+        console.log(11);
+
+        this.redistributionAttachmentList = fileList;
+        this.$message.success("閲嶅垎閰嶉檮浠朵笂浼犳垚鍔�");
       }
     },
+
+    // 閲嶅垎閰嶉檮浠朵笂浼犻敊璇�
+    handleRedistributionUploadError({ file, fileList, error }) {
+      console.error("閲嶅垎閰嶉檮浠朵笂浼犲け璐�:", error);
+      this.$message.error("閲嶅垎閰嶉檮浠朵笂浼犲け璐ワ紝璇烽噸璇�");
+    },
+
+    // 閲嶅垎閰嶉檮浠剁Щ闄�
+    handleRedistributionAttachmentRemove(file) {
+      if (file.url) {
+        const index = this.redistributionAttachmentList.findIndex(
+          item => item.path == file.url || item.fileUrl == file.url
+        );
+        if (index > -1) {
+          this.redistributionAttachmentList.splice(index, 1);
+        }
+      }
+    },
+
+    // 纭閲嶅垎閰�
+    async handleRedistributionConfirm() {
+      this.$refs.redistributionFormRef.validate(async valid => {
+        if (!valid) {
+          this.$message.warning("璇峰畬鍠勯噸鍒嗛厤淇℃伅");
+          return;
+        }
+        console.log(1, this.redistributionAttachmentList);
+
+        this.redistributionLoading = true;
+
+        try {
+          // 鏋勫缓閲嶅垎閰嶄俊鎭璞�
+          const redistributionInfo = {
+            reason: this.redistributionForm.reason,
+            redistributionTime: this.redistributionForm.redistributionTime,
+            attachments: this.redistributionAttachmentList.map(att => ({
+              // fileName: att.fileName,
+              // path: att.path || att.fileUrl,
+              // fileUrl: att.path || att.fileUrl,
+              // fileType: this.getFileExtension(att.name),
+              // fileSize: att.fileSize,
+              // uploadTime: att.uploadTime
+              fileName: att.name,
+              path: att.url,
+              fileUrl: att.url,
+              fileType: this.getFileExtension(att.name),
+              fileSize: att.size,
+              uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+            })),
+
+            operator: this.currentUser.username || this.currentUser.nickName,
+            operatorTime: new Date()
+              .toISOString()
+              .replace("T", " ")
+              .substring(0, 19)
+          };
+          console.log(2, this.redistributionAttachmentList);
+
+          // 鎵惧埌褰撳墠璁板綍鐨勭储寮�
+          const currentIndex = this.allocationData.serviceDonateorganList.findIndex(
+            item => item == this.currentRedistributeRecord
+          );
+
+          if (currentIndex !== -1) {
+            // 1. 鏇存柊鍘熻褰曠殑鐘舵�佷负3锛堥噸鍒嗛厤锛夊苟淇濆瓨閲嶅垎閰嶄俊鎭�
+            const originalRecord = { ...this.currentRedistributeRecord };
+            originalRecord.allocationstatus = "3";
+            originalRecord.reallocationreason = JSON.stringify(
+              redistributionInfo
+            );
+            originalRecord.redistributionInfo = JSON.stringify(
+              redistributionInfo
+            );
+
+            // 2. 鍒涘缓鏂扮殑璁板綍
+            const newRecord = {
+              ...this.currentRedistributeRecord,
+              id: null, // 鏂拌褰旾D涓虹┖
+              allocationstatus: "0", // 鏂拌褰曠姸鎬佷负鎻愪氦鍒嗛厤
+              reallocationreason: "", // 娓呯┖閲嶅垎閰嶅師鍥�
+              redistributionInfo: null,
+              // 閲嶇疆鐩稿叧瀛楁锛屼絾淇濈暀鍣ㄥ畼淇℃伅
+              caseno: "",
+              applicanttime: "",
+              organgettime: "",
+              name: "",
+              transplanthospitalno: "",
+              transplantHospitalName: ""
+            };
+
+            // 3. 鍦ㄦ暟缁勪腑鎻掑叆鏂拌褰曪紙鍦ㄦ棫璁板綍涔嬪悗锛�
+            this.allocationData.serviceDonateorganList.splice(
+              currentIndex + 1,
+              0,
+              newRecord
+            );
+            // 4. 鏇存柊鍘熻褰�
+            this.allocationData.serviceDonateorganList[
+              currentIndex
+            ] = originalRecord;
+
+            // 5. 鏇存柊閫変腑鐨勫櫒瀹樺垪琛�
+            this.selectedOrgans.push(this.currentRedistributeRecord.organno);
+
+            this.$message.success("閲嶅垎閰嶆搷浣滄垚鍔熷畬鎴�");
+            this.redistributionDialogVisible = false;
+          } else {
+            this.$message.error("鏈壘鍒板搴旂殑璁板綍");
+          }
+        } catch (error) {
+          console.error("閲嶅垎閰嶆搷浣滃け璐�:", error);
+          this.$message.error("閲嶅垎閰嶆搷浣滃け璐�");
+        } finally {
+          this.redistributionLoading = false;
+        }
+      });
+    },
+
     // 鍣ㄥ畼琛屾牱寮�
     getOrganRowClassName({ row }) {
-      if (
+      if (row.allocationstatus == "3") {
+        return "redistributed-row"; // 閲嶅垎閰嶈褰曟牱寮�
+      } else if (
         !row.caseno ||
         !row.applicanttime ||
+        !row.organgettime ||
         !row.name ||
         !row.transplanthospitalno
       ) {
-        return "warning-row";
+        return "warning-row"; // 淇℃伅涓嶅畬鏁存牱寮�
+      } else if (row.allocationstatus == "0") {
+        return "pending-row"; // 寰呭鏍告牱寮�
       }
       return "";
     },
+
     // 鏋勫缓 filePatch 瀛楁
     buildFilePatch() {
       if (!this.attachments || this.attachments.length == 0) {
@@ -940,6 +1480,7 @@
       }
       return JSON.stringify(this.attachments);
     },
+
     // 淇濆瓨鍩烘湰淇℃伅
     async handleSave() {
       this.$refs.form.validate(async valid => {
@@ -955,17 +1496,26 @@
             serviceDonateorganList:
               this.allocationData.serviceDonateorganList || []
           };
-          if (
-            submitData.allocationStatus == 1 ||
-            !submitData.allocationStatus
-          ) {
-            submitData.allocationStatus = 2;
-          }
-          saveData.fileName = this.buildFilePatch();
+
+          // 纭繚姣忔潯璁板綍閮芥湁鍒嗛厤鐘舵��
           saveData.serviceDonateorganList.forEach(item => {
             item.baseid = this.form.id;
             item.infoid = this.form.infoid;
+            // 纭繚鏈夊垎閰嶇姸鎬佸瓧娈�
+            if (!item.allocationstatus) {
+              item.allocationstatus = "0";
+            }
+            // 濡傛灉鏄噸鍒嗛厤璁板綍锛岀‘淇濇湁閲嶅垎閰嶄俊鎭�
+            if (item.allocationstatus == "3" && !item.reallocationreason) {
+              item.reallocationreason = item.redistributionInfo || "";
+            }
           });
+
+          if (saveData.allocationStatus == 1 || !saveData.allocationStatus) {
+            saveData.allocationStatus = 2;
+          }
+          saveData.fileName = this.buildFilePatch();
+
           const apiMethod = this.form.id ? allocationedit : allocationadd;
           const response = await apiMethod(saveData);
 
@@ -973,9 +1523,6 @@
             this.$message.success("淇濆瓨鎴愬姛");
             if (!this.form.id && response.data) {
               this.form.id = response.data;
-              // this.$router.replace({
-              //   query: { ...this.$route.query, id: this.form.id }
-              // });
             }
           } else {
             this.$message.error("淇濆瓨澶辫触锛�" + (response.msg || "鏈煡閿欒"));
@@ -988,38 +1535,7 @@
         }
       });
     },
-    // 淇濆瓨鍒嗛厤璁板綍
-    async handleSaveAllocation() {
-      if (!this.form.id) {
-        this.$message.warning("璇峰厛淇濆瓨鍩烘湰淇℃伅");
-        return;
-      }
 
-      this.saveLoading = true;
-      try {
-        const saveData = {
-          ...this.form,
-          attachments: this.attachments,
-          serviceDonateorganList:
-            this.allocationData.serviceDonateorganList || []
-        };
-
-        const response = await allocationedit(saveData);
-
-        if (response.code == 200) {
-          this.$message.success("鍒嗛厤璁板綍淇濆瓨鎴愬姛");
-        } else {
-          this.$message.error(
-            "淇濆瓨鍒嗛厤璁板綍澶辫触锛�" + (response.msg || "鏈煡閿欒")
-          );
-        }
-      } catch (error) {
-        console.error("淇濆瓨鍒嗛厤璁板綍澶辫触:", error);
-        this.$message.error("淇濆瓨鍒嗛厤璁板綍澶辫触");
-      } finally {
-        this.saveLoading = false;
-      }
-    },
     // 纭瀹屾垚鍒嗛厤
     async handleConfirmAllocation() {
       if (this.incompleteRecords > 0) {
@@ -1075,6 +1591,9 @@
     /** 闄勪欢鍙樺寲澶勭悊 */
     handleAttachmentChange(fileList) {
       this.attachmentFileList = fileList;
+    },
+    handleRedistributionChange(fileList) {
+      this.redistributionAttachmentList = fileList;
     },
 
     /** 闄勪欢绉婚櫎澶勭悊 */
@@ -1132,9 +1651,9 @@
         fileUrl: file.path || file.fileUrl,
         fileType: this.getFileType(file.fileName)
       };
-      // this.filePreviewTitle = file.fileName;
       this.filePreviewVisible = true;
     },
+
     handleDownloadAttachment(file) {
       const fileUrl = file.path || file.fileUrl;
       const fileName = file.fileName;
@@ -1213,6 +1732,8 @@
 
     /** 鑾峰彇鏂囦欢鎵╁睍鍚� */
     getFileExtension(filename) {
+      console.log(filename, "filename");
+
       return filename
         .split(".")
         .pop()
@@ -1342,7 +1863,46 @@
   font-size: 20px;
   font-weight: bold;
 }
+/* 鍦╯tyle閮ㄥ垎娣诲姞 */
+.section-title {
+  font-weight: 600;
+  color: #303133;
+  margin-bottom: 8px;
+  font-size: 14px;
+}
 
+.section-content {
+  background: #f5f7fa;
+  padding: 12px;
+  border-radius: 4px;
+  border-left: 3px solid #e6a23c;
+  line-height: 1.6;
+}
+
+.redistribution-attachments {
+  margin-top: 10px;
+  border: 1px solid #ebeef5;
+  border-radius: 4px;
+  overflow: hidden;
+}
+
+/* 閲嶅垎閰嶈鎯呰〃鏍兼牱寮� */
+:deep(.redistribution-attachments .el-table) {
+  border: none;
+}
+
+:deep(.redistribution-attachments .el-table th) {
+  background-color: #f5f7fa;
+  color: #606266;
+  font-weight: 600;
+}
+
+/* 鍝嶅簲寮忚皟鏁� */
+@media (max-width: 768px) {
+  .redistribution-attachments {
+    overflow-x: auto;
+  }
+}
 /* 绌虹姸鎬佹牱寮� */
 .empty-allocation {
   text-align: center;
@@ -1350,15 +1910,23 @@
   color: #909399;
 }
 
-/* 瀵硅瘽妗嗗簳閮ㄦ寜閽� */
-.dialog-footer {
-  margin-top: 20px;
-  text-align: center;
-  padding-top: 20px;
-  border-top: 1px solid #e4e7ed;
+/* 鏃犳暟鎹牱寮� */
+.no-data {
+  color: #909399;
+  font-style: italic;
 }
 
 /* 琛ㄦ牸琛屾牱寮� */
+:deep(.redistributed-row) {
+  background-color: #fdf6ec;
+  opacity: 0.8;
+}
+
+:deep(.redistributed-row:hover) {
+  background-color: #faecd8;
+  opacity: 0.9;
+}
+
 :deep(.warning-row) {
   background-color: #fff7e6;
 }
@@ -1367,6 +1935,42 @@
   background-color: #ffecc2;
 }
 
+:deep(.pending-row) {
+  background-color: #f0f9ff;
+}
+
+:deep(.pending-row:hover) {
+  background-color: #e0f2ff;
+}
+
+/* 绂佺敤鐘舵�佺殑杈撳叆妗嗘牱寮� */
+:deep(.el-input.is-disabled .el-input__inner) {
+  background-color: #f5f7fa;
+  border-color: #e4e7ed;
+  color: #c0c4cc;
+  cursor: not-allowed;
+}
+
+:deep(.el-textarea.is-disabled .el-textarea__inner) {
+  background-color: #f5f7fa;
+  border-color: #e4e7ed;
+  color: #c0c4cc;
+  cursor: not-allowed;
+}
+
+/* 閲嶅垎閰嶆寜閽牱寮� */
+:deep(.el-button--text.is-disabled) {
+  color: #c0c4cc !important;
+  cursor: not-allowed;
+}
+
+/* 閲嶅垎閰嶄俊鎭彁绀烘鏍峰紡 */
+:deep(.el-tooltip__popper) {
+  max-width: 300px;
+  white-space: pre-line;
+  line-height: 1.6;
+}
+
 /* 鍝嶅簲寮忚璁� */
 @media (max-width: 768px) {
   .organ-allocation-detail {
diff --git a/src/views/business/appear/caseDetail.vue b/src/views/business/appear/caseDetail.vue
index 3b27c8b..58eb5c6 100644
--- a/src/views/business/appear/caseDetail.vue
+++ b/src/views/business/appear/caseDetail.vue
@@ -117,7 +117,13 @@
         <span class="section-title">鍖婚櫌淇℃伅</span>
       </div>
       <el-descriptions :column="2" border>
-        <el-descriptions-item label="娌荤枟鍖婚櫌鍚嶇О">{{
+        <el-descriptions-item label="ICU璇勪及鍖荤敓">{{
+          caseData.icuDoctor || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="ICU鍖荤敓鐢佃瘽">{{
+          caseData.icuDoctorPhone || "-"
+        }}</el-descriptions-item
+        ><el-descriptions-item label="娌荤枟鍖婚櫌鍚嶇О">{{
           caseData.treatmenthospitalname || "-"
         }}</el-descriptions-item>
         <!-- <el-descriptions-item label="娌荤枟绉戝鍚嶇О">{{
diff --git a/src/views/business/appear/index.vue b/src/views/business/appear/index.vue
index a1ee5cc..68194a3 100644
--- a/src/views/business/appear/index.vue
+++ b/src/views/business/appear/index.vue
@@ -715,7 +715,24 @@
             ></i>
             <span>鍖婚櫌淇℃伅</span>
           </div>
-
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor">
+                <el-input
+                  v-model="editForm.icuDoctor"
+                  placeholder="璇疯緭鍏CU璇勪及鍖荤敓"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="ICU鍖荤敓鐢佃瘽" prop="icuDoctorPhone">
+                <el-input
+                  v-model="editForm.icuDoctorPhone"
+                  placeholder="璇疯緭鍏CU鍖荤敓鎵嬫満鍙�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
           <el-row :gutter="20">
             <el-col :span="12">
               <el-form-item label="娌荤枟鍖婚櫌" prop="treatmenthospitalname">
@@ -998,7 +1015,15 @@
     FilePreviewDialog
   },
   dicts: ["sys_user_sex", "sys_BloodType", "sys_Infectious", "sys_IDType"],
+
   data() {
+    const validateConfirmResult = (rule, value, callback) => {
+      if (this.approveForm.approveResult === "4" && !value) {
+        callback(new Error("椹冲洖鏃跺繀椤诲~鍐欓┏鍥炴剰瑙�"));
+      } else {
+        callback();
+      }
+    };
     return {
       // 閬僵灞�
       loading: false,
@@ -1048,9 +1073,7 @@
         approveResult: [
           { required: true, message: "璇烽�夋嫨纭缁撴灉", trigger: "change" }
         ],
-        confirmResult: [
-          { required: true, message: "璇疯緭鍏ョ‘璁ゆ剰瑙�", trigger: "blur" }
-        ],
+        confirmResult: [{ validator: validateConfirmResult, trigger: "blur" }],
         rejectType: {
           required: false,
           validator: (rule, value, callback) => {
@@ -1219,7 +1242,7 @@
         }
         return "鏈夎浆杩愬崟";
       }
-      return "闇�杞繍";
+      return "鏈煡";
     },
 
     /** 璺宠浆鍒板垱寤鸿浆杩愬崟椤甸潰 */
diff --git a/src/views/business/course/components/DeathJudgmentStage.vue b/src/views/business/course/components/DeathJudgmentStage.vue
index b64306c..8550177 100644
--- a/src/views/business/course/components/DeathJudgmentStage.vue
+++ b/src/views/business/course/components/DeathJudgmentStage.vue
@@ -23,7 +23,7 @@
         </el-tab-pane>
       </el-tabs>
     </el-card>
-    <el-card class="detail-card common-info-card">
+    <!-- <el-card class="detail-card common-info-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">鍏叡淇℃伅</span>
       </div>
@@ -71,7 +71,7 @@
           </el-col>
         </el-row>
       </el-form>
-    </el-card>
+    </el-card> -->
     <!-- 鑴戞浜″垽瀹氭ā鍧� -->
     <el-card v-if="activeJudgmentType === 'brain'" class="detail-card">
       <div slot="header" class="clearfix">
diff --git a/src/views/business/course/components/DonationConfirmStage.vue b/src/views/business/course/components/DonationConfirmStage.vue
index 044817c..7d55c4d 100644
--- a/src/views/business/course/components/DonationConfirmStage.vue
+++ b/src/views/business/course/components/DonationConfirmStage.vue
@@ -79,10 +79,10 @@
             </el-form-item>
           </el-col>
           <el-col :span="6">
-            <el-form-item label="涓庢崘璧犺�呭叧绯�" prop="signfamilyrelations">
+            <el-form-item label="涓庢崘鐚�呭叧绯�" prop="signfamilyrelations">
               <el-select
                 v-model="form.signfamilyrelations"
-                placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+                placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
               >
                 <el-option
                   v-for="dict in dict.type.sys_FamilyRelation || []"
diff --git a/src/views/business/course/components/EthicalReviewStage.vue b/src/views/business/course/components/EthicalReviewStage.vue
index 7b874b4..3192819 100644
--- a/src/views/business/course/components/EthicalReviewStage.vue
+++ b/src/views/business/course/components/EthicalReviewStage.vue
@@ -758,7 +758,7 @@
 <script>
 import { getToken } from "@/utils/auth";
 import {
-  reviewinitiateBaseInfoList,
+  ethicalreviewgetInfoID,
   ethicalreviewedit,
   ethicalreviewadd,
   ethicalreviewInfo,
@@ -1106,7 +1106,7 @@
         if (id) {
           response = await ethicalreviewInfo(id);
         } else if (infoid) {
-          response = await reviewinitiateBaseInfoList({ infoid: infoid });
+          response = await ethicalreviewgetInfoID({ InfoId: infoid });
         }
 
         if (response.code === 200) {
@@ -1123,7 +1123,7 @@
               this.$set(this.form, "ethicalreviewopinionsList", []);
             }
           } else if (response.data && infoid) {
-            this.form = response.data[0];
+            this.form = response.data;
             // 瑙f瀽 filePatch 瀛楁
             this.parseFilePatch(this.form.filePatch);
             this.initAttachmentFileList();
diff --git a/src/views/business/course/components/OrganAllocationStage.vue b/src/views/business/course/components/OrganAllocationStage.vue
index 41cbcf9..72caae8 100644
--- a/src/views/business/course/components/OrganAllocationStage.vue
+++ b/src/views/business/course/components/OrganAllocationStage.vue
@@ -688,7 +688,7 @@
     // 鑾峰彇璇︽儏
     async getDetail(infoid, id) {
       this.loading = true;
-      donateorganBaseinfoInfo(id);
+
       try {
         const response = await allocationList({ infoid });
         if (response.code == 200 && response.data && response.data.length > 0) {
diff --git a/src/views/business/course/components/components/BloodRoutinePanel.vue b/src/views/business/course/components/components/BloodRoutinePanel.vue
index a43e2fd..d8aed02 100644
--- a/src/views/business/course/components/components/BloodRoutinePanel.vue
+++ b/src/views/business/course/components/components/BloodRoutinePanel.vue
@@ -29,7 +29,7 @@
       border
       style="width: 100%"
       class="medical-table"
-      v-fit-columns
+
       :key="tableKey"
       @header-dragend="handleHeaderDragEnd"
       v-loading="tableLoading"
diff --git a/src/views/business/course/components/components/LiverKidneyPanel.vue b/src/views/business/course/components/components/LiverKidneyPanel.vue
index a485fed..fcd83bf 100644
--- a/src/views/business/course/components/components/LiverKidneyPanel.vue
+++ b/src/views/business/course/components/components/LiverKidneyPanel.vue
@@ -19,7 +19,7 @@
       style="width: 100%"
       class="medical-table"
       :key="tableKey"
-      v-fit-columns
+
       @header-dragend="handleHeaderDragEnd"
     >
       <el-table-column
diff --git a/src/views/business/course/components/components/UrineRoutinePanel.vue b/src/views/business/course/components/components/UrineRoutinePanel.vue
index 4d62072..e5c5d49 100644
--- a/src/views/business/course/components/components/UrineRoutinePanel.vue
+++ b/src/views/business/course/components/components/UrineRoutinePanel.vue
@@ -29,7 +29,7 @@
       border
       style="width: 100%"
       class="medical-table"
-      v-fit-columns
+
       :key="tableKey"
       @header-dragend="handleHeaderDragEnd"
       v-loading="tableLoading"
diff --git a/src/views/business/course/index.vue b/src/views/business/course/index.vue
index dcbb645..02501b3 100644
--- a/src/views/business/course/index.vue
+++ b/src/views/business/course/index.vue
@@ -2,13 +2,10 @@
   <div class="donation-process-detail">
     <el-card class="process-card">
       <div class="process-container">
-        <!-- 宸︿晶鏃堕棿绾� - 鐙珛鍥哄畾锛屽唴閮ㄥ彲婊氬姩 -->
+        <!-- 宸︿晶鏃堕棿绾� -->
         <div class="timeline-section">
           <div class="section-header">
             <h3>鎹愮尞杩涚▼鏃堕棿绾�</h3>
-            <el-tag :type="getOverallStatusTag(caseInfo.status)">
-              {{ getStatusText(caseInfo.status) }}
-            </el-tag>
           </div>
 
           <div class="timeline-scroll-container">
@@ -18,20 +15,20 @@
                 :key="stage.key"
                 class="timeline-item"
                 :class="{
-                  active: activeStage === stage.key,
-                  completed: stage.status === 'completed',
-                  'in-progress': stage.status === 'in_progress',
-                  pending: stage.status === 'pending'
+                  active: stage.status == 'active',
+                  completed: stage.status == 'completed',
+                  progress: stage.status == 'progress',
+                  pending: stage.status == 'pending'
                 }"
                 @click="handleStageClick(stage)"
               >
                 <div class="timeline-marker">
                   <i
-                    v-if="stage.status === 'completed'"
+                    v-if="stage.status == 'completed'"
                     class="el-icon-check"
                   ></i>
                   <i
-                    v-else-if="stage.status === 'in_progress'"
+                    v-else-if="stage.status == 'progress'"
                     class="el-icon-loading"
                   ></i>
                   <i v-else class="el-icon-time"></i>
@@ -40,25 +37,21 @@
                 <div class="timeline-content">
                   <div class="stage-header">
                     <span class="stage-name">{{ stage.name }}</span>
-                    <el-tag
-                      size="small"
-                      :type="getStageStatusTag(stage.status)"
-                    >
-                      {{ getStageStatusText(stage.status) }}
-                    </el-tag>
+                    <dict-tag
+                      :options="dict.type[stage.dict]"
+                      :value="stage.state"
+                    />
                   </div>
 
                   <div class="stage-info">
-                    <div v-if="stage.completeTime" class="time-info">
-                      <span
-                        >瀹屾垚鏃堕棿: {{ formatTime(stage.completeTime) }}</span
-                      >
+                    <div v-if="stage.createtime" class="time-info">
+                      鍒涘缓鏃堕棿: {{ formatTime(stage.createtime) }}
                     </div>
                     <div v-if="stage.updateTime" class="time-info">
-                      <span>鏈�杩戞洿鏂�: {{ formatTime(stage.updateTime) }}</span>
+                      鏈�杩戞洿鏂�: {{ formatTime(stage.updateTime) }}
                     </div>
                     <div v-if="stage.operator" class="operator-info">
-                      <span>璐熻矗浜�: {{ stage.operator }}</span>
+                      璐熻矗浜�: {{ stage.operator }}
                     </div>
                   </div>
                 </div>
@@ -67,19 +60,15 @@
           </div>
         </div>
 
-        <!-- 鍙充晶鍐呭鍖哄煙 - 鐙珛婊氬姩 -->
+        <!-- 鍙充晶鍐呭 -->
         <div class="content-section">
-          <!-- 妗堜緥鍩烘湰淇℃伅 - 鍥哄畾楂樺害锛屽彲婊氬姩 -->
           <case-basic-info :case-id="caseId" :show-attachment="true" />
 
-          <!-- 闃舵璇︽儏鍐呭 - 鑷�傚簲楂樺害锛屽彲婊氬姩 -->
           <div class="stage-detail-section">
             <div class="section-header">
               <h3>{{ activeStageName }} - 闃舵璇︽儏</h3>
-              <div class="stage-actions"></div>
             </div>
 
-            <!-- 鍔ㄦ�侀樁娈靛唴瀹� -->
             <div class="stage-content-wrapper">
               <component
                 :is="getStageComponent()"
@@ -96,135 +85,178 @@
 </template>
 
 <script>
+// ===================== 瀛楀吀 Label 鈫� UI 涓婚 =====================
+function mapDictLabelToTheme(label) {
+  if (!label) return "pending";
+
+  const l = label.trim();
+
+  // 寰� XX
+  if (/^寰�/.test(l)) {
+    return "progress";
+  }
+
+  // XX涓�
+  if (/涓�$/.test(l)) {
+    return "active";
+  }
+
+  // 瀹屾垚 / 瀹屾垚XX
+  if (/瀹屾垚/.test(l)) {
+    return "completed";
+  }
+
+  // 寮冪敤 / 鏀惧純
+  if (/寮冪敤|鏀惧純/.test(l)) {
+    return "danger";
+  }
+
+  return "pending";
+}
 import { getDonatebaseinfoflow } from "@/api/project/donatebaseinfo";
-import { getDonationProcessDetail } from "./donationProcess";
+import CaseBasicInfo from "@/components/CaseBasicInfo";
+
 import DonorMaintenanceStage from "./components/DonorMaintenanceStage";
-import MedicalAssessmentStage from "./components/MedicalAssessmentStage";
 import DeathJudgmentStage from "./components/DeathJudgmentStage";
+import MedicalAssessmentStage from "./components/MedicalAssessmentStage";
 import DonationConfirmStage from "./components/DonationConfirmStage";
 import EthicalReviewStage from "./components/EthicalReviewStage";
 import OrganAllocationStage from "./components/OrganAllocationStage";
 import OrganProcurementStage from "./components/OrganProcurementStage";
 import OrganUtilizationStage from "./components/OrganUtilizationStage";
-import CaseBasicInfo from "@/components/CaseBasicInfo";
 
 import dayjs from "dayjs";
+
+// ============== 瀛楀吀鏄犲皠锛堜綘鍚庨潰鑷繁鏀癸級 ==============
+const STAGE_DICT_MAP = {
+  donatemaintenance: "maintain_type",
+  deathinfo: "decide_type",
+  medicalevaluation: "state_Evaluation",
+  relativesconfirmation: "affirm_type",
+  donateflowcharts: "sys_ethical",
+  donateorgansService: "allocation_Status",
+  donationwitness: "Obtain_status",
+  donatecompletioninfo: "utilize_statue"
+};
+
+// state -> 娴佺▼鐘舵��
+const STATE_MAP = {
+  0: "pending",
+  1: "progress",
+  2: "completed",
+  3: "terminated"
+};
+
+// 闃舵閰嶇疆
+const STAGE_CONFIG = [
+  { key: "donor_maintenance", name: "渚涜�呯淮鎶�", apiKey: "donatemaintenance" },
+  { key: "death_judgment", name: "姝讳骸鍒ゅ畾", apiKey: "deathinfo" },
+  { key: "medical_assessment", name: "鍖诲璇勪及", apiKey: "medicalevaluation" },
+  {
+    key: "donation_confirm",
+    name: "鎹愮尞纭",
+    apiKey: "relativesconfirmation"
+  },
+  { key: "ethical_review", name: "浼︾悊瀹℃煡", apiKey: "donateflowcharts" },
+  { key: "organ_allocation", name: "鍣ㄥ畼鍒嗛厤", apiKey: "donateorgansService" },
+  { key: "organ_procurement", name: "鍣ㄥ畼鑾峰彇", apiKey: "donationwitness" },
+  { key: "organ_utilization", name: "鍣ㄥ畼鍒╃敤", apiKey: "donatecompletioninfo" }
+];
 
 export default {
   name: "DonationProcessDetail",
   components: {
+    CaseBasicInfo,
     DonorMaintenanceStage,
-    MedicalAssessmentStage,
     DeathJudgmentStage,
+    MedicalAssessmentStage,
     DonationConfirmStage,
     EthicalReviewStage,
     OrganAllocationStage,
     OrganProcurementStage,
-    OrganUtilizationStage,
-    CaseBasicInfo
+    OrganUtilizationStage
   },
-  dicts: ["sys_user_sex", "sys_BloodType", "sys_0_1"],
+  dicts: [
+    "decide_type",
+    "maintain_type",
+    "state_Evaluation",
+    "affirm_type",
+    "sys_ethical",
+    "allocation_Status",
+    "Obtain_status",
+    "utilize_statue"
+  ], // 杩欓噷鍙0鏄庝竴涓嵆鍙紝鍏朵綑閫氳繃 dict.type[xxx] 浣跨敤
   data() {
     return {
       caseId: null,
-      infoid: null,
-      caseInfo: {
-        id: "",
-        caseNo: "",
-        hospitalNo: "",
-        donorName: "",
-        gender: "",
-        age: "",
-        bloodType: "",
-        diagnosis: "",
-        status: "in_progress",
-        createTime: "",
-        registrant: "",
-        currentStage: "donor_maintenance"
-      },
-      processStages: [
-        {
-          key: "donor_maintenance",
-          name: "渚涜�呯淮鎶�",
-          status: "completed",
-          completeTime: "2025-12-01 10:00:00",
-          updateTime: "2025-12-01 10:00:00",
-          operator: "寮犲尰鐢�"
-        },
-        {
-          key: "death_judgment",
-          name: "姝讳骸鍒ゅ畾",
-          status: "completed",
-          completeTime: "2025-12-02 14:30:00",
-          updateTime: "2025-12-02 14:30:00",
-          operator: "鐜嬪尰鐢�"
-        },
-        {
-          key: "medical_assessment",
-          name: "鍖诲璇勪及",
-          status: "completed",
-
-          completeTime: "2025-12-03 09:15:00",
-          updateTime: "2025-12-03 09:15:00",
-          operator: "鏉庝富浠�"
-        },
-        {
-          key: "donation_confirm",
-          name: "鎹愮尞纭",
-          status: "completed",
-          completeTime: "2025-12-03 11:00:00",
-          updateTime: "2025-12-03 11:00:00",
-          operator: "璧靛崗璋冨憳"
-        },
-        {
-          key: "ethical_review",
-          name: "浼︾悊瀹℃煡",
-          status: "completed",
-          completeTime: "2025-12-03 15:20:00",
-          updateTime: "2025-12-03 15:20:00",
-          operator: "浼︾悊濮斿憳浼�"
-        },
-        {
-          key: "organ_allocation",
-          name: "鍣ㄥ畼鍒嗛厤",
-          status: "in_progress",
-          updateTime: "2025-12-04 10:00:00",
-          operator: "鍒嗛厤绯荤粺"
-        },
-        {
-          key: "organ_procurement",
-          name: "鍣ㄥ畼鑾峰彇",
-          status: "in_progress",
-          operator: "寰呭垎閰�"
-        },
-        {
-          key: "organ_utilization",
-          name: "鍣ㄥ畼鍒╃敤",
-          status: "in_progress",
-          operator: "寰呭垎閰�"
-        }
-      ],
-      activeStage: "organ_allocation",
-      activeStageName: "鍣ㄥ畼鍒嗛厤",
-      activeStageData: {},
-      loading: false
+      caseInfo: {},
+      processStages: [],
+      activeStage: "",
+      activeStageName: "",
+      activeStageData: {}
     };
   },
-  computed: {},
   created() {
     this.caseId = this.$route.query.id;
-    this.infoid = this.$route.query.id;
-
     if (this.caseId) {
       this.getDetail();
-    } else {
-      this.generateMockData();
     }
-    this.setActiveStage(this.activeStage);
   },
   methods: {
+    async getDetail() {
+      try {
+        const res = await getDonatebaseinfoflow(this.caseId);
+
+        const data = res;
+
+        this.caseInfo = data.donatebaseinfo || {};
+
+        this.processStages = STAGE_CONFIG.map(stage => {
+          const obj = data[stage.apiKey] || {};
+          console.log(stage.apiKey, "stage.apiKey");
+          console.log(this.dict?.type?.[STAGE_DICT_MAP[stage.apiKey]]);
+
+          const dictLabel =
+            this.dict?.type?.[STAGE_DICT_MAP[stage.apiKey]]?.find(
+              d => d.value == obj.state
+            )?.label || "";
+
+          const theme = mapDictLabelToTheme(dictLabel);
+
+          return {
+            key: stage.key,
+            name: stage.name,
+            dict: STAGE_DICT_MAP[stage.apiKey],
+            state: obj.state,
+            dictLabel,
+            status: theme, // 鉁� 鏍稿績锛歎I 涓婚鐢� dictLabel 鍐冲畾
+            createtime: obj.createtime,
+            updateTime: obj.updatetime,
+            operator: obj.updateperson || obj.createperson
+          };
+        });
+
+        const active =
+          this.processStages.find(s => s.status == "progress") ||
+          [...this.processStages].reverse().find(s => s.status == "completed");
+
+        this.setActiveStage(active?.key || STAGE_CONFIG[0].key);
+      } catch (e) {
+        console.error(e);
+        this.$message.error("鑾峰彇娴佺▼璇︽儏澶辫触");
+      }
+    },
+
+    setActiveStage(key) {
+      const stage = this.processStages.find(s => s.key == key);
+      if (!stage) return;
+      this.activeStage = key;
+      this.activeStageName = stage.name;
+      this.activeStageData = stage;
+    },
+
     getStageComponent() {
-      const componentMap = {
+      const map = {
         donor_maintenance: "DonorMaintenanceStage",
         death_judgment: "DeathJudgmentStage",
         medical_assessment: "MedicalAssessmentStage",
@@ -234,169 +266,19 @@
         organ_procurement: "OrganProcurementStage",
         organ_utilization: "OrganUtilizationStage"
       };
-      return componentMap[this.activeStage];
+      return map[this.activeStage];
     },
-    // 鑾峰彇璇︽儏鏁版嵁
-    async getDetail() {
-      this.loading = true;
-      try {
-        const response = await getDonatebaseinfoflow(this.caseId);
-        if (response.code === 200) {
-          this.caseInfo = response.data.caseInfo;
-          this.processStages = response.data.processStages;
-          this.setActiveStage(response.data.currentStage);
-        }
-      } catch (error) {
-        console.error("鑾峰彇鎹愮尞杩涚▼璇︽儏澶辫触:", error);
-        this.$message.error("鑾峰彇璇︽儏澶辫触");
-      } finally {
-        this.loading = false;
-      }
-    },
-    // 鐢熸垚妯℃嫙鏁版嵁
-    generateMockData() {
-      this.caseInfo = {
-        id: "202512001",
-        caseNo: "C202512001",
-        hospitalNo: "D202512001",
-        donorName: "寮犱笁",
-        gender: "0",
-        age: 45,
-        bloodType: "A",
-        diagnosis: "鑴戝浼�",
-        status: "in_progress",
-        createTime: "2025-12-01 08:00:00",
-        registrant: "鏉庡崗璋冨憳",
-        currentStage: "organ_allocation"
-      };
-    },
-    // 璁剧疆褰撳墠婵�娲婚樁娈�
-    setActiveStage(stageKey) {
-      this.activeStage = stageKey;
-      const stage = this.processStages.find(s => s.key === stageKey);
-      if (stage) {
-        this.activeStageName = stage.name;
-        this.activeStageData = stage;
-        console.log(this.activeStageData, "this.activeStageData");
-      }
-    },
-    // 澶勭悊闃舵鐐瑰嚮
+
     handleStageClick(stage) {
-      if (stage.status !== "pending") {
-        this.setActiveStage(stage.key);
-      } else {
-        this.$message.warning("璇ラ樁娈靛皻鏈紑濮嬶紝鏃犳硶鏌ョ湅璇︽儏");
+      if (stage.status == "pending") {
+        this.$message.warning("璇ラ樁娈靛皻鏈紑濮�");
+        return;
       }
+      this.setActiveStage(stage.key);
     },
-    // 鑾峰彇闃舵鐘舵�佹爣绛剧被鍨�
-    getStageStatusTag(status) {
-      const map = {
-        completed: "success",
-        in_progress: "warning",
-        pending: "info"
-      };
-      return map[status] || "info";
-    },
-    // 鑾峰彇闃舵鐘舵�佹枃鏈�
-    getStageStatusText(status) {
-      const map = {
-        completed: "宸插畬鎴�",
-        in_progress: "杩涜涓�",
-        pending: "鏈紑濮�"
-      };
-      return map[status] || "鏈煡";
-    },
-    // 鑾峰彇鏁翠綋鐘舵�佹爣绛剧被鍨�
-    getOverallStatusTag(status) {
-      const map = {
-        completed: "success",
-        in_progress: "warning",
-        pending: "info",
-        terminated: "danger"
-      };
-      return map[status] || "info";
-    },
-    // 鑾峰彇鏁翠綋鐘舵�佹枃鏈�
-    getStatusText(status) {
-      const map = {
-        completed: "宸插畬鎴�",
-        in_progress: "杩涜涓�",
-        pending: "鏈紑濮�",
-        terminated: "宸茬粓姝�"
-      };
-      return map[status] || "鏈煡";
-    },
-    // 鏃堕棿鏍煎紡鍖�
+
     formatTime(time) {
-      if (!time) return "-";
-      return dayjs(time).format("YYYY-MM-DD HH:mm");
-    },
-
-    // 鑾峰彇褰撳墠闃舵鍚嶇О
-    getCurrentStageName() {
-      const currentStage = this.processStages.find(
-        stage => stage.status === "in_progress"
-      );
-      return currentStage ? currentStage.name : "宸插畬鎴�";
-    },
-    // 缂栬緫鍩烘湰淇℃伅
-    handleEditBasicInfo() {
-      this.$message.info("缂栬緫鍩烘湰淇℃伅鍔熻兘");
-    },
-    // 瀹屾垚闃舵
-    handleCompleteStage() {
-      this.$confirm(`纭畾瑕佸畬鎴愩��${this.activeStageName}銆戦樁娈靛悧锛焋, "鎻愮ず", {
-        confirmButtonText: "纭畾",
-        cancelButtonText: "鍙栨秷",
-        type: "warning"
-      }).then(() => {
-        // 鏇存柊褰撳墠闃舵鐘舵��
-        const currentIndex = this.processStages.findIndex(
-          stage => stage.key === this.activeStage
-        );
-
-        if (currentIndex !== -1) {
-          this.processStages[currentIndex].status = "completed";
-          this.processStages[
-            currentIndex
-          ].completeTime = new Date().toISOString();
-
-          // 婵�娲讳笅涓�涓樁娈�
-          if (currentIndex < this.processStages.length - 1) {
-            this.processStages[currentIndex + 1].status = "in_progress";
-            this.setActiveStage(this.processStages[currentIndex + 1].key);
-          } else {
-            this.caseInfo.status = "completed";
-          }
-
-          this.$message.success("闃舵宸插畬鎴�");
-        }
-      });
-    },
-    // 鏌ョ湅璇︽儏
-    handleViewDetail() {
-      const routeMap = {
-        donor_maintenance: "/case/donorMaintenance/detail",
-        death_judgment: "/case/deathJudgment/detail",
-        medical_assessment: "/case/medicalAssessment/detail",
-        donation_confirm: "/case/donationConfirm/detail",
-        ethical_review: "/case/ethicalReview/detail",
-        organ_allocation: "/case/organAllocation/detail",
-        organ_procurement: "/case/organProcurement/detail",
-        organ_utilization: "/case/organUtilization/detail"
-      };
-
-      const route = routeMap[this.activeStage];
-      if (route) {
-        this.$router.push({
-          path: route,
-          query: { id: this.caseId }
-        });
-      }
-    },
-    // 淇敼闃舵淇℃伅
-    handleModifyStage() {
-      this.$message.info(`淇敼${this.activeStageName}淇℃伅鍔熻兘`);
+      return time ? dayjs(time).format("YYYY-MM-DD HH:mm") : "-";
     }
   }
 };
@@ -418,31 +300,40 @@
 
 .process-container {
   display: flex;
-  min-height: 600px; /* 璁剧疆涓�涓渶灏忛珮搴� */
+  min-height: 600px;
+  /* 璁剧疆涓�涓渶灏忛珮搴� */
   gap: 20px;
-  align-items: flex-start; /* 椤堕儴瀵归綈 */
+  align-items: flex-start;
+  /* 椤堕儴瀵归綈 */
 }
 
 /* 宸︿晶鏃堕棿绾挎牱寮� - 鍥哄畾楂樺害锛屽唴閮ㄦ粴鍔� */
 .timeline-section {
-  flex: 0 0 320px; /* 鍥哄畾瀹藉害 */
+  flex: 0 0 320px;
+  /* 鍥哄畾瀹藉害 */
   display: flex;
   flex-direction: column;
   background: white;
   border-radius: 6px;
   padding: 20px;
   box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
-  height: calc(120vh - 120px); /* 鏍规嵁瑙嗗彛楂樺害鑷�傚簲 */
-  max-height: 1200px; /* 璁剧疆鏈�澶ч珮搴� */
-  position: sticky; /* 浣跨敤 sticky 瀹氫綅 */
-  top: 20px; /* 璺濈椤堕儴 20px */
+  height: calc(120vh - 120px);
+  /* 鏍规嵁瑙嗗彛楂樺害鑷�傚簲 */
+  max-height: 1200px;
+  /* 璁剧疆鏈�澶ч珮搴� */
+  position: sticky;
+  /* 浣跨敤 sticky 瀹氫綅 */
+  top: 20px;
+  /* 璺濈椤堕儴 20px */
 }
 
 .timeline-scroll-container {
   flex: 1;
-  overflow-y: auto; /* 鍐呴儴鍙粴鍔� */
+  overflow-y: auto;
+  /* 鍐呴儴鍙粴鍔� */
   margin-top: 20px;
-  padding-right: 8px; /* 涓烘粴鍔ㄦ潯鐣欏嚭绌洪棿 */
+  padding-right: 8px;
+  /* 涓烘粴鍔ㄦ潯鐣欏嚭绌洪棿 */
 }
 
 .timeline-scroll-container::-webkit-scrollbar {
@@ -476,7 +367,8 @@
   display: flex;
   flex-direction: column;
   gap: 20px;
-  min-height: 0; /* 閲嶈锛氬厑璁竑lex瀛愰」鍘嬬缉 */
+  min-height: 0;
+  /* 閲嶈锛氬厑璁竑lex瀛愰」鍘嬬缉 */
 }
 
 .basic-info-section {
@@ -486,13 +378,16 @@
   box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
   display: flex;
   flex-direction: column;
-  min-height: 0; /* 閲嶈 */
+  min-height: 0;
+  /* 閲嶈 */
 }
 
 .basic-info-content {
   flex: 1;
-  max-height: 300px; /* 鍩烘湰淇℃伅鍖哄煙鏈�澶ч珮搴� */
-  overflow-y: auto; /* 鍩烘湰淇℃伅鍐呴儴鍙粴鍔� */
+  max-height: 300px;
+  /* 鍩烘湰淇℃伅鍖哄煙鏈�澶ч珮搴� */
+  overflow-y: auto;
+  /* 鍩烘湰淇℃伅鍐呴儴鍙粴鍔� */
   margin-top: 20px;
   padding-right: 8px;
 }
@@ -520,24 +415,30 @@
 }
 
 .stage-detail-section {
-  flex: 1; /* 鍗犳嵁鍓╀綑绌洪棿 */
+  flex: 1;
+  /* 鍗犳嵁鍓╀綑绌洪棿 */
   background: white;
   border-radius: 6px;
   padding: 20px;
   box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
   display: flex;
   flex-direction: column;
-  min-height: 400px; /* 鏈�灏忛珮搴� */
-  max-height: 800px; /* 鏈�澶ч珮搴︼紝鍙牴鎹渶瑕佽皟鏁� */
-  overflow: hidden; /* 闅愯棌澶栧眰婧㈠嚭 */
+  min-height: 400px;
+  /* 鏈�灏忛珮搴� */
+  max-height: 800px;
+  /* 鏈�澶ч珮搴︼紝鍙牴鎹渶瑕佽皟鏁� */
+  overflow: hidden;
+  /* 闅愯棌澶栧眰婧㈠嚭 */
 }
 
 .stage-content-wrapper {
   flex: 1;
-  overflow-y: auto; /* 闃舵璇︽儏鍐呴儴鍙粴鍔� */
+  overflow-y: auto;
+  /* 闃舵璇︽儏鍐呴儴鍙粴鍔� */
   margin-top: 20px;
   padding-right: 8px;
-  min-height: 0; /* 閲嶈 */
+  min-height: 0;
+  /* 閲嶈 */
 }
 
 .stage-content-wrapper::-webkit-scrollbar {
@@ -563,7 +464,8 @@
   display: flex;
   justify-content: space-between;
   align-items: center;
-  flex-shrink: 0; /* 闃叉琚帇缂� */
+  flex-shrink: 0;
+  /* 闃叉琚帇缂� */
 }
 
 .section-header h3 {
@@ -581,14 +483,22 @@
   cursor: pointer;
   transition: all 0.3s ease;
   border: 1px solid #e4e7ed;
-  flex-shrink: 0; /* 闃叉琚帇缂� */
+  flex-shrink: 0;
+  /* 闃叉琚帇缂� */
 }
 
 .timeline-item:hover {
   box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
   transform: translateY(-1px);
 }
+.timeline-item.danger {
+  border-color: #f56c6c;
+  background-color: #fef0f0;
+}
 
+.timeline-item.danger .timeline-marker {
+  background-color: #f56c6c;
+}
 .timeline-item.active {
   border-color: #409eff;
   background-color: #f0f9ff;
@@ -599,7 +509,7 @@
   background-color: #f0f9e8;
 }
 
-.timeline-item.in-progress {
+.timeline-item.progress {
   border-color: #e6a23c;
   background-color: #fdf6ec;
 }
@@ -624,8 +534,11 @@
 .timeline-item.completed .timeline-marker {
   background-color: #67c23a;
 }
+.timeline-item.active .timeline-marker {
+  background-color: #409eff;
+}
 
-.timeline-item.in-progress .timeline-marker {
+.timeline-item.progress .timeline-marker {
   background-color: #e6a23c;
 }
 
@@ -684,7 +597,8 @@
     width: 100%;
     height: auto;
     max-height: 300px;
-    position: static; /* 灏忓睆骞曞彇娑� sticky */
+    position: static;
+    /* 灏忓睆骞曞彇娑� sticky */
   }
 
   .timeline-scroll-container {
diff --git a/src/views/business/decide/DecideInfo.vue b/src/views/business/decide/DecideInfo.vue
index 0e262e8..894015e 100644
--- a/src/views/business/decide/DecideInfo.vue
+++ b/src/views/business/decide/DecideInfo.vue
@@ -24,7 +24,7 @@
         </el-tab-pane>
       </el-tabs>
     </el-card>
-    <el-card class="detail-card common-info-card">
+    <!-- <el-card class="detail-card common-info-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">鍏叡淇℃伅</span>
       </div>
@@ -46,33 +46,10 @@
               <el-input v-model="form.gainhospitalname" :readonly="!isEdit" />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
-            <el-form-item label="鏄惁榛樺搥缂呮��" prop="isspendremember">
-              <el-select
-                v-model="form.isspendremember"
-                :disabled="!isEdit"
-                style="width: 100%"
-              >
-                <el-option label="鏄�" :value="1" />
-                <el-option label="鍚�" :value="0" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鎭㈠閬椾綋浠" prop="isrestoreremains">
-              <el-select
-                v-model="form.isrestoreremains"
-                :disabled="!isEdit"
-                style="width: 100%"
-              >
-                <el-option label="鏄�" :value="1" />
-                <el-option label="鍚�" :value="0" />
-              </el-select>
-            </el-form-item>
-          </el-col>
+
         </el-row>
       </el-form>
-    </el-card>
+    </el-card> -->
     <!-- 鑴戞浜″垽瀹氭ā鍧� -->
     <el-card v-if="activeJudgmentType === 'brain'" class="detail-card">
       <div slot="header" class="clearfix">
diff --git a/src/views/business/decide/index.vue b/src/views/business/decide/index.vue
index 9ccf9f2..48a0536 100644
--- a/src/views/business/decide/index.vue
+++ b/src/views/business/decide/index.vue
@@ -175,9 +175,9 @@
             <template slot-scope="scope">
               <el-tag
                 v-if="scope.row.deathreason"
-                :type="getDeathReasonTagType(scope.row.deathreason)"
+                type="danger"
               >
-                {{ getDeathReasonText(scope.row.deathreason) }}
+                {{ scope.row.deathreason }}
               </el-tag>
               <span v-else>-</span>
             </template>
@@ -226,7 +226,7 @@
           >
             <template slot-scope="scope">
               <el-tag v-if="scope.row.heartdeathreason" type="danger">
-                {{ getHeartDeathReasonText(scope.row.heartdeathreason) }}
+                {{ scope.row.heartdeathreason }}
               </el-tag>
               <span v-else>-</span>
             </template>
diff --git a/src/views/business/ethicalReview/ethicalReviewInfo copy.vue b/src/views/business/ethicalReview/ethicalReviewInfo copy.vue
deleted file mode 100644
index d5828de..0000000
--- a/src/views/business/ethicalReview/ethicalReviewInfo copy.vue
+++ /dev/null
@@ -1,1536 +0,0 @@
-<template>
-  <div class="ethics-review-detail">
-    <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="warning"
-            @click="handleEndReview"
-            :disabled="form.ethicsConclusion === 'terminated'"
-          >
-            缁撴潫瀹℃煡
-          </el-button>
-        </div>
-      </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="hospitalNo">
-              <el-input v-model="form.hospitalNo" readonly />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
-              <el-input v-model="form.donorName" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鎬у埆" prop="gender">
-              <el-select v-model="form.gender" style="width: 100%">
-                <el-option label="鐢�" value="0" />
-                <el-option label="濂�" value="1" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="骞撮緞" prop="age">
-              <el-input v-model="form.age" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="16">
-            <el-form-item label="鐤剧梾璇婃柇" prop="diagnosis">
-              <el-input v-model="form.diagnosis" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="浼︾悊缁撹" prop="ethicsConclusion">
-              <el-select v-model="form.ethicsConclusion" style="width: 100%">
-                <el-option label="瀹℃煡涓�" value="reviewing" />
-                <el-option label="鍚屾剰" value="approved" />
-                <el-option
-                  label="淇敼鍚庡悓鎰�"
-                  value="approved_with_modifications"
-                />
-                <el-option label="淇敼鍚庨噸瀹�" value="re-review" />
-                <el-option label="涓嶅悓鎰�" value="disapproved" />
-                <el-option label="缁堟瀹℃煡" value="terminated" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="瀹℃煡鏃堕棿" prop="reviewTime">
-              <el-date-picker
-                v-model="form.reviewTime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鐧昏浜�" prop="registrant">
-              <el-input v-model="form.registrant" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="浼︾悊鎰忚" prop="ethicsOpinion">
-              <el-input
-                type="textarea"
-                :rows="3"
-                v-model="form.ethicsOpinion"
-                placeholder="璇疯緭鍏ヤ鸡鐞嗗鏌ユ剰瑙�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-form-item label="鐧昏鏃堕棿" prop="registrationTime">
-          <el-date-picker
-            v-model="form.registrationTime"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            style="width: 100%"
-          />
-        </el-form-item>
-      </el-form>
-    </el-card>
-    <!-- 闄勪欢涓婁紶 -->
-    <el-card class="attachment-card">
-      <div slot="header" class="clearfix">
-        <span class="detail-title">鐩稿叧闄勪欢</span>
-        <el-button type="primary" size="mini" @click="handleUploadAttachment">
-          涓婁紶闄勪欢
-        </el-button>
-      </div>
-
-      <el-table :data="attachments" style="width: 100%">
-        <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="120" align="center">
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-view"
-              @click="handlePreviewAttachment(scope.row)"
-              >棰勮</el-button
-            >
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-download"
-              @click="handleDownloadAttachment(scope.row)"
-              >涓嬭浇</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-    </el-card>
-    <!-- 涓撳瀹℃煡鎯呭喌 -->
-    <el-card class="expert-card">
-      <div slot="header" class="clearfix">
-        <span class="detail-title">涓撳瀹℃煡鎯呭喌 (18浣嶄笓瀹� + 1浣嶄富濮斾笓瀹�)</span>
-        <div style="float: right;">
-          <el-button
-            size="mini"
-            type="primary"
-            @click="handleSendToNormalExperts"
-            :disabled="!canSendToNormalExperts"
-          >
-            鍙戦�佷笓瀹�
-          </el-button>
-          <el-button
-            size="mini"
-            type="success"
-            @click="handleSendToChiefExpert"
-            :disabled="!canSendToChiefExpert"
-          >
-            鍙戦�佷富濮斾笓瀹�
-          </el-button>
-          <el-button
-            size="mini"
-            type="warning"
-            @click="handleBatchSend"
-            :disabled="!canBatchSend"
-          >
-            鎵归噺鍙戦��
-          </el-button>
-        </div>
-      </div>
-      <!-- 涓撳缁熻淇℃伅 -->
-      <div
-        class="expert-stats"
-        style="margin-top: 20px; padding: 15px; background: #f5f7fa; border-radius: 4px;"
-      >
-        <el-row :gutter="20">
-          <el-col :span="6">
-            <div class="stat-item">
-              <span class="stat-label">涓撳宸插悓鎰�:</span>
-              <span class="stat-value">{{ approvedNormalExperts }}/18</span>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <div class="stat-item">
-              <span class="stat-label">涓诲涓撳鐘舵��:</span>
-              <span class="stat-value">{{ chiefExpertStatus }}</span>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <div class="stat-item">
-              <span class="stat-label">鎬诲畬鎴愯繘搴�:</span>
-              <span class="stat-value">{{ completionRate }}%</span>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <div class="stat-item">
-              <span class="stat-label">瀹℃煡缁撴灉:</span>
-              <span class="stat-value">
-                <el-tag :type="overallConclusionFilter">
-                  {{ overallConclusionText }}
-                </el-tag>
-              </span>
-            </div>
-          </el-col>
-        </el-row>
-      </div>
-      <!-- 涓撳瀹℃煡琛ㄦ牸 -->
-      <el-table
-        :data="expertReviews"
-        v-loading="expertLoading"
-        style="width: 100%"
-        heiht="800"
-        :row-class-name="getExpertRowClassName"
-      >
-        <el-table-column label="搴忓彿" width="60" align="center" type="index" />
-
-        <el-table-column
-          label="涓撳濮撳悕"
-          width="120"
-          align="center"
-          fixed="left"
-        >
-          <template slot-scope="scope">
-            <span>{{ scope.row.expertName }}</span>
-            <el-tag
-              v-if="scope.row.isChief"
-              size="mini"
-              type="danger"
-              style="margin-left: 5px;"
-              >涓诲</el-tag
-            >
-          </template>
-        </el-table-column>
-
-        <el-table-column label="涓撳绫诲瀷" width="100" align="center">
-          <template slot-scope="scope">
-            <span :class="scope.row.isChief ? 'chief-expert' : 'normal-expert'">
-              {{ scope.row.isChief ? "涓诲涓撳" : "涓撳" }}
-            </span>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="瀹℃煡鐘舵��" width="100" align="center">
-          <template slot-scope="scope">
-            <el-tag :type="statusFilter(scope.row.reviewStatus)" size="small">
-              {{ statusTextFilter(scope.row.reviewStatus) }}
-            </el-tag>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="涓撳缁撹" width="120" align="center">
-          <template slot-scope="scope">
-            <el-tag
-              v-if="scope.row.expertConclusion"
-              :type="conclusionFilter(scope.row.expertConclusion)"
-              size="small"
-            >
-              {{ conclusionTextFilter(scope.row.expertConclusion) }}
-            </el-tag>
-            <span v-else class="no-data">-</span>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="瀹℃煡鎰忚" min-width="200" show-overflow-tooltip>
-          <template slot-scope="scope">
-            <span :class="{ 'expert-opinion': scope.row.expertOpinion }">
-              {{ scope.row.expertOpinion || "鏆傛棤鎰忚" }}
-            </span>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="瀹℃煡鏃堕棿" width="160" align="center">
-          <template slot-scope="scope">
-            <span>{{
-              scope.row.reviewTime ? parseTime(scope.row.reviewTime) : "鏈鏌�"
-            }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="鍙戦�佹椂闂�" width="160" align="center">
-          <template slot-scope="scope">
-            <span>{{
-              scope.row.reviewTime ? parseTime(scope.row.reviewTime) : "鏈彂閫�"
-            }}</span>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="鎿嶄綔" width="280" align="center" fixed="right">
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-s-promotion"
-              @click="handleSendToExpert(scope.row)"
-              :disabled="scope.row.reviewStatus === 'submitted'"
-              :class="{ 'sent-button': scope.row.reviewStatus === 'submitted' }"
-            >
-              {{ scope.row.reviewStatus === "submitted" ? "宸插彂閫�" : "鍙戦��" }}
-            </el-button>
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-edit"
-              @click="handleEditExpertReview(scope.row)"
-              :disabled="scope.row.reviewStatus !== 'submitted'"
-            >
-              缂栬緫
-            </el-button>
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-view"
-              @click="handleViewExpertReview(scope.row)"
-            >
-              璇︽儏
-            </el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-    </el-card>
-
-    <!-- 鍙戦�佷笓瀹跺璇濇 -->
-    <el-dialog
-      title="鍙戦�佷笓瀹跺鏌�"
-      :visible.sync="sendDialogVisible"
-      width="500px"
-    >
-      <el-form :model="sendForm" ref="sendForm" label-width="100px">
-        <el-form-item label="涓撳绫诲瀷" prop="expertType">
-          <el-radio-group v-model="sendForm.expertType">
-            <el-radio label="normal">涓撳</el-radio>
-            <el-radio label="chief">涓诲涓撳</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item
-          label="閫夋嫨涓撳"
-          prop="expertIds"
-          v-if="sendForm.expertType === 'normal'"
-        >
-          <el-select
-            v-model="sendForm.expertIds"
-            multiple
-            placeholder="璇烽�夋嫨涓撳"
-            style="width: 100%"
-          >
-            <el-option
-              v-for="expert in availableExperts"
-              :key="expert.id"
-              :label="expert.name"
-              :value="expert.id"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="鍙戦�佸唴瀹�" prop="content">
-          <el-input
-            type="textarea"
-            :rows="4"
-            v-model="sendForm.content"
-            placeholder="璇疯緭鍏ュ彂閫佺粰涓撳鐨勫鏌ュ唴瀹硅鏄�"
-          />
-        </el-form-item>
-      </el-form>
-      <div slot="footer">
-        <el-button @click="sendDialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleSendConfirm"
-          >纭鍙戦��</el-button
-        >
-      </div>
-    </el-dialog>
-  </div>
-</template>
-<script>
-import {
-  getEthicsReviewDetail,
-  updateEthicsReview,
-  sendExpertReview,
-  endEthicsReview,
-  uploadAttachment,
-  deleteAttachment,
-  getAttachments
-} from "./ethicsReview";
-import {
-  reviewinitiateBaseInfoList,
-  ethicalreviewedit,
-  ethicalreviewadd
-} from "@/api/businessApi";
-
-export default {
-  name: "EthicsReviewDetail",
-  data() {
-    return {
-      // 琛ㄥ崟鏁版嵁
-      form: {
-        id: undefined,
-        hospitalNo: "",
-        donorName: "",
-        gender: "",
-        age: "",
-        diagnosis: "",
-        ethicsConclusion: "reviewing",
-        ethicsOpinion: "",
-        reviewTime: "",
-        registrant: "",
-        registrationTime: new Date()
-          .toISOString()
-          .replace("T", " ")
-          .substring(0, 19)
-      },
-      // 琛ㄥ崟楠岃瘉瑙勫垯
-      rules: {
-        donorName: [
-          { required: true, message: "鎹愮尞鑰呭鍚嶄笉鑳戒负绌�", trigger: "blur" }
-        ],
-        ethicsConclusion: [
-          { required: true, message: "浼︾悊缁撹涓嶈兘涓虹┖", trigger: "change" }
-        ],
-        reviewTime: [
-          { required: true, message: "瀹℃煡鏃堕棿涓嶈兘涓虹┖", trigger: "change" }
-        ]
-      },
-      // 淇濆瓨鍔犺浇鐘舵��
-      saveLoading: false,
-
-      // 闄勪欢鏁版嵁
-      attachments: [],
-      expertReviews: [
-        // 涓撳锛�18浣嶏級- 鍒濆鐘舵�佷负鐢宠涓�
-        {
-          id: 1,
-          expertName: "闄舵槉",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 2,
-          expertName: "鍒樻枌",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 3,
-          expertName: "浜庢捣鍒� ",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 4,
-          expertName: "鐜嬬孩姊�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 5,
-          expertName: "鐜嬫槬鍏�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 6,
-          expertName: "鐜嬮潤",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 7,
-          expertName: "杈规枃瓒�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 8,
-          expertName: "闂織鍕�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 9,
-          expertName: "璁稿嚖",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 10,
-          expertName: "璁镐紶灞�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 11,
-          expertName: "寮犵孩宀�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 12,
-          expertName: "鏉ㄨ嫃姘�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 13,
-          expertName: "瀹嬬帀寮�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 14,
-          expertName: "鍛ㄤ紶鍒�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 15,
-          expertName: "鑽嗗嚒娉�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 16,
-          expertName: "鐭枃鎹�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 17,
-          expertName: "钁i渿",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        {
-          id: 18,
-          expertName: "钄¢噾璐�",
-          isChief: false,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        },
-        // 涓诲涓撳锛�1浣嶏級
-        {
-          id: 19,
-          expertName: "瀛斿績娑�",
-          isChief: true,
-          reviewStatus: "applying",
-          expertConclusion: "",
-          expertOpinion: "",
-          reviewTime: ""
-        }
-      ],
-      expertLoading: false,
-      attachmentLoading: false,
-      // 鍙戦�佸璇濇
-      sendDialogVisible: false,
-      sendForm: {
-        expertType: "normal",
-        expertIds: [],
-        content: ""
-      },
-      // 涓婁紶鐩稿叧
-      uploadDialogVisible: false,
-      uploadLoading: false,
-      tempFileList: [],
-      // 鍙敤涓撳鍒楄〃
-      availableExperts: [
-        { id: 1, name: "寮犳暀鎺�", type: "normal" },
-        { id: 2, name: "鏉庢暀鎺�", type: "normal" },
-        { id: 3, name: "鐜嬫暀鎺�", type: "normal" },
-        { id: 4, name: "璧典富濮�", type: "chief" }
-      ]
-    };
-  },
-  computed: {
-    // 璁$畻灞炴�э細涓撳鍚屾剰鏁伴噺
-    approvedNormalExperts() {
-      return this.expertReviews.filter(
-        expert => !expert.isChief && expert.expertConclusion === "approved"
-      ).length;
-    },
-    // 璁$畻灞炴�э細涓诲涓撳鐘舵��
-    chiefExpertStatus() {
-      const chiefExpert = this.expertReviews.find(expert => expert.isChief);
-      return chiefExpert
-        ? this.statusTextFilter(chiefExpert.reviewStatus)
-        : "鏈垎閰�";
-    },
-    // 璁$畻灞炴�э細瀹屾垚杩涘害
-    completionRate() {
-      const totalExperts = this.expertReviews.length;
-      const completedExperts = this.expertReviews.filter(
-        expert => expert.reviewStatus === "submitted"
-      ).length;
-      return totalExperts > 0
-        ? Math.round((completedExperts / totalExperts) * 100)
-        : 0;
-    },
-    // 璁$畻灞炴�э細鎬讳綋缁撹
-    overallConclusionText() {
-      if (this.approvedNormalExperts >= 12) {
-        return "閫氳繃";
-      } else if (this.approvedNormalExperts >= 9) {
-        return "淇敼鍚庨�氳繃";
-      } else {
-        return "涓嶉�氳繃";
-      }
-    },
-    overallConclusionFilter() {
-      if (this.approvedNormalExperts >= 12) {
-        return "success";
-      } else if (this.approvedNormalExperts >= 9) {
-        return "warning";
-      } else {
-        return "danger";
-      }
-    },
-    // 鏄惁鍙互鍙戦�佺粰涓撳
-    canSendToNormalExperts() {
-      return (
-        this.expertReviews.filter(
-          expert => !expert.isChief && expert.reviewStatus === "applying"
-        ).length > 0
-      );
-    },
-    // 鏄惁鍙互鍙戦�佺粰涓诲涓撳锛堥渶瑕佽嚦灏�12涓笓瀹跺悓鎰忥級
-    canSendToChiefExpert() {
-      return (
-        this.approvedNormalExperts >= 12 &&
-        this.expertReviews.filter(
-          expert => expert.isChief && expert.reviewStatus === "applying"
-        ).length > 0
-      );
-    },
-    // 鏄惁鍙互鎵归噺鍙戦��
-    canBatchSend() {
-      return (
-        this.expertReviews.filter(expert => expert.reviewStatus === "applying")
-          .length > 0
-      );
-    },
-    // 鏄惁鍙互鍙戦�佷笓瀹跺鏌�
-    canSendToExperts() {
-      return this.form.id && this.form.ethicsConclusion === "reviewing";
-    },
-    // 褰撳墠鐢ㄦ埛淇℃伅
-    currentUser() {
-      return JSON.parse(sessionStorage.getItem("user") || "{}");
-    }
-  },
-  created() {
-    const id = this.$route.query.id;
-    if (id) {
-      this.getDetail(id);
-      this.getAttachments(id);
-      // 涓嶅啀闇�瑕佷粠鎺ュ彛鑾峰彇涓撳鍒楄〃锛屼娇鐢ㄥ浐瀹氱殑expertReviews鏁版嵁
-    } else if (this.$route.path.includes("/add")) {
-      this.generateHospitalNo();
-      this.form.registrant = this.currentUser.username || "褰撳墠鐢ㄦ埛";
-    }
-  },
-  methods: {
-    // 鐢熸垚浣忛櫌鍙�
-    generateHospitalNo() {
-      const timestamp = Date.now().toString();
-      this.form.hospitalNo = "D" + timestamp.slice(-6);
-    },
-    getExpertRowClassName({ row }) {
-      return row.isChief ? "chief-expert-row" : "normal-expert-row";
-    },
-    // 鑾峰彇璇︽儏
-    getDetail(id) {
-      getEthicsReviewDetail(id)
-        .then(response => {
-          if (response.code === 200) {
-            this.form = response.data;
-          }
-        })
-        .catch(error => {
-          console.error("鑾峰彇浼︾悊瀹℃煡璇︽儏澶辫触:", error);
-          this.$message.error("鑾峰彇璇︽儏澶辫触");
-        });
-    },
-
-    // 鑾峰彇涓撳瀹℃煡鍒楄〃
-    getExpertReviews(ethicsReviewId) {
-      this.expertLoading = true;
-      // 妯℃嫙鏁版嵁 - 瀹為檯椤圭洰涓粠鎺ュ彛鑾峰彇
-      setTimeout(() => {
-        this.expertReviews = [
-          // 涓撳锛�18浣嶏級
-          {
-            id: 1,
-            expertName: "寮犳暀鎺�",
-            isChief: false,
-            reviewStatus: "submitted",
-            expertConclusion: "approved",
-            expertOpinion: "绗﹀悎浼︾悊瑕佹眰",
-            reviewTime: "2025-12-01 10:30:00"
-          },
-          {
-            id: 2,
-            expertName: "鏉庢暀鎺�",
-            isChief: false,
-            reviewStatus: "submitted",
-            expertConclusion: "approved",
-            expertOpinion: "鏂规璁捐鍚堢悊",
-            reviewTime: "2025-12-01 11:20:00"
-          },
-          {
-            id: 3,
-            expertName: "鐜嬫暀鎺�",
-            isChief: false,
-            reviewStatus: "applying",
-            expertConclusion: "",
-            expertOpinion: "",
-            reviewTime: ""
-          },
-          // 涓诲涓撳锛�1浣嶏級
-          {
-            id: 19,
-            expertName: "璧典富濮�",
-            isChief: true,
-            reviewStatus: "applying",
-            expertConclusion: "",
-            expertOpinion: "",
-            reviewTime: ""
-          }
-        ];
-        this.expertLoading = false;
-      }, 500);
-    },
-
-    // 鑾峰彇闄勪欢鍒楄〃
-    getAttachments(ethicsReviewId) {
-      this.attachmentLoading = true;
-      getAttachments(ethicsReviewId)
-        .then(response => {
-          if (response.code === 200) {
-            this.attachments = response.data;
-          }
-          this.attachmentLoading = false;
-        })
-        .catch(error => {
-          console.error("鑾峰彇闄勪欢鍒楄〃澶辫触:", error);
-          this.attachmentLoading = false;
-        });
-    },
-
-    // 鐘舵�佽繃婊ゅ櫒
-    statusFilter(status) {
-      const statusMap = {
-        applying: "info",
-        submitted: "success"
-      };
-      return statusMap[status] || "info";
-    },
-
-    statusTextFilter(status) {
-      const statusMap = {
-        applying: "鐢宠涓�",
-        submitted: "宸叉彁浜�"
-      };
-      return statusMap[status] || "鏈煡";
-    },
-
-    // 缁撹杩囨护鍣�
-    conclusionFilter(conclusion) {
-      const conclusionMap = {
-        approved: "success",
-        approved_with_modifications: "warning",
-        disapproved: "danger"
-      };
-      return conclusionMap[conclusion] || "info";
-    },
-
-    conclusionTextFilter(conclusion) {
-      const conclusionMap = {
-        approved: "鍚屾剰",
-        approved_with_modifications: "淇敼鍚庡悓鎰�",
-        disapproved: "涓嶅悓鎰�"
-      };
-      return conclusionMap[conclusion] || "鏈煡";
-    },
-
-    // 淇濆瓨淇℃伅
-    handleSave() {
-      this.$refs.form.validate(valid => {
-        if (valid) {
-          this.saveLoading = true;
-          const apiMethod = this.form.id ? updateEthicsReview : addEthicsReview;
-
-          apiMethod(this.form)
-            .then(response => {
-              if (response.code === 200) {
-                this.$message.success("淇濆瓨鎴愬姛");
-                if (!this.form.id) {
-                  this.form.id = response.data.id;
-                  this.$router.replace({
-                    query: { ...this.$route.query, id: this.form.id }
-                  });
-                }
-              }
-            })
-            .catch(error => {
-              console.error("淇濆瓨澶辫触:", error);
-              this.$message.error("淇濆瓨澶辫触");
-            })
-            .finally(() => {
-              this.saveLoading = false;
-            });
-        }
-      });
-    },
-
-    // 鍙戦�佷笓瀹跺鏌�
-    handleSendToExperts() {
-      this.sendDialogVisible = true;
-    },
-
-    // 鍙戦�佺粰涓撳
-    handleSendToNormalExperts() {
-      const normalExperts = this.expertReviews.filter(
-        expert => !expert.isChief && expert.reviewStatus === "applying"
-      );
-      this.sendForm.expertIds = normalExperts.map(expert => expert.id);
-      this.sendForm.expertType = "normal";
-      this.sendDialogVisible = true;
-    },
-
-    // 鍙戦�佺粰涓诲涓撳
-    handleSendToChiefExpert() {
-      const chiefExpert = this.expertReviews.find(
-        expert => expert.isChief && expert.reviewStatus === "applying"
-      );
-      if (chiefExpert) {
-        this.sendForm.expertIds = [chiefExpert.id];
-        this.sendForm.expertType = "chief";
-        this.sendDialogVisible = true;
-      }
-    },
-
-    // 鎵归噺鍙戦��
-    handleBatchSend() {
-      const applyingExperts = this.expertReviews.filter(
-        expert => expert.reviewStatus === "applying"
-      );
-      this.sendForm.expertIds = applyingExperts.map(expert => expert.id);
-      this.sendForm.expertType = "batch";
-      this.sendDialogVisible = true;
-    },
-
-    // 鍙戦�佺粰鍗曚釜涓撳
-    handleSendToExpert(expert) {
-      this.sendForm.expertIds = [expert.id];
-      this.sendForm.expertType = expert.isChief ? "chief" : "normal";
-      this.sendDialogVisible = true;
-    },
-
-    // 纭鍙戦��
-    handleSendConfirm() {
-      if (this.sendForm.expertIds.length === 0) {
-        this.$message.warning("璇烽�夋嫨瑕佸彂閫佺殑涓撳");
-        return;
-      }
-
-      sendExpertReview({
-        ethicsReviewId: this.form.id,
-        expertIds: this.sendForm.expertIds,
-        content: this.sendForm.content
-      })
-        .then(response => {
-          if (response.code === 200) {
-            this.$message.success("鍙戦�佹垚鍔�");
-            this.sendDialogVisible = false;
-            this.getExpertReviews(this.form.id);
-            this.sendForm = {
-              expertType: "normal",
-              expertIds: [],
-              content: ""
-            };
-          }
-        })
-        .catch(error => {
-          console.error("鍙戦�佸け璐�:", error);
-          this.$message.error("鍙戦�佸け璐�");
-        });
-    },
-
-    // 缁撴潫瀹℃煡
-    handleEndReview() {
-      this.$confirm(
-        "纭畾瑕佺粨鏉熸湰娆′鸡鐞嗗鏌ュ悧锛熺粨鏉熷悗灏嗘棤娉曚慨鏀逛笓瀹跺鏌ョ粨鏋溿��",
-        "鎻愮ず",
-        {
-          confirmButtonText: "纭畾",
-          cancelButtonText: "鍙栨秷",
-          type: "warning"
-        }
-      )
-        .then(() => {
-          endEthicsReview(this.form.id)
-            .then(response => {
-              if (response.code === 200) {
-                this.$message.success("瀹℃煡宸茬粨鏉�");
-                this.form.ethicsConclusion = "terminated";
-              }
-            })
-            .catch(error => {
-              console.error("缁撴潫瀹℃煡澶辫触:", error);
-              this.$message.error("缁撴潫瀹℃煡澶辫触");
-            });
-        })
-        .catch(() => {});
-    },
-
-    // 缂栬緫涓撳瀹℃煡
-    handleEditExpertReview(expert) {
-      this.$prompt("璇疯緭鍏ュ鏌ユ剰瑙�", "缂栬緫涓撳瀹℃煡", {
-        confirmButtonText: "纭畾",
-        cancelButtonText: "鍙栨秷",
-        inputValue: expert.expertOpinion || "",
-        inputValidator: value => {
-          if (!value || value.trim() === "") {
-            return "瀹℃煡鎰忚涓嶈兘涓虹┖";
-          }
-          return true;
-        }
-      })
-        .then(({ value }) => {
-          // 妯℃嫙鏇存柊涓撳瀹℃煡
-          const index = this.expertReviews.findIndex(e => e.id === expert.id);
-          if (index !== -1) {
-            this.expertReviews[index].expertOpinion = value;
-            this.$message.success("瀹℃煡鎰忚宸叉洿鏂�");
-          }
-        })
-        .catch(() => {});
-    },
-
-    // 鏌ョ湅涓撳瀹℃煡璇︽儏
-    handleViewExpertReview(expert) {
-      this.$alert(
-        `
-        <div>
-          <p><strong>涓撳濮撳悕锛�</strong>${expert.expertName}</p>
-          <p><strong>涓撳绫诲瀷锛�</strong>${
-            expert.isChief ? "涓诲涓撳" : "涓撳"
-          }</p>
-          <p><strong>瀹℃煡鐘舵�侊細</strong>${this.statusTextFilter(
-            expert.reviewStatus
-          )}</p>
-          <p><strong>涓撳缁撹锛�</strong>${
-            expert.expertConclusion
-              ? this.conclusionTextFilter(expert.expertConclusion)
-              : "鏈彁浜�"
-          }</p>
-          <p><strong>瀹℃煡鎰忚锛�</strong>${expert.expertOpinion || "鏃�"}</p>
-          <p><strong>瀹℃煡鏃堕棿锛�</strong>${expert.reviewTime || "鏈鏌�"}</p>
-        </div>
-      `,
-        "涓撳瀹℃煡璇︽儏",
-        {
-          dangerouslyUseHTMLString: true,
-          customClass: "expert-review-detail-dialog"
-        }
-      );
-    },
-
-    // 涓婁紶闄勪欢
-    handleUploadAttachment() {
-      this.uploadDialogVisible = true;
-    },
-
-    // 涓婁紶鍓嶆牎楠�
-    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;
-
-      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("鏂囦欢鏍煎紡涓嶆敮鎸�");
-        return false;
-      }
-
-      if (file.size > maxSize) {
-        this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
-        return false;
-      }
-
-      return true;
-    },
-
-    // 鏂囦欢閫夋嫨鍙樺寲
-    handleFileChange(file, fileList) {
-      this.tempFileList = fileList;
-    },
-
-    // 鎻愪氦涓婁紶
-    submitUpload() {
-      if (this.tempFileList.length === 0) {
-        this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
-        return;
-      }
-
-      this.uploadLoading = true;
-
-      const uploadPromises = this.tempFileList.map(file => {
-        const formData = new FormData();
-        formData.append("file", file.raw);
-        formData.append("ethicsReviewId", this.form.id);
-
-        return uploadAttachment(formData);
-      });
-
-      Promise.all(uploadPromises)
-        .then(responses => {
-          this.$message.success("鏂囦欢涓婁紶鎴愬姛");
-          this.uploadDialogVisible = false;
-          this.tempFileList = [];
-          this.getAttachments(this.form.id);
-        })
-        .catch(error => {
-          console.error("涓婁紶澶辫触:", error);
-          this.$message.error("鏂囦欢涓婁紶澶辫触");
-        })
-        .finally(() => {
-          this.uploadLoading = false;
-        });
-    },
-
-    // 棰勮闄勪欢
-    handlePreviewAttachment(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("璇ユ枃浠剁被鍨嬫殏涓嶆敮鎸佸湪绾块瑙堬紝璇蜂笅杞藉悗鏌ョ湅");
-      }
-    },
-
-    // 涓嬭浇闄勪欢
-    handleDownloadAttachment(attachment) {
-      const link = document.createElement("a");
-      link.href = attachment.fileUrl;
-      link.download = attachment.fileName;
-      link.click();
-      this.$message.success(`寮�濮嬩笅杞�: ${attachment.fileName}`);
-    },
-
-    // 鍒犻櫎闄勪欢
-    handleRemoveAttachment(attachment) {
-      this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
-        confirmButtonText: "纭畾",
-        cancelButtonText: "鍙栨秷",
-        type: "warning"
-      })
-        .then(() => {
-          deleteAttachment(attachment.id)
-            .then(response => {
-              if (response.code === 200) {
-                this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
-                this.getAttachments(this.form.id);
-              }
-            })
-            .catch(error => {
-              console.error("鍒犻櫎闄勪欢澶辫触:", error);
-              this.$message.error("鍒犻櫎闄勪欢澶辫触");
-            });
-        })
-        .catch(() => {});
-    },
-
-    // 鑾峰彇鏂囦欢绫诲瀷
-    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();
-    },
-
-    // 鏂囦欢澶у皬鏍煎紡鍖�
-    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>
-.ethics-review-detail {
-  padding: 20px;
-  background-color: #f5f7fa;
-}
-
-.detail-card {
-  margin-bottom: 20px;
-  border-radius: 8px;
-  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-}
-
-.expert-card {
-  margin-bottom: 20px;
-  border-radius: 8px;
-  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-}
-
-.attachment-card {
-  margin-bottom: 20px;
-  border-radius: 8px;
-  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-}
-
-.detail-title {
-  font-size: 18px;
-  font-weight: 600;
-  color: #303133;
-}
-
-.expert-stats {
-  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-  color: rgb(43, 181, 245);
-  border-radius: 8px;
-  margin-bottom: 20px;
-}
-
-.stat-item {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  padding: 10px;
-}
-
-.stat-label {
-  font-size: 12px;
-  opacity: 0.9;
-  margin-bottom: 5px;
-}
-
-.stat-value {
-  font-size: 18px;
-  font-weight: bold;
-}
-
-.upload-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 15px;
-  padding: 10px;
-  background-color: #f8f9fa;
-  border-radius: 4px;
-}
-
-.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(.el-form-item__label) {
-  font-weight: 500;
-}
-
-:deep(.el-input__inner) {
-  border-radius: 4px;
-}
-
-:deep(.el-textarea__inner) {
-  border-radius: 4px;
-  resize: vertical;
-}
-
-/* 琛ㄦ牸鏍峰紡浼樺寲 */
-:deep(.el-table) {
-  border-radius: 8px;
-  overflow: hidden;
-}
-
-:deep(.el-table th) {
-  background-color: #f5f7fa;
-  color: #606266;
-  font-weight: 500;
-}
-
-:deep(.el-table .cell) {
-  padding: 8px 12px;
-}
-
-/* 鎸夐挳鏍峰紡浼樺寲 */
-:deep(.el-button--primary) {
-  background: linear-gradient(135deg, #409eff 0%, #3375e0 100%);
-  border: none;
-  border-radius: 4px;
-}
-
-:deep(.el-button--success) {
-  background: linear-gradient(135deg, #67c23a 0%, #529b2f 100%);
-  border: none;
-  border-radius: 4px;
-}
-
-:deep(.el-button--warning) {
-  background: linear-gradient(135deg, #e6a23c 0%, #d18c2a 100%);
-  border: none;
-  border-radius: 4px;
-}
-
-:deep(.el-button--danger) {
-  background: linear-gradient(135deg, #f56c6c 0%, #e05b5b 100%);
-  border: none;
-  border-radius: 4px;
-}
-
-/* 鏍囩鏍峰紡 */
-:deep(.el-tag) {
-  border-radius: 12px;
-  border: none;
-  font-weight: 500;
-}
-
-/* 瀵硅瘽妗嗘牱寮忎紭鍖� */
-:deep(.el-dialog) {
-  border-radius: 8px;
-  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
-}
-
-:deep(.el-dialog__header) {
-  background: linear-gradient(135deg, #f5f7fa 0%, #e4e7ed 100%);
-  border-bottom: 1px solid #e4e7ed;
-  padding: 15px 20px;
-}
-
-:deep(.el-dialog__title) {
-  font-weight: 600;
-  color: #303133;
-}
-
-/* 涓婁紶缁勪欢鏍峰紡 */
-:deep(.el-upload-dragger) {
-  border: 2px dashed #dcdfe6;
-  border-radius: 6px;
-  background-color: #fafafa;
-  transition: all 0.3s ease;
-}
-
-:deep(.el-upload-dragger:hover) {
-  border-color: #409eff;
-  background-color: #f0f7ff;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
-  .ethics-review-detail {
-    padding: 10px;
-  }
-
-  .expert-stats .el-col {
-    margin-bottom: 10px;
-  }
-
-  .upload-header {
-    flex-direction: column;
-    align-items: flex-start;
-    gap: 10px;
-  }
-}
-
-/* 鍔ㄧ敾鏁堟灉 */
-.fade-enter-active,
-.fade-leave-active {
-  transition: opacity 0.3s ease;
-}
-
-.fade-enter,
-.fade-leave-to {
-  opacity: 0;
-}
-
-/* 鍔犺浇鐘舵�� */
-.loading-container {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  height: 200px;
-}
-
-/* 涓撳绫诲瀷鏍峰紡 */
-.normal-expert {
-  color: #409eff;
-  font-weight: 500;
-}
-
-.chief-expert {
-  color: #f56c6c;
-  font-weight: 600;
-}
-
-/* 涓撳琛屾牱寮� */
-:deep(.normal-expert-row) {
-  background-color: #fafafa;
-}
-
-:deep(.chief-expert-row) {
-  background-color: #fff7e6;
-}
-
-:deep(.normal-expert-row:hover) {
-  background-color: #f0f7ff;
-}
-
-:deep(.chief-expert-row:hover) {
-  background-color: #ffecc2;
-}
-
-/* 鏃犳暟鎹牱寮� */
-.no-data {
-  color: #909399;
-  font-style: italic;
-}
-
-/* 涓撳鎰忚鏍峰紡 */
-.expert-opinion {
-  color: #303133;
-  line-height: 1.5;
-}
-
-/* 宸插彂閫佹寜閽牱寮� */
-.sent-button {
-  color: #67c23a !important;
-}
-
-/* 琛ㄦ牸琛屾偓鍋滄晥鏋� */
-:deep(.el-table__row:hover) {
-  transform: translateY(-1px);
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-  transition: all 0.3s ease;
-}
-
-/* 鑷畾涔夋粴鍔ㄦ潯 */
-:deep(::-webkit-scrollbar) {
-  width: 6px;
-  height: 6px;
-}
-
-:deep(::-webkit-scrollbar-track) {
-  background: #f1f1f1;
-  border-radius: 3px;
-}
-
-:deep(::-webkit-scrollbar-thumb) {
-  background: #c1c1c1;
-  border-radius: 3px;
-}
-
-:deep(::-webkit-scrollbar-thumb:hover) {
-  background: #a8a8a8;
-}
-
-/* 涓撳瀹℃煡琛ㄦ牸鐗规畩鏍峰紡 */
-.expert-table-special :deep(.el-table__row) {
-  transition: all 0.3s ease;
-}
-
-.expert-table-special :deep(.el-table__row:hover) {
-  background-color: #f0f7ff;
-  transform: translateY(-1px);
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-}
-
-/* 涓诲涓撳琛岄珮浜� */
-:deep(.chief-expert-row) {
-  background-color: #fff7e6 !important;
-}
-
-:deep(.chief-expert-row:hover) {
-  background-color: #ffecc2 !important;
-}
-</style>
diff --git a/src/views/business/ethicalReview/ethicalReviewInfo.vue b/src/views/business/ethicalReview/ethicalReviewInfo.vue
index c783e46..8e56dfa 100644
--- a/src/views/business/ethicalReview/ethicalReviewInfo.vue
+++ b/src/views/business/ethicalReview/ethicalReviewInfo.vue
@@ -55,7 +55,7 @@
               <el-input v-model="form.initiatePerson" />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <!-- <el-col :span="8">
             <el-form-item label="瀹℃煡鐘舵��" prop="status">
               <el-select v-model="form.status" style="width: 100%">
                 <el-option
@@ -66,7 +66,7 @@
                 />
               </el-select>
             </el-form-item>
-          </el-col>
+          </el-col> -->
         </el-row>
 
         <!-- 涓撳鐩稿叧淇℃伅 -->
@@ -215,6 +215,14 @@
       <div slot="header" class="clearfix">
         <span class="detail-title">涓撳瀹℃煡鎯呭喌</span>
         <div style="float: right;">
+          <el-button
+            type="warning"
+            size="mini"
+            @click="handleRefresh"
+            icon="el-icon-refresh"
+          >
+            鍒锋柊
+          </el-button>
           <el-button size="mini" type="primary" @click="handleAddExpert">
             娣诲姞涓撳
           </el-button>
@@ -350,7 +358,27 @@
             <span v-else class="no-data">-</span>
           </template>
         </el-table-column>
-
+        <!-- 鍦�"瀹℃煡鏃堕棿"鍒楀悗闈㈡坊鍔�"鎵嬬闄勪欢"鍒� -->
+        <el-table-column label="鎵嬬闄勪欢" width="120" align="center">
+          <template slot-scope="scope">
+            <template v-if="scope.row.sigin">
+              <!-- 鏈夌鍚嶏紝鏄剧ず鍙偣鍑婚瑙堢殑鍥剧墖 -->
+              <el-button
+                type="text"
+                size="mini"
+                @click="handlePreviewSignature(scope.row.sigin)"
+                class="signature-preview-btn"
+              >
+                <i class="el-icon-picture" style="margin-right: 4px;"></i>
+                鏌ョ湅绛惧悕
+              </el-button>
+            </template>
+            <template v-else>
+              <!-- 鏃犵鍚嶏紝鏄剧ず鏂滄潬 -->
+              <span class="no-signature">/</span>
+            </template>
+          </template>
+        </el-table-column>
         <el-table-column label="瀹℃煡鎰忚" min-width="200" show-overflow-tooltip>
           <template slot-scope="scope">
             <span :class="{ 'expert-opinion': scope.row.expertopinion }">
@@ -435,7 +463,7 @@
     <el-dialog
       title="娣诲姞涓撳"
       :visible.sync="expertDialogVisible"
-      width="800px"
+      width="900px"
       @close="handleExpertDialogClose"
     >
       <div style="margin-bottom: 20px;">
@@ -469,7 +497,7 @@
         :data="filteredExpertList"
         v-loading="expertListLoading"
         style="width: 100%"
-        max-height="400"
+        max-height="600"
         @selection-change="handleExpertSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
@@ -505,7 +533,7 @@
         ></el-table-column>
         <el-table-column
           label="鑱旂郴鐢佃瘽"
-          prop="telephone"
+          prop="donorno"
           width="120"
         ></el-table-column>
       </el-table>
@@ -572,7 +600,7 @@
             placeholder="璇烽�夋嫨鎴鏃堕棿"
             value-format="yyyy-MM-dd HH:mm:ss"
             style="width: 100%"
-            :disabled="sendForm.expertType === 'chief'"
+            :disabled="sendForm.expertType == 'chief'"
           />
           <div v-if="sendForm.expertType !== 'chief'" style="margin-top: 5px;">
             <el-button-group>
@@ -585,7 +613,7 @@
             </el-button-group>
           </div>
           <div
-            v-if="sendForm.expertType === 'chief'"
+            v-if="sendForm.expertType == 'chief'"
             style="font-size: 12px; color: #999; margin-top: 5px;"
           >
             涓诲涓撳鏃犻渶璁剧疆鎴鏃堕棿
@@ -627,12 +655,35 @@
       </el-form>
       <div slot="footer">
         <el-button @click="sendDialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleSendConfirm" :loading="sending"
-          >纭鍙戦��</el-button
+        <el-button
+          type="primary"
+          @click="handleSendConfirm"
+          :loading="sendingAll"
+          :disabled="sendingAll"
         >
+          {{
+            sendingAll
+              ? `鍙戦�佷腑 (${sendingProgress}/${sendingTotal})`
+              : "纭鍙戦��"
+          }}
+        </el-button>
       </div>
     </el-dialog>
-
+    <!-- 鎴栬�呭湪椤甸潰涓坊鍔犺繘搴︽潯 -->
+    <div v-if="sendingAll" class="send-progress-container">
+      <el-progress
+        :percentage="Math.round((sendingProgress / sendingTotal) * 100)"
+        :text-inside="true"
+        :stroke-width="20"
+        status="success"
+      >
+        <span>宸插彂閫� {{ sendingProgress }} / {{ sendingTotal }}</span>
+      </el-progress>
+      <div class="send-stats">
+        <span class="stat-item success">鎴愬姛: {{ sendingSuccessCount }}</span>
+        <span class="stat-item fail">澶辫触: {{ sendingFailCount }}</span>
+      </div>
+    </div>
     <!-- 涓撳鍘嗗彶瀹℃壒鎯呭喌瀵硅瘽妗� -->
     <el-dialog
       title="涓撳鍘嗗彶瀹℃壒鎯呭喌"
@@ -764,7 +815,8 @@
   ethicalreviewadd,
   ethicalreviewInfo,
   ethicalreExpertTotal,
-  sendNotification
+  sendNotification,
+  sendcall
 } from "@/api/businessApi";
 import { listExternalperson } from "@/api/project/externalperson";
 import CaseBasicInfo from "@/components/CaseBasicInfo";
@@ -859,7 +911,17 @@
           { max: 500, message: "闀垮害涓嶈兘瓒呰繃 500 涓瓧绗�", trigger: "blur" }
         ]
       },
-
+      sending: false, // 鍗曚釜鍙戦�佺姸鎬�
+      sendingAll: false, // 鍏ㄥ眬鍙戦�佺姸鎬�
+      sendingProgress: 0, // 鍙戦�佽繘搴�
+      sendingTotal: 0, // 鎬诲彂閫佹暟
+      sendingSuccessCount: 0, // 鎴愬姛鏁�
+      sendingFailCount: 0, // 澶辫触鏁�
+      sendingResults: [], // 鍙戦�佺粨鏋滃垪琛�
+      originalFormData: null, // 鍘熷琛ㄥ崟鏁版嵁
+      originalExpertList: null, // 鍘熷涓撳鍒楄〃
+      originalAttachments: null, // 鍘熷闄勪欢鍒楄〃
+      isDataLoaded: false, // 鏁版嵁鏄惁宸插姞杞�
       // 淇濆瓨鍔犺浇鐘舵��
       saveLoading: false,
       completeLoading: false,
@@ -924,14 +986,14 @@
     // 璁$畻灞炴�э細鏅�氫笓瀹舵暟閲�
     normalExpertsCount() {
       return this.ethicalreviewopinionsList.filter(
-        expert => expert.expertType === "0"
+        expert => expert.expertType == "0"
       ).length;
     },
 
     // 璁$畻灞炴�э細涓诲涓撳鏁伴噺
     chiefExpertsCount() {
       return this.ethicalreviewopinionsList.filter(
-        expert => expert.expertType === "1"
+        expert => expert.expertType == "1"
       ).length;
     },
 
@@ -943,7 +1005,7 @@
     // 璁$畻灞炴�э細宸插悓鎰忎笓瀹舵暟閲�
     approvedExpertsCount() {
       return this.ethicalreviewopinionsList.filter(
-        expert => expert.expertconclusion === "1"
+        expert => expert.expertconclusion == "1"
       ).length;
     },
 
@@ -952,7 +1014,7 @@
       const total = this.totalExpertsCount;
       const approved = this.approvedExpertsCount;
 
-      if (total === 0) return "鏈鏌�";
+      if (total == 0) return "鏈鏌�";
       if (approved >= Math.ceil(total * 0.7)) {
         // 瓒呰繃70%鍚屾剰
         return "閫氳繃";
@@ -968,7 +1030,7 @@
       const total = this.totalExpertsCount;
       const approved = this.approvedExpertsCount;
 
-      if (total === 0) return "info";
+      if (total == 0) return "info";
       if (approved >= Math.ceil(total * 0.7)) {
         return "success";
       } else if (approved >= Math.ceil(total * 0.5)) {
@@ -982,10 +1044,10 @@
     availableNormalExperts() {
       return this.ethicalreviewopinionsList.filter(
         expert =>
-          expert.expertType === "0" &&
+          expert.expertType == "0" &&
           (!expert.receiveStatus ||
-            expert.receiveStatus === "0" ||
-            expert.receiveStatus === "1")
+            expert.receiveStatus == "0" ||
+            expert.receiveStatus == "1")
       );
     },
 
@@ -993,10 +1055,10 @@
     availableChiefExperts() {
       return this.ethicalreviewopinionsList.filter(
         expert =>
-          expert.expertType === "1" &&
+          expert.expertType == "1" &&
           (!expert.receiveStatus ||
-            expert.receiveStatus === "0" ||
-            expert.receiveStatus === "1")
+            expert.receiveStatus == "0" ||
+            expert.receiveStatus == "1")
       );
     },
 
@@ -1008,7 +1070,7 @@
     // 鏄惁鍙互鍙戦�佺粰涓诲涓撳锛堥渶瑕佽嚦灏�12涓櫘閫氫笓瀹跺悓鎰忥級
     canSendToChiefExpert() {
       const normalApprovedCount = this.ethicalreviewopinionsList.filter(
-        expert => expert.expertType === "0" && expert.expertconclusion === "1"
+        expert => expert.expertType == "0" && expert.expertconclusion == "1"
       ).length;
       return this.availableChiefExperts.length > 0 && normalApprovedCount >= 12;
     },
@@ -1059,9 +1121,9 @@
 
     // 鍙戦�佸璇濇鏍囬
     sendDialogTitle() {
-      if (this.sendForm.expertType === "chief") {
+      if (this.sendForm.expertType == "chief") {
         return "鍙戦�佷富濮斾笓瀹跺鏌�";
-      } else if (this.sendForm.expertType === "normal") {
+      } else if (this.sendForm.expertType == "normal") {
         return "鍙戦�佹櫘閫氫笓瀹跺鏌�";
       } else {
         return "鍙戦�佷笓瀹跺鏌�";
@@ -1082,6 +1144,12 @@
     this.id = this.$route.query.id;
     this.caseId = this.$route.query.infoid;
     this.getDetail(this.infoid, this.id);
+    // 鐩戝惉璺敱鍙樺寲锛岄槻姝㈢敤鎴风寮�椤甸潰
+    window.addEventListener("beforeunload", this.beforeUnloadHandler);
+  },
+  beforeDestroy() {
+    // 绉婚櫎浜嬩欢鐩戝惉鍣�
+    window.removeEventListener("beforeunload", this.beforeUnloadHandler);
   },
   methods: {
     // 鍒濆鍖栨柊澧炴暟鎹�
@@ -1107,7 +1175,7 @@
           response = await reviewinitiateBaseInfoList({ infoid: infoid });
         }
 
-        if (response.code === 200) {
+        if (response.code == 200) {
           let detailData = {};
 
           if (response.data && id) {
@@ -1116,24 +1184,24 @@
             this.parseFilePatch(this.form.filePatch);
             this.initAttachmentFileList();
 
-            // 濡傛灉涓撳瀹℃煡鎰忚鍒楄〃涓嶅瓨鍦紝鍒濆鍖栦负绌烘暟缁�
             if (!this.form.ethicalreviewopinionsList) {
               this.$set(this.form, "ethicalreviewopinionsList", []);
             }
           } else if (response.data && infoid) {
             this.form = response.data[0];
-            // 瑙f瀽 filePatch 瀛楁
             this.parseFilePatch(this.form.filePatch);
             this.initAttachmentFileList();
 
-            // 濡傛灉涓撳瀹℃煡鎰忚鍒楄〃涓嶅瓨鍦紝鍒濆鍖栦负绌烘暟缁�
             if (!this.form.ethicalreviewopinionsList) {
               this.$set(this.form, "ethicalreviewopinionsList", []);
             }
           }
 
-          // 璁剧疆 expertReviews 鐢ㄤ簬琛ㄦ牸鏄剧ず
+          // 淇濆瓨鍘熷鏁版嵁鐢ㄤ簬姣旇緝
+          this.saveOriginalData();
+
           this.expertReviews = this.form.ethicalreviewopinionsList;
+          this.isDataLoaded = true;
 
           this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
         } else {
@@ -1145,6 +1213,22 @@
       } finally {
         this.expertLoading = false;
       }
+    },
+
+    // 淇濆瓨鍘熷鏁版嵁
+    saveOriginalData() {
+      // 娣辨嫹璐濊〃鍗曟暟鎹�
+      this.originalFormData = JSON.parse(JSON.stringify(this.form));
+
+      // 娣辨嫹璐濅笓瀹跺垪琛�
+      this.originalExpertList = this.form.ethicalreviewopinionsList
+        ? JSON.parse(JSON.stringify(this.form.ethicalreviewopinionsList))
+        : [];
+
+      // 娣辨嫹璐濋檮浠跺垪琛�
+      this.originalAttachments = this.form.annexfilesList
+        ? JSON.parse(JSON.stringify(this.form.annexfilesList))
+        : [];
     },
 
     // 瑙f瀽 filePatch 瀛楁
@@ -1182,7 +1266,7 @@
 
     // 鏋勫缓 filePatch 瀛楁
     buildFilePatch() {
-      if (!this.form.annexfilesList || this.form.annexfilesList.length === 0) {
+      if (!this.form.annexfilesList || this.form.annexfilesList.length == 0) {
         return "";
       }
       return JSON.stringify(this.form.annexfilesList);
@@ -1197,7 +1281,7 @@
     handleAttachmentRemove(file) {
       if (file.url) {
         const index = this.form.annexfilesList.findIndex(
-          item => item.path === file.url || item.fileUrl === file.url
+          item => item.path == file.url || item.fileUrl == file.url
         );
         if (index > -1) {
           this.form.annexfilesList.splice(index, 1);
@@ -1214,7 +1298,7 @@
 
     // 涓婁紶鎴愬姛澶勭悊
     handleUploadSuccess({ file, fileList, response }) {
-      if (response.code === 200) {
+      if (response.code == 200) {
         const attachmentObj = {
           fileName: file.name,
           path: response.data || file.url,
@@ -1238,10 +1322,23 @@
 
     // 鏂囦欢棰勮
     handlePreview(file) {
+      console.log(file, "file");
+
       this.currentPreviewFile = {
         fileName: file.fileName,
         fileUrl: file.path || file.fileUrl,
         fileType: this.getFileType(file.fileName)
+      };
+      this.previewVisible = true;
+    },
+    // 鏂囦欢棰勮
+    handlePreviewSignature(file) {
+      console.log(file, "file");
+
+      this.currentPreviewFile = {
+        fileName: file,
+        fileUrl: file,
+        fileType: "png"
       };
       this.previewVisible = true;
     },
@@ -1317,13 +1414,13 @@
       // 鑱岀О鍖呭惈"涓讳换濮斿憳"鎴栬�卐xpertType涓�"1"
       return (
         (expert.title && expert.title.includes("涓讳换濮斿憳")) ||
-        expert.expertType === "1"
+        expert.expertType == "1"
       );
     },
 
     // 涓撳绫诲瀷鏂囨湰杞崲
     getExpertTypeText(type) {
-      return type === "1" ? "涓诲涓撳" : "鏅�氫笓瀹�";
+      return type == "1" ? "涓诲涓撳" : "鏅�氫笓瀹�";
     },
 
     // 瀹℃煡鐘舵�佽繃婊ゅ櫒
@@ -1372,7 +1469,7 @@
 
     // 涓撳琛屾牱寮�
     getExpertRowClassName({ row }) {
-      return row.expertType === "1" ? "chief-expert-row" : "normal-expert-row";
+      return row.expertType == "1" ? "chief-expert-row" : "normal-expert-row";
     },
 
     // 鑾峰彇涓撳鍞竴鏍囪瘑
@@ -1382,7 +1479,7 @@
 
     // 涓撳绫诲瀷鍙樻洿澶勭悊
     handleExpertTypeChange() {
-      if (this.sendForm.expertType === "chief") {
+      if (this.sendForm.expertType == "chief") {
         // 涓诲涓撳鏃犻渶璁剧疆鎴鏃堕棿
         this.sendForm.endTime = "";
       } else {
@@ -1407,9 +1504,9 @@
         if (valid) {
           this.saveLoading = true;
           // 淇濆瓨娓呯┖id渚夸簬鍚庣鏁翠綋鍒犻櫎鏂板
-          this.form.ethicalreviewopinionsList.forEach(item=>{
-            item.id=null
-          })
+          this.form.ethicalreviewopinionsList.forEach(item => {
+            item.id = null;
+          });
           try {
             const submitData = {
               ...this.form,
@@ -1428,8 +1525,10 @@
               response = await ethicalreviewadd(submitData);
             }
 
-            if (response.code === 200) {
+            if (response.code == 200) {
               this.$message.success("淇濆瓨鎴愬姛");
+              // 淇濆瓨鎴愬姛鍚庢洿鏂板師濮嬫暟鎹�
+              this.saveOriginalData();
               this.isEdit = false;
               if (!this.form.id && response.data && response.data.id) {
                 this.form.id = response.data.id;
@@ -1471,7 +1570,7 @@
 
             const response = await ethicalreviewedit(updateData);
 
-            if (response.code === 200) {
+            if (response.code == 200) {
               this.$message.success("瀹℃煡鐘舵�佸凡鏇存柊涓哄畬鎴�");
               this.form.status = "3";
               this.form.endTime = updateData.endTime;
@@ -1523,7 +1622,7 @@
 
             const response = await ethicalreviewedit(updateData);
 
-            if (response.code === 200) {
+            if (response.code == 200) {
               this.$message.success("瀹℃煡宸蹭腑姝紝鎵�鏈変笓瀹剁姸鎬佸凡鏇存柊");
               this.form.status = "2";
             } else {
@@ -1555,7 +1654,7 @@
           try {
             const updateData = {
               ...this.form,
-              status: "2", // 瀹℃煡涓
+              status: "4", // 瀹℃煡涓
               endTime: new Date()
                 .toISOString()
                 .replace("T", " ")
@@ -1564,9 +1663,9 @@
 
             const response = await ethicalreviewedit(updateData);
 
-            if (response.code === 200) {
+            if (response.code == 200) {
               this.$message.success("瀹℃煡宸茬粨鏉�");
-              this.form.status = "2";
+              this.form.status = "4";
               this.form.endTime = updateData.endTime;
             } else {
               this.$message.error("鎿嶄綔澶辫触锛�" + (response.msg || "鏈煡閿欒"));
@@ -1586,13 +1685,255 @@
       this.expertDialogVisible = true;
       this.loadExperts();
     },
+    /**
+     * 鍒锋柊椤甸潰鏁版嵁
+     */
+    async refreshPageData() {
+      try {
+        // 閲嶇疆鏁版嵁鐘舵��
+        this.isDataLoaded = false;
 
+        // 娓呯┖褰撳墠鏁版嵁
+        this.form = {
+          id: undefined,
+          infoid: undefined,
+          caseNo: "",
+          initiateTheme: "",
+          initiatePerson: "",
+          status: "0",
+          startTime: "",
+          cutOffTime: "",
+          endTime: "",
+          expertName: "",
+          expertNo: "",
+          expertType: "0",
+          expertConclusion: "",
+          expertOpinion: "",
+          expertTime: "",
+          orderNo: 1,
+          remark: "",
+          annexfilesList: [],
+          filePatch: "",
+          ethicalreviewopinionsList: [],
+          createBy: "",
+          createTime: "",
+          updateBy: "",
+          updateTime: "",
+          delFlag: "0"
+        };
+
+        this.attachmentFileList = [];
+        this.originalFormData = null;
+        this.originalExpertList = null;
+        this.originalAttachments = null;
+
+        // 閲嶆柊鑾峰彇鏁版嵁
+        if (this.id) {
+          await this.getDetail(this.infoid, this.id);
+        } else if (this.infoid) {
+          await this.getDetail(this.infoid, null);
+        } else {
+          this.$message.warning("鏃犳硶鍒锋柊锛岀己灏戝繀瑕佺殑鍙傛暟");
+        }
+
+        this.$message.success("鏁版嵁鍒锋柊鎴愬姛");
+      } catch (error) {
+        console.error("鍒锋柊鏁版嵁澶辫触:", error);
+        this.$message.error("鍒锋柊鏁版嵁澶辫触锛岃閲嶈瘯");
+      }
+    },
+
+    /**
+     * 澶勭悊椤甸潰鍒锋柊
+     * 妫�鏌ユ槸鍚︽湁鏈繚瀛樻暟鎹紝纭鍚庡埛鏂伴〉闈�
+     */
+    handleRefresh() {
+      // 妫�鏌ユ槸鍚︽湁鏈繚瀛樼殑缂栬緫
+      if (this.hasUnsavedChanges()) {
+        this.$confirm(
+          "褰撳墠鏈夋湭淇濆瓨鐨勬暟鎹紝鍒锋柊椤甸潰灏嗕涪澶辫繖浜涙洿鏀广�傛槸鍚︾户缁埛鏂帮紵",
+          "璀﹀憡",
+          {
+            confirmButtonText: "缁х画鍒锋柊",
+            cancelButtonText: "鍙栨秷",
+            type: "warning",
+            distinguishCancelAndClose: true,
+            beforeClose: (action, instance, done) => {
+              if (action === "confirm") {
+                instance.confirmButtonLoading = true;
+                instance.confirmButtonText = "鍒锋柊涓�...";
+
+                // 寤惰繜鎵ц浠ョ‘淇漊I鏇存柊
+                setTimeout(() => {
+                  done();
+                  instance.confirmButtonLoading = false;
+
+                  // 鐢ㄦ埛纭鍒锋柊
+                  this.refreshPageData();
+                }, 300);
+              } else {
+                this.$message({
+                  type: "info",
+                  message: "宸插彇娑堝埛鏂�"
+                });
+                done();
+              }
+            }
+          }
+        ).catch(action => {
+          if (action === "cancel") {
+            this.$message({
+              type: "info",
+              message: "宸插彇娑堝埛鏂�"
+            });
+          }
+        });
+      } else {
+        // 娌℃湁鏈繚瀛樼殑缂栬緫锛岀洿鎺ュ埛鏂�
+        this.refreshPageData();
+      }
+    },
+    // 妫�鏌ユ槸鍚︽湁鏈繚瀛樼殑鏁版嵁鍙樺寲
+    hasUnsavedChanges() {
+      if (!this.isDataLoaded) {
+        return false; // 鏁版嵁鏈姞杞斤紝鏃犻渶妫�娴�
+      }
+
+      // 1. 妫�鏌ヨ〃鍗曞瓧娈靛彉鍖�
+      const formFieldsChanged = this.checkFormFieldsChanged();
+
+      // 2. 妫�鏌ヤ笓瀹跺垪琛ㄥ彉鍖�
+      const expertListChanged = this.checkExpertListChanged();
+
+      // 3. 妫�鏌ラ檮浠跺垪琛ㄥ彉鍖�
+      const attachmentsChanged = this.checkAttachmentsChanged();
+
+      return formFieldsChanged || expertListChanged || attachmentsChanged;
+    },
+
+    // 妫�鏌ヨ〃鍗曞瓧娈垫槸鍚︽湁鍙樺寲
+    checkFormFieldsChanged() {
+      if (!this.originalFormData) return false;
+
+      const formKeys = [
+        "initiateTheme",
+        "initiatePerson",
+        "status",
+        "expertConclusion",
+        "expertOpinion",
+        "expertTime",
+        "remark"
+      ];
+
+      for (const key of formKeys) {
+        if (this.form[key] !== this.originalFormData[key]) {
+          console.log(
+            `琛ㄥ崟瀛楁鍙樺寲: ${key}`,
+            this.form[key],
+            this.originalFormData[key]
+          );
+          return true;
+        }
+      }
+
+      return false;
+    },
+
+    // 妫�鏌ヤ笓瀹跺垪琛ㄥ彉鍖�
+    checkExpertListChanged() {
+      if (!this.originalExpertList || !this.form.ethicalreviewopinionsList) {
+        return false;
+      }
+
+      const original = this.originalExpertList;
+      const current = this.form.ethicalreviewopinionsList;
+
+      // 1. 妫�鏌ユ暟閲忓彉鍖�
+      if (original.length !== current.length) {
+        console.log("涓撳鏁伴噺鍙樺寲:", original.length, "->", current.length);
+        return true;
+      }
+
+      // 2. 妫�鏌ユ瘡涓笓瀹剁殑鍙樺寲
+      for (let i = 0; i < original.length; i++) {
+        const origExpert = original[i];
+        const currExpert = current[i];
+
+        // 妫�鏌ュ叧閿瓧娈靛彉鍖�
+        const fieldsToCheck = [
+          "expertconclusion",
+          "expertopinion",
+          "receiveStatus",
+          "conclusiontime",
+          "startTime",
+          "endTime",
+          "sendType"
+        ];
+
+        for (const field of fieldsToCheck) {
+          if (origExpert[field] !== currExpert[field]) {
+            console.log(
+              `涓撳${i}鐨�${field}瀛楁鍙樺寲:`,
+              origExpert[field],
+              "->",
+              currExpert[field]
+            );
+            return true;
+          }
+        }
+      }
+
+      return false;
+    },
+
+    // 妫�鏌ラ檮浠跺垪琛ㄥ彉鍖�
+    checkAttachmentsChanged() {
+      if (!this.originalAttachments || !this.form.annexfilesList) {
+        return false;
+      }
+
+      const original = this.originalAttachments;
+      const current = this.form.annexfilesList;
+
+      // 妫�鏌ユ暟閲忓彉鍖�
+      if (original.length !== current.length) {
+        console.log("闄勪欢鏁伴噺鍙樺寲:", original.length, "->", current.length);
+        return true;
+      }
+
+      // 妫�鏌ユ枃浠跺悕鍙樺寲锛堥�氬父闄勪欢涓嶄細淇敼锛屽彧澧炲垹锛�
+      const originalFileNames = original.map(f => f.fileName || f.name).sort();
+      const currentFileNames = current.map(f => f.fileName || f.name).sort();
+
+      for (let i = 0; i < originalFileNames.length; i++) {
+        if (originalFileNames[i] !== currentFileNames[i]) {
+          console.log(
+            "闄勪欢鏂囦欢鍚嶅彉鍖�:",
+            originalFileNames[i],
+            "->",
+            currentFileNames[i]
+          );
+          return true;
+        }
+      }
+
+      return false;
+    },
+
+    // 娴忚鍣ㄧ寮�椤甸潰妫�娴�
+    beforeUnloadHandler(event) {
+      if (this.hasUnsavedChanges()) {
+        const message = "鎮ㄦ湁鏈繚瀛樼殑鏇存敼锛岀‘瀹氳绂诲紑鍚楋紵";
+        event.returnValue = message; // 鏍囧噯鏂瑰紡
+        return message; // 鏌愪簺娴忚鍣ㄩ渶瑕佽繑鍥炲瓧绗︿覆
+      }
+    },
     // 鍔犺浇涓撳鍒楄〃
     async loadExperts() {
       try {
         this.expertListLoading = true;
         const params = {
-          usertype: "浼︾悊涓撳", // 浼︾悊涓撳
+          usertype: "ethical", // 浼︾悊涓撳
           pageNum: this.expertPage.pageNum,
           pageSize: this.expertPage.pageSize
         };
@@ -1602,7 +1943,7 @@
         }
 
         const response = await listExternalperson(params);
-        if (response.code === 200) {
+        if (response.code == 200) {
           this.expertList = response.rows || [];
           this.expertTotal = response.total || 0;
         } else {
@@ -1639,7 +1980,7 @@
 
     // 纭娣诲姞涓撳
     handleConfirmAddExpert() {
-      if (this.selectedExperts.length === 0) {
+      if (this.selectedExperts.length == 0) {
         this.$message.warning("璇烽�夋嫨瑕佹坊鍔犵殑涓撳");
         return;
       }
@@ -1664,7 +2005,7 @@
           expertType: isChief ? "1" : "0", // 涓讳换濮斿憳璁剧疆涓轰富濮斾笓瀹�
           deptName: expert.unitname || "",
           title: expert.title || "",
-          deptname: expert.telephone || "",
+          donorno: expert.telephone || "",
           receiveStatus: "0", // 寰呮帴鏀�
           expertconclusion: "",
           expertopinion: "",
@@ -1736,8 +2077,8 @@
     // 鍙戦�佺粰鍗曚釜涓撳
     handleSendToExpert(expert) {
       this.currentSendExperts = [expert];
-      this.sendForm.expertType = expert.expertType === "1" ? "chief" : "normal";
-      this.sendForm.endTime = expert.expertType === "1" ? "" : ""; // 涓诲涓撳鏃犻渶鎴鏃堕棿
+      this.sendForm.expertType = expert.expertType == "1" ? "chief" : "normal";
+      this.sendForm.endTime = expert.expertType == "1" ? "" : ""; // 涓诲涓撳鏃犻渶鎴鏃堕棿
       this.sendDialogVisible = true;
     },
 
@@ -1784,40 +2125,52 @@
         return;
       }
 
-      if (this.currentSendExperts.length === 0) {
+      if (this.currentSendExperts.length == 0) {
         this.$message.warning("娌℃湁鎵惧埌鍙彂閫佺殑涓撳");
         return;
       }
 
-      this.sending = true;
+      // 鍒濆鍖栧彂閫佺姸鎬�
+      this.sendingAll = true;
+      this.sendingProgress = 0;
+      this.sendingTotal = this.currentSendExperts.length;
+      this.sendingSuccessCount = 0;
+      this.sendingFailCount = 0;
+      this.sendingResults = [];
+
+      // 鍒涘缓涓�涓繘搴﹀璇濇
+      const progressDialog = this.$message({
+        type: "info",
+        message: `姝e湪鍙戦�侀�氱煡锛岃绋嶅��... (0/${this.sendingTotal})`,
+        duration: 0, // 涓嶄細鑷姩鍏抽棴
+        showClose: true
+      });
+
       try {
-        // 鍙戦�佺粰姣忎釜涓撳
-        const sendPromises = this.currentSendExperts.map(async expert => {
+        // 浣跨敤Promise鏁扮粍鏉ラ『搴忔墽琛屽彂閫�
+        for (let i = 0; i < this.currentSendExperts.length; i++) {
+          const expert = this.currentSendExperts[i];
+
+          // 鏇存柊杩涘害
+          this.sendingProgress = i;
+          progressDialog.message = `姝e湪鍙戦�侀�氱煡锛岃绋嶅��... (${i}/${this.sendingTotal})`;
+
           try {
-            // 鏋勫缓鍙戦�佹暟鎹�
-            const sendData = {
-              number: expert.deptname || "", // 鐢ㄦ埛鎵嬫満鍙�
-              title: this.sendForm.title,
-              url: this.sendForm.url || "",
+            // 鍙戦�佸崟涓笓瀹堕�氱煡
+            const result = await this.sendSingleExpert(expert, i);
+            this.sendingResults.push(result);
 
-              createTime: new Date()
-                .toISOString()
-                .replace("T", " ")
-                .substring(0, 19)
-            };
+            if (result.success) {
+              this.sendingSuccessCount++;
 
-            // 璋冪敤鍙戦�侀�氱煡鎺ュ彛
-            const response = await sendNotification(sendData);
-
-            if (response.code === 200) {
               // 鏇存柊涓撳鐘舵��
               const index = this.form.ethicalreviewopinionsList.findIndex(
                 e =>
-                  e.expertNo === expert.expertNo ||
-                  e.expertname === expert.expertname
+                  e.expertNo == expert.expertNo ||
+                  e.expertname == expert.expertname
               );
 
-              if (index !== -1) {
+              if (index != -1) {
                 this.form.ethicalreviewopinionsList[index].receiveStatus = "1"; // 宸叉帴鏀�
                 this.form.ethicalreviewopinionsList[
                   index
@@ -1842,42 +2195,49 @@
                   this.form.ethicalreviewopinionsList[index]
                 );
               }
-
-              return { success: true, expert: expert.expertname };
             } else {
-              return {
-                success: false,
-                expert: expert.expertname,
-                error: response.msg
-              };
+              this.sendingFailCount++;
             }
           } catch (error) {
             console.error(`鍙戦�佺粰涓撳 ${expert.expertname} 澶辫触:`, error);
-            return {
+            this.sendingResults.push({
               success: false,
               expert: expert.expertname,
               error: error.message
-            };
+            });
+            this.sendingFailCount++;
           }
-        });
 
-        // 绛夊緟鎵�鏈夊彂閫佸畬鎴�
-        const results = await Promise.all(sendPromises);
-
-        // 缁熻鍙戦�佺粨鏋�
-        const successCount = results.filter(r => r.success).length;
-        const failCount = results.filter(r => !r.success).length;
-
-        if (failCount === 0) {
-          this.$message.success(`鎴愬姛鍙戦�佺粰 ${successCount} 浣嶄笓瀹禶);
-        } else if (successCount > 0) {
-          this.$message.warning(
-            `鎴愬姛鍙戦�佺粰 ${successCount} 浣嶄笓瀹讹紝澶辫触 ${failCount} 浣峘
-          );
-        } else {
-          this.$message.error("鍙戦�佸け璐ワ紝璇风◢鍚庨噸璇�");
+          // 濡傛灉涓嶆槸鏈�鍚庝竴涓紝绛夊緟100ms鍐嶅彂閫佷笅涓�涓�
+          if (i < this.currentSendExperts.length - 1) {
+            await this.sleep(100);
+          }
         }
 
+        // 瀹屾垚杩涘害
+        this.sendingProgress = this.sendingTotal;
+        progressDialog.message = `鍙戦�佸畬鎴愶紝鎴愬姛 ${this.sendingSuccessCount} 涓紝澶辫触 ${this.sendingFailCount} 涓猔;
+
+        // 寤惰繜1绉掑悗鍏抽棴杩涘害瀵硅瘽妗�
+        await this.sleep(1000);
+        progressDialog.close();
+
+        // 鏄剧ず鏈�缁堢粨鏋�
+        if (this.sendingFailCount == 0) {
+          this.$message.success(
+            `鎴愬姛鍙戦�佺粰 ${this.sendingSuccessCount} 浣嶄笓瀹禶
+          );
+        } else if (this.sendingSuccessCount > 0) {
+          this.$message.warning(
+            `鎴愬姛鍙戦�佺粰 ${this.sendingSuccessCount} 浣嶄笓瀹讹紝澶辫触 ${this.sendingFailCount} 浣峘
+          );
+          // 濡傛灉鏈夊け璐ワ紝鍙互鏄剧ず璇︾粏澶辫触淇℃伅
+          this.showFailedDetails();
+        } else {
+          this.$message.error("鍏ㄩ儴鍙戦�佸け璐ワ紝璇风◢鍚庨噸璇�");
+        }
+
+        // 鍏抽棴鍙戦�佸璇濇
         this.sendDialogVisible = false;
         this.sendForm = {
           expertType: "normal",
@@ -1890,14 +2250,99 @@
           url: ""
         };
         this.currentSendExperts = [];
+        // 淇濆瓨鏁翠釜鍗曟嵁
+        this.handleSave();
       } catch (error) {
-        console.error("鍙戦�佸け璐�:", error);
-        this.$message.error("鍙戦�佸け璐ワ紝璇烽噸璇�");
+        console.error("鍙戦�佽繃绋嬩腑鍙戠敓閿欒:", error);
+        progressDialog.close();
+        this.$message.error("鍙戦�佽繃绋嬩腑鍙戠敓閿欒锛岃閲嶈瘯");
       } finally {
-        this.sending = false;
+        this.sendingAll = false;
+      }
+    },
+    // 鍙戦�佸崟涓笓瀹剁殑鏂规硶
+    async sendSingleExpert(expert, index) {
+      try {
+        // 鏋勫缓鍙戦�佹暟鎹�
+        const sendData = {
+          number: expert.deptname || "", // 鐢ㄦ埛鎵嬫満鍙�
+          title: this.sendForm.title,
+          url: this.sendForm.url || "",
+          createTime: new Date()
+            .toISOString()
+            .replace("T", " ")
+            .substring(0, 19)
+        };
+
+        console.log(`姝e湪鍙戦�佺 ${index + 1} 涓笓瀹�: ${expert.expertname}`);
+
+        // 璋冪敤鍙戦�侀�氱煡鎺ュ彛
+        // const response = await sendNotification(sendData);
+        const response = await sendcall({
+          tel: expert.donorno ? expert.donorno : 13634195431, // 杩欓噷搴旇鏄� expert.deptname 鎴� expert.phone
+          messageContent:
+            "闈掑矝澶у闄勫睘鍖婚櫌涓婃姤娼滃湪鎹愮尞妗堜緥锛岃鐧诲綍OPO绯荤粺鏌ョ湅璇︾粏淇℃伅锛屽強鏃惰繘琛屽鎺ャ�傜櫥褰曢摼鎺�:https://brdeddd.qduhosos.cn/dklejdj/deljf/index"
+        });
+
+        if (response.code == 200) {
+          return {
+            success: true,
+            expert: expert.expertname,
+            index: index
+          };
+        } else {
+          return {
+            success: false,
+            expert: expert.expertname,
+            index: index,
+            error: response.msg
+          };
+        }
+      } catch (error) {
+        console.error(`鍙戦�佺粰涓撳 ${expert.expertname} 澶辫触:`, error);
+        return {
+          success: false,
+          expert: expert.expertname,
+          index: index,
+          error: error.message
+        };
       }
     },
 
+    // 鏄剧ず澶辫触璇︽儏鐨勬柟娉�
+    showFailedDetails() {
+      const failedExperts = this.sendingResults.filter(r => !r.success);
+      if (failedExperts.length > 0) {
+        this.$confirm(
+          `鏈� ${failedExperts.length} 浣嶄笓瀹跺彂閫佸け璐ワ紝鏄惁鏌ョ湅澶辫触璇︽儏锛焋,
+          "鍙戦�佺粨鏋�",
+          {
+            confirmButtonText: "鏌ョ湅璇︽儏",
+            cancelButtonText: "鍏抽棴",
+            type: "warning"
+          }
+        )
+          .then(() => {
+            let detailMessage = "鍙戦�佸け璐ョ殑涓撳锛歕n\n";
+            failedExperts.forEach((expert, index) => {
+              detailMessage += `${index + 1}. ${expert.expert}: ${
+                expert.error
+              }\n`;
+            });
+
+            this.$alert(detailMessage, "鍙戦�佸け璐ヨ鎯�", {
+              confirmButtonText: "纭畾",
+              customClass: "failed-details-dialog"
+            });
+          })
+          .catch(() => {});
+      }
+    },
+
+    // 鐫$湢鍑芥暟锛岀敤浜庨棿闅�
+    sleep(ms) {
+      return new Promise(resolve => setTimeout(resolve, ms));
+    },
     // 鍒犻櫎涓撳瀹℃煡
     handleDeleteExpertReview(expert, index) {
       this.$confirm("纭畾瑕佸垹闄よ涓撳鐨勫鏌ヨ褰曞悧锛�", "鎻愮ず", {
@@ -1931,7 +2376,7 @@
 
         const response = await ethicalreExpertTotal(params);
 
-        if (response && response.code === 200) {
+        if (response && response.code == 200) {
           this.expertHistoryData = response.data || response[0] || null;
         } else {
           this.$message.error(
@@ -2171,11 +2616,82 @@
 .selected-case-info {
   margin-bottom: 20px;
 }
+/* 鍙戦�佽繘搴︽牱寮� */
+.send-progress-container {
+  margin: 20px 0;
+  padding: 20px;
+  background: #f5f7fa;
+  border-radius: 8px;
+}
 
+.send-stats {
+  display: flex;
+  justify-content: center;
+  gap: 30px;
+  margin-top: 10px;
+}
+
+.stat-item {
+  font-size: 14px;
+  font-weight: 500;
+  padding: 4px 12px;
+  border-radius: 4px;
+}
+
+.stat-item.success {
+  color: #67c23a;
+  background: #f0f9eb;
+}
+
+.stat-item.fail {
+  color: #f56c6c;
+  background: #fef0f0;
+}
+
+/* 澶辫触璇︽儏瀵硅瘽妗� */
+.failed-details-dialog {
+  min-width: 400px;
+  max-width: 600px;
+}
+
+.failed-details-dialog .el-message-box__content {
+  max-height: 400px;
+  overflow-y: auto;
+  white-space: pre-wrap;
+  word-break: break-word;
+}
 .case-info-card {
   border-left: 4px solid #67c23a;
 }
+/* 鍦–SS涓坊鍔� */
+:deep(.el-message-box) {
+  max-width: 500px;
+}
 
+/* 娣诲姞鏈繚瀛樼姸鎬佹牱寮� */
+.unsaved-hint {
+  position: absolute;
+  top: 10px;
+  right: 10px;
+  background: #e6a23c;
+  color: white;
+  padding: 4px 8px;
+  border-radius: 4px;
+  font-size: 12px;
+  animation: pulse 2s infinite;
+}
+
+@keyframes pulse {
+  0% {
+    opacity: 0.8;
+  }
+  50% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0.8;
+  }
+}
 /* 鍝嶅簲寮忚璁� */
 @media (max-width: 768px) {
   .ethics-review-detail {
diff --git a/src/views/business/maintain/maintainInfo.vue b/src/views/business/maintain/maintainInfo.vue
index 78cd766..ec052b2 100644
--- a/src/views/business/maintain/maintainInfo.vue
+++ b/src/views/business/maintain/maintainInfo.vue
@@ -55,8 +55,17 @@
                   <el-tag
                     :type="scope.row.result === '闃存��' ? 'success' : 'danger'"
                     effect="plain"
+                    @click="handleResultClick(scope.row)"
+                    style="cursor: pointer;"
                   >
                     {{ scope.row.result }}
+                    <i
+                      v-if="
+                        scope.row.result === '闃虫��' && scope.row.positiveDetails
+                      "
+                      class="el-icon-info"
+                      style="margin-left: 4px;"
+                    ></i>
                   </el-tag>
                 </template>
               </el-table-column>
@@ -263,6 +272,7 @@
                 v-model="cultureForm.result"
                 placeholder="璇烽�夋嫨鍩瑰吇缁撴灉"
                 style="width: 100%"
+                @change="handleResultChange"
               >
                 <el-option label="闃存��" value="闃存��" />
                 <el-option label="闃虫��" value="闃虫��" />
@@ -270,7 +280,19 @@
             </el-form-item>
           </el-col>
         </el-row>
-
+        <el-form-item
+          v-if="cultureForm.result === '闃虫��'"
+          label="闃虫�ц鎯�"
+          prop="positiveDetails"
+        >
+          <el-input
+            type="textarea"
+            :rows="2"
+            v-model="cultureForm.positiveDetails"
+            placeholder="璇疯緭鍏ラ槼鎬х粨鏋滅殑璇︾粏淇℃伅"
+            clearable
+          />
+        </el-form-item>
         <el-form-item label="闄勪欢">
           <UploadAttachment
             ref="cultureUploadAttachment"
@@ -502,6 +524,7 @@
         cultureType: "",
         sampleTime: "",
         result: "闃存��",
+        positiveDetails: "", // 鏂板锛氶槼鎬ц鎯�
         attachments: []
       },
       cultureFileList: [],
@@ -514,7 +537,8 @@
         ],
         result: [
           { required: true, message: "璇烽�夋嫨鍩瑰吇缁撴灉", trigger: "change" }
-        ]
+        ],
+        positiveDetails: [] // 鍔ㄦ�侀獙璇佽鍒�
       },
       cultureTypeOptions: [
         { value: "1", label: "琛�鍩瑰吇" },
@@ -661,7 +685,46 @@
         this.recordLoading = false;
       }
     },
+    // 澶勭悊鍩瑰吇缁撴灉閫夋嫨鍙樺寲
+    handleResultChange(value) {
+      this.$nextTick(() => {
+        if (value === "闃虫��") {
+          this.cultureRules.positiveDetails = [
+            { required: true, message: "璇疯緭鍏ラ槼鎬ц鎯�", trigger: "blur" }
+          ];
+        } else {
+          this.cultureRules.positiveDetails = [];
+          this.cultureForm.positiveDetails = "";
+        }
+        // 娓呴櫎楠岃瘉
+        if (this.$refs.cultureForm) {
+          this.$refs.cultureForm.clearValidate("positiveDetails");
+        }
+      });
+    },
 
+    // 澶勭悊鐐瑰嚮鍩瑰吇缁撴灉鏍囩
+    handleResultClick(row) {
+      if (row.result === "闃虫��" && row.positiveDetails) {
+        this.$alert(
+          `<div style="padding: 10px;">
+        <h4 style="margin-bottom: 10px; color: #f56c6c;">闃虫�ц鎯咃細</h4>
+        <div style="background: #fef0f0; padding: 15px; border-radius: 4px; border-left: 4px solid #f56c6c;">
+          <p style="margin: 0; white-space: pre-wrap; line-height: 1.5;">${row.positiveDetails}</p>
+        </div>
+      </div>`,
+          "闃虫�х粨鏋滆鎯�",
+          {
+            dangerouslyUseHTMLString: true,
+            confirmButtonText: "鍏抽棴",
+            customClass: "result-details-dialog",
+            showClose: false
+          }
+        );
+      } else if (row.result === "闃虫��") {
+        this.$message.warning("璇ラ槼鎬ц褰曟殏鏃犺鎯呬俊鎭�");
+      }
+    },
     // 淇濆瓨鎵�鏈夋暟鎹�
     async handleSave() {
       try {
@@ -747,9 +810,13 @@
       });
     },
 
+    // 5. 淇敼缂栬緫鍩瑰吇璁板綍鏂规硶
     handleEditCulture(row) {
       this.cultureDialogTitle = "缂栬緫鍩瑰吇璁板綍";
-      this.cultureForm = { ...row };
+      this.cultureForm = {
+        ...row,
+        positiveDetails: row.positiveDetails || "" // 纭繚鏈塸ositiveDetails瀛楁
+      };
       this.cultureFileList = row.attachments
         ? row.attachments.map(item => ({
             uid: item.id || Math.random(),
@@ -763,27 +830,44 @@
       this.cultureDialogVisible = true;
       this.$nextTick(() => {
         this.$refs.cultureForm && this.$refs.cultureForm.clearValidate();
+        // 濡傛灉缂栬緫鏃舵槸闃虫�х粨鏋滐紝璁剧疆楠岃瘉瑙勫垯
+        if (row.result === "闃虫��") {
+          this.cultureRules.positiveDetails = [
+            { required: true, message: "璇疯緭鍏ラ槼鎬ц鎯�", trigger: "blur" }
+          ];
+        }
       });
     },
 
+    // 6. 淇敼淇濆瓨鍩瑰吇璁板綍鏂规硶
     handleSaveCulture() {
       this.$refs.cultureForm.validate(valid => {
         if (valid) {
           this.cultureSaveLoading = true;
 
-          if (this.cultureForm.id) {
+          // 鏋勫缓淇濆瓨鏁版嵁
+          const saveData = {
+            ...this.cultureForm,
+            // 濡傛灉鏄槾鎬э紝娓呯┖闃虫�ц鎯�
+            positiveDetails:
+              this.cultureForm.result === "闃虫��"
+                ? this.cultureForm.positiveDetails || ""
+                : ""
+          };
+
+          if (saveData.id) {
             const index = this.cultureList.findIndex(
-              item => item.id === this.cultureForm.id
+              item => item.id === saveData.id
             );
             if (index !== -1) {
-              this.cultureList.splice(index, 1, { ...this.cultureForm });
+              this.cultureList.splice(index, 1, { ...saveData });
             }
           } else {
-            this.cultureForm.id = Date.now();
-            this.cultureList.push({ ...this.cultureForm });
+            saveData.id = Date.now();
+            this.cultureList.push({ ...saveData });
           }
 
-          this.$message.success(this.cultureForm.id ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
+          this.$message.success(saveData.id ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
           this.cultureDialogVisible = false;
           this.cultureSaveLoading = false;
         }
@@ -1171,4 +1255,22 @@
   font-size: 13px;
   margin-left: 8px;
 }
+/* 7. 娣诲姞涓�浜涙牱寮� */
+.result-details-dialog {
+  width: 500px;
+}
+
+.result-details-dialog .el-message-box__content {
+  padding: 0;
+}
+
+.result-details-dialog .el-message-box__header {
+  background: #fef0f0;
+  border-bottom: 1px solid #fde2e2;
+}
+
+.result-details-dialog .el-message-box__title {
+  color: #f56c6c;
+  font-weight: bold;
+}
 </style>
diff --git a/src/views/business/transfer/TransportEdit.vue b/src/views/business/transfer/TransportEdit.vue
index bae6f58..e37071e 100644
--- a/src/views/business/transfer/TransportEdit.vue
+++ b/src/views/business/transfer/TransportEdit.vue
@@ -149,6 +149,24 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor">
+              <el-input
+                v-model="formData.icuDoctor"
+                placeholder="璇疯緭鍏CU璇勪及鍖荤敓"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="ICU鍖荤敓鐢佃瘽" prop="icuDoctorPhone">
+              <el-input
+                v-model="formData.icuDoctorPhone"
+                placeholder="璇疯緭鍏CU鍖荤敓鎵嬫満鍙�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-card>
 
       <!-- 杞繍淇℃伅 -->
@@ -222,10 +240,10 @@
 
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鎬ヨ瘖绉戝尰鐢�" prop="doctor">
+            <el-form-item label="杞繍鍖荤敓" prop="doctor">
               <el-input
                 v-model="formData.doctor"
-                placeholder="璇疯緭鍏ユ�ヨ瘖绉戝尰鐢�"
+                placeholder="璇疯緭鍏ヨ浆杩愬尰鐢�"
               />
             </el-form-item>
           </el-col>
@@ -241,7 +259,7 @@
 
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鎶ゅ+" prop="nurse">
+            <el-form-item label="杞繍鎶ゅ+" prop="nurse">
               <el-input v-model="formData.nurse" placeholder="璇疯緭鍏ユ姢澹鍚�" />
             </el-form-item>
           </el-col>
@@ -257,7 +275,7 @@
 
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="椹鹃┒鍛�" prop="driver">
+            <el-form-item label="杞繍椹鹃┒鍛�" prop="driver">
               <el-input
                 v-model="formData.driver"
                 placeholder="璇疯緭鍏ラ┚椹跺憳濮撳悕"
@@ -274,24 +292,7 @@
           </el-col>
         </el-row>
 
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor">
-              <el-input
-                v-model="formData.icuDoctor"
-                placeholder="璇疯緭鍏CU璇勪及鍖荤敓"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="ICU鍖荤敓鐢佃瘽" prop="icuDoctorPhone">
-              <el-input
-                v-model="formData.icuDoctorPhone"
-                placeholder="璇疯緭鍏CU鍖荤敓鎵嬫満鍙�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+
       </el-card>
 
       <!-- 闄勪欢淇℃伅 -->
diff --git a/src/views/business/transfer/index.vue b/src/views/business/transfer/index.vue
index bbf0b4d..cb73d73 100644
--- a/src/views/business/transfer/index.vue
+++ b/src/views/business/transfer/index.vue
@@ -217,34 +217,49 @@
       >
         <template slot-scope="scope">
           <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-view"
+            size="small"
+            type="primary"
             @click="handleDetail(scope.row)"
             >璇︽儏</el-button
           >
           <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
+            size="small"
+            type="primary"
+            style="margin-bottom: 10px;"
+            plain
             @click="handleUpdate(scope.row)"
             >缂栬緫</el-button
           >
           <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-video-play"
+            size="small"
+            type="primary"
+            plain
             @click="handleStartTransport(scope.row)"
             v-if="scope.row.transitStatus === 1"
             >寮�濮嬭浆杩�</el-button
           >
           <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-check"
+            size="small"
+            type="success"
+            plain
             @click="handleCompleteTransport(scope.row)"
             v-if="scope.row.transitStatus === 2"
             >瀹屾垚杞繍</el-button
+          ><el-button
+            size="small"
+            type="danger"
+            plain
+            @click="cancelTransport(scope.row)"
+            v-if="scope.row.transitStatus === 2"
+            >鍙栨秷杞繍</el-button
+          >
+          <el-button
+            size="small"
+            type="warning"
+            plain
+            @click="recoverTransport(scope.row)"
+            v-if="scope.row.transitStatus === 4"
+            >鎭㈠杞繍</el-button
           >
         </template>
       </el-table-column>
@@ -664,6 +679,8 @@
         // 鍏朵粬瀛楁鍙互鏍规嵁闇�瑕佷粠妗堜緥涓幏鍙�
         transportStartPlace: caseData.treatmenthospitalname || "",
         contactPerson: caseData.coordinatorName || "",
+        icuDoctor: caseData.icuDoctor,
+        icuDoctorPhone: caseData.icuDoctorPhone,
         transitStatus: 1, // 榛樿寰呰浆杩�
         // 娓呯┖鍏朵粬瀛楁
         id: undefined,
@@ -793,6 +810,18 @@
       this.actionTitle = "瀹屾垚杞繍";
       this.actionText = "瀹屾垚";
       this.actionOpen = true;
+    } /** 瀹屾垚杞繍鎿嶄綔 */,
+    async cancelTransport(row) {
+      this.currentTransport = row;
+      this.actionTitle = "鍙栨秷杞繍";
+      this.actionText = "鍙栨秷";
+      this.actionOpen = true;
+    } /** 瀹屾垚杞繍鎿嶄綔 */,
+    async recoverTransport(row) {
+      this.currentTransport = row;
+      this.actionTitle = "鎭㈠杞繍";
+      this.actionText = "鎭㈠";
+      this.actionOpen = true;
     },
 
     /** 纭鎿嶄綔 */
@@ -806,13 +835,19 @@
           requestData.transitStatus = 2; // 璁剧疆涓鸿浆杩愪腑
         } else if (this.actionText === "瀹屾垚") {
           requestData.transitStatus = 3; // 璁剧疆涓鸿浆杩愬畬鎴�
+        } else if (this.actionText === "鍙栨秷") {
+          requestData.transitStatus = 4; // 璁剧疆涓鸿浆杩愬彇娑�
+        } else if (this.actionText === "鎭㈠") {
+          requestData.transitStatus = 2; // 璁剧疆涓鸿浆杩愪腑
         }
-
+        requestData.annexfilesList.forEach(item => {
+          item.id = null;
+        });
         const response = await transportEdit(requestData);
 
         if (response.code == 200) {
           this.$modal.msgSuccess(`${this.actionText}杞繍鎴愬姛`);
-          if (requestData.transitStatus==3) {
+          if (requestData.transitStatus == 3) {
             const resappear = await donateInfo(requestData.reportId);
             if (resappear.code) {
               let obj = resappear.data;
diff --git a/src/views/login.vue b/src/views/login.vue
index 6a50751..0f6a635 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -139,7 +139,8 @@
     this.getCode();
     this.getCookie();
     this.getAuthCode();
-    this.loginForm.password=this.generatePassword();
+    this.loginForm.password='';
+    // this.loginForm.password=this.generatePassword();
     // this.avoidLogin();
   },
   methods: {
diff --git a/src/views/project/DonationProcess/index.vue b/src/views/project/DonationProcess/index.vue
index da4d64d..4fa2c40 100644
--- a/src/views/project/DonationProcess/index.vue
+++ b/src/views/project/DonationProcess/index.vue
@@ -195,12 +195,13 @@
           />
         </template>
       </el-table-column>
-      <el-table-column
-        label="浼犳煋鐥�"
-        align="center"
-        prop="infectious"
-        width="180"
-      />
+       <el-table-column label="浼犳煋鐥�" align="center" prop="infectious">
+        <template slot-scope="scope">
+          <span v-for="item in scope.row.infectious.split(',')"
+            ><dict-tag :options="dict.type.sys_Infectious" :value="item" />
+          </span>
+        </template>
+      </el-table-column>
 
       <el-table-column
         label="棣栬瘖鍖婚櫌"
@@ -405,6 +406,7 @@
     "sys_donornode",
     "sys_BloodType",
     "sys_EthicalReview",
+    'sys_Infectious',
     "sys_BaseAssessConclusion"
   ],
   data() {
diff --git a/src/views/project/distributedetail/index.vue b/src/views/project/distributedetail/index.vue
index 60f494f..5341493 100644
--- a/src/views/project/distributedetail/index.vue
+++ b/src/views/project/distributedetail/index.vue
@@ -188,7 +188,7 @@
           <dict-tag :options="dict.type.sys_user_sex" :value="scope.row.sex"/>
         </template>
       </el-table-column>
-      <el-table-column label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" align="center" prop="familyrelations">
+      <el-table-column label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" align="center" prop="familyrelations">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.sys_FamilyRelation" :value="scope.row.familyrelations"/>
         </template>
@@ -240,7 +240,7 @@
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -296,8 +296,8 @@
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
-          <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愯禒鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
+        <el-form-item label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
+          <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愮尞鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
         </el-form-item>
         <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
           <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" />
diff --git a/src/views/project/donatebaseinfo/Archivedpage.vue b/src/views/project/donatebaseinfo/Archivedpage.vue
new file mode 100644
index 0000000..dc09df0
--- /dev/null
+++ b/src/views/project/donatebaseinfo/Archivedpage.vue
@@ -0,0 +1,322 @@
+<template>
+  <div class="app-container archive-container">
+    <div class="archive-header">
+  <span class="archive-title">鎹愮尞妗堜緥褰掓。绠$悊</span>
+  <span class="archive-tag">浠呭睍绀哄凡褰掓。妗堜緥锛堜笉鍙紪杈戯級</span>
+</div>
+    <!-- 鎼滅储 -->
+     <el-card class="search-card">
+       <el-form
+         :model="queryParams"
+         ref="queryForm"
+         :inline="true"
+         v-show="showSearch"
+         label-width="70px"
+       >
+         <el-row :gutter="8">
+           <el-col :span="5">
+             <el-form-item label="濮撳悕" prop="name">
+               <el-input
+                 v-model="queryParams.name"
+                 placeholder="璇疯緭鍏ュ鍚�"
+                 clearable
+                 size="small"
+               />
+             </el-form-item>
+           </el-col>
+
+           <el-col :span="5">
+             <el-form-item label="鎶ュ憡鍖婚櫌" prop="treatmenthospitalno">
+               <org-selecter
+                 ref="orgSelecter"
+                 :org-type="'3'"
+                 v-model="queryParams.treatmenthospitalno"
+               />
+             </el-form-item>
+           </el-col>
+
+           <el-col :span="9">
+             <el-form-item label="褰掓。鏃堕棿">
+               <el-date-picker
+                 v-model="selecttime"
+                 type="daterange"
+                 range-separator="鑷�"
+                 start-placeholder="寮�濮嬫棩鏈�"
+                 end-placeholder="缁撴潫鏃ユ湡"
+                 value-format="yyyy-MM-dd"
+                 @change="getTimeList"
+               />
+             </el-form-item>
+           </el-col>
+         </el-row>
+
+         <el-row>
+           <el-col :span="4">
+             <el-form-item>
+               <el-button
+                 type="primary"
+                 icon="el-icon-search"
+                 size="mini"
+                 @click="handleQuery"
+               >
+                 鎼滅储
+               </el-button>
+               <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">
+                 閲嶇疆
+               </el-button>
+             </el-form-item>
+           </el-col>
+         </el-row>
+       </el-form>
+     </el-card>
+
+    <!-- 鎿嶄綔 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+        >
+          瀵煎嚭
+        </el-button>
+      </el-col>
+    </el-row>
+
+    <el-card class="table-card">
+
+      <el-table
+        v-loading="loading"
+        :data="tableList"
+         class="archive-table"
+        border
+      >
+        <el-table-column label="濮撳悕" align="center" prop="name" />
+        <el-table-column label="浣忛櫌鍙�" align="center" prop="inpatientno" />
+        <el-table-column label="鎬у埆" align="center" prop="sex">
+          <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" />
+        <el-table-column label="琛�鍨�" align="center" prop="bloodtype">
+          <template slot-scope="scope">
+            <dict-tag
+              :options="dict.type.sys_BloodType"
+              :value="scope.row.bloodtype"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="褰掓。鏃堕棿" align="center" prop="filingtime" />
+
+        <el-table-column
+          label="鎿嶄綔"
+          width="120"
+          align="center"
+          fixed="right"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              style="color:#67C23A;"
+              @click="handleCancelArchive(scope.row)"
+            >
+              鍙栨秷褰掓。
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-card>
+    <!-- 琛ㄦ牸 -->
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+<script>
+import {
+  listDonatebaseinfo,
+  updateDonatebaseinfo,
+  exportDonatebaseinfo
+} from "@/api/project/donatebaseinfo";
+import OrgSelecter from "@/views/project/components/orgselect";
+
+export default {
+  name: "DonateArchive",
+  components: { OrgSelecter },
+  dicts: ["sys_user_sex", "sys_BloodType"],
+
+  data() {
+    return {
+      loading: true,
+      exportLoading: false,
+      tableList: [],
+      total: 0,
+      selecttime: [],
+
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        treatmenthospitalno: null,
+        starttime: null,
+        endtime: null,
+        recordstate: "4" // 鉁� 鍙煡褰掓。妗堜緥
+      }
+    };
+  },
+
+  created() {
+    this.getList();
+  },
+
+  methods: {
+    getTimeList() {
+      if (!this.selecttime) return;
+      const [start, end] = this.selecttime;
+      this.queryParams.starttime = start;
+      this.queryParams.endtime = end;
+    },
+
+    getList() {
+      this.loading = true;
+      listDonatebaseinfo(this.queryParams).then(res => {
+        this.tableList = res.data;
+        this.total = res.total;
+        this.loading = false;
+      });
+    },
+
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+
+    resetQuery() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        treatmenthospitalno: null,
+        starttime: null,
+        endtime: null,
+        recordstate: "4"
+      };
+      this.selecttime = [];
+      this.resetForm("queryForm");
+      this.getList();
+    },
+
+    /** 鍙栨秷褰掓。 */
+    handleCancelArchive(row) {
+      this.$confirm("纭鍙栨秷褰掓。锛熷彇娑堝悗妗堜緥灏嗘仮澶嶄负姝e父鐘舵�併��", "鎻愮ず", {
+        type: "warning"
+      }).then(async () => {
+        const res = await updateDonatebaseinfo({
+          id: row.id,
+          recordstate: "2"
+        });
+
+        if (res.code === 200) {
+          this.$modal.msgSuccess("宸插彇娑堝綊妗�");
+          this.getList();
+        } else {
+          this.$modal.msgError(res.msg || "鎿嶄綔澶辫触");
+        }
+      }).catch(() => {});
+    },
+
+    /** 瀵煎嚭 */
+    async handleExport() {
+      this.$modal.confirm("鏄惁瀵煎嚭褰掓。妗堜緥鏁版嵁锛�").then(async () => {
+        this.exportLoading = true;
+        const res = await exportDonatebaseinfo(this.queryParams);
+        this.$download.name(res.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    }
+  }
+};
+</script>
+<style scoped>
+/* ===== 褰掓。椤甸潰鏁翠綋椋庢牸 ===== */
+.archive-container {
+  background: #f5f7fa;
+  min-height: calc(100vh - 84px);
+  padding: 20px;
+}
+
+/* ===== 椤甸潰鏍囬鍖� ===== */
+.archive-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16px;
+}
+
+.archive-title {
+  font-size: 18px;
+  font-weight: bold;
+  color: #606266;
+}
+
+.archive-tag {
+  margin-left: 12px;
+  background: #fdf6ec;
+  color: #e6a23c;
+  border: 1px solid #faecd8;
+  padding: 4px 10px;
+  border-radius: 4px;
+  font-size: 12px;
+}
+
+/* ===== 鎼滅储鍖哄煙 ===== */
+.search-card {
+  background: #ffffff;
+  padding: 18px 20px 0;
+  border-radius: 6px;
+  margin-bottom: 16px;
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
+}
+
+/* ===== 琛ㄦ牸鍖哄煙 ===== */
+.table-card {
+  background: #ffffff;
+  padding: 16px;
+  border-radius: 6px;
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
+}
+
+/* ===== 褰掓。琛ㄦ牸琛屾牱寮忥紙閲嶇偣锛� ===== */
+::v-deep .archive-table .el-table__row {
+  background: #fdfbf5;
+}
+
+::v-deep .archive-table .el-table__row:hover > td {
+  background: #f9f3e3 !important;
+}
+
+/* ===== 鎿嶄綔鎸夐挳 ===== */
+.archive-action-btn {
+  color: #67c23a;
+  font-weight: 500;
+}
+
+/* ===== 绌虹姸鎬� ===== */
+.empty-archive {
+  text-align: center;
+  padding: 60px 0;
+  color: #909399;
+}
+</style>
diff --git a/src/views/project/donatebaseinfo/EditCaseModal.vue b/src/views/project/donatebaseinfo/EditCaseModal.vue
index adf8394..f89c500 100644
--- a/src/views/project/donatebaseinfo/EditCaseModal.vue
+++ b/src/views/project/donatebaseinfo/EditCaseModal.vue
@@ -181,18 +181,12 @@
           <el-row :gutter="20">
             <el-col :span="8">
               <el-form-item label="鍏ラ櫌鏃堕棿" prop="Reporttothehospital">
-                <el-input
-                  v-model="formData.Reporttothehospital"
-                  placeholder="璇疯緭鍏ュ叆闄㈡椂闂�"
-                />
-
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="鍏ラ櫌绉戝" prop="treatmentdeptname">
-                <el-input
-                  v-model="formData.treatmentdeptname"
-                  placeholder="璇疯緭鍏ョ瀹�"
+                <el-date-picker
+                  v-model="formData.entryTime"
+                  type="datetime"
+                  placeholder="閫夋嫨鍏ラ櫌鏃堕棿"
+                  value-format="yyyy-MM-dd HH:mm:ss"
+                  style="width: 100%"
                 />
               </el-form-item>
             </el-col>
@@ -370,14 +364,7 @@
                 />
               </el-form-item>
             </el-col>
-            <el-col :span="8">
-              <el-form-item label="鍗忚皟鍛樼紪鍙�" prop="coordinatorNo">
-                <el-input
-                  v-model="formData.coordinatorNo"
-                  placeholder="璇疯緭鍏ュ崗璋冨憳缂栧彿"
-                />
-              </el-form-item>
-            </el-col>
+
             <el-col :span="8">
               <el-form-item label="鍗忚皟鍛樺鍚�" prop="coordinatorName">
                 <el-input
@@ -496,10 +483,10 @@
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="涓庢崘璧犺�呭叧绯�" prop="familyrelations">
+              <el-form-item label="涓庢崘鐚�呭叧绯�" prop="familyrelations">
                 <el-select
                   v-model="formData.familyrelations"
-                  placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+                  placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
                 >
                   <el-option
                     v-for="dict in dict.type.sys_FamilyRelation || []"
@@ -1013,19 +1000,21 @@
         // 璁剧疆鍦板潃淇℃伅
         if (data.residenceprovince) {
           this.residenceAddress = {
-            sheng: data.residenceprovincename,
-            shi: data.residencecityname,
-            qu: data.residencetownname
+            sheng: data.residenceprovince,
+            shi: data.residencecity,
+            qu: data.residencetown
           };
         }
 
         if (data.registerprovince) {
           this.registerAddress = {
-            sheng: data.registerprovincename,
-            shi: data.registercityname,
-            qu: data.registertownname
+            sheng: data.registerprovince,
+            shi: data.registercity,
+            qu: data.registertown
           };
         }
+      console.log(this.registerAddress,'registerAddress12');
+
 
         this.calculateAge(data.birthday);
       } catch (error) {
@@ -1137,6 +1126,8 @@
     },
 
     handleRegisterAddressChange(address) {
+      console.log(this.registerAddress,'registerAddress11');
+
       this.formData.registerprovince = address.sheng;
       this.formData.registercity = address.shi;
       this.formData.registertown = address.qu;
diff --git a/src/views/project/donatebaseinfo/index.vue b/src/views/project/donatebaseinfo/index.vue
index 6442bd2..63e3fca 100644
--- a/src/views/project/donatebaseinfo/index.vue
+++ b/src/views/project/donatebaseinfo/index.vue
@@ -101,6 +101,12 @@
         </template>
       </el-table-column>
       <el-table-column
+        label="浣忛櫌鍙�"
+        align="center"
+        prop="inpatientno"
+        width="200"
+      />
+      <el-table-column
         label="鎹愮尞杩涘害"
         align="center"
         prop="workflow"
@@ -129,12 +135,7 @@
           />
         </template>
       </el-table-column>
-      <el-table-column
-        label="妗堜緥缂栧彿"
-        align="center"
-        prop="caseNo"
-        width="200"
-      />
+
       <el-table-column label="鎬у埆" align="center" prop="sex" width="100">
         <template slot-scope="scope">
           <dict-tag
@@ -158,16 +159,12 @@
           }}
         </template>
       </el-table-column>
-<<<<<<< HEAD
-      <el-table-column label="GCS璇勫垎" align="center" prop="gcsScore" width="100"/>
-=======
       <el-table-column
-        label="涓婃姤鍖婚櫌"
+        label="GCS璇勫垎"
         align="center"
-        prop="treatmenthospitalname"
+        prop="gcsScore"
+        width="100"
       />
-      <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
@@ -176,20 +173,24 @@
           />
         </template>
       </el-table-column>
+
+      <el-table-column label="浼犳煋鐥�" align="center" prop="infectious">
+        <template slot-scope="scope">
+          <span v-for="item in scope.row.infectious.split(',')"
+            ><dict-tag :options="dict.type.sys_Infectious" :value="item" />
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鐤剧梾璇婃柇" align="center" prop="diagnosisname" />
       <el-table-column
-        label="鎶ュ憡鍖婚櫌"
+        label="鍗忚皟鍛�"
         align="center"
-        prop="treatmenthospitalname"
-      />
-      <el-table-column
-        label="鎶ュ憡浜�"
-        align="center"
-        prop="reportername"
+        prop="coordinatorName"
         width="100"
       />
       <el-table-column
         label="鎿嶄綔"
-        width="190"
+        width="220"
         align="center"
         class-name="small-padding fixed-width"
         fixed="right"
@@ -204,14 +205,29 @@
           >
             璇︽儏
           </el-button>
+
           <el-button
             size="mini"
             type="text"
             icon="el-icon-edit"
             @click="handleOpenEdit(scope.row)"
             v-hasPermi="['project:donatebaseinfo:edit']"
-            >缂栬緫</el-button
+            v-if="scope.row.recordstate !== '4'"
           >
+            缂栬緫
+          </el-button>
+
+          <!-- 鉁� 鏂板锛氬綊妗f寜閽� -->
+          <el-button
+            size="mini"
+            type="text"
+            style="color:#E6A23C;"
+            @click="handleArchive(scope.row)"
+            v-if="scope.row.recordstate !== '4'"
+          >
+            褰掓。
+          </el-button>
+
           <el-button
             size="mini"
             type="text"
@@ -223,6 +239,7 @@
           >
             缁堟
           </el-button>
+
           <el-button
             size="mini"
             type="text"
@@ -270,7 +287,8 @@
 import {
   listDonatebaseinfo,
   addDonatebaseinfo,
-  exportDonatebaseinfo
+  exportDonatebaseinfo,
+  updateDonatebaseinfo
 } from "@/api/project/donatebaseinfo";
 import Li_area_select from "@/components/Address";
 import OrgSelecter from "@/views/project/components/orgselect";
@@ -287,6 +305,7 @@
   dicts: [
     "sys_user_sex",
     "sys_BloodType",
+    "sys_Infectious",
     "sys_DonationCategory",
     "sys_donornode"
   ],
@@ -455,7 +474,52 @@
       this.currentRecord = { ...row };
       this.modalVisible = { ...this.modalVisible, restore: true };
     },
+    /** 褰掓。 */
+    handleArchive(row) {
+      this.$confirm("纭灏嗚妗堜緥褰掓。锛熷綊妗e悗灏嗕笉鍙紪杈戙��", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(async () => {
+          try {
+            const res = await updateDonatebaseinfo({
+              id: row.id,
+              recordstate: "4",
+              filingtime: this.getCurrentTime()
+            });
 
+            if (res.code === 200) {
+              this.$modal.msgSuccess("褰掓。鎴愬姛");
+              this.getList();
+            } else {
+              this.$modal.msgError(res.msg || "褰掓。澶辫触");
+            }
+          } catch (err) {
+            this.$modal.msgError("鎿嶄綔澶辫触");
+          }
+        })
+        .catch(() => {});
+    },
+    // 鑾峰彇褰撳墠鏃堕棿
+    getCurrentTime() {
+      const now = new Date();
+      return `${now.getFullYear()}-${(now.getMonth() + 1)
+        .toString()
+        .padStart(2, "0")}-${now
+        .getDate()
+        .toString()
+        .padStart(2, "0")} ${now
+        .getHours()
+        .toString()
+        .padStart(2, "0")}:${now
+        .getMinutes()
+        .toString()
+        .padStart(2, "0")}:${now
+        .getSeconds()
+        .toString()
+        .padStart(2, "0")}`;
+    },
     getTimeList() {
       if (!this.selecttime) {
         // this.queryParams.starttime = "1998-01-01 00:00:00";
@@ -541,12 +605,13 @@
         this.loading = false;
       }
     },
-    /** 鎵撳紑缂栬緫寮圭獥 */
     handleOpenEdit(row) {
-      // 纭繚鍦ㄦ墦寮�寮规鍓嶉噸缃甤urrentEditData
-      this.currentEditData = {};
+      if (row.recordstate === "4") {
+        this.$modal.msgWarning("褰掓。妗堜緥涓嶅彲缂栬緫");
+        return;
+      }
 
-      // 浣跨敤$nextTick纭繚DOM鏇存柊瀹屾垚
+      this.currentEditData = {};
       this.$nextTick(() => {
         this.currentEditData = { ...row };
         this.editModalVisible = true;
diff --git a/src/views/project/donatereview/index.vue b/src/views/project/donatereview/index.vue
index 9f06523..66c7017 100644
--- a/src/views/project/donatereview/index.vue
+++ b/src/views/project/donatereview/index.vue
@@ -629,10 +629,10 @@
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="涓庢崘璧犺�呭叧绯�" prop="familyrelations">
+            <el-form-item label="涓庢崘鐚�呭叧绯�" prop="familyrelations">
               <el-select
                 v-model="form.familyrelations"
-                placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+                placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
               >
                 <el-option
                   v-for="dict in dict.type.sys_FamilyRelation"
diff --git a/src/views/project/donationdetails/index.vue b/src/views/project/donationdetails/index.vue
index 6bc93cd..a16ee2b 100644
--- a/src/views/project/donationdetails/index.vue
+++ b/src/views/project/donationdetails/index.vue
@@ -664,10 +664,10 @@
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="涓庢崘璧犺�呭叧绯�" prop="familyrelations">
+              <el-form-item label="涓庢崘鐚�呭叧绯�" prop="familyrelations">
                 <el-select
                   v-model="form.familyrelations"
-                  placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+                  placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
                 >
                   <el-option
                     v-for="dict in dict.type.sys_FamilyRelation || []"
@@ -1023,7 +1023,7 @@
         >
           <el-row>
             <el-col :span="6">
-              <el-form-item label="鎹愯禒鑰呮皯鏃�" prop="nation">
+              <el-form-item label="鎹愮尞鑰呮皯鏃�" prop="nation">
                 <el-select
                   filterable
                   v-model="affirmform.nation"
@@ -1039,7 +1039,7 @@
               </el-form-item>
             </el-col>
             <el-col :span="6">
-              <el-form-item label="鎹愯禒鑰呭鍘�" prop="education">
+              <el-form-item label="鎹愮尞鑰呭鍘�" prop="education">
                 <el-select
                   v-model="affirmform.education"
                   placeholder="璇烽�夋嫨瀛﹀巻"
@@ -1054,7 +1054,7 @@
               </el-form-item>
             </el-col>
             <el-col :span="6">
-              <el-form-item label="鎹愯禒鑰呰亴涓�" prop="occupation">
+              <el-form-item label="鎹愮尞鑰呰亴涓�" prop="occupation">
                 <el-select
                   filterable
                   v-model="affirmform.occupation"
@@ -1079,12 +1079,12 @@
             <el-col :span="6">
               <el-form-item
                 align="left"
-                label="涓庢崘璧犺�呭叧绯�"
+                label="涓庢崘鐚�呭叧绯�"
                 prop="familyrelations"
               >
                 <el-select
                   v-model="affirmform.familyrelations"
-                  placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+                  placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
                 >
                   <el-option
                     v-for="dict in dict.type.sys_FamilyRelation || []"
diff --git a/src/views/project/externalperson/index.vue b/src/views/project/externalperson/index.vue
index dd83482..bfd71fe 100644
--- a/src/views/project/externalperson/index.vue
+++ b/src/views/project/externalperson/index.vue
@@ -460,12 +460,7 @@
             }
           }
         ],
-        bankcardno: [
-          { required: true, message: "璇疯緭鍏ラ摱琛岃处鍙�", trigger: "blur" }
-        ],
-        depositbank: [
-          { required: true, message: "璇疯緭鍏ュ紑鎴烽摱琛�", trigger: "blur" }
-        ]
+
       },
       //鏄惁鏄笓瀹惰垂鐨凮PO瀹℃壒浜哄憳
       ismanager: false
diff --git a/src/views/project/funddetail/index.vue b/src/views/project/funddetail/index.vue
index 5c18378..11dddc1 100644
--- a/src/views/project/funddetail/index.vue
+++ b/src/views/project/funddetail/index.vue
@@ -133,8 +133,8 @@
                 <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
               </el-select>
             </el-form-item></el-col>
-          <el-col :span="5"><el-form-item label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
-              <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愯禒鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
+          <el-col :span="5"><el-form-item label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
+              <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愮尞鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
             </el-form-item></el-col>
           <el-col :span="5"><el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
               <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" />
diff --git a/src/views/project/reimbursementpayee/index.vue b/src/views/project/reimbursementpayee/index.vue
index 9d5d82e..15f4301 100644
--- a/src/views/project/reimbursementpayee/index.vue
+++ b/src/views/project/reimbursementpayee/index.vue
@@ -69,10 +69,10 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
+      <el-form-item label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
         <el-input
           v-model="queryParams.familyrelations"
-          placeholder="璇疯緭鍏ヤ笌鎹愯禒鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
+          placeholder="璇疯緭鍏ヤ笌鎹愮尞鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
@@ -167,7 +167,7 @@
       <el-table-column label="鍗″彿" align="center" prop="bankcardno" />
       <el-table-column label="鐢宠閲戦" align="center" prop="amount" />
       <el-table-column label="鑱旂郴鐢佃瘽" align="center" prop="phone" />
-      <el-table-column label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" align="center" prop="familyrelations" />
+      <el-table-column label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" align="center" prop="familyrelations" />
       <el-table-column label="浠樻鏃ユ湡" align="center" prop="paiddate" width="180">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.paiddate, '{y}-{m}-{d}') }}</span>
@@ -199,7 +199,7 @@
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -237,8 +237,8 @@
         <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
           <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" />
         </el-form-item>
-        <el-form-item label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
-          <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愯禒鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
+        <el-form-item label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" prop="familyrelations">
+          <el-input v-model="form.familyrelations" placeholder="璇疯緭鍏ヤ笌鎹愮尞鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation" />
         </el-form-item>
         <el-form-item label="浠樻鏃ユ湡" prop="paiddate">
           <el-date-picker clearable size="small"
diff --git a/src/views/project/relativesconfirmation/index.vue b/src/views/project/relativesconfirmation/index.vue
index 16104e2..3fdc823 100644
--- a/src/views/project/relativesconfirmation/index.vue
+++ b/src/views/project/relativesconfirmation/index.vue
@@ -449,12 +449,12 @@
             <el-col :span="6">
               <el-form-item
                 align="left"
-                label="涓庢崘璧犺�呭叧绯�"
+                label="涓庢崘鐚�呭叧绯�"
                 prop="familyrelations"
               >
                 <el-select
                   v-model="form.familyrelations"
-                  placeholder="璇烽�夋嫨涓庢崘璧犺�呭叧绯�"
+                  placeholder="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
                 >
                   <el-option
                     v-for="dict in dict.type.sys_FamilyRelation"
diff --git a/src/views/project/travelexpensedeal/index.vue b/src/views/project/travelexpensedeal/index.vue
index 13bbf91..c68473b 100644
--- a/src/views/project/travelexpensedeal/index.vue
+++ b/src/views/project/travelexpensedeal/index.vue
@@ -227,7 +227,7 @@
     <!-- 娣诲姞鎴栦慨鏀硅垂鐢ㄧ敵璇锋槑缁嗗璇濇 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        
+
         <el-form-item label="鏀剁泭浜�" prop="beneficiaryname">
           <el-input
             v-model="form.beneficiaryname"
@@ -260,12 +260,12 @@
           </el-select>
         </el-form-item>
         <el-form-item
-          label="涓庢崘璧犺�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
+          label="涓庢崘鐚�呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
           prop="familyrelations"
         >
           <el-input
             v-model="form.familyrelations"
-            placeholder="璇疯緭鍏ヤ笌鎹愯禒鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
+            placeholder="璇疯緭鍏ヤ笌鎹愮尞鑰呭叧绯� 鏍规嵁瀛楀吀sys_FamilyRelation"
           />
         </el-form-item>
         <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
@@ -574,4 +574,4 @@
     },
   },
 };
-</script>
\ No newline at end of file
+</script>
diff --git a/vue.config.js b/vue.config.js
index 40c759e..cb37af7 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -1,13 +1,13 @@
-'use strict'
-const path = require('path')
+"use strict";
+const path = require("path");
 
 function resolve(dir) {
-  return path.join(__dirname, dir)
+  return path.join(__dirname, dir);
 }
 
-const name = process.env.VUE_APP_TITLE || '闈掗檮闄PO绠$悊骞冲彴' // 缃戦〉鏍囬
+const name = process.env.VUE_APP_TITLE || "闈掗檮闄PO绠$悊骞冲彴"; // 缃戦〉鏍囬
 
-const port = process.env.port || process.env.npm_config_port || 80 // 绔彛
+const port = process.env.port || process.env.npm_config_port || 80; // 绔彛
 
 // vue.config.js 閰嶇疆璇存槑
 //瀹樻柟vue.config.js 鍙傝�冩枃妗� https://cli.vuejs.org/zh/config/#css-loaderoptions
@@ -18,36 +18,37 @@
   // 渚嬪 https://www.ruoyi.vip/銆傚鏋滃簲鐢ㄨ閮ㄧ讲鍦ㄤ竴涓瓙璺緞涓婏紝浣犲氨闇�瑕佺敤杩欎釜閫夐」鎸囧畾杩欎釜瀛愯矾寰勩�備緥濡傦紝濡傛灉浣犵殑搴旂敤琚儴缃插湪 https://www.ruoyi.vip/admin/锛屽垯璁剧疆 baseUrl 涓� /admin/銆�
   publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
   // 鍦╪pm run build 鎴� yarn build 鏃� 锛岀敓鎴愭枃浠剁殑鐩綍鍚嶇О锛堣鍜宐aseUrl鐨勭敓浜х幆澧冭矾寰勪竴鑷达級锛堥粯璁ist锛�
-  outputDir: 'dist',
+  outputDir: "dist",
   // 鐢ㄤ簬鏀剧疆鐢熸垚鐨勯潤鎬佽祫婧� (js銆乧ss銆乮mg銆乫onts) 鐨勶紱锛堥」鐩墦鍖呬箣鍚庯紝闈欐�佽祫婧愪細鏀惧湪杩欎釜鏂囦欢澶逛笅锛�
-  assetsDir: 'static',
+  assetsDir: "static",
   // 鏄惁寮�鍚痚slint淇濆瓨妫�娴嬶紝鏈夋晥鍊硷細ture | false | 'error'
-  lintOnSave: process.env.NODE_ENV === 'development',
+  lintOnSave: process.env.NODE_ENV === "development",
   // 濡傛灉浣犱笉闇�瑕佺敓浜х幆澧冪殑 source map锛屽彲浠ュ皢鍏惰缃负 false 浠ュ姞閫熺敓浜х幆澧冩瀯寤恒��
   productionSourceMap: false,
   // webpack-dev-server 鐩稿叧閰嶇疆
   devServer: {
-    host: '0.0.0.0',
+    host: "0.0.0.0",
     port: port,
     open: true,
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target:`http://localhost:8080`,
+        target: `http://www.qdopo.com:9095`,
+        // target:`http://192.168.76.25:9095`,//鎵撳寘鍦板潃
         // target:`http://192.168.100.10:8080`,
         // target:`http://192.168.100.137:8080`,
         // target: `https://slb.hospitalstar.com:9093`,
         changeOrigin: true,
         pathRewrite: {
-          ['^' + process.env.VUE_APP_BASE_API]: ''
+          ["^" + process.env.VUE_APP_BASE_API]: ""
         }
       },
       //褰損df鍜屾暟鎹帴鍙d笉鍦ㄥ悓涓�涓姹傚湴鍧�涓嬫椂,涓簆df棰勮杩藉姞涓�涓唬鐞�
-      '/pdf': {
-        target: 'http://192.168.1.4/pdf/data',
+      "/pdf": {
+        target: "http://192.168.1.4/pdf/data",
         changOrigin: true,
         pathRewrite: {
-            '^/pdf': ''
+          "^/pdf": ""
         }
       }
     },
@@ -57,73 +58,70 @@
     name: name,
     resolve: {
       alias: {
-        '@': resolve('src')
-
+        "@": resolve("src")
       }
     }
   },
   chainWebpack(config) {
-    config.plugins.delete('preload') // TODO: need test
-    config.plugins.delete('prefetch') // TODO: need test
+    config.plugins.delete("preload"); // TODO: need test
+    config.plugins.delete("prefetch"); // TODO: need test
 
     // set svg-sprite-loader
     config.module
-      .rule('svg')
-      .exclude.add(resolve('src/assets/icons'))
-      .end()
+      .rule("svg")
+      .exclude.add(resolve("src/assets/icons"))
+      .end();
     config.module
-      .rule('icons')
+      .rule("icons")
       .test(/\.svg$/)
-      .include.add(resolve('src/assets/icons'))
+      .include.add(resolve("src/assets/icons"))
       .end()
-      .use('svg-sprite-loader')
-      .loader('svg-sprite-loader')
+      .use("svg-sprite-loader")
+      .loader("svg-sprite-loader")
       .options({
-        symbolId: 'icon-[name]'
+        symbolId: "icon-[name]"
       })
-      .end()
+      .end();
 
-    config
-      .when(process.env.NODE_ENV !== 'development',
-        config => {
-          config
-            .plugin('ScriptExtHtmlWebpackPlugin')
-            .after('html')
-            .use('script-ext-html-webpack-plugin', [{
-              // `runtime` must same as runtimeChunk name. default is `runtime`
-              inline: /runtime\..*\.js$/
-            }])
-            .end()
-          config
-            .optimization.splitChunks({
-              chunks: 'all',
-              cacheGroups: {
-                libs: {
-                  name: 'chunk-libs',
-                  test: /[\\/]node_modules[\\/]/,
-                  priority: 10,
-                  chunks: 'initial' // only package third parties that are initially dependent
-                },
-                elementUI: {
-                  name: 'chunk-elementUI', // split elementUI into a single package
-                  priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
-                  test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
-                },
-                commons: {
-                  name: 'chunk-commons',
-                  test: resolve('src/components'), // can customize your rules
-                  minChunks: 3, //  minimum common number
-                  priority: 5,
-                  reuseExistingChunk: true
-                }
-              }
-            })
-          config.optimization.runtimeChunk('single'),
+    config.when(process.env.NODE_ENV !== "development", config => {
+      config
+        .plugin("ScriptExtHtmlWebpackPlugin")
+        .after("html")
+        .use("script-ext-html-webpack-plugin", [
           {
-            from: path.resolve(__dirname, './public/robots.txt'), //闃茬埇铏枃浠�
-            to: './' //鍒版牴鐩綍涓�
+            // `runtime` must same as runtimeChunk name. default is `runtime`
+            inline: /runtime\..*\.js$/
+          }
+        ])
+        .end();
+      config.optimization.splitChunks({
+        chunks: "all",
+        cacheGroups: {
+          libs: {
+            name: "chunk-libs",
+            test: /[\\/]node_modules[\\/]/,
+            priority: 10,
+            chunks: "initial" // only package third parties that are initially dependent
+          },
+          elementUI: {
+            name: "chunk-elementUI", // split elementUI into a single package
+            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
+            test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
+          },
+          commons: {
+            name: "chunk-commons",
+            test: resolve("src/components"), // can customize your rules
+            minChunks: 3, //  minimum common number
+            priority: 5,
+            reuseExistingChunk: true
           }
         }
-      )
+      });
+      config.optimization.runtimeChunk("single"),
+        {
+          from: path.resolve(__dirname, "./public/robots.txt"), //闃茬埇铏枃浠�
+          to: "./" //鍒版牴鐩綍涓�
+        };
+    });
   }
-}
+};
diff --git "a/\347\256\241\347\220\206\347\253\257 \0502\051.zip" "b/\347\256\241\347\220\206\347\253\257 \0502\051.zip"
new file mode 100644
index 0000000..9da13ee
--- /dev/null
+++ "b/\347\256\241\347\220\206\347\253\257 \0502\051.zip"
Binary files differ
diff --git "a/\347\256\241\347\220\206\347\253\257 \0503\051.zip" "b/\347\256\241\347\220\206\347\253\257 \0503\051.zip"
new file mode 100644
index 0000000..75284fb
--- /dev/null
+++ "b/\347\256\241\347\220\206\347\253\257 \0503\051.zip"
Binary files differ
diff --git "a/\347\256\241\347\220\206\347\253\257.zip" "b/\347\256\241\347\220\206\347\253\257.zip"
new file mode 100644
index 0000000..22d1d2b
--- /dev/null
+++ "b/\347\256\241\347\220\206\347\253\257.zip"
Binary files differ

--
Gitblit v1.9.3