From c4599aa279fd2f90b741608392e056fbae2282d5 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期四, 20 八月 2026 17:16:54 +0800
Subject: [PATCH] 各表单布局调整

---
 vue.config.js                                                     |    6 
 src/views/business/transfer/TransportEdit.vue                     |  389 +-
 src/views/business/course/ccss.vue                                |  577 +++
 src/views/business/ethicalReview/ethicalReviewInfo.vue            |  198 
 src/views/business/course/components/DeathJudgmentStage.vue       |  330 -
 src/views/business/GetWitness/GetWitnessInfo.vue                  |  776 ++--
 src/views/business/OrganUtilization/OrganUtilizationInfo.vue      |  744 ++-
 src/views/business/decide/DecideInfo copy.vue                     |    2 
 src/components/assessInfoComponents/OrganAssessmentForm.vue       |   28 
 src/views/business/course/components/OrganProcurementStage.vue    | 1044 +----
 src/components/CaseBasicInfo/index.vue                            |    2 
 src/views/business/affirm/affirmInfo.vue                          |  145 
 src/views/business/maintain/maintainInfo.vue                      |   71 
 管理端8.20.zip                                                       |    0 
 src/views/business/followupVisit/info.vue                         |  372 +
 src/views/business/assess/assessInfo.vue                          |   93 
 src/views/business/course/components/MedicalAssessmentStage.vue   |   72 
 src/views/business/course/components/DonationConfirmStage.vue     |  674 +--
 src/views/business/course/components/OrganAllocationStage.vue     |  426 --
 src/views/business/decide/DecideInfo.vue                          |  315 +
 src/views/business/course/components/OrganUtilizationStage.vue    | 2050 +++--------
 src/views/business/course/components/DonorMaintenanceStage.vue    |  206 -
 src/views/business/course/index.vue                               |   17 
 src/views/business/course/components/EthicalReviewStage.vue       | 1193 ++++---
 src/views/business/allocation/allocationInfo.vue                  |  136 
 src/views/business/course/components/readonlyDescriptionsMixin.js |   36 
 26 files changed, 4,551 insertions(+), 5,351 deletions(-)

diff --git a/src/components/CaseBasicInfo/index.vue b/src/components/CaseBasicInfo/index.vue
index 1fa9b10..1e688ae 100644
--- a/src/components/CaseBasicInfo/index.vue
+++ b/src/components/CaseBasicInfo/index.vue
@@ -422,7 +422,7 @@
 
 <style scoped>
 .basic-info-card {
-  margin-bottom: 20px;
+  margin-bottom: 5px;
 }
 
 .clearfix::after {
diff --git a/src/components/assessInfoComponents/OrganAssessmentForm.vue b/src/components/assessInfoComponents/OrganAssessmentForm.vue
index bccb24d..aa91fb8 100644
--- a/src/components/assessInfoComponents/OrganAssessmentForm.vue
+++ b/src/components/assessInfoComponents/OrganAssessmentForm.vue
@@ -4,6 +4,7 @@
       <!-- 娣诲姞璇勪及鏃堕棿瀛楁 -->
       <el-form-item label="璇勪及鏃堕棿">
         <el-date-picker
+          v-if="!readonly"
           v-model="formData.assessmentTime"
           type="datetime"
           placeholder="閫夋嫨璇勪及鏃堕棿"
@@ -12,25 +13,29 @@
           :default-value="new Date()"
           style="width: 100%"
         />
+        <span v-else>{{ formData.assessmentTime || '-' }}</span>
       </el-form-item>
 
       <!-- 鍙妯″紡涓嬫樉绀鸿瘎浼版椂闂� -->
       <el-form-item label="鍔熻兘鐘舵��">
-        <el-select v-model="formData.functionStatus">
+        <el-select v-if="!readonly" v-model="formData.functionStatus">
           <el-option label="姝e父" value="1" />
           <el-option label="杞诲害寮傚父" value="2" />
           <el-option label="閲嶅害寮傚父" value="3" />
           <el-option label="鏃犳硶璇勪及" value="4" />
         </el-select>
+        <span v-else>{{ getFunctionStatusLabel(formData.functionStatus) }}</span>
       </el-form-item>
 
       <el-form-item label="璇勪及鎰忚">
         <el-input
+          v-if="!readonly"
           type="textarea"
           v-model="formData.assessmentOpinion"
           :rows="4"
           placeholder="璇疯緭鍏ヨ瘎浼版剰瑙�"
         />
+        <span v-else class="ro-text">{{ formData.assessmentOpinion || '-' }}</span>
       </el-form-item>
 
       <!-- 闄勪欢涓婁紶鍖哄煙 -->
@@ -44,8 +49,9 @@
             >
           </div>
 
-          <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
+          <!-- 浣跨敤 UploadAttachment 缁勪欢锛堝彧璇绘�侀殣钘忎笂浼犲叆鍙o紝浠呭睍绀哄凡涓婁紶闄勪欢锛� -->
           <UploadAttachment
+            v-if="!readonly"
             ref="uploadAttachment"
             :file-list="attachmentFileList"
             :limit="attachmentLimit"
@@ -366,6 +372,16 @@
 
       return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
     },
+    // 鍔熻兘鐘舵�� label 鏄犲皠锛堝彧璇绘�佸睍绀猴級
+    getFunctionStatusLabel(value) {
+      const map = {
+        "1": "姝e父",
+        "2": "杞诲害寮傚父",
+        "3": "閲嶅害寮傚父",
+        "4": "鏃犳硶璇勪及"
+      };
+      return map[value] || "-";
+    },
     // 淇濆瓨璇勪及
     handleSave() {
       // 楠岃瘉蹇呰瀛楁
@@ -664,6 +680,14 @@
   display: inline-block;
   min-width: 200px;
 }
+.ro-text {
+  display: inline-block;
+  color: #303133;
+  font-size: 14px;
+  line-height: 32px;
+  white-space: pre-wrap;
+  word-break: break-word;
+}
 ::v-deep .el-upload__tip {
   font-size: 12px;
   color: #909399;
diff --git a/src/views/business/GetWitness/GetWitnessInfo.vue b/src/views/business/GetWitness/GetWitnessInfo.vue
index d42c8bd..48c1e5e 100644
--- a/src/views/business/GetWitness/GetWitnessInfo.vue
+++ b/src/views/business/GetWitness/GetWitnessInfo.vue
@@ -1,129 +1,113 @@
 <template>
   <div class="organ-procurement-detail">
-    <case-basic-info :case-id="caseId" :show-attachment="true" />
+    <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
 
     <!-- 鍩烘湰淇℃伅 -->
-    <el-card class="detail-card">
+    <el-card class="detail-card paper-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">鍣ㄥ畼鑾峰彇鍩烘湰淇℃伅</span>
       </div>
 
-      <el-form :model="form" ref="form" :rules="rules" label-width="120px">
+      <el-form :model="form" ref="form" :rules="rules" label-width="120px" class="paper-form">
         <!-- 鎵嬫湳鐩稿叧淇℃伅 -->
         <el-divider content-position="left">鎵嬫湳淇℃伅</el-divider>
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="鎵嬫湳鍖荤敓" prop="operationdoctor">
-              <el-input v-model="form.operationdoctor" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鎵嬫湳寮�濮嬫椂闂�" prop="operationbegtime">
-              <el-date-picker
-                v-model="form.operationbegtime"
-                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="operationendtime">
-              <el-date-picker
-                v-model="form.operationendtime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="鎵嬫湳鍖荤敓" prop="operationdoctor" class="col-1-3">
+            <el-input v-model="form.operationdoctor" />
+          </el-form-item>
+          <el-form-item label="鎵嬫湳寮�濮嬫椂闂�" prop="operationbegtime" class="col-1-3">
+            <el-date-picker
+              v-model="form.operationbegtime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+          <el-form-item label="鎵嬫湳缁撴潫鏃堕棿" prop="operationendtime" class="col-1-3">
+            <el-date-picker
+              v-model="form.operationendtime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item
-              label="鑵逛富鍔ㄨ剦鎻掔鏃堕棿"
-              prop="abdominalaortacannulatime"
-            >
-              <el-date-picker
-                v-model="form.abdominalaortacannulatime"
-                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="abdominalaortaperfusiontime"
-            >
-              <el-date-picker
-                v-model="form.abdominalaortaperfusiontime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item
+            label="鑵逛富鍔ㄨ剦鎻掔鏃堕棿"
+            prop="abdominalaortacannulatime"
+            class="col-1-3"
+          >
+            <el-date-picker
+              v-model="form.abdominalaortacannulatime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+          <el-form-item
+            label="鑵逛富鍔ㄨ剦鐏屾敞鏃堕棿"
+            prop="abdominalaortaperfusiontime"
+            class="col-1-3"
+          >
+            <el-date-picker
+              v-model="form.abdominalaortaperfusiontime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="闂ㄩ潤鑴夋彃绠℃椂闂�" prop="portalveincannulatime">
-              <el-date-picker
-                v-model="form.portalveincannulatime"
-                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="portalveinperfusiontime">
-              <el-date-picker
-                v-model="form.portalveinperfusiontime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="闂ㄩ潤鑴夋彃绠℃椂闂�" prop="portalveincannulatime" class="col-1-3">
+            <el-date-picker
+              v-model="form.portalveincannulatime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+          <el-form-item label="闂ㄩ潤鑴夌亴娉ㄦ椂闂�" prop="portalveinperfusiontime" class="col-1-3">
+            <el-date-picker
+              v-model="form.portalveinperfusiontime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+        </div>
 
         <!-- 鍗忚皟鍛樹俊鎭� -->
         <el-divider content-position="left">鍗忚皟鍛樹俊鎭�</el-divider>
 
-        <el-row :gutter="20">
+        <div class="form-row">
           <!-- <el-col :span="8">
             <el-form-item label="鍗忚皟鍛樺鍚�" prop="coordinatorName">
               <el-input v-model="form.coordinatorName" />
             </el-form-item>
           </el-col> -->
-          <el-col :span="8">
-            <el-form-item label="杩涙墜鏈鏃堕棿" prop="coordinatorInOperating">
-              <el-date-picker
-                v-model="form.coordinatorInOperating"
-                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="coordinatorOutOperating">
-              <el-date-picker
-                v-model="form.coordinatorOutOperating"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+          <el-form-item label="杩涙墜鏈鏃堕棿" prop="coordinatorInOperating" class="col-1-3">
+            <el-date-picker
+              v-model="form.coordinatorInOperating"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+          <el-form-item label="鍑烘墜鏈鏃堕棿" prop="coordinatorOutOperating" class="col-1-3">
+            <el-date-picker
+              v-model="form.coordinatorOutOperating"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
+        <div class="form-row">
           <!-- <el-col :span="8">
             <el-form-item label="鍗忚皟鍛樼瀛�" prop="coordinatorSign">
               <el-input v-model="form.coordinatorSign" />
@@ -139,57 +123,45 @@
               />
             </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>
+          <el-form-item label="鏄惁榛樺搥缂呮��" prop="isspendremember" class="col-1-3">
+            <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-form-item label="鎭㈠閬椾綋浠" prop="isrestoreremains" class="col-1-3">
+            <el-select v-model="form.isrestoreremains" style="width: 100%">
+              <el-option label="鏄�" :value="1" />
+              <el-option label="鍚�" :value="0" />
+            </el-select>
+          </el-form-item>
+        </div>
 
         <!-- 璐熻矗浜轰俊鎭� -->
         <el-divider content-position="left">璐熻矗浜轰俊鎭�</el-divider>
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="璐熻矗浜哄鍚�" prop="responsibleusername">
-              <el-input v-model="form.responsibleusername" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <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-input v-model="form.coordinatedusernamet" />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="璐熻矗浜哄鍚�" prop="responsibleusername" class="col-1-3">
+            <el-input v-model="form.responsibleusername" />
+          </el-form-item>
+          <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo" class="col-1-3">
+            <el-input v-model="form.coordinatedusernameo" />
+          </el-form-item>
+          <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet" class="col-1-3">
+            <el-input v-model="form.coordinatedusernamet" />
+          </el-form-item>
+        </div>
 
         <!-- 鑾峰彇鏈烘瀯淇℃伅 -->
         <el-divider content-position="left">鑾峰彇鏈烘瀯淇℃伅</el-divider>
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="鑾峰彇鏈烘瀯鍚嶇О" prop="gainhospitalname">
-              <el-input
-                v-model="form.gainhospitalname"
-                placeholder="璇疯緭鍏ヨ幏鍙栨満鏋勫悕绉�"
-              />
-            </el-form-item>
-          </el-col>
+        <div class="form-row">
+          <el-form-item label="鑾峰彇鏈烘瀯鍚嶇О" prop="gainhospitalname" class="col-1-3">
+            <el-input
+              v-model="form.gainhospitalname"
+              placeholder="璇疯緭鍏ヨ幏鍙栨満鏋勫悕绉�"
+            />
+          </el-form-item>
           <!-- <el-col :span="8">
             <el-form-item label="鎹愮尞缂栧彿" prop="gainhospitalno">
               <el-input
@@ -198,7 +170,7 @@
               />
             </el-form-item>
           </el-col> -->
-        </el-row>
+        </div>
       </el-form>
     </el-card>
 
@@ -425,42 +397,30 @@
         <span class="detail-title">鐩稿叧闄勪欢</span>
       </div>
 
-      <!-- 涓婁紶鍖哄煙锛堟棤鍒嗙被閫夋嫨锛岀敱Tab鎺у埗锛� -->
-      <div class="upload-wrapper">
-        <UploadAttachment
-          ref="uploadAttachment"
-          :file-list="attachmentFileList"
-          :limit="attachmentLimit"
-          :accept="attachmentAccept"
-          :multiple="true"
-          @change="handleAttachmentChange"
-          @upload-success="handleUploadSuccess"
-          @upload-error="handleUploadError"
-          @remove="handleAttachmentRemove"
-        />
-        <div style="font-size:12px; color:#909399; margin-top:4px;">
-          褰撳墠涓婁紶鍒嗙被锛�<el-tag size="small" type="info">{{
-            activeTab === "鏈垎绫�" ? "鏈垎绫�" : activeTab
-          }}</el-tag>
-          锛堝垏鎹� Tab 鍙敼鍙樹笂浼犲垎绫伙級
-        </div>
-      </div>
-
       <!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず锛屾敮鎸佷慨鏀瑰垎绫� -->
-      <div class="attachment-list" v-if="attachments && attachments.length > 0">
-        <el-tabs v-model="activeTab" type="border-card">
-          <el-tab-pane
-            v-for="category in categories"
-            :key="category"
-            :label="category + '(' + getCategoryCount(category) + ')'"
-            :name="category"
-          >
-            <el-table
-              :data="getCategoryFiles(category)"
-              style="width: 100%"
-              size="small"
-              border
+      <el-tabs v-model="activeTab" type="border-card">
+        <el-tab-pane
+          v-for="category in categories"
+          :key="category"
+          :label="category + '(' + getCategoryCount(category) + ')'"
+          :name="category"
+        >
+          <div style="margin-bottom: 10px; text-align: right;">
+            <el-button
+              size="mini"
+              type="primary"
+              icon="el-icon-plus"
+              @click="openUploadDialog(category)"
             >
+              娣诲姞闄勪欢
+            </el-button>
+          </div>
+          <el-table
+            :data="getCategoryFiles(category)"
+            style="width: 100%"
+            size="small"
+            border
+          >
               <el-table-column label="鏂囦欢鍚�" min-width="180">
                 <template #default="scope">
                   <i
@@ -521,15 +481,15 @@
                   >
                 </template>
               </el-table-column>
-            </el-table>
-          </el-tab-pane>
-        </el-tabs>
-      </div>
-
-      <!-- 鏃犻檮浠舵椂鏄剧ず -->
-      <div v-else style="text-align:center; padding:20px; color:#909399;">
-        鏆傛棤闄勪欢锛岃涓婁紶
-      </div>
+          </el-table>
+          <div
+            v-if="getCategoryFiles(category).length === 0"
+            style="text-align:center; padding:20px; color:#909399;"
+          >
+            鏆傛棤闄勪欢
+          </div>
+        </el-tab-pane>
+      </el-tabs>
     </el-card>
     <div style="text-align: center; margin: 30px 0;">
       <el-button type="primary" @click="handleSave" :loading="saveLoading">
@@ -631,45 +591,68 @@
       </div>
     </el-dialog>
 
-    <!-- 鏂囦欢棰勮寮圭獥 -->
+    <!-- 涓婁紶瀵硅瘽妗� -->
     <el-dialog
-      :title="filePreviewTitle"
-      :visible.sync="filePreviewVisible"
-      width="800px"
-      @close="filePreviewVisible = false"
+      :title="`涓婁紶${currentUploadCategory}闄勪欢`"
+      :visible.sync="uploadDialogVisible"
+      width="480px"
+      :close-on-click-modal="false"
     >
-      <div v-if="currentPreviewFile">
-        <div v-if="currentPreviewFile.fileType === 'image'">
-          <img
-            :src="currentPreviewFile.fileUrl"
-            style="max-width: 100%; max-height: 500px;"
-          />
+      <el-upload
+        ref="uploadRef"
+        class="upload-demo"
+        drag
+        :action="uploadAction"
+        :headers="headers"
+        multiple
+        :file-list="tempFileList"
+        :before-upload="beforeUpload"
+        :on-change="handleFileChange"
+        :on-remove="handleTempRemove"
+        :on-success="handleUploadSuccess"
+        :auto-upload="false"
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        <div class="el-upload__tip" slot="tip">
+          鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
         </div>
-        <div v-else-if="currentPreviewFile.fileType === 'pdf'">
-          <iframe
-            :src="currentPreviewFile.fileUrl"
-            width="100%"
-            height="500px"
-          ></iframe>
-        </div>
-        <div v-else>
-          <p>涓嶆敮鎸侀瑙堟鏂囦欢绫诲瀷锛岃涓嬭浇鏌ョ湅</p>
-        </div>
-      </div>
+      </el-upload>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="uploadDialogVisible = false">鍙栨秷</el-button>
+        <el-button
+          type="primary"
+          @click="submitUpload"
+          :loading="uploadLoading"
+          :disabled="tempFileList.length === 0"
+        >
+          纭涓婁紶
+        </el-button>
+      </span>
     </el-dialog>
+
+    <!-- 鏂囦欢棰勮寮圭獥 -->
+    <FilePreviewDialog
+      :visible="previewVisible"
+      :file="currentPreviewFile"
+      @close="previewVisible = false"
+      @download="handleDownload"
+    />
   </div>
 </template>
 
 <script>
 import { witnessList, witnessadd, witnessedit } from "@/api/businessApi";
-import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
 import CaseBasicInfo from "@/components/CaseBasicInfo";
+import { getToken } from "@/utils/auth";
 import dayjs from "dayjs";
 
 export default {
   name: "OrganProcurementDetail",
   components: {
-    UploadAttachment,
+    FilePreviewDialog,
     CaseBasicInfo
   },
   dicts: [
@@ -779,19 +762,22 @@
       },
       // 闄勪欢鏁版嵁
       attachments: [],
-      attachmentFileList: [],
-      // 闄勪欢鐩稿叧閰嶇疆
-      attachmentLimit: 10,
-      attachmentAccept:
-        ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt",
+      // 涓婁紶鐩稿叧
+      uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+      headers: {
+        Authorization: "Bearer " + getToken()
+      },
+      uploadDialogVisible: false,
+      uploadLoading: false,
+      tempFileList: [],
+      currentUploadCategory: "",
       // 缂栬緫瀵硅瘽妗�
       editDialogVisible: false,
       currentRecord: {},
       currentEditIndex: -1,
       // 鏂囦欢棰勮鐩稿叧
-      filePreviewVisible: false,
-      currentPreviewFile: null,
-      filePreviewTitle: ""
+      previewVisible: false,
+      currentPreviewFile: null
     };
   },
   computed: {
@@ -847,22 +833,6 @@
     // 鑾峰彇鍣ㄥ畼瀛楀吀
     organDict() {
       return this.dict.type.sys_Organ || [];
-    }
-  },
-  watch: {
-    // 鐩戝惉闄勪欢鏁版嵁鍙樺寲
-    attachments: {
-      handler(newAttachments) {
-        this.attachmentFileList = newAttachments.map(item => ({
-          uid: item.id || Math.random(),
-          name: item.fileName,
-          fileSize: item.fileSize,
-          url: item.path || item.fileUrl,
-          uploadTime: item.uploadTime,
-          status: "success"
-        }));
-      },
-      deep: true
     }
   },
   created() {
@@ -934,19 +904,8 @@
               fileType: item.fileType || "" // 榛樿绌哄瓧绗︿覆琛ㄧず鏈垎绫�
             }));
             this.form.attachments = this.attachments;
-            // 鍚屾 attachmentFileList
-            this.attachmentFileList = this.attachments.map(item => ({
-              uid: item.id || Math.random(),
-              name: item.fileName,
-              url: item.path || item.fileUrl,
-              fileSize: item.fileSize,
-              uploadTime: item.uploadTime,
-              status: "success",
-              raw: item
-            }));
           } else {
             this.attachments = [];
-            this.attachmentFileList = [];
           }
 
           // 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
@@ -1382,133 +1341,157 @@
       this.handleConfirmProcurement();
     },
 
-    // 闄勪欢鐩稿叧鏂规硶
-    /** 闄勪欢鍙樺寲澶勭悊 */
-    handleAttachmentChange(fileList) {
-      this.attachmentFileList = fileList;
+    // ===== 闄勪欢鐩稿叧鏂规硶 =====
+    // 鎵撳紑涓婁紶瀵硅瘽妗�
+    openUploadDialog(category) {
+      this.currentUploadCategory = category;
+      this.tempFileList = [];
+      this.uploadDialogVisible = true;
+      this.$nextTick(() => {
+        if (this.$refs.uploadRef) {
+          this.$refs.uploadRef.clearFiles();
+        }
+      });
     },
 
-    /** 闄勪欢绉婚櫎澶勭悊 */
-   handleAttachmentRemove(file) {
-  // 鐩存帴璋冪敤鏂扮殑鍒犻櫎鏂规硶
-  if (file.raw) {
-    this.handleRemoveAttachmentByFile(file.raw);
-  } else if (file.url) {
-    const target = this.attachments.find(
-      item => item.path === file.url || item.fileUrl === file.url
-    );
-    if (target) {
-      this.handleRemoveAttachmentByFile(target);
-    }
-  }
-},
-
-    /** 涓婁紶鎴愬姛澶勭悊 */
-    handleUploadSuccess({ file, fileList, response }) {
-  if (response.code === 200) {
-    // 鏍规嵁褰撳墠婵�娲荤殑 Tab 鍐冲畾鍒嗙被锛堟湭鍒嗙被 Tab 瀵瑰簲绌哄瓧绗︿覆锛�
-    const category = this.activeTab === '鏈垎绫�' ? '' : this.activeTab;
-    const attachmentObj = {
-      fileName: file.name,
-      path: response.fileUrl || file.url,
-      fileUrl: response.fileUrl || file.url,
-      fileType: category,                    // 鍏抽敭锛氳褰曞垎绫�
-      fileSize: file.size,
-      uploadTime: dayjs().format('YYYY-MM-DD HH:mm:ss')
-    };
-
-    if (!Array.isArray(this.attachments)) {
-      this.attachments = [];
-    }
-    this.attachments.push(attachmentObj);
-    this.attachmentFileList = fileList;
-    this.$message.success('鏂囦欢涓婁紶鎴愬姛');
-  }
-},
-// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
-getCategoryCount(category) {
-  return this.attachments.filter(item => {
-    const type = item.fileType || '';
-    if (category === '鏈垎绫�') {
-      return !this.presetCategories.includes(type);
-    }
-    return type === category;
-  }).length;
-},
-
-// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鍒楄〃
-getCategoryFiles(category) {
-  return this.attachments.filter(item => {
-    const type = item.fileType || '';
-    if (category === '鏈垎绫�') {
-      return !this.presetCategories.includes(type);
-    }
-    return type === category;
-  });
-},
-
-// 鏇存柊闄勪欢鍒嗙被锛堜笅鎷変慨鏀规椂瑙﹀彂锛�
-updateAttachmentCategory(row, newVal) {
-  const target = this.attachments.find(item => item === row);
-  if (target) {
-    target.fileType = newVal; // 鍙兘涓虹┖瀛楃涓�
-    // 鍚屾鏇存柊 attachmentFileList
-    const fileItem = this.attachmentFileList.find(
-      f => f.raw === row || f.url === row.fileUrl
-    );
-    if (fileItem) {
-      fileItem.raw.fileType = newVal;
-      fileItem.fileType = newVal || '鏈垎绫�';
-    }
-    // 濡傛灉褰撳墠婵�娲荤殑tab娌℃湁鏂囦欢浜嗭紝鑷姩鍒囨崲鍒扮涓�涓湁鏂囦欢鐨則ab
-    const currentTabHasFiles = this.getCategoryFiles(this.activeTab).length > 0;
-    if (!currentTabHasFiles) {
-      const firstCategory = this.categories[0];
-      if (firstCategory) this.activeTab = firstCategory;
-    }
-  }
-},
-
-// 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
-handleRemoveAttachmentByFile(file) {
-  const index = this.attachments.findIndex(item => item === file);
-  if (index > -1) {
-    this.attachments.splice(index, 1);
-    // 鍚屾鍒犻櫎 attachmentFileList
-    const fileIndex = this.attachmentFileList.findIndex(
-      f => f.raw === file || f.url === file.fileUrl
-    );
-    if (fileIndex > -1) {
-      this.attachmentFileList.splice(fileIndex, 1);
-    }
-    this.$message.success('闄勪欢鍒犻櫎鎴愬姛');
-  }
-},
-    /** 涓婁紶閿欒澶勭悊 */
-    handleUploadError({ file, fileList, error }) {
-      console.error("闄勪欢涓婁紶澶辫触:", error);
-      this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+    // 涓婁紶鍓嶆牎楠�
+    beforeUpload(file) {
+      const allowedTypes = [
+        "application/pdf",
+        "image/jpeg",
+        "image/png",
+        "application/msword",
+        "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+      ];
+      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");
+      if (!isTypeOk) {
+        this.$message.error("鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢");
+        return false;
+      }
+      if (file.size > maxSize) {
+        this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
+        return false;
+      }
+      return true;
     },
 
-    /** 鎵嬪姩鍒犻櫎闄勪欢 */
-    handleRemoveAttachment(index) {
-      this.attachments.splice(index, 1);
-      this.attachmentFileList.splice(index, 1);
-      this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+    // 鏂囦欢閫夋嫨鍙樺寲
+    handleFileChange(file, fileList) {
+      this.tempFileList = fileList;
     },
 
-    /** 鏂囦欢棰勮 */
+    // 涓存椂绉婚櫎
+    handleTempRemove(file, fileList) {
+      this.tempFileList = fileList;
+    },
+
+    // 涓婁紶鎴愬姛澶勭悊
+    handleUploadSuccess(response, file, fileList) {
+      if (response.code !== 200) {
+        this.$message.error(response.msg || "涓婁紶澶辫触");
+        return;
+      }
+      // 鏈垎绫诲搴旂┖瀛楃涓诧紝涓庡睍绀�/淇濆瓨閫昏緫涓�鑷�
+      const category = this.currentUploadCategory === "鏈垎绫�" ? "" : this.currentUploadCategory;
+      const attachmentObj = {
+        fileName: file.name,
+        path: response.fileUrl || response.url || response.data || file.url,
+        fileUrl: response.fileUrl || response.url || response.data || file.url,
+        fileType: category,
+        fileSize: file.size,
+        uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+      };
+      if (!Array.isArray(this.attachments)) {
+        this.attachments = [];
+      }
+      this.attachments.push(attachmentObj);
+      this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+      this.uploadLoading = false;
+      this.uploadDialogVisible = false;
+      this.tempFileList = [];
+    },
+
+    // 鎻愪氦涓婁紶
+    submitUpload() {
+      if (this.tempFileList.length === 0) {
+        this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
+        return;
+      }
+      this.uploadLoading = true;
+      this.$refs.uploadRef.submit();
+    },
+
+    // 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
+    getCategoryCount(category) {
+      return this.attachments.filter(item => {
+        const type = item.fileType || "";
+        if (category === "鏈垎绫�") {
+          return !this.presetCategories.includes(type);
+        }
+        return type === category;
+      }).length;
+    },
+
+    // 鑾峰彇鏌愬垎绫荤殑鏂囦欢鍒楄〃
+    getCategoryFiles(category) {
+      return this.attachments.filter(item => {
+        const type = item.fileType || "";
+        if (category === "鏈垎绫�") {
+          return !this.presetCategories.includes(type);
+        }
+        return type === category;
+      });
+    },
+
+    // 鏇存柊闄勪欢鍒嗙被锛堜笅鎷変慨鏀规椂瑙﹀彂锛�
+    updateAttachmentCategory(row, newVal) {
+      const target = this.attachments.find(item => item === row);
+      if (target) {
+        target.fileType = newVal;
+        const currentTabHasFiles = this.getCategoryFiles(this.activeTab).length > 0;
+        if (!currentTabHasFiles) {
+          const firstCategory = this.categories[0];
+          if (firstCategory) this.activeTab = firstCategory;
+        }
+      }
+    },
+
+    // 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
+    handleRemoveAttachmentByFile(file) {
+      this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(() => {
+          const index = this.attachments.findIndex(item => item === file);
+          if (index > -1) {
+            this.attachments.splice(index, 1);
+            this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+          }
+        })
+        .catch(() => {});
+    },
+
+    // 鏂囦欢棰勮
     handlePreview(file) {
       this.currentPreviewFile = {
         fileName: file.fileName,
         fileUrl: file.path || file.fileUrl,
         fileType: this.getFileType(file.fileName)
       };
-      this.filePreviewTitle = file.fileName;
-      this.filePreviewVisible = true;
+      this.previewVisible = true;
     },
 
-    /** 鏂囦欢涓嬭浇 */
+    // 鏂囦欢涓嬭浇
     handleDownload(file) {
       const fileUrl = file.path || file.fileUrl;
       const fileName = file.fileName;
@@ -1767,4 +1750,73 @@
     margin-bottom: 10px;
   }
 }
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+  padding: 16px;
+}
+
+.paper-form {
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+.paper-form >>> .form-row {
+  display: flex;
+  width: 100%;
+  border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+  display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #ecf5ff;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
 </style>
diff --git a/src/views/business/OrganUtilization/OrganUtilizationInfo.vue b/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
index 839a358..6e2cff4 100644
--- a/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
+++ b/src/views/business/OrganUtilization/OrganUtilizationInfo.vue
@@ -1,49 +1,41 @@
 <template>
   <div class="organ-utilization-detail">
-    <case-basic-info :case-id="caseId" :show-attachment="true" />
-    <el-form :model="form" ref="form" :rules="rules" label-width="120px">
+    <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
+    <el-form :model="form" ref="form" :rules="rules" label-width="120px" class="paper-form">
       <!-- 鍩烘湰淇℃伅 -->
-      <el-card class="detail-card">
+      <el-card class="detail-card paper-card">
         <div slot="header" class="clearfix">
           <span class="detail-title">鍣ㄥ畼鍒╃敤鍩烘湰淇℃伅</span>
         </div>
 
-        <el-row :gutter="20">
-          <el-col :span="6">
-            <el-form-item label="璐熻矗浜�" prop="responsibleusername">
-              <el-input
-                v-model="form.responsibleusername"
-                placeholder="璇疯緭鍏ヨ礋璐d汉濮撳悕"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo">
-              <el-input
-                v-model="form.coordinatedusernameo"
-                placeholder="璇疯緭鍏ュ崗璋冨憳涓�濮撳悕"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet">
-              <el-input
-                v-model="form.coordinatedusernamet"
-                placeholder="璇疯緭鍏ュ崗璋冨憳浜屽鍚�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="瀹屾垚鏃堕棿" prop="completetime">
-              <el-date-picker
-                v-model="form.completetime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="璐熻矗浜�" prop="responsibleusername" class="col-1-3">
+            <el-input
+              v-model="form.responsibleusername"
+              placeholder="璇疯緭鍏ヨ礋璐d汉濮撳悕"
+            />
+          </el-form-item>
+          <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo" class="col-1-3">
+            <el-input
+              v-model="form.coordinatedusernameo"
+              placeholder="璇疯緭鍏ュ崗璋冨憳涓�濮撳悕"
+            />
+          </el-form-item>
+          <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet" class="col-1-3">
+            <el-input
+              v-model="form.coordinatedusernamet"
+              placeholder="璇疯緭鍏ュ崗璋冨憳浜屽鍚�"
+            />
+          </el-form-item>
+          <el-form-item label="瀹屾垚鏃堕棿" prop="completetime" class="col-1-3">
+            <el-date-picker
+              v-model="form.completetime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+        </div>
 
         <!-- <el-row :gutter="20">
           <el-col :span="12">
@@ -63,48 +55,42 @@
           </el-col>
         </el-row> -->
       </el-card>
-      <el-card class="detail-card">
+      <el-card class="detail-card paper-card">
         <div slot="header" class="clearfix">
           <span class="detail-title">閬椾綋鎹愮尞淇℃伅</span>
         </div>
-        <el-row :gutter="20">
-          <el-col :span="6">
-            <el-form-item align="left" label="閬椾綋鎺ユ敹" prop="isbodydonation">
-              <el-radio-group v-model="form.isbodydonation">
-                <el-radio
-                  v-for="dict in dict.type.sys_0_1 || []"
-                  :key="dict.value"
-                  :label="dict.value"
-                  >{{ dict.label }}</el-radio
-                >
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="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="璇烽�夋嫨涓庢崘鐚�呭叧绯�"
+        <div class="form-row">
+          <el-form-item align="left" label="閬椾綋鎺ユ敹" prop="isbodydonation" class="col-1-3">
+            <el-radio-group v-model="form.isbodydonation">
+              <el-radio
+                v-for="dict in dict.type.sys_0_1 || []"
+                :key="dict.value"
+                :label="dict.value"
+                >{{ dict.label }}</el-radio
               >
-                <el-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>
+            </el-radio-group>
+          </el-form-item>
+
+          <el-form-item align="left" label="鎺ユ敹瀹跺睘" prop="relationname" class="col-1-3">
+            <el-input
+              v-model="form.relationname"
+              placeholder="璇疯緭鍏ユ帴鏀跺灞�"
+            />
+          </el-form-item>
+          <el-form-item label="涓庢崘鐚�呭叧绯�" prop="signfamilyrelations" class="col-1-3">
+            <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>
+        </div>
       </el-card>
     </el-form>
     <!-- 鍣ㄥ畼鍒╃敤璁板綍閮ㄥ垎 - 鏁村悎鍙楄�呰鎯� -->
@@ -164,14 +150,14 @@
                       <div class="recipient-header">
                         <span class="recipient-title">鍙楄�呰缁嗕俊鎭�</span>
                         <el-tag
-                          v-if="scope.row.transplantstate === '1'"
+                          v-if="scope.row.transplantstate == '1'"
                           type="success"
                           size="small"
                         >
                           宸茬Щ妞�
                         </el-tag>
                         <el-tag
-                          v-else-if="scope.row.transplantstate === '0'"
+                          v-else-if="scope.row.transplantstate == '0'"
                           type="warning"
                           size="small"
                         >
@@ -297,7 +283,7 @@
                         <!-- 绉绘淇℃伅閮ㄥ垎 -->
                         <div
                           class="form-section"
-                          v-if="scope.row.transplantstate === '1'"
+                          v-if="scope.row.transplantstate == '1'"
                         >
                           <h4 class="section-title">绉绘淇℃伅</h4>
                           <el-row :gutter="20">
@@ -326,7 +312,7 @@
                         <!-- 鏈Щ妞嶅師鍥� -->
                         <div
                           class="form-section"
-                          v-if="scope.row.transplantstate === '0'"
+                          v-if="scope.row.transplantstate == '0'"
                         >
                           <h4 class="section-title">鏈Щ妞嶄俊鎭�</h4>
                           <el-row :gutter="20">
@@ -473,110 +459,98 @@
         <span class="detail-title">鐩稿叧闄勪欢</span>
       </div>
 
-      <!-- 涓婁紶鍖哄煙锛堟棤鍒嗙被閫夋嫨锛岀敱Tab鎺у埗锛� -->
-      <div class="upload-wrapper">
-        <UploadAttachment
-          ref="uploadAttachment"
-          :file-list="attachmentFileList"
-          :limit="attachmentLimit"
-          :accept="attachmentAccept"
-          :multiple="true"
-          @change="handleAttachmentChange"
-          @upload-success="handleUploadSuccess"
-          @upload-error="handleUploadError"
-          @remove="handleAttachmentRemove"
-        />
-        <div style="font-size:12px; color:#909399; margin-top:4px;">
-          褰撳墠涓婁紶鍒嗙被锛�<el-tag size="small" type="info">{{
-            activeTab === "鏈垎绫�" ? "鏈垎绫�" : activeTab
-          }}</el-tag>
-          锛堝垏鎹� Tab 鍙敼鍙樹笂浼犲垎绫伙級
-        </div>
-      </div>
-
       <!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず锛屾敮鎸佷慨鏀瑰垎绫� -->
-      <div class="attachment-list" v-if="attachments && attachments.length > 0">
-        <el-tabs v-model="activeTab" type="border-card">
-          <el-tab-pane
-            v-for="category in categories"
-            :key="category"
-            :label="category + '(' + getCategoryCount(category) + ')'"
-            :name="category"
-          >
-            <el-table
-              :data="getCategoryFiles(category)"
-              style="width: 100%"
-              size="small"
-              border
+      <el-tabs v-model="activeTab" type="border-card">
+        <el-tab-pane
+          v-for="category in categories"
+          :key="category"
+          :label="category + '(' + getCategoryCount(category) + ')'"
+          :name="category"
+        >
+          <div style="margin-bottom: 10px; text-align: right;">
+            <el-button
+              size="mini"
+              type="primary"
+              icon="el-icon-plus"
+              @click="openUploadDialog(category)"
             >
-              <el-table-column label="鏂囦欢鍚�" min-width="180">
-                <template #default="scope">
-                  <i
-                    class="el-icon-document"
-                    style="margin-right: 8px; color: #409EFF;"
-                  ></i>
-                  <span class="file-name">{{ scope.row.fileName }}</span>
-                </template>
-              </el-table-column>
-              <!-- 鍙紪杈戝垎绫讳笅鎷� -->
-              <el-table-column label="鍒嗙被" width="150">
-                <template #default="scope">
-                  <el-select
-                    v-model="scope.row.fileType"
-                    size="small"
-                    @change="updateAttachmentCategory(scope.row, $event)"
-                    placeholder="閫夋嫨鍒嗙被"
-                  >
-                    <el-option label="鍘熻〃鎷嶇収" value="鍘熻〃鎷嶇収" />
-                    <el-option label="鎺ュ彈纭涔�" value="鎺ュ彈纭涔�" />
-                    <el-option label="寮冪敤璇存槑" value="寮冪敤璇存槑" />
-                    <el-option label="鎹愮尞璇佷功鐓х墖" value="鎹愮尞璇佷功鐓х墖" />
-                    <el-option label="鏈垎绫�" value="" />
-                  </el-select>
-                </template>
-              </el-table-column>
-              <el-table-column label="鏂囦欢绫诲瀷" width="100">
-                <template #default="scope">
-                  <el-tag size="small">{{
-                    getFileTypeText(scope.row.fileName)
-                  }}</el-tag>
-                </template>
-              </el-table-column>
-              <el-table-column label="涓婁紶鏃堕棿" width="160">
-                <template #default="scope">
-                  <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="鏂囦欢澶у皬" width="120">
-                <template #default="scope">
-                  <span>{{ formatFileSize(scope.row.fileSize) }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="鎿嶄綔" width="180" fixed="right">
-                <template #default="scope">
-                  <el-button
-                    size="mini"
-                    type="primary"
-                    @click="handlePreview(scope.row)"
-                    >棰勮</el-button
-                  >
-                  <el-button
-                    size="mini"
-                    type="danger"
-                    @click="handleRemoveAttachmentByFile(scope.row)"
-                    >鍒犻櫎</el-button
-                  >
-                </template>
-              </el-table-column>
-            </el-table>
-          </el-tab-pane>
-        </el-tabs>
-      </div>
-
-      <!-- 鏃犻檮浠舵椂鏄剧ず -->
-      <div v-else style="text-align:center; padding:20px; color:#909399;">
-        鏆傛棤闄勪欢锛岃涓婁紶
-      </div>
+              娣诲姞闄勪欢
+            </el-button>
+          </div>
+          <el-table
+            :data="getCategoryFiles(category)"
+            style="width: 100%"
+            size="small"
+            border
+          >
+            <el-table-column label="鏂囦欢鍚�" min-width="180">
+              <template #default="scope">
+                <i
+                  class="el-icon-document"
+                  style="margin-right: 8px; color: #409EFF;"
+                ></i>
+                <span class="file-name">{{ scope.row.fileName }}</span>
+              </template>
+            </el-table-column>
+            <!-- 鍙紪杈戝垎绫讳笅鎷� -->
+            <el-table-column label="鍒嗙被" width="150">
+              <template #default="scope">
+                <el-select
+                  v-model="scope.row.fileType"
+                  size="small"
+                  @change="updateAttachmentCategory(scope.row, $event)"
+                  placeholder="閫夋嫨鍒嗙被"
+                >
+                  <el-option label="鍘熻〃鎷嶇収" value="鍘熻〃鎷嶇収" />
+                  <el-option label="鎺ュ彈纭涔�" value="鎺ュ彈纭涔�" />
+                  <el-option label="寮冪敤璇存槑" value="寮冪敤璇存槑" />
+                  <el-option label="鎹愮尞璇佷功鐓х墖" value="鎹愮尞璇佷功鐓х墖" />
+                  <el-option label="鏈垎绫�" value="" />
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column label="鏂囦欢绫诲瀷" width="100">
+              <template #default="scope">
+                <el-tag size="small">{{
+                  getFileTypeText(scope.row.fileName)
+                }}</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="涓婁紶鏃堕棿" width="160">
+              <template #default="scope">
+                <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鏂囦欢澶у皬" width="120">
+              <template #default="scope">
+                <span>{{ formatFileSize(scope.row.fileSize) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鎿嶄綔" width="180" fixed="right">
+              <template #default="scope">
+                <el-button
+                  size="mini"
+                  type="primary"
+                  @click="handlePreview(scope.row)"
+                  >棰勮</el-button
+                >
+                <el-button
+                  size="mini"
+                  type="danger"
+                  @click="handleRemoveAttachmentByFile(scope.row)"
+                  >鍒犻櫎</el-button
+                >
+              </template>
+            </el-table-column>
+          </el-table>
+          <div
+            v-if="getCategoryFiles(category).length == 0"
+            style="text-align:center; padding:20px; color:#909399;"
+          >
+            鏆傛棤闄勪欢
+          </div>
+        </el-tab-pane>
+      </el-tabs>
     </el-card>
     <div style="text-align: center; margin: 30px 0;">
       <el-button type="primary" @click="handleSave" :loading="saveLoading">
@@ -590,6 +564,47 @@
         瀹屾垚鍒╃敤
       </el-button>
     </div>
+    <!-- 涓婁紶瀵硅瘽妗� -->
+    <el-dialog
+      :title="`涓婁紶${currentUploadCategory}闄勪欢`"
+      :visible.sync="uploadDialogVisible"
+      width="480px"
+      :close-on-click-modal="false"
+    >
+      <el-upload
+        ref="uploadRef"
+        class="upload-demo"
+        drag
+        :action="uploadAction"
+        :headers="headers"
+        multiple
+        :file-list="tempFileList"
+        :before-upload="beforeUpload"
+        :on-change="handleFileChange"
+        :on-remove="handleTempRemove"
+        :on-success="handleUploadSuccess"
+        :auto-upload="false"
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        <div class="el-upload__tip" slot="tip">
+          鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
+        </div>
+      </el-upload>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="uploadDialogVisible = false">鍙栨秷</el-button>
+        <el-button
+          type="primary"
+          @click="submitUpload"
+          :loading="uploadLoading"
+          :disabled="tempFileList.length == 0"
+        >
+          纭涓婁紶
+        </el-button>
+      </span>
+    </el-dialog>
+
     <!-- 鏂囦欢棰勮瀵硅瘽妗� -->
     <FilePreviewDialog
       :visible="filePreviewVisible"
@@ -606,15 +621,14 @@
   completionadd,
   completionedit
 } from "@/api/businessApi";
-import UploadAttachment from "@/components/UploadAttachment"; // 鏂板瀵煎叆
-import FilePreviewDialog from "@/components/FilePreviewDialog"; // 鏂板瀵煎叆
+import FilePreviewDialog from "@/components/FilePreviewDialog";
 import CaseBasicInfo from "@/components/CaseBasicInfo";
-import dayjs from "dayjs"; // 鏂板瀵煎叆锛岀敤浜庢椂闂村鐞�
+import { getToken } from "@/utils/auth";
+import dayjs from "dayjs";
 
 export default {
   name: "OrganUtilizationDetail",
   components: {
-    UploadAttachment,
     FilePreviewDialog,
     CaseBasicInfo
   },
@@ -714,13 +728,17 @@
       editDialogVisible: false,
       currentRecord: {},
       currentEditIndex: -1,
-      // 闄勪欢鐩稿叧閰嶇疆 - 鏂板
-      attachmentFileList: [],
-      attachmentLimit: 10,
-      attachmentAccept:
-        ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt",
+      // 涓婁紶鐩稿叧
+      uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+      headers: {
+        Authorization: "Bearer " + getToken()
+      },
+      uploadDialogVisible: false,
+      uploadLoading: false,
+      tempFileList: [],
+      currentUploadCategory: "",
 
-      // 鏂囦欢棰勮鐩稿叧 - 鏂板
+      // 鏂囦欢棰勮鐩稿叧
       filePreviewVisible: false,
       currentPreviewFile: null,
       currentFollowup: {},
@@ -733,15 +751,21 @@
       return JSON.parse(sessionStorage.getItem("user") || "{}");
     },
     categories() {
-     // 濮嬬粓杩斿洖鎵�鏈夐璁惧垎绫� + 鏈垎绫伙紝鍗充娇娌℃湁鏁版嵁涔熸樉绀�
-    const allCategories = ['鍘熻〃鎷嶇収', '鎺ュ彈纭涔�', '寮冪敤璇存槑', '鎹愮尞璇佷功鐓х墖', '鏈垎绫�'];
-    return allCategories;
+      // 濮嬬粓杩斿洖鎵�鏈夐璁惧垎绫� + 鏈垎绫伙紝鍗充娇娌℃湁鏁版嵁涔熸樉绀�
+      const allCategories = [
+        "鍘熻〃鎷嶇収",
+        "鎺ュ彈纭涔�",
+        "寮冪敤璇存槑",
+        "鎹愮尞璇佷功鐓х墖",
+        "鏈垎绫�"
+      ];
+      return allCategories;
     },
     // 宸茬Щ妞嶆暟閲�
     transplantedCount() {
       if (!this.utilizationData.serviceDonatecomporganList) return 0;
       return this.utilizationData.serviceDonatecomporganList.filter(
-        record => record.transplantstate === "1"
+        record => record.transplantstate == "1"
       ).length;
     },
     // 鍞竴鍖婚櫌鏁伴噺
@@ -776,22 +800,6 @@
   created() {
     this.initData();
   },
-  watch: {
-    // 鐩戝惉闄勪欢鏁版嵁鍙樺寲 - 鏂板
-    attachments: {
-      handler(newAttachments) {
-        this.attachmentFileList = newAttachments.map(item => ({
-          uid: item.id || Math.random(),
-          name: item.fileName,
-          fileSize: item.fileSize,
-          url: item.path || item.fileUrl,
-          uploadTime: item.uploadTime,
-          status: "success"
-        }));
-      },
-      deep: true
-    }
-  },
   methods: {
     // 鍒濆鍖栨暟鎹�
     initData() {
@@ -825,9 +833,9 @@
       });
 
       targetNos.forEach(no => {
-        const existing = records.find(r => r.organno === no);
+        const existing = records.find(r => r.organno == no);
         if (existing) {
-          if (existing.delFlag === 1) existing.delFlag = 0;
+          if (existing.delFlag == 1) existing.delFlag = 0;
         } else {
           // 浣跨敤鍒涘缓鏂规硶锛岃嚜鍔ㄥ寘鍚� delFlag:0
           this.createOrganRecord(no);
@@ -843,11 +851,7 @@
       this.loading = true;
       try {
         const response = await completionList({ infoid: this.caseId });
-        if (
-          response.code === 200 &&
-          response.data &&
-          response.data.length > 0
-        ) {
+        if (response.code == 200 && response.data && response.data.length > 0) {
           const data = response.data[0];
           if (!data.completeState || data.completeState == 1) {
             data.completeState = "2";
@@ -872,9 +876,10 @@
               ? data.serviceDonatecomporganList.map(record => ({
                   ...record,
                   transplanttime: record.transplanttime || "",
-                  transplantstate: record.transplantstate
-                    ? record.transplantstate.toString()
-                    : "1"
+                  transplantstate:
+                    record.transplantstate != null
+                      ? record.transplantstate.toString()
+                      : "1"
                 }))
               : [];
           }
@@ -889,19 +894,8 @@
               fileType: item.fileType || "" // 榛樿绌哄瓧绗︿覆琛ㄧず鏈垎绫�
             }));
             this.form.attachments = this.attachments;
-            // 鍚屾 attachmentFileList
-            this.attachmentFileList = this.attachments.map(item => ({
-              uid: item.id || Math.random(),
-              name: item.fileName,
-              url: item.path || item.fileUrl,
-              fileSize: item.fileSize,
-              uploadTime: item.uploadTime,
-              status: "success",
-              raw: item
-            }));
           } else {
             this.attachments = [];
-            this.attachmentFileList = [];
           }
 
           this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
@@ -956,9 +950,9 @@
 
       // 3. 鏂板鎴栨仮澶嶈褰曪紙鏃犻渶寮圭獥锛�
       targetOrganNos.forEach(no => {
-        const existing = records.find(r => r.organno === no);
+        const existing = records.find(r => r.organno == no);
         if (existing) {
-          if (existing.delFlag === 1) {
+          if (existing.delFlag == 1) {
             existing.delFlag = 0; // 鎭㈠鏄剧ず
           }
         } else {
@@ -1073,6 +1067,7 @@
       const organName = this.getOrganLabel(organValue);
 
       this.utilizationData.serviceDonatecomporganList.push({
+        infoid: this.caseId,
         organname: organName,
         organno: organValue,
         caseNo: "",
@@ -1107,19 +1102,19 @@
 
     // 鏍规嵁瀛楀吀value鑾峰彇label
     getOrganLabel(organValue) {
-      const dictItem = this.organDict.find(item => item.value === organValue);
+      const dictItem = this.organDict.find(item => item.value == organValue);
       return dictItem ? dictItem.label : organValue;
     },
 
     // 绉绘鐘舵�佸彉鍖栧鐞�
     handleTransplantStatusChange(row, status) {
-      if (status === "0") {
+      if (status == "0") {
         // 濡傛灉鐘舵�佷负鏈Щ妞嶏紝娓呴櫎鐩稿叧瀛楁
         // row.transplanttime = "";
         // row.transplantdoct = "";
         // row.hospitalno = "";
         // row.hospitalname = "";
-      } else if (status === "1") {
+      } else if (status == "1") {
         // 濡傛灉鐘舵�佷负宸茬Щ妞嶏紝鑷姩璁剧疆绉绘鏃堕棿涓哄綋鍓嶆椂闂�
         if (!row.transplanttime) {
           row.transplanttime = new Date().toISOString().split("T")[0];
@@ -1158,12 +1153,12 @@
     // 鍣ㄥ畼琛屾牱寮�
     getOrganRowClassName({ row }) {
       if (
-        row.transplantstate === "1" &&
+        row.transplantstate == "1" &&
         (!row.hospitalno || !row.name || !row.transplanttime)
       ) {
         return "warning-row";
       }
-      if (row.transplantstate === "0" && !row.abandonreason) {
+      if (row.transplantstate == "0" && !row.abandonreason) {
         return "warning-row";
       }
       return "";
@@ -1226,7 +1221,7 @@
             const apiMethod = this.form.id ? completionedit : completionadd;
             const response = await apiMethod(saveData);
 
-            if (response.code === 200) {
+            if (response.code == 200) {
               this.$message.success("淇濆瓨鎴愬姛");
               if (!this.form.id && response.data && response.data.id) {
                 this.form.id = response.data.id;
@@ -1251,7 +1246,7 @@
     async handleSaveUtilization() {
       if (
         !this.utilizationData.serviceDonatecomporganList ||
-        this.utilizationData.serviceDonatecomporganList.length === 0
+        this.utilizationData.serviceDonatecomporganList.length == 0
       ) {
         this.$message.warning("璇峰厛娣诲姞鍒╃敤璁板綍");
         return;
@@ -1269,7 +1264,7 @@
 
         const response = await completionedit(saveData);
 
-        if (response.code === 200) {
+        if (response.code == 200) {
           this.$message.success("鍒╃敤璁板綍淇濆瓨鎴愬姛");
         } else {
           this.$message.error(
@@ -1289,9 +1284,9 @@
       // 妫�鏌ュ埄鐢ㄨ褰曟槸鍚﹀畬鏁�
       const incompleteRecords = this.utilizationData.serviceDonatecomporganList.filter(
         record => {
-          if (record.transplantstate === "1") {
+          if (record.transplantstate == "1") {
             return !record.hospitalno || !record.name || !record.transplanttime;
-          } else if (record.transplantstate === "0") {
+          } else if (record.transplantstate == "0") {
             return !record.abandonreason;
           }
           return false;
@@ -1329,7 +1324,7 @@
 
             const response = await completionedit(saveData);
 
-            if (response.code === 200) {
+            if (response.code == 200) {
               this.$message.success("鍣ㄥ畼鍒╃敤宸插畬鎴�");
             } else {
               this.$message.error(
@@ -1371,7 +1366,7 @@
 
       // 鑾峰彇鍣ㄥ畼鍚嶇О
       const organRecord = this.utilizationData.serviceDonatecomporganList.find(
-        item => item.organno === this.currentFollowup.organNo
+        item => item.organno == this.currentFollowup.organNo
       );
       const organName = organRecord ? organRecord.organname : "";
 
@@ -1386,7 +1381,7 @@
         if (this.isEditingFollowup) {
           // 鏇存柊鐜版湁璁板綍
           const index = this.followupData.records.findIndex(
-            item => item.id === this.currentFollowup.id
+            item => item.id == this.currentFollowup.id
           );
           if (index !== -1) {
             this.followupData.records[index] = {
@@ -1403,53 +1398,107 @@
         this.saveLoading = false;
       }, 1000);
     },
-    /** 闄勪欢鍙樺寲澶勭悊 */
-    handleAttachmentChange(fileList) {
-      this.attachmentFileList = fileList;
+    // ==== 闄勪欢鐩稿叧鏂规硶 ====
+    // 鎵撳紑涓婁紶瀵硅瘽妗�
+    openUploadDialog(category) {
+      this.currentUploadCategory = category;
+      this.tempFileList = [];
+      this.uploadDialogVisible = true;
+      this.$nextTick(() => {
+        if (this.$refs.uploadRef) {
+          this.$refs.uploadRef.clearFiles();
+        }
+      });
     },
 
-    /** 闄勪欢绉婚櫎澶勭悊 */
-    handleAttachmentRemove(file) {
-      if (file.url) {
-        const index = this.attachments.findIndex(
-          item => item.path === file.url || item.fileUrl === file.url
+    // 涓婁紶鍓嶆牎楠�
+    beforeUpload(file) {
+      const allowedTypes = [
+        "application/pdf",
+        "image/jpeg",
+        "image/png",
+        "application/msword",
+        "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+      ];
+      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");
+      if (!isTypeOk) {
+        this.$message.error(
+          "鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢"
         );
-        if (index > -1) {
-          this.attachments.splice(index, 1);
-          this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
-        }
+        return false;
       }
+      if (file.size > maxSize) {
+        this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
+        return false;
+      }
+      return true;
     },
-    /** 涓婁紶鎴愬姛澶勭悊 */
-    handleUploadSuccess({ file, fileList, response }) {
-      if (response.code === 200) {
-        // 鏍规嵁褰撳墠婵�娲荤殑 Tab 鍐冲畾鍒嗙被锛堟湭鍒嗙被 Tab 瀵瑰簲绌哄瓧绗︿覆锛�
-        const category = this.activeTab === "鏈垎绫�" ? "" : this.activeTab;
-        const attachmentObj = {
-          fileName: file.name,
-          path: response.fileUrl || file.url,
-          fileUrl: response.fileUrl || file.url,
-          fileType: category, // 鍏抽敭锛氳褰曞垎绫�
-          fileSize: file.size,
-          uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
-        };
 
-        if (!Array.isArray(this.attachments)) {
-          this.attachments = [];
-        }
-        this.attachments.push(attachmentObj);
-        this.attachmentFileList = fileList; // 淇濇寔鍚屾
-        this.$message.success("鏂囦欢涓婁紶鎴愬姛");
-      }
+    // 鏂囦欢閫夋嫨鍙樺寲
+    handleFileChange(file, fileList) {
+      this.tempFileList = fileList;
     },
+
+    // 涓存椂绉婚櫎
+    handleTempRemove(file, fileList) {
+      this.tempFileList = fileList;
+    },
+
+    // 涓婁紶鎴愬姛澶勭悊
+    handleUploadSuccess(response, file, fileList) {
+      if (response.code !== 200) {
+        this.$message.error(response.msg || "涓婁紶澶辫触");
+        return;
+      }
+      // 鏈垎绫诲搴旂┖瀛楃涓诧紝涓庡睍绀�/淇濆瓨閫昏緫涓�鑷�
+      const category =
+        this.currentUploadCategory == "鏈垎绫�"
+          ? ""
+          : this.currentUploadCategory;
+      const attachmentObj = {
+        fileName: file.name,
+        path: response.fileUrl || response.url || response.data || file.url,
+        fileUrl: response.fileUrl || response.url || response.data || file.url,
+        fileType: category,
+        fileSize: file.size,
+        uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+      };
+      if (!Array.isArray(this.attachments)) {
+        this.attachments = [];
+      }
+      this.attachments.push(attachmentObj);
+      this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+      this.uploadLoading = false;
+      this.uploadDialogVisible = false;
+      this.tempFileList = [];
+    },
+
+    // 鎻愪氦涓婁紶
+    submitUpload() {
+      if (this.tempFileList.length == 0) {
+        this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
+        return;
+      }
+      this.uploadLoading = true;
+      this.$refs.uploadRef.submit();
+    },
+
     // 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
     getCategoryCount(category) {
       return this.attachments.filter(item => {
         const type = item.fileType || "";
-        if (category === "鏈垎绫�") {
+        if (category == "鏈垎绫�") {
           return !this.presetCategories.includes(type);
         }
-        return type === category;
+        return type == category;
       }).length;
     },
 
@@ -1457,27 +1506,18 @@
     getCategoryFiles(category) {
       return this.attachments.filter(item => {
         const type = item.fileType || "";
-        if (category === "鏈垎绫�") {
+        if (category == "鏈垎绫�") {
           return !this.presetCategories.includes(type);
         }
-        return type === category;
+        return type == category;
       });
     },
 
     // 鏇存柊闄勪欢鍒嗙被锛堜笅鎷変慨鏀规椂瑙﹀彂锛�
     updateAttachmentCategory(row, newVal) {
-      const target = this.attachments.find(item => item === row);
+      const target = this.attachments.find(item => item == row);
       if (target) {
-        target.fileType = newVal; // 鍙兘涓虹┖瀛楃涓�
-        // 鍚屾鏇存柊 attachmentFileList
-        const fileItem = this.attachmentFileList.find(
-          f => f.raw === row || f.url === row.fileUrl
-        );
-        if (fileItem) {
-          fileItem.raw.fileType = newVal;
-          fileItem.fileType = newVal || "鏈垎绫�";
-        }
-        // 濡傛灉褰撳墠婵�娲荤殑tab娌℃湁鏂囦欢浜嗭紝鑷姩鍒囨崲鍒扮涓�涓湁鏂囦欢鐨則ab
+        target.fileType = newVal;
         const currentTabHasFiles =
           this.getCategoryFiles(this.activeTab).length > 0;
         if (!currentTabHasFiles) {
@@ -1489,32 +1529,22 @@
 
     // 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
     handleRemoveAttachmentByFile(file) {
-      const index = this.attachments.findIndex(item => item === file);
-      if (index > -1) {
-        this.attachments.splice(index, 1);
-        // 鍚屾鍒犻櫎 attachmentFileList
-        const fileIndex = this.attachmentFileList.findIndex(
-          f => f.raw === file || f.url === file.fileUrl
-        );
-        if (fileIndex > -1) {
-          this.attachmentFileList.splice(fileIndex, 1);
-        }
-        this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
-      }
-    },
-    /** 涓婁紶閿欒澶勭悊 */
-    handleUploadError({ file, fileList, error }) {
-      console.error("闄勪欢涓婁紶澶辫触:", error);
-      this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+      this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(() => {
+          const index = this.attachments.findIndex(item => item == file);
+          if (index > -1) {
+            this.attachments.splice(index, 1);
+            this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+          }
+        })
+        .catch(() => {});
     },
 
-    /** 鎵嬪姩鍒犻櫎闄勪欢 */
-    handleRemoveAttachment(index) {
-      // 鐩存帴璋冪敤鏂扮殑鍒犻櫎鏂规硶
-      this.handleRemoveAttachmentByFile(file.raw || file);
-    },
-
-    /** 鏂囦欢棰勮 */
+    // 鏂囦欢棰勮
     handlePreview(file) {
       this.currentPreviewFile = {
         fileName: file.fileName,
@@ -1523,7 +1553,8 @@
       };
       this.filePreviewVisible = true;
     },
-    /** 鏂囦欢涓嬭浇 */
+
+    // 鏂囦欢涓嬭浇
     handleDownloadAttachment(file) {
       const fileUrl = file.path || file.fileUrl;
       const fileName = file.fileName;
@@ -1610,7 +1641,7 @@
 
     /** 鏍煎紡鍖栨枃浠跺ぇ灏� */
     formatFileSize(bytes) {
-      if (!bytes || bytes === 0) return "0 B";
+      if (!bytes || bytes == 0) return "0 B";
       const k = 1024;
       const sizes = ["B", "KB", "MB", "GB"];
       const i = Math.floor(Math.log(bytes) / Math.log(k));
@@ -2033,4 +2064,73 @@
     padding: 10px 15px;
   }
 }
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+  padding: 16px;
+}
+
+.paper-form {
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+.paper-form >>> .form-row {
+  display: flex;
+  width: 100%;
+  border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+  display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #ecf5ff;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
 </style>
diff --git a/src/views/business/affirm/affirmInfo.vue b/src/views/business/affirm/affirmInfo.vue
index 55cbfcc..ea684f4 100644
--- a/src/views/business/affirm/affirmInfo.vue
+++ b/src/views/business/affirm/affirmInfo.vue
@@ -1,47 +1,28 @@
 <template>
   <div class="confirmation-detail">
-    <case-basic-info :case-id="caseId" :show-attachment="true" />
+    <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
 
-    <el-card class="detail-card">
+    <el-card class="detail-card paper-card">
       <!-- 鍩虹淇℃伅 -->
       <div slot="header" class="clearfix">
         <span class="detail-title">鎹愮尞纭淇℃伅</span>
-        <!-- <el-button
-          type="primary"
-          style="float: right;margin-left: 20px;"
-          @click="handleSave"
-          :loading="saveLoading"
-        >
-          淇濆瓨纭淇℃伅
-        </el-button>
-        <el-button
-          type="success"
-          style="float: right;margin-left: 20px;"
-          @click="accomplish"
-          :loading="saveLoading"
-        >
-          纭瀹屾垚
-        </el-button> -->
+
       </div>
 
-      <el-form :model="form" ref="form" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="鍗忚皟鍛�1" prop="coordinatedusernameo">
-              <el-input v-model="form.coordinatedusernameo" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍗忚皟鍛�2" prop="coordinatedusernamet">
-              <el-input v-model="form.coordinatedusernamet" />
-            </el-form-item>
-          </el-col>
+      <el-form :model="form" ref="form" label-width="120px" class="paper-form">
+        <div class="form-row">
+          <el-form-item label="鍗忚皟鍛�1" prop="coordinatedusernameo" class="col-1-3">
+            <el-input v-model="form.coordinatedusernameo" />
+          </el-form-item>
+          <el-form-item label="鍗忚皟鍛�2" prop="coordinatedusernamet" class="col-1-3">
+            <el-input v-model="form.coordinatedusernamet" />
+          </el-form-item>
           <!-- <el-col :span="8">
             <el-form-item label="涓氬姟浜哄憳" prop="responsibleusername">
               <el-input v-model="form.responsibleusername" />
             </el-form-item>
           </el-col> -->
-        </el-row>
+        </div>
 
         <!-- <el-row :gutter="20">
           <el-col :span="8">
@@ -66,7 +47,7 @@
           style="margin-bottom: 15px;"
         >
         </el-alert>
-        <el-row style="margin-top: 15px;">
+        <div style="margin-top: 15px;">
           <el-button
           style="float: right; margin-bottom: 5px;"
             type="primary"
@@ -76,7 +57,7 @@
           >
             娣诲姞鍏朵粬瀹跺睘
           </el-button>
-        </el-row>
+        </div>
         <el-table :data="familyMemberList" size="small" border>
           <el-table-column label="搴忓彿" width="60" align="center">
             <template slot-scope="scope">
@@ -143,8 +124,8 @@
           </el-table-column>
         </el-table>
 
-        <el-row>
-          <el-form-item label-width="100px" label="鎹愮尞鍐冲畾">
+        <div class="form-row">
+          <el-form-item label-width="100px" label="鎹愮尞鍐冲畾" class="col-full">
             <el-checkbox-group v-model="organdecision">
               <el-checkbox
                 v-for="item in organselection"
@@ -160,16 +141,18 @@
               style="margin-top: 10px; width: 300px;"
             ></el-input>
           </el-form-item>
-        </el-row>
+        </div>
 
-        <el-form-item label="瀹跺睘鎰忚澶囨敞" prop="relativeRemark">
-          <el-input
-            type="textarea"
-            :rows="3"
-            v-model="form.relativeRemark"
-            placeholder="璁板綍瀹跺睘鐨勬剰瑙佸拰娌熼�氭儏鍐�"
-          />
-        </el-form-item>
+        <div class="form-row">
+          <el-form-item label="瀹跺睘鎰忚澶囨敞" prop="relativeRemark" class="col-full">
+            <el-input
+              type="textarea"
+              :rows="3"
+              v-model="form.relativeRemark"
+              placeholder="璁板綍瀹跺睘鐨勬剰瑙佸拰娌熼�氭儏鍐�"
+            />
+          </el-form-item>
+        </div>
       </el-form>
     </el-card>
 
@@ -635,6 +618,9 @@
     },
 
     getAttachmentsByType(type) {
+      console.log(type);
+      console.log(this.attachmentData[type]);
+
       return this.attachmentData[type] || [];
     },
 
@@ -703,6 +689,8 @@
         uploader: "褰撳墠鐢ㄦ埛"
       };
       this.attachmentData[this.currentUploadType].push(newAttachment);
+      console.log(this.attachmentData,'this.attachmentData');
+
       this.updateAssessannexField();
       this.$message.success("涓婁紶鎴愬姛");
       this.uploadLoading = false;
@@ -1082,4 +1070,73 @@
   font-size: 13px;
   color: #606266;
 }
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+  padding: 16px;
+}
+
+.paper-form {
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+.paper-form >>> .form-row {
+  display: flex;
+  width: 100%;
+  border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+  display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #ecf5ff;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
 </style>
diff --git a/src/views/business/allocation/allocationInfo.vue b/src/views/business/allocation/allocationInfo.vue
index 1ab3aab..4be4f21 100644
--- a/src/views/business/allocation/allocationInfo.vue
+++ b/src/views/business/allocation/allocationInfo.vue
@@ -1,43 +1,36 @@
 <template>
   <div class="organ-allocation-detail">
-    <case-basic-info :case-id="caseId" :show-attachment="true" />
+    <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
     <!-- 鍩烘湰淇℃伅閮ㄥ垎 -->
-    <el-card class="detail-card">
+    <el-card class="detail-card paper-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">鍣ㄥ畼鍒嗛厤鍩烘湰淇℃伅</span>
       </div>
 
-      <el-form :model="form" ref="form" :rules="rules" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鍒嗛厤鐘舵��" prop="allocationStatus">
-              <el-select v-model="form.allocationStatus" placeholder="璇烽�夋嫨鍒嗛厤鐘舵��">
-                <el-option v-for="dict in dict.type.organ_allocation_status || []" :key="dict.value" :label="dict.label"
-                  :value="dict.value"></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍒嗛厤鏃堕棿" prop="allocationTime">
-              <el-date-picker v-model="form.allocationTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%" :disabled="form.allocationStatus == '1'" />
-            </el-form-item>
-          </el-col>
-        </el-row>
+      <el-form :model="form" ref="form" :rules="rules" label-width="120px" class="paper-form">
+        <div class="form-row">
+          <el-form-item label="鍒嗛厤鐘舵��" prop="allocationStatus" class="col-half">
+            <el-select v-model="form.allocationStatus" placeholder="璇烽�夋嫨鍒嗛厤鐘舵��">
+              <el-option v-for="dict in dict.type.organ_allocation_status || []" :key="dict.value" :label="dict.label"
+                :value="dict.value"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鍒嗛厤鏃堕棿" prop="allocationTime" class="col-half">
+            <el-date-picker v-model="form.allocationTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%" :disabled="form.allocationStatus == '1'" />
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="璐熻矗浜�" prop="registrationName">
+        <div class="form-row">
+          <el-form-item label="璐熻矗浜�" prop="registrationName" class="col-half">
               <el-input v-model="form.registrationName" />
-            </el-form-item>
-          </el-col>
-
-        </el-row>
+          </el-form-item>
+        </div>
       </el-form>
     </el-card>
 
     <!-- 鍣ㄥ畼鍒嗛厤璁板綍閮ㄥ垎 -->
-    <el-card class="allocation-card">
+    <el-card class="allocation-card paper-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">鍣ㄥ畼鍒嗛厤璁板綍</span>
         <div style="float: right;">
@@ -45,10 +38,9 @@
         </div>
       </div>
 
-      <el-form ref="allocationForm" :rules="allocationRules" :model="allocationData" label-position="right">
-        <el-row>
-          <el-col>
-            <el-form-item label-width="100px" label="鍒嗛厤鍣ㄥ畼">
+      <el-form ref="allocationForm" :rules="allocationRules" :model="allocationData" label-position="right" class="paper-form">
+        <div class="form-row">
+          <el-form-item label-width="100px" label="鍒嗛厤鍣ㄥ畼" class="col-full">
               <el-checkbox-group v-model="selectedOrgans" @change="handleOrganSelectionChange">
                 <el-checkbox v-for="dict in dict.type.sys_Organ || []" :key="dict.value" :label="dict.value"
                   :disabled="form.allocationStatus == '1'">
@@ -57,13 +49,11 @@
               </el-checkbox-group>
               <el-input v-if="showOtherInput" v-model="otherOrganInput" placeholder="璇疯緭鍏ュ叾浠栧櫒瀹樺悕绉�"
                 style="margin-top: 10px; width: 300px;" :disabled="form.allocationStatus == '1'" />
-            </el-form-item>
-          </el-col>
-        </el-row>
+          </el-form-item>
+        </div>
 
-        <el-row>
-          <el-col>
-            <el-form-item>
+        <div class="form-row">
+          <el-form-item class="col-full">
               <el-table :data="displayOrgans" v-loading="loading" border style="width: 100%"
                 :row-class-name="getOrganRowClassName">
                 <el-table-column label="搴忓彿" type="index" width="60" align="center" fixed></el-table-column>
@@ -202,8 +192,7 @@
                 </el-table-column>
               </el-table>
             </el-form-item>
-          </el-col>
-        </el-row>
+        </div>
 
         <!-- 鍒嗛厤缁熻淇℃伅 -->
         <!-- <div
@@ -1887,4 +1876,73 @@
     font-size: 11px;
   }
 }
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+  padding: 16px;
+}
+
+.paper-form {
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+.paper-form >>> .form-row {
+  display: flex;
+  width: 100%;
+  border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+  display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #ecf5ff;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
 </style>
diff --git a/src/views/business/assess/assessInfo.vue b/src/views/business/assess/assessInfo.vue
index 5a06c99..ecad7c4 100644
--- a/src/views/business/assess/assessInfo.vue
+++ b/src/views/business/assess/assessInfo.vue
@@ -1,23 +1,25 @@
 <template>
   <div class="assessment-detail">
     <!-- 鍩虹妗堜緥淇℃伅 -->
-    <case-basic-info :case-id="caseId" :show-attachment="true" />
+    <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
 
-    <el-card class="organ-assessment-card">
+    <el-card class="organ-assessment-card paper-card">
       <div slot="header" class="clearfix">
         <span>鍣ㄥ畼璇勪及琛�</span>
       </div>
 
       <!-- 鎹愮尞鍐冲畾琛ㄥ崟 -->
-      <el-form>
-        <el-form-item label-width="100px" label="鎹愮尞鍐冲畾">
-          <el-checkbox-group v-model="organdecisionValues" @change="handleOrganDecisionChange" :disabled="!isEdit">
-            <el-checkbox v-for="dict in dict.type.sys_Organ" :key="dict.value" :label="dict.value">{{ dict.label }}
-            </el-checkbox>
-          </el-checkbox-group>
-          <el-input v-if="showOtherInput" v-model="organdecisionOther" placeholder="璇疯緭鍏ュ叾浠栨崘鐚喅瀹氱殑鍏蜂綋鍐呭"
-            style="margin-top: 10px; width: 300px;" :readonly="!isEdit" @input="handleOtherDecisionInput"></el-input>
-        </el-form-item>
+      <el-form class="paper-form">
+        <div class="form-row">
+          <el-form-item label-width="100px" label="鎹愮尞鍐冲畾" class="col-full">
+            <el-checkbox-group v-model="organdecisionValues" @change="handleOrganDecisionChange" :disabled="!isEdit">
+              <el-checkbox v-for="dict in dict.type.sys_Organ" :key="dict.value" :label="dict.value">{{ dict.label }}
+              </el-checkbox>
+            </el-checkbox-group>
+            <el-input v-if="showOtherInput" v-model="organdecisionOther" placeholder="璇疯緭鍏ュ叾浠栨崘鐚喅瀹氱殑鍏蜂綋鍐呭"
+              style="margin-top: 10px; width: 300px;" :readonly="!isEdit" @input="handleOtherDecisionInput"></el-input>
+          </el-form-item>
+        </div>
       </el-form>
 
       <!-- 鍣ㄥ畼璇勪及琛ㄦ牸 -->
@@ -1547,4 +1549,73 @@
     margin-bottom: 10px;
   }
 }
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+  padding: 16px;
+}
+
+.paper-form {
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+.paper-form >>> .form-row {
+  display: flex;
+  width: 100%;
+  border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+  display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #ecf5ff;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
 </style>
diff --git a/src/views/business/course/ccss.vue b/src/views/business/course/ccss.vue
new file mode 100644
index 0000000..36f1e5a
--- /dev/null
+++ b/src/views/business/course/ccss.vue
@@ -0,0 +1,577 @@
+<!--
+  浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃锛堢焊璐ㄨ〃鏍奸锛�
+  姣忎竴椤癸細鏍囬鏍�(鐏板簳) + 鍐呭鏍�(鐧藉簳)锛岃鍒楃敤杈规鎷兼垚瀹屾暣缃戞牸锛屽儚绾歌川鐧昏琛ㄣ��
+  甯冨眬妯″紡锛�
+    col-1-3  涓夊垎涔嬩竴鍒楋紙3鍒楀苟鍒楋級
+    col-half 浜屽垎涔嬩竴鍒楋紙2鍒楋級
+    col-2-3  涓夊垎涔嬩簩鍒楋紙闈炲绉�2鍒楋級
+    col-full 婊¤锛堝閫�/鍗曢��/涓婁紶锛�
+-->
+<template>
+  <div class="donor-register">
+    <!-- 鏍囬鍖� -->
+    <div class="register-header">
+      <h2 class="register-title">浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃</h2>
+      <p class="register-tip">锛� <span class="required-star">*</span> 锛変负蹇呴』濉啓鐨勯」</p>
+    </div>
+
+    <el-card class="register-card" shadow="never">
+      <el-form
+        ref="registerForm"
+        :model="form"
+        :rules="rules"
+        label-width="120px"
+        class="register-form"
+      >
+        <!-- 绗�1琛岋細鐪佷唤 / 鎵�鍦ㄥ尰鐤楁満鏋� / 绉戝 -->
+        <div class="form-row">
+          <el-form-item label="鐪佷唤" prop="province" class="col-1-3">
+            <el-input v-model="form.province" placeholder="璇疯緭鍏ョ渷浠�" />
+          </el-form-item>
+          <el-form-item label="鎵�鍦ㄥ尰鐤楁満鏋�" prop="treatmentHospitalName" class="col-1-3">
+            <el-input v-model="form.treatmentHospitalName" placeholder="璇疯緭鍏ユ墍鍦ㄥ尰鐤楁満鏋�" />
+          </el-form-item>
+          <el-form-item label="绉戝" class="col-1-3">
+            <el-input v-model="form.department" placeholder="璇疯緭鍏ョ瀹�" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�2琛岋細鎹愮尞缂栧彿 / 棣栬瘖鍖荤枟鏈烘瀯 / 绉戝 -->
+        <div class="form-row">
+          <el-form-item label="鎹愮尞缂栧彿" class="col-1-3">
+            <el-input v-model="form.donationNo" placeholder="鐢辩渷鎹愮尞鍘熷琛ㄤ俊鎭敓鎴�" disabled />
+          </el-form-item>
+          <el-form-item label="棣栬瘖鍖荤枟鏈烘瀯" prop="firstTreatmentHospitalName" class="col-1-3">
+            <el-input v-model="form.firstTreatmentHospitalName" placeholder="璇疯緭鍏ラ璇婂尰鐤楁満鏋�" />
+          </el-form-item>
+          <el-form-item label="绉戝" class="col-1-3">
+            <el-input v-model="form.firstDepartment" placeholder="璇疯緭鍏ョ瀹�" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�3琛岋細濮撳悕 / 鎬у埆 / 璇佷欢鍙风爜 -->
+        <div class="form-row">
+          <el-form-item label="濮撳悕" prop="name" class="col-1-3">
+            <el-input v-model="form.name" placeholder="璇疯緭鍏ュ鍚�" />
+          </el-form-item>
+          <el-form-item label="鎬у埆" prop="sex" class="col-1-3">
+            <el-radio-group v-model="form.sex">
+              <el-radio label="1">鐢�</el-radio>
+              <el-radio label="2">濂�</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="璇佷欢鍙风爜" prop="idCardNo" class="col-1-3">
+            <el-input v-model="form.idCardNo" placeholder="璇疯緭鍏ヨ瘉浠跺彿鐮�" maxlength="18" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�4琛岋細鍥界睄 / 璇佷欢绫诲瀷 / 鍑虹敓鏃ユ湡 -->
+        <div class="form-row">
+          <el-form-item label="鍥界睄" prop="nationality" class="col-1-3">
+            <el-select v-model="form.nationality" placeholder="璇烽�夋嫨鍥界睄" style="width: 100%">
+              <el-option v-for="dict in nationalityOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="璇佷欢绫诲瀷" prop="idCardType" class="col-1-3">
+            <el-select v-model="form.idCardType" placeholder="璇烽�夋嫨璇佷欢绫诲瀷" style="width: 100%">
+              <el-option v-for="dict in idCardTypeOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鍑虹敓鏃ユ湡" prop="birthDate" class="col-1-3">
+            <el-date-picker v-model="form.birthDate" type="date" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨鍑虹敓鏃ユ湡" style="width: 100%" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�5琛岋細浣忓潃锛堢渷甯傚尯鑱斿姩 + 璇︾粏鍦板潃锛屾弧琛岋級 -->
+        <div class="form-row">
+          <el-form-item label="浣忓潃" prop="addressArr" class="col-full">
+            <el-cascader v-model="form.addressArr" :options="regionData" :props="{ expandTrigger: 'hover' }" placeholder="璇烽�夋嫨鐪�/甯�/鍖�" style="width: 280px" />
+            <el-input v-model="form.addressDetail" placeholder="xx璺痻x鍙穢x瀹わ紙鍚岃瘉浠舵墍鍐欏湴鍧�涓�鑷达級" style="flex: 1; margin-left: 10px" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�6琛岋細鐜板眳浣忓湴锛堟弧琛岋級 -->
+        <div class="form-row">
+          <el-form-item label="鐜板眳浣忓湴" prop="currentAddressArr" class="col-full">
+            <el-cascader v-model="form.currentAddressArr" :options="regionData" :props="{ expandTrigger: 'hover' }" placeholder="璇烽�夋嫨鐪�/甯�/鍖�" style="width: 280px" />
+            <el-input v-model="form.currentAddressDetail" placeholder="xx璺痻x鍙穢x瀹�" style="flex: 1; margin-left: 10px" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�7琛岋細琛�鍨�+RH / 浣忛櫌鍙� / 鐤剧梾璇婃柇 -->
+        <div class="form-row">
+          <el-form-item label="琛�鍨�" prop="bloodType" class="col-1-3">
+            <el-select v-model="form.bloodType" placeholder="璇烽�夋嫨" style="flex: 1">
+              <el-option label="A" value="A" />
+              <el-option label="B" value="B" />
+              <el-option label="AB" value="AB" />
+              <el-option label="O" value="O" />
+            </el-select>
+            <el-select v-model="form.rhType" placeholder="璇烽�夋嫨" style="flex: 1; margin-left: 8px">
+              <el-option label="RH闃虫��" value="1" />
+              <el-option label="RH闃存��" value="2" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="浣忛櫌鍙�" prop="hospitalNo" class="col-1-3">
+            <el-input v-model="form.hospitalNo" placeholder="璇疯緭鍏ヤ綇闄㈠彿" />
+          </el-form-item>
+          <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisName" class="col-1-3">
+            <el-input v-model="form.diagnosisName" placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂�" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�8琛岋細鐤剧梾绫诲瀷锛堟弧琛屽閫夛級 -->
+        <div class="form-row">
+          <el-form-item label="鐤剧梾绫诲瀷" prop="diseaseType" class="col-full">
+            <el-checkbox-group v-model="form.diseaseType">
+              <el-checkbox v-for="item in diseaseTypeOptions" :key="item" :label="item">{{ item }}</el-checkbox>
+            </el-checkbox-group>
+            <el-input v-if="form.diseaseType.includes('鍏朵粬')" v-model="form.diseaseTypeOther" placeholder="璇疯緭鍏ュ叾浠栫柧鐥呯被鍨�" style="width: 300px; margin-left: 10px" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�9琛岋細浼犳煋鐥呮儏鎯呭喌锛堟弧琛屽閫夛級 -->
+        <div class="form-row">
+          <el-form-item label="浼犳煋鐥呮儏鎯呭喌" prop="infectiousDisease" class="col-full">
+            <el-checkbox-group v-model="form.infectiousDisease">
+              <el-checkbox v-for="item in infectiousOptions" :key="item" :label="item">{{ item }}</el-checkbox>
+            </el-checkbox-group>
+            <el-input v-if="form.infectiousDisease.includes('鍏朵粬')" v-model="form.infectiousDiseaseOther" placeholder="濡傛湁璇峰嬀閫夋垨濉啓鐩稿簲椤�" style="width: 300px; margin-left: 10px" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�10琛岋細鐥呬汉鐘跺喌锛堟弧琛屽閫夛級 -->
+        <div class="form-row">
+          <el-form-item label="鐥呬汉鐘跺喌" prop="patientStatus" class="col-full">
+            <el-checkbox-group v-model="form.patientStatus">
+              <el-checkbox label="娣卞害鏄忚糠">娣卞害鏄忚糠</el-checkbox>
+              <el-checkbox label="鏃犺嚜涓诲懠鍚�">鏃犺嚜涓诲懠鍚�</el-checkbox>
+            </el-checkbox-group>
+          </el-form-item>
+        </div>
+
+        <!-- 绗�11琛岋細鍏朵粬鎯呭喌锛堟弧琛屽閫夛級 -->
+        <div class="form-row">
+          <el-form-item label="鍏朵粬鎯呭喌" prop="otherSituation" class="col-full">
+            <el-checkbox-group v-model="form.otherSituation">
+              <el-checkbox v-for="item in otherSituationOptions" :key="item" :label="item">{{ item }}</el-checkbox>
+            </el-checkbox-group>
+          </el-form-item>
+        </div>
+
+        <!-- 绗�12琛岋細鏈汉鎹愮尞鎰忔効(2/3) + 鐧昏缂栧彿(1/3) -->
+        <div class="form-row">
+          <el-form-item label="鏈汉鎹愮尞鎰忔効" prop="donationWill" class="col-2-3">
+            <el-radio-group v-model="form.donationWill">
+              <el-radio label="1">蹇楁効鐧昏鍚屾剰</el-radio>
+              <el-radio label="2">涔﹂潰鍚屾剰锛堥仐灞烇級</el-radio>
+              <el-radio label="3">鏈〃绀轰笉鍚屾剰</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="鐧昏缂栧彿" class="col-1-3">
+            <el-link type="primary" :underline="false" @click="handleGetRegisterNo">
+              {{ form.registerNo || '蹇楁効鐧昏鍚屾剰鑾峰彇蹇楁効鐧昏淇℃伅' }}
+            </el-link>
+          </el-form-item>
+        </div>
+
+        <!-- 绗�13琛岋細浜插睘鍏崇郴鐘跺喌锛堟弧琛屽閫夛級 -->
+        <div class="form-row">
+          <el-form-item label="浜插睘鍏崇郴鐘跺喌" prop="relativeRelation" class="col-full">
+            <el-checkbox-group v-model="form.relativeRelation">
+              <el-checkbox v-for="item in relativeRelationOptions" :key="item" :label="item">{{ item }}</el-checkbox>
+            </el-checkbox-group>
+            <el-input v-if="form.relativeRelation.includes('鍏朵粬')" v-model="form.relativeRelationOther" placeholder="璇疯緭鍏ュ叾浠栦翰灞炲叧绯�" style="width: 300px; margin-left: 10px" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�14琛岋細涓昏浜插睘锛堢瀛楋級(1/2) + 涓庢綔鍦ㄦ崘鐚�呭叧绯�(1/2) -->
+        <div class="form-row">
+          <el-form-item label="涓昏浜插睘锛堢瀛楋級" prop="mainRelativeName" class="col-half">
+            <el-input v-model="form.mainRelativeName" placeholder="璇疯緭鍏ヤ富瑕佷翰灞炲鍚�" />
+          </el-form-item>
+          <el-form-item label="涓庢綔鍦ㄦ崘鐚�呭叧绯�" prop="mainRelativeRelation" class="col-half">
+            <el-select v-model="form.mainRelativeRelation" placeholder="璇烽�夋嫨鍏崇郴" style="width: 100%">
+              <el-option label="閰嶅伓" value="閰嶅伓" />
+              <el-option label="瀛愬コ" value="瀛愬コ" />
+              <el-option label="鐖朵翰" value="鐖朵翰" />
+              <el-option label="姣嶄翰" value="姣嶄翰" />
+              <el-option label="鍏朵粬" value="鍏朵粬" />
+            </el-select>
+          </el-form-item>
+        </div>
+
+        <!-- 绗�15琛岋細淇℃伅鏉ユ簮锛堟弧琛屽崟閫夛級 -->
+        <div class="form-row">
+          <el-form-item label="淇℃伅鏉ユ簮" prop="infoSource" class="col-full">
+            <el-radio-group v-model="form.infoSource">
+              <el-radio v-for="item in infoSourceOptions" :key="item" :label="item">{{ item }}</el-radio>
+            </el-radio-group>
+            <el-input v-if="form.infoSource === '鍏朵粬淇℃伅鏉ユ簮'" v-model="form.infoSourceOther" placeholder="璇疯緭鍏ュ叾浠栦俊鎭潵婧�" style="width: 300px; margin-left: 10px" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�16琛岋細浜轰綋鍣ㄥ畼鑾峰彇缁勭粐锛堟弧琛岋紝鍙垹闄ゆ爣绛撅級 -->
+        <div class="form-row">
+          <el-form-item label="浜轰綋鍣ㄥ畼鑾峰彇缁勭粐" prop="opoOrg" class="col-full">
+            <el-tag v-if="form.opoOrg" closable type="info" @close="form.opoOrg = ''">{{ form.opoOrg }}</el-tag>
+            <el-button v-else type="text" icon="el-icon-plus" @click="form.opoOrg = '闈掑矝澶у闄勫睘鍖婚櫌'">閫夋嫨鑾峰彇缁勭粐</el-button>
+          </el-form-item>
+        </div>
+
+        <!-- 绗�17琛岋細鐧昏琛紙婊¤涓婁紶锛� -->
+        <div class="form-row">
+          <el-form-item label="鐧昏琛�" prop="registerFormFile" class="col-full">
+            <el-upload action="#" :auto-upload="false" :file-list="form.registerFormFile" list-type="picture-card" :on-change="(f, fl) => handleUploadChange('registerFormFile', f, fl)" :on-remove="(f, fl) => handleUploadRemove('registerFormFile', f, fl)" accept=".jpg,.jpeg,.png,.pdf">
+              <el-button size="small" type="success" icon="el-icon-upload2">涓婁紶鍥剧墖</el-button>
+            </el-upload>
+            <span class="upload-tip">璇蜂笂浼犮�婁汉浣撳櫒瀹樻綔鍦ㄦ崘鐚�呯櫥璁拌〃銆嬶紙鍘熷绛惧瓧琛級锛屽繀濉��</span>
+          </el-form-item>
+        </div>
+
+        <!-- 绗�18琛岋細璇佷欢鐓э紙婊¤涓婁紶锛� -->
+        <div class="form-row">
+          <el-form-item label="璇佷欢鐓�" prop="idPhotoFile" class="col-full">
+            <el-upload action="#" :auto-upload="false" :file-list="form.idPhotoFile" list-type="picture-card" :on-change="(f, fl) => handleUploadChange('idPhotoFile', f, fl)" :on-remove="(f, fl) => handleUploadRemove('idPhotoFile', f, fl)" accept=".jpg,.jpeg,.png,.pdf">
+              <el-button size="small" type="success" icon="el-icon-upload2">涓婁紶鍥剧墖</el-button>
+            </el-upload>
+            <span class="upload-tip">璇蜂笂浼犳綔鍦ㄦ崘鐚�呮硶瀹氳韩浠借瘉浠剁収鐗囨垨澶嶅嵃浠讹紝蹇呭~銆�</span>
+          </el-form-item>
+        </div>
+
+        <!-- 绗�19琛岋細鐤剧梾璇婃柇璧勬枡锛堟弧琛屼笂浼狅級 -->
+        <div class="form-row">
+          <el-form-item label="鐤剧梾璇婃柇璧勬枡" prop="diagnosisFile" class="col-full">
+            <el-upload action="#" :auto-upload="false" :file-list="form.diagnosisFile" list-type="picture-card" :on-change="(f, fl) => handleUploadChange('diagnosisFile', f, fl)" :on-remove="(f, fl) => handleUploadRemove('diagnosisFile', f, fl)" accept=".jpg,.jpeg,.png,.pdf">
+              <el-button size="small" type="success" icon="el-icon-upload2">涓婁紶鍥剧墖</el-button>
+            </el-upload>
+            <span class="upload-tip">璇蜂笂浼犳綔鍦ㄦ崘鐚�呯柧鐥呰瘖鏂祫鏂欙紙澶嶅嵃浠讹級绛夈��</span>
+          </el-form-item>
+        </div>
+
+        <!-- 绗�20琛岋細鎶ュ憡浜� / 鑱旂郴鐢佃瘽 / 鎶ュ憡鏃ユ湡 -->
+        <div class="form-row">
+          <el-form-item label="鎶ュ憡浜�" prop="reporter" class="col-1-3">
+            <el-input v-model="form.reporter" placeholder="璇疯緭鍏ユ姤鍛婁汉" />
+          </el-form-item>
+          <el-form-item label="鑱旂郴鐢佃瘽" prop="reportPhone" class="col-1-3">
+            <el-input v-model="form.reportPhone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" maxlength="11" />
+          </el-form-item>
+          <el-form-item label="鎶ュ憡鏃ユ湡" prop="reportDate" class="col-1-3">
+            <el-date-picker v-model="form.reportDate" type="date" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨鎶ュ憡鏃ユ湡" style="width: 100%" />
+          </el-form-item>
+        </div>
+
+        <!-- 绗�21琛岋細涓鍘熷洜锛堟弧琛屽閫夛級 -->
+        <div class="form-row">
+          <el-form-item label="涓鍘熷洜" prop="stopReason" class="col-full">
+            <el-checkbox-group v-model="form.stopReason">
+              <el-checkbox v-for="item in stopReasonOptions" :key="item" :label="item">{{ item }}</el-checkbox>
+            </el-checkbox-group>
+            <el-input v-if="form.stopReason.includes('鍏朵粬涓鍘熷洜')" v-model="form.stopReasonOther" placeholder="璇疯緭鍏ュ叾浠栦腑姝㈠師鍥�" style="width: 300px; margin-left: 10px" />
+          </el-form-item>
+        </div>
+      </el-form>
+    </el-card>
+
+    <!-- 搴曢儴鎿嶄綔鎸夐挳 -->
+    <div class="register-footer">
+      <el-button type="primary" :loading="saveLoading" @click="handleSave">淇濆瓨</el-button>
+      <el-button type="success" :loading="submitLoading" @click="handleSubmit">鎻愪氦淇℃伅</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { regionData } from "element-china-area-data";
+
+export default {
+  name: "PotentialDonorRegister",
+  data() {
+    return {
+      // 鐪佸競鍖鸿仈鍔ㄦ暟鎹簮
+      regionData,
+      saveLoading: false,
+      submitLoading: false,
+
+      // 涓嬫媺/澶氶�� 閫夐」
+      nationalityOptions: [
+        { value: "1", label: "涓浗澶ч檰" },
+        { value: "2", label: "涓浗棣欐腐" },
+        { value: "3", label: "涓浗婢抽棬" },
+        { value: "4", label: "涓浗鍙版咕" },
+        { value: "5", label: "鍏朵粬" }
+      ],
+      idCardTypeOptions: [
+        { value: "1", label: "灞呮皯韬唤璇�" },
+        { value: "2", label: "鎶ょ収" },
+        { value: "3", label: "鍐涘畼璇�" },
+        { value: "4", label: "鍏朵粬" }
+      ],
+      diseaseTypeOptions: ["鑴戣绠″", "鑴戝浼�", "缂鸿缂烘哀鎬ц剳鐥�", "鑴戣偪鐦�", "蹇冭绠$柧鐥�", "鍏朵粬"],
+      infectiousOptions: ["涔欒倽", "涓欒倽", "姊呮瘨", "鑹炬粙鐥�", "鍏朵粬"],
+      otherSituationOptions: ["浜ら�氫簨鏁�", "鍒戜簨妗堜欢", "宸ヤ激浜嬫晠", "鍏朵粬鎰忓浜嬫晠"],
+      relativeRelationOptions: ["閰嶅伓", "瀛愬コ", "鐖朵翰", "姣嶄翰", "鍏朵粬"],
+      infoSourceOptions: ["绾㈠崄瀛椾細", "鍖荤枟鏈烘瀯", "浜插睘", "浜ら��", "鍏畨", "鍏朵粬淇℃伅鏉ユ簮"],
+      stopReasonOptions: ["浜插睘鍙嶅", "缁忔不鐤楃梾鎯呭ソ杞�", "閿欒繃鎹愮尞鏃舵満", "鍏朵粬涓鍘熷洜"],
+
+      form: {
+        // 绗�1琛�
+        province: "灞变笢鐪�",
+        treatmentHospitalName: "闈掑矝澶у闄勫睘鍖婚櫌",
+        department: "鎬ヨ瘖绉�",
+        // 绗�2琛�
+        donationNo: "SD-2026-00258",
+        firstTreatmentHospitalName: "闈掑矝甯傚競绔嬪尰闄�",
+        firstDepartment: "绁炵粡澶栫",
+        // 绗�3琛�
+        name: "寮犱笁",
+        sex: "1",
+        idCardNo: "370202198805151234",
+        // 绗�4琛�
+        nationality: "1",
+        idCardType: "1",
+        birthDate: "1988-05-15",
+        // 绗�5琛� 浣忓潃锛堝北涓滅渷闈掑矝甯傚競鍖楀尯锛�
+        addressArr: ["370000", "370200", "370203"],
+        addressDetail: "浜烘皯璺�123鍙�5鍙锋ゼ201瀹�",
+        // 绗�6琛� 鐜板眳浣忓湴锛堝悓涓婏級
+        currentAddressArr: ["370000", "370200", "370203"],
+        currentAddressDetail: "鍙颁笢璺�88鍙�3鍗曞厓602瀹�",
+        // 绗�7琛�
+        bloodType: "A",
+        rhType: "1",
+        hospitalNo: "20260815-032",
+        diagnosisName: "鑴戝嚭琛�",
+        // 绗�8琛�
+        diseaseType: ["鑴戣绠″"],
+        diseaseTypeOther: "",
+        // 绗�9琛�
+        infectiousDisease: ["涔欒倽"],
+        infectiousDiseaseOther: "",
+        // 绗�10琛�
+        patientStatus: ["娣卞害鏄忚糠"],
+        // 绗�11琛�
+        otherSituation: ["浜ら�氫簨鏁�"],
+        // 绗�12琛�
+        donationWill: "1",
+        registerNo: "ZYDJ-2026-00258",
+        // 绗�13琛�
+        relativeRelation: ["閰嶅伓"],
+        relativeRelationOther: "",
+        // 绗�14琛�
+        mainRelativeName: "鏉庡洓",
+        mainRelativeRelation: "閰嶅伓",
+        // 绗�15琛�
+        infoSource: "鍖荤枟鏈烘瀯",
+        infoSourceOther: "",
+        // 绗�16琛�
+        opoOrg: "闈掑矝澶у闄勫睘鍖婚櫌",
+        // 绗�17~19琛� 鏂囦欢锛堝亣鏁版嵁锛屼粎鐢ㄤ簬灞曠ず宸蹭笂浼犵缉鐣ュ浘锛�
+        registerFormFile: [{ name: "鐧昏琛�.jpg", url: "https://picsum.photos/200/200?random=8" }],
+        idPhotoFile: [{ name: "韬唤璇�.jpg", url: "https://picsum.photos/200/200?random=9" }],
+        diagnosisFile: [{ name: "璇婃柇璇佹槑.jpg", url: "https://picsum.photos/200/200?random=10" }],
+        // 绗�20琛�
+        reporter: "鐜嬪崗璋冨憳",
+        reportPhone: "18661808259",
+        reportDate: "2026-08-20",
+        // 绗�21琛�
+        stopReason: [],
+        stopReasonOther: ""
+      },
+      rules: {
+        province: [{ required: true, message: "璇疯緭鍏ョ渷浠�", trigger: "blur" }],
+        treatmentHospitalName: [{ required: true, message: "璇疯緭鍏ユ墍鍦ㄥ尰鐤楁満鏋�", trigger: "blur" }],
+        firstTreatmentHospitalName: [{ required: true, message: "璇疯緭鍏ラ璇婂尰鐤楁満鏋�", trigger: "blur" }],
+        name: [{ required: true, message: "璇疯緭鍏ュ鍚�", trigger: "blur" }],
+        sex: [{ required: true, message: "璇烽�夋嫨鎬у埆", trigger: "change" }],
+        idCardNo: [{ required: true, message: "璇疯緭鍏ヨ瘉浠跺彿鐮�", trigger: "blur" }],
+        nationality: [{ required: true, message: "璇烽�夋嫨鍥界睄", trigger: "change" }],
+        idCardType: [{ required: true, message: "璇烽�夋嫨璇佷欢绫诲瀷", trigger: "change" }],
+        birthDate: [{ required: true, message: "璇烽�夋嫨鍑虹敓鏃ユ湡", trigger: "change" }],
+        addressArr: [{ required: true, message: "璇烽�夋嫨浣忓潃鐪�/甯�/鍖�", trigger: "change" }],
+        currentAddressArr: [{ required: true, message: "璇烽�夋嫨鐜板眳浣忓湴鐪�/甯�/鍖�", trigger: "change" }],
+        bloodType: [{ required: true, message: "璇烽�夋嫨琛�鍨�", trigger: "change" }],
+        hospitalNo: [{ required: true, message: "璇疯緭鍏ヤ綇闄㈠彿", trigger: "blur" }],
+        diagnosisName: [{ required: true, message: "璇疯緭鍏ョ柧鐥呰瘖鏂�", trigger: "blur" }],
+        donationWill: [{ required: true, message: "璇烽�夋嫨鏈汉鎹愮尞鎰忔効", trigger: "change" }],
+        relativeRelation: [{ required: true, message: "璇烽�夋嫨浜插睘鍏崇郴鐘跺喌", trigger: "change" }],
+        mainRelativeName: [{ required: true, message: "璇疯緭鍏ヤ富瑕佷翰灞炲鍚�", trigger: "blur" }],
+        mainRelativeRelation: [{ required: true, message: "璇烽�夋嫨涓庢綔鍦ㄦ崘鐚�呭叧绯�", trigger: "change" }],
+        infoSource: [{ required: true, message: "璇烽�夋嫨淇℃伅鏉ユ簮", trigger: "change" }],
+        registerFormFile: [{ required: true, message: "璇蜂笂浼犵櫥璁拌〃", trigger: "change" }],
+        idPhotoFile: [{ required: true, message: "璇蜂笂浼犺瘉浠剁収", trigger: "change" }],
+        diagnosisFile: [{ required: true, message: "璇蜂笂浼犵柧鐥呰瘖鏂祫鏂�", trigger: "change" }],
+        reporter: [{ required: true, message: "璇疯緭鍏ユ姤鍛婁汉", trigger: "blur" }],
+        reportPhone: [
+          { required: true, message: "璇疯緭鍏ヨ仈绯荤數璇�", trigger: "blur" },
+          { pattern: /^1[3-9]\d{9}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙�", trigger: "blur" }
+        ],
+        reportDate: [{ required: true, message: "璇烽�夋嫨鎶ュ憡鏃ユ湡", trigger: "change" }]
+      }
+    };
+  },
+  methods: {
+    // 鏂囦欢涓婁紶鍙樺寲
+    handleUploadChange(field, file, fileList) {
+      this.form[field] = fileList;
+      this.$refs.registerForm.validateField(field);
+    },
+    handleUploadRemove(field, file, fileList) {
+      this.form[field] = fileList;
+      this.$refs.registerForm.validateField(field);
+    },
+
+    // 蹇楁効鐧昏缂栧彿锛堝崰浣嶏級
+    handleGetRegisterNo() {
+      this.form.registerNo = "ZYDJ-" + Date.now();
+      this.$message.success("宸茶幏鍙栧織鎰跨櫥璁扮紪鍙�");
+    },
+
+    // 淇濆瓨锛堢函鍓嶇鍋囨暟鎹紝涓嶈皟鍚庣锛�
+    handleSave() {
+      this.saveLoading = true;
+      setTimeout(() => {
+        this.saveLoading = false;
+        this.$message.success("淇濆瓨鎴愬姛锛堝亣鏁版嵁锛屾湭鎻愪氦鍚庣锛�");
+      }, 500);
+    },
+
+    // 鎻愪氦锛堢函鍓嶇鍋囨暟鎹紝涓嶈皟鍚庣锛�
+    handleSubmit() {
+      this.submitLoading = true;
+      setTimeout(() => {
+        this.submitLoading = false;
+        this.$message.success("鎻愪氦鎴愬姛锛堝亣鏁版嵁锛屾湭鎻愪氦鍚庣锛�");
+      }, 500);
+    }
+  }
+};
+</script>
+
+<style scoped>
+.donor-register {
+  padding: 20px;
+}
+
+/* 鏍囬鍖� */
+.register-header {
+  text-align: center;
+  margin-bottom: 20px;
+}
+.register-title {
+  font-size: 20px;
+  font-weight: bold;
+  color: #303133;
+  margin: 0 0 8px 0;
+}
+.register-tip {
+  font-size: 13px;
+  color: #909399;
+  margin: 0;
+}
+.required-star {
+  color: #f56c6c;
+}
+
+.register-card {
+  margin-bottom: 20px;
+}
+.register-card >>> .el-card__body {
+  padding: 16px;
+}
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍稿績鏍峰紡 ===== */
+/* 瀹瑰櫒鍙敾銆屼笂銆佸乏銆嶄袱鏉″杈规锛岄厤鍚堟瘡涓崟鍏冩牸鐨勩�屽彸銆佷笅銆嶈竟妗嗘嫾鎴愬畬鏁寸綉鏍� */
+.register-form {
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+/* 姣忎竴琛屼负 flex 琛岋紝鑷甫涓婅竟妗嗕繚璇佺綉鏍艰繛缁�� */
+.register-form >>> .form-row {
+  display: flex;
+  width: 100%;
+  border-top: 1px solid #d0d3db;
+}
+
+/* 鍗曞厓鏍硷細榛樿涓夊垎涔嬩竴鍒楋紝鐢诲彸銆佷笅涓ゆ潯杈� */
+.register-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.register-form >>> .el-form-item::after,
+.register-form >>> .el-form-item::before {
+  display: none;
+}
+
+/* 鍒楀鎺у埗 */
+.register-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.register-form >>> .col-half { flex: 0 0 50%; }
+.register-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.register-form >>> .col-full { flex: 0 0 100%; }
+
+/* 鏍囬鏍硷細鐏板簳銆佸眳涓�佸姞绮楋紝鍙宠竟涓�鏉″垎闅旂嚎 */
+.register-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #ecf5ff;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+/* 蹇呭~椤规槦鍙风孩鑹� */
+.register-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+/* 鍐呭鏍硷細鐧藉簳銆佸瀭鐩村眳涓�佽嚜閫傚簲鍐呭 */
+.register-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
+
+/* 鏍¢獙鍑洪敊鏃舵爣棰樻牸涓嶅彉绾紝浠呭唴瀹瑰尯鏂囧瓧鎻愮ず鍗冲彲 */
+.register-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label {
+  background: #ecf5ff;
+}
+
+/* 涓婁紶鎻愮ず鏂囧瓧 */
+.upload-tip {
+  font-size: 12px;
+  color: #909399;
+  margin-left: 12px;
+}
+
+/* 搴曢儴鎸夐挳 */
+.register-footer {
+  text-align: center;
+  margin: 20px 0;
+}
+.register-footer .el-button {
+  min-width: 120px;
+  margin: 0 10px;
+}
+</style>
diff --git a/src/views/business/course/components/DeathJudgmentStage.vue b/src/views/business/course/components/DeathJudgmentStage.vue
index b71bcf0..e4a5555 100644
--- a/src/views/business/course/components/DeathJudgmentStage.vue
+++ b/src/views/business/course/components/DeathJudgmentStage.vue
@@ -1,6 +1,6 @@
 <template>
   <div class="death-judgment-detail">
-    <!-- <case-basic-info :case-id="caseId" :show-attachment="true" /> -->
+    <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
     <!-- 鍏叡淇℃伅妯″潡锛堢嫭绔嬫樉绀猴級 -->
 
     <!-- 鍒ゅ畾绫诲瀷鏍囩椤� -->
@@ -56,65 +56,15 @@
         <span class="detail-title">鑴戞浜″垽瀹氫俊鎭�</span>
       </div>
 
-      <el-form :model="form" ref="brainForm" :rules="rules" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="姝讳骸鍘熷洜" prop="deathreason">
-              <el-input v-model="form.deathreason" :readonly="!isEdit" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="姝讳骸鏃堕棿" prop="deathtime">
-              <el-date-picker
-                v-model="form.deathtime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-                :disabled="!isEdit"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="deathjudgedocto">
-              <el-input v-model="form.deathjudgedocto" :readonly="!isEdit" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="deathjudgedoctt">
-              <el-input v-model="form.deathjudgedoctt" :readonly="!isEdit" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓">
-              <div
-                v-for="(doctor, index) in brainExtraDoctors"
-                :key="index"
-                style="display: flex; align-items: center; margin-bottom: 8px;"
-              >
-                <el-input
-                  v-model="brainExtraDoctors[index]"
-                  placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
-                  style="flex: 1; margin-right: 10px;"
-                  :readonly="!isEdit"
-                />
-                <el-button
-                  v-if="isEdit"
-                  type="danger"
-                  icon="el-icon-minus"
-                  circle
-                  size="mini"
-                  @click="removeBrainDoctor(index)"
-                />
-              </div>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
+      <el-descriptions title="鑴戞浜″垽瀹氫俊鎭�" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="姝讳骸鍘熷洜">{{ form.deathreason || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="姝讳骸鏃堕棿">{{ form.deathtime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍒ゅ畾鍖荤敓涓�">{{ form.deathjudgedocto || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍒ゅ畾鍖荤敓浜�">{{ form.deathjudgedoctt || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍏朵粬鍒ゅ畾鍖荤敓">
+          {{ brainExtraDoctors.filter(d => d && d.trim()).join('銆�') || '-' }}
+        </el-descriptions-item>
+      </el-descriptions>
 
       <!-- 鑴戞浜¤瘎浼拌〃闄勪欢 -->
       <div class="attachment-section">
@@ -131,21 +81,6 @@
             :name="type.value"
           >
             <div class="attachment-upload-section">
-              <div class="upload-header">
-                <span class="upload-title">{{ type.label }}</span>
-                <el-tooltip content="鐐瑰嚮涓婁紶璇ョ被鍨嬭瘎浼拌〃" placement="top">
-                  <el-button
-                    size="mini"
-                    type="primary"
-                    icon="el-icon-plus"
-                    @click="openUploadDialog(type.value)"
-                    :disabled="!isEdit"
-                  >
-                    娣诲姞璇勪及琛�
-                  </el-button>
-                </el-tooltip>
-              </div>
-
               <!-- 闄勪欢鍒楄〃 -->
               <el-table
                 :data="getAttachmentsByType(type.value)"
@@ -190,7 +125,7 @@
                   </template>
                 </el-table-column>
 
-                <el-table-column label="鎿嶄綔" width="180" align="center">
+                <el-table-column label="鎿嶄綔" width="140" align="center">
                   <template slot-scope="scope">
                     <el-button
                       size="mini"
@@ -205,15 +140,6 @@
                       icon="el-icon-download"
                       @click="handleDownload(scope.row)"
                       >涓嬭浇</el-button
-                    >
-                    <el-button
-                      v-if="isEdit"
-                      size="mini"
-                      type="text"
-                      icon="el-icon-delete"
-                      style="color: #F56C6C;"
-                      @click="handleRemoveAttachment(scope.row)"
-                      >鍒犻櫎</el-button
                     >
                   </template>
                 </el-table-column>
@@ -238,99 +164,17 @@
     <el-card v-else class="detail-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">蹇冩浜″垽瀹氫俊鎭�</span>
-        <el-button
-          v-if="isEdit"
-          style="float: right; margin-left: 10px;"
-          type="success"
-          @click="handleSave"
-          :loading="saveLoading"
-        >
-          淇濆瓨淇℃伅
-        </el-button>
-        <el-button
-          v-else
-          style="float: right; margin-left: 10px;"
-          type="primary"
-          @click="handleEdit"
-        >
-          缂栬緫淇℃伅
-        </el-button>
       </div>
 
-      <el-form :model="form" ref="heartForm" :rules="rules" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="蹇冩浜″師鍥�" prop="heartdeathreason">
-              <el-input v-model="form.heartdeathreason" :readonly="!isEdit" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="蹇冩浜″垽瀹氬畬鎴愭椂闂�" prop="heartdeathtime">
-              <el-date-picker
-                v-model="form.heartdeathtime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-                :disabled="!isEdit"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="heartdeathjudgedocto">
-              <el-input
-                v-model="form.heartdeathjudgedocto"
-                :readonly="!isEdit"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="heartdeathjudgedoctt">
-              <el-input
-                v-model="form.heartdeathjudgedoctt"
-                :readonly="!isEdit"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓">
-              <div
-                v-for="(doctor, index) in heartExtraDoctors"
-                :key="index"
-                style="display: flex; align-items: center; margin-bottom: 8px;"
-              >
-                <el-input
-                  v-model="heartExtraDoctors[index]"
-                  placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
-                  style="flex: 1; margin-right: 10px;"
-                  :readonly="!isEdit"
-                />
-                <el-button
-                  v-if="isEdit"
-                  type="danger"
-                  icon="el-icon-minus"
-                  circle
-                  size="mini"
-                  @click="removeHeartDoctor(index)"
-                />
-              </div>
-              <el-button
-                v-if="isEdit"
-                type="primary"
-                icon="el-icon-plus"
-                size="small"
-                @click="addHeartDoctor"
-              >
-                娣诲姞鍖荤敓
-              </el-button>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
+      <el-descriptions title="蹇冩浜″垽瀹氫俊鎭�" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="蹇冩浜″師鍥�">{{ form.heartdeathreason || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="蹇冩浜″垽瀹氬畬鎴愭椂闂�">{{ form.heartdeathtime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍒ゅ畾鍖荤敓涓�">{{ form.heartdeathjudgedocto || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍒ゅ畾鍖荤敓浜�">{{ form.heartdeathjudgedoctt || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍏朵粬鍒ゅ畾鍖荤敓">
+          {{ heartExtraDoctors.filter(d => d && d.trim()).join('銆�') || '-' }}
+        </el-descriptions-item>
+      </el-descriptions>
 
       <!-- 蹇冩浜¤瘎浼拌〃闄勪欢 -->
       <div class="attachment-section">
@@ -347,21 +191,6 @@
             :name="type.value"
           >
             <div class="attachment-upload-section">
-              <div class="upload-header">
-                <span class="upload-title">{{ type.label }}</span>
-                <el-tooltip content="鐐瑰嚮涓婁紶璇ョ被鍨嬭瘎浼拌〃" placement="top">
-                  <el-button
-                    size="mini"
-                    type="primary"
-                    icon="el-icon-plus"
-                    @click="openHeartDeathUploadDialog(type.value)"
-                    :disabled="!isEdit"
-                  >
-                    娣诲姞璇勪及琛�
-                  </el-button>
-                </el-tooltip>
-              </div>
-
               <!-- 蹇冩浜¢檮浠跺垪琛� -->
               <el-table
                 :data="getHeartDeathAttachmentsByType(type.value)"
@@ -406,7 +235,7 @@
                   </template>
                 </el-table-column>
 
-                <el-table-column label="鎿嶄綔" width="180" align="center">
+                <el-table-column label="鎿嶄綔" width="140" align="center">
                   <template slot-scope="scope">
                     <el-button
                       size="mini"
@@ -421,15 +250,6 @@
                       icon="el-icon-download"
                       @click="handleDownload(scope.row)"
                       >涓嬭浇</el-button
-                    >
-                    <el-button
-                      v-if="isEdit"
-                      size="mini"
-                      type="text"
-                      icon="el-icon-delete"
-                      style="color: #F56C6C;"
-                      @click="handleRemoveHeartDeathAttachment(scope.row)"
-                      >鍒犻櫎</el-button
                     >
                   </template>
                 </el-table-column>
@@ -449,112 +269,6 @@
         </el-tabs>
       </div>
     </el-card>
-    <!-- 搴曢儴鎿嶄綔鎸夐挳 -->
-    <div style="text-align: center; margin: 30px 0;">
-      <el-button
-        v-if="isEdit"
-        type="primary"
-        @click="handleSave"
-        :loading="saveLoading"
-      >
-        淇濆瓨淇℃伅
-      </el-button>
-      <el-button
-        v-if="isEdit"
-        type="success"
-        @click="accomplish"
-        :loading="saveLoading"
-      >
-        瀹屾垚鍒ゅ畾
-      </el-button>
-    </div>
-    <!-- 涓婁紶瀵硅瘽妗嗭紙鑴戞浜★級 -->
-    <el-dialog
-      :title="`涓婁紶${getCurrentBrainDeathTypeLabel}璇勪及琛╜"
-      :visible.sync="uploadDialogVisible"
-      width="500px"
-      :close-on-click-modal="false"
-    >
-      <el-upload
-        ref="uploadRef"
-        class="upload-demo"
-        drag
-        :action="uploadAction"
-        :headers="headers"
-        multiple
-        :file-list="tempFileList"
-        :before-upload="beforeUpload"
-        :on-change="handleFileChange"
-        :on-remove="handleTempRemove"
-        :on-success="handleUploadSuccess"
-        :auto-upload="false"
-      >
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">
-          灏嗚瘎浼拌〃鏂囦欢鎷栧埌姝ゅ锛屾垨<em>鐐瑰嚮涓婁紶</em>
-        </div>
-        <div class="el-upload__tip" slot="tip">
-          鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx銆亁ls銆亁lsx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
-        </div>
-      </el-upload>
-
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="uploadDialogVisible = false">鍙栨秷</el-button>
-        <el-button
-          type="primary"
-          @click="submitUpload"
-          :loading="uploadLoading"
-          :disabled="tempFileList.length === 0"
-        >
-          纭涓婁紶
-        </el-button>
-      </div>
-    </el-dialog>
-
-    <!-- 涓婁紶瀵硅瘽妗嗭紙蹇冩浜★級 -->
-    <el-dialog
-      :title="`涓婁紶${getCurrentHeartDeathTypeLabel}璇勪及琛╜"
-      :visible.sync="heartDeathUploadDialogVisible"
-      width="500px"
-      :close-on-click-modal="false"
-    >
-      <el-upload
-        ref="heartDeathUploadRef"
-        class="upload-demo"
-        drag
-        :action="uploadAction"
-        :headers="headers"
-        multiple
-        :file-list="tempHeartDeathFileList"
-        :before-upload="beforeUpload"
-        :on-change="handleHeartDeathFileChange"
-        :on-remove="handleHeartDeathTempRemove"
-        :on-success="handleHeartDeathUploadSuccess"
-        :auto-upload="false"
-      >
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">
-          灏嗚瘎浼拌〃鏂囦欢鎷栧埌姝ゅ锛屾垨<em>鐐瑰嚮涓婁紶</em>
-        </div>
-        <div class="el-upload__tip" slot="tip">
-          鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx銆亁ls銆亁lsx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
-        </div>
-      </el-upload>
-
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="heartDeathUploadDialogVisible = false"
-          >鍙栨秷</el-button
-        >
-        <el-button
-          type="primary"
-          @click="submitHeartDeathUpload"
-          :loading="heartDeathUploadLoading"
-          :disabled="tempHeartDeathFileList.length === 0"
-        >
-          纭涓婁紶
-        </el-button>
-      </div>
-    </el-dialog>
     <!-- 闄勪欢棰勮 -->
     <FilePreviewDialog
       :visible="previewVisible"
@@ -574,10 +288,12 @@
 import { getToken } from "@/utils/auth";
 import CaseBasicInfo from "@/components/CaseBasicInfo";
 import FilePreviewDialog from "@/components/FilePreviewDialog";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
 
 export default {
   name: "DeathJudgmentDetail",
   components: { CaseBasicInfo, FilePreviewDialog },
+  mixins: [readonlyDescriptionsMixin],
   props: {
     infoid: {
       type: String,
diff --git a/src/views/business/course/components/DonationConfirmStage.vue b/src/views/business/course/components/DonationConfirmStage.vue
index 2320f4c..11fa1c2 100644
--- a/src/views/business/course/components/DonationConfirmStage.vue
+++ b/src/views/business/course/components/DonationConfirmStage.vue
@@ -1,194 +1,90 @@
 <template>
   <div class="confirmation-detail">
+    <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
 
     <el-card class="detail-card">
-      <!-- 鍩虹淇℃伅 -->
       <div slot="header" class="clearfix">
         <span class="detail-title">鎹愮尞纭淇℃伅</span>
-
       </div>
 
-      <el-form :model="form" ref="form" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="鍗忚皟鍛�1" prop="coordinatedusernameo">
-              <el-input v-model="form.coordinatedusernameo" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍗忚皟鍛�2" prop="coordinatedusernamet">
-              <el-input v-model="form.coordinatedusernamet" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="涓氬姟浜哄憳" prop="responsibleusername">
-              <el-input v-model="form.responsibleusername" />
-            </el-form-item>
-          </el-col>
-        </el-row>
+      <el-descriptions title="鍗忚皟鍛樹俊鎭�" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="鍗忚皟鍛�1">{{ form.coordinatedusernameo || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍗忚皟鍛�2">{{ form.coordinatedusernamet || '-' }}</el-descriptions-item>
+      </el-descriptions>
 
-        <el-row :gutter="20">
-          <!-- <el-col :span="8">
-            <el-form-item label="纭鐘舵��" prop="relativeconfirmationsign">
-              <el-select
-                v-model="form.relativeconfirmationsign"
-                style="width: 100%"
+      <el-descriptions title="鎹愮尞鍐冲畾" :column="descriptionColumn" border size="small" style="margin-top: 16px;">
+        <el-descriptions-item label="鎹愮尞鍐冲畾">
+          <template v-if="organdecision && organdecision.length">
+            <el-tag v-for="(item, i) in organdecision" :key="i" size="small" style="margin-right: 8px;">{{ item }}</el-tag>
+          </template>
+          <template v-else>-</template>
+        </el-descriptions-item>
+        <el-descriptions-item v-if="organdecision && organdecision.includes('鍏朵粬')" label="鍏朵粬鎹愮尞鍐冲畾">
+          {{ organdecisionOther || '-' }}
+        </el-descriptions-item>
+      </el-descriptions>
 
-              >
-                <el-option label="鏈‘璁�" value="0" />
-                <el-option label="瀹跺睘纭" value="1" />
-                <el-option label="涓嶅悓鎰忔崘鐚�" value="2" />
-              </el-select>
-            </el-form-item>
-          </el-col> -->
-          <el-col :span="8">
-            <el-form-item label="绛惧瓧鏃堕棿" prop="signdate">
-              <el-date-picker
-                v-model="form.signdate"
-                type="datetime"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-          <!-- <el-col :span="8">
-            <el-form-item label="琛�鍨�" prop="bloodtype">
-              <el-input v-model="form.bloodtype"  />
-            </el-form-item>
-          </el-col> -->
-        </el-row>
+      <el-descriptions title="瀹跺睘鎰忚澶囨敞" :column="1" border size="small" style="margin-top: 16px;">
+        <el-descriptions-item label="瀹跺睘鎰忚澶囨敞">{{ form.relativeRemark || '-' }}</el-descriptions-item>
+      </el-descriptions>
+    </el-card>
 
-        <!-- <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="璇佷欢鍙风爜" prop="idcardno">
-              <el-input v-model="form.idcardno"  />
-            </el-form-item>
-          </el-col>
-        </el-row> -->
+    <!-- 浜插睘纭淇℃伅 -->
+    <el-card class="detail-card">
+      <div slot="header" class="clearfix">
+        <span class="detail-title">浜插睘纭淇℃伅</span>
+      </div>
 
-        <!-- 浜插睘淇℃伅 -->
-        <!-- 浜插睘淇℃伅 -->
-        <el-divider content-position="left">浜插睘纭淇℃伅</el-divider>
-
-        <el-row :gutter="20">
-          <el-col :span="6">
-            <el-form-item label="浜插睘濮撳悕" prop="relativeconfirmationsignname">
-              <el-input
-                v-model="form.relativeconfirmationsignname"
-                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-col :span="6">
-            <el-form-item label="浜插睘韬唤璇�" prop="relativeidcardno">
-              <el-input
-                v-model="form.relativeidcardno"
-                placeholder="璇疯緭鍏ヤ翰灞炶瘉浠跺彿鐮�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="浜插睘鐢佃瘽" prop="relativephone">
-              <el-input
-                v-model="form.relativephone"
-                placeholder="璇疯緭鍏ヤ翰灞炶仈绯荤數璇�"
-              />
-            </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">
-              <el-checkbox
-                v-for="item in organselection"
-                :key="item"
-                :label="item"
-                >{{ item }}
-              </el-checkbox>
-            </el-checkbox-group>
-            <el-input
-              v-if="organdecision.includes('鍏朵粬')"
-              v-model="organdecisionOther"
-              placeholder="璇疯緭鍏ュ叾浠栨崘鐚喅瀹氱殑鍏蜂綋鍐呭"
-              style="margin-top: 10px; width: 300px;"
-            ></el-input>
-          </el-form-item>
-        </el-row>
-
-        <el-form-item label="瀹跺睘鎰忚澶囨敞" prop="relativeRemark">
-          <el-input
-            type="textarea"
-            :rows="3"
-            v-model="form.relativeRemark"
-            placeholder="璁板綍瀹跺睘鐨勬剰瑙佸拰娌熼�氭儏鍐�"
-          />
-        </el-form-item>
-      </el-form>
+      <el-table :data="familyMemberList" size="small" border>
+        <el-table-column label="搴忓彿" width="60" align="center">
+          <template slot-scope="scope">
+            {{ scope.$index + 1 }}
+          </template>
+        </el-table-column>
+        <el-table-column label="濮撳悕" prop="name" min-width="120">
+          <template slot-scope="scope">
+            <span :class="{ 'main-family': scope.$index === 0 }">{{
+              scope.row.name
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="涓庢崘璧犺�呭叧绯�" prop="relation" min-width="140">
+          <template slot-scope="scope">
+            <dict-tag
+              :options="dict.type.sys_FamilyRelation"
+              :value="scope.row.relation"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="韬唤璇佸彿" prop="idcard" min-width="180">
+          <template slot-scope="scope">
+            <span v-if="scope.$index === 0">{{ scope.row.idcard }}</span>
+            <span v-else style="color: #909399;">-</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鑱旂郴鐢佃瘽" prop="phone" min-width="130">
+          <template slot-scope="scope">
+            <span v-if="scope.$index === 0">{{ scope.row.phone }}</span>
+            <span v-else style="color: #909399;">-</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="绫诲瀷" width="70" align="center">
+          <template slot-scope="scope">
+            <el-tag v-if="scope.$index === 0" type="warning" size="small"
+              >涓昏</el-tag
+            >
+            <el-tag v-else type="info" size="small">鍏朵粬</el-tag>
+          </template>
+        </el-table-column>
+      </el-table>
     </el-card>
 
     <!-- 闄勪欢淇℃伅 - 鎸夌被鍨嬪垎绫� -->
     <el-card class="attachment-card">
       <div slot="header" class="clearfix">
-        <span class="detail-title">鐩稿叧闄勪欢涓婁紶</span>
+        <span class="detail-title">鐩稿叧闄勪欢</span>
       </div>
 
-      <!-- 闄勪欢绫诲瀷閫夐」鍗� -->
       <el-tabs v-model="activeAttachmentType" type="card">
         <el-tab-pane
           v-for="type in attachmentTypes"
@@ -197,21 +93,6 @@
           :name="type.value"
         >
           <div class="attachment-section">
-            <div class="attachment-header">
-              <span class="upload-title">{{ type.label }}</span>
-              <el-tooltip content="鐐瑰嚮涓婁紶璇ョ被鍨嬮檮浠�" placement="top">
-                <!-- <el-button
-                  size="mini"
-                  type="primary"
-                  icon="el-icon-plus"
-                  @click="openUploadDialog(type.value)"
-                >
-                  娣诲姞闄勪欢
-                </el-button> -->
-              </el-tooltip>
-            </div>
-
-            <!-- 褰撳墠绫诲瀷鐨勯檮浠跺垪琛� -->
             <div class="attachment-list">
               <el-table
                 :data="getAttachmentsByType(type.value)"
@@ -229,7 +110,7 @@
                   </template>
                 </el-table-column>
 
-                <el-table-column label="鏂囦欢绫诲瀷" width="100" align="center">
+                <el-table-column label="鏂囦欢绫诲瀷" width="90" align="center">
                   <template slot-scope="scope">
                     <el-tag size="small">{{
                       getFileType(scope.row.fileName)
@@ -237,19 +118,19 @@
                   </template>
                 </el-table-column>
 
-                <el-table-column label="鏂囦欢澶у皬" width="100" align="center">
+                <el-table-column label="鏂囦欢澶у皬" width="90" align="center">
                   <template slot-scope="scope">
                     <span>{{ formatFileSize(scope.row.fileSize) }}</span>
                   </template>
                 </el-table-column>
 
-                <el-table-column label="涓婁紶鏃堕棿" width="160" align="center">
+                <el-table-column label="涓婁紶鏃堕棿" width="155" align="center">
                   <template slot-scope="scope">
                     <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
                   </template>
                 </el-table-column>
 
-                <el-table-column label="鎿嶄綔" width="150" align="center">
+                <el-table-column label="鎿嶄綔" width="80" align="center">
                   <template slot-scope="scope">
                     <el-button
                       size="mini"
@@ -258,18 +139,10 @@
                     >
                       棰勮
                     </el-button>
-                    <el-button
-                      size="mini"
-                      type="danger"
-                      @click="handleRemoveAttachment(type.value, scope.$index)"
-                    >
-                      鍒犻櫎
-                    </el-button>
                   </template>
                 </el-table-column>
               </el-table>
 
-              <!-- 绌虹姸鎬佹彁绀� -->
               <div
                 v-if="getAttachmentsByType(type.value).length === 0"
                 class="empty-attachment"
@@ -284,78 +157,6 @@
         </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}闄勪欢`"
-      :visible.sync="uploadDialogVisible"
-      width="500px"
-      :close-on-click-modal="false"
-    >
-      <el-upload
-        ref="uploadRef"
-        class="upload-demo"
-        drag
-        :action="uploadAction"
-        :headers="headers"
-        multiple
-        :file-list="tempFileList"
-        :before-upload="beforeUpload"
-        :on-change="handleFileChange"
-        :on-remove="handleTempRemove"
-        :on-success="handleUploadSuccess"
-        :auto-upload="false"
-      >
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
-        <div class="el-upload__tip" slot="tip">
-          鏀寔涓婁紶pdf銆乯pg銆乸ng銆乨oc銆乨ocx鏍煎紡鏂囦欢锛屽崟涓枃浠朵笉瓒呰繃10MB
-        </div>
-      </el-upload>
-
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="uploadDialogVisible = false">鍙栨秷</el-button>
-        <el-button
-          type="primary"
-          @click="submitUpload"
-          :loading="uploadLoading"
-          :disabled="tempFileList.length === 0"
-        >
-          纭涓婁紶
-        </el-button>
-      </span>
-    </el-dialog>
 
     <!-- 鏂囦欢棰勮寮圭獥 -->
     <FilePreviewDialog
@@ -372,6 +173,7 @@
 import FilePreviewDialog from "@/components/FilePreviewDialog";
 import CaseBasicInfo from "@/components/CaseBasicInfo";
 import { getToken } from "@/utils/auth";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
 
 export default {
   name: "ConfirmationDetail",
@@ -379,20 +181,18 @@
     FilePreviewDialog,
     CaseBasicInfo
   },
-    props: {
+  mixins: [readonlyDescriptionsMixin],
+  dicts: ["sys_FamilyRelation"],
+   props: {
     infoid: {
       type: String,
       default: true
     }
   },
-  dicts: ["sys_FamilyRelation"],
   data() {
     return {
       caseId: null,
-
-      // 鏄惁缂栬緫妯″紡
       isEdit: false,
-      // 琛ㄥ崟鏁版嵁
       form: {
         id: undefined,
         infoid: undefined,
@@ -412,29 +212,28 @@
         relativeidcardno: "",
         relativephone: "",
         relativeRemark: "",
-        assessannex: "", // JSON瀛楃涓插瓨鍌ㄦ墍鏈夐檮浠�
-        otherFamilyMembers: "" // 鉁� 鏂板
+        assessannex: "",
+        otherFamilyMembers: ""
       },
+      // 缁熶竴浜插睘鍒楄〃锛堢涓�鏉′负涓昏浜插睘锛屽叾浣欎负鍏朵粬浜插睘锛�
+      familyMemberList: [],
+      // 褰撳墠缂栬緫鐨勫灞烇紙寮圭獥鐢級
+      currentFamilyMember: {
+        name: "",
+        relation: "",
+        phone: "",
+        idcard: "",
+        isMain: false
+      },
+      isEditFamilyMember: false,
+      editFamilyMemberIndex: -1,
+      familyDialogVisible: false,
+      familyDialogTitle: "娣诲姞瀹跺睘",
+
       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: [
@@ -447,21 +246,16 @@
         "鐪艰鑶�",
         "鍏朵粬"
       ],
-      // 鍔犺浇鐘舵��
       loading: false,
       saveLoading: false,
-      // 闄勪欢鐩稿叧鏁版嵁
       activeAttachmentType: "1",
       attachmentLoading: false,
       uploadDialogVisible: false,
       uploadLoading: false,
       tempFileList: [],
       currentUploadType: "",
-      // 棰勮鐩稿叧
       previewVisible: false,
       currentPreviewFile: null,
-
-      // 闄勪欢绫诲瀷瀹氫箟
       attachmentTypes: [
         { value: "1", label: "浜轰綋鍣ㄥ畼娼滃湪鎹愮尞鑰呯櫥璁拌〃" },
         { value: "2", label: "浜轰綋鍣ㄥ畼鎹愮尞浜插睘纭鐧昏琛�" },
@@ -470,10 +264,8 @@
         { value: "5", label: "鑴戞浜″垽瀹氱煡鎯呭悓鎰忎功" },
         { value: "6", label: "蹇冩浜″垽瀹氱煡鎯呭悓鎰忎功" }
       ],
-
-      // 闄勪欢鏁版嵁缁撴瀯 - 鎸夌被鍨嬪垎寮�瀛樺偍
       attachmentData: {
-        "1": [], // 绫诲瀷1鐨勯檮浠跺垪琛�
+        "1": [],
         "2": [],
         "3": [],
         "4": [],
@@ -491,19 +283,17 @@
     }
   },
   created() {
+    this.infoid = this.infoid;
     this.caseId = this.infoid;
-
     if (this.infoid) {
       this.getDetail(this.infoid);
     }
   },
   methods: {
-    // 鑾峰彇璇︽儏
     async getDetail(infoid) {
       this.loading = true;
       try {
         const response = await relativesList({ infoid });
-
         if (response.code === 200) {
           this.handleDetailData(response);
         } else {
@@ -517,11 +307,8 @@
       }
     },
 
-    // 澶勭悊璇︽儏鏁版嵁
     handleDetailData(response) {
       let detailData = null;
-
-      // 鏍规嵁鎺ュ彛瀹為檯杩斿洖鐨勬暟鎹粨鏋勮繘琛岃皟鏁�
       if (response.data) {
         if (Array.isArray(response.data)) {
           detailData = response.data[0] || {};
@@ -535,22 +322,11 @@
       } 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,
         id: detailData.id || this.$route.query.id,
-        infoid: detailData.infoid || infoid,
+        infoid: detailData.infoid || this.infoid,
         caseNo: detailData.caseNo || "",
         name: detailData.name || "",
         sex: detailData.sex || "",
@@ -571,19 +347,44 @@
         assessannex: detailData.assessannex || ""
       };
 
-      // 澶勭悊鎹愮尞鍐冲畾鏁版嵁
+      // 鍒濆鍖栧灞炲垪琛�
+      this.familyMemberList = [];
+      if (detailData.relativeconfirmationsignname) {
+        this.familyMemberList.push({
+          name: detailData.relativeconfirmationsignname,
+          relation: detailData.signfamilyrelations || "",
+          phone: detailData.relativephone || "",
+          idcard: detailData.relativeidcardno || ""
+        });
+      }
+      if (detailData.otherFamilyMembers) {
+        try {
+          const otherMembers =
+            typeof detailData.otherFamilyMembers === "string"
+              ? JSON.parse(detailData.otherFamilyMembers)
+              : detailData.otherFamilyMembers || [];
+          otherMembers.forEach(member => {
+            this.familyMemberList.push({
+              name: member.name,
+              relation: member.relation,
+              phone: member.phone || "",
+              idcard: member.idcard || ""
+            });
+          });
+        } catch (e) {
+          console.warn("瑙f瀽鍏朵粬瀹跺睘鏁版嵁澶辫触:", e);
+        }
+      }
+
       if (detailData.organdecision) {
         this.organdecision = Array.isArray(detailData.organdecision)
           ? detailData.organdecision
           : detailData.organdecision.split(",");
       }
-      console.log(this.organdecision, "this.organdecision");
 
-      // 澶勭悊闄勪欢鏁版嵁 - 浠巃ssessannex瀛楁瑙f瀽JSON骞舵寜绫诲瀷鍒嗙被
       this.processAssessannexData();
     },
 
-    // 澶勭悊assessannex瀛楁鏁版嵁骞舵寜绫诲瀷鍒嗙被
     processAssessannexData() {
       if (this.form.assessannex) {
         try {
@@ -591,16 +392,12 @@
             typeof this.form.assessannex === "string"
               ? JSON.parse(this.form.assessannex)
               : this.form.assessannex;
-
-          // 娓呯┖鐜版湁鏁版嵁
           Object.keys(this.attachmentData).forEach(key => {
             this.attachmentData[key] = [];
           });
-
-          // 鎸夌被鍨嬪垎绫诲瓨鍌�
           if (Array.isArray(annexData)) {
             annexData.forEach(attachment => {
-              const type = attachment.type || "1"; // 榛樿鍒扮涓�绉嶇被鍨�
+              const type = attachment.type || "1";
               if (this.attachmentData[type]) {
                 this.attachmentData[type].push(attachment);
               }
@@ -612,12 +409,13 @@
       }
     },
 
-    // 鏍规嵁绫诲瀷鑾峰彇闄勪欢鍒楄〃
     getAttachmentsByType(type) {
+      console.log(type);
+      console.log(this.attachmentData[type]);
+
       return this.attachmentData[type] || [];
     },
 
-    // 鎵撳紑涓婁紶瀵硅瘽妗�
     openUploadDialog(type) {
       this.currentUploadType = type;
       this.tempFileList = [];
@@ -629,7 +427,6 @@
       });
     },
 
-    // 涓婁紶鍓嶆牎楠孾7](@ref)
     beforeUpload(file) {
       const allowedTypes = [
         "application/pdf",
@@ -638,10 +435,7 @@
         "application/msword",
         "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
       ];
-
-      const maxSize = 10 * 1024 * 1024; // 10MB
-
-      // 鏍¢獙鏂囦欢绫诲瀷
+      const maxSize = 10 * 1024 * 1024;
       const isTypeOk =
         allowedTypes.includes(file.type) ||
         file.name.endsWith(".pdf") ||
@@ -650,29 +444,23 @@
         file.name.endsWith(".png") ||
         file.name.endsWith(".doc") ||
         file.name.endsWith(".docx");
-
       if (!isTypeOk) {
         this.$message.error(
           "鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢"
         );
         return false;
       }
-
-      // 鏍¢獙鏂囦欢澶у皬
       if (file.size > maxSize) {
         this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
         return false;
       }
-
       return true;
     },
 
-    // 鏂囦欢閫夋嫨鍙樺寲
     handleFileChange(file, fileList) {
       this.tempFileList = fileList;
     },
 
-    // 绉婚櫎涓存椂鏂囦欢
     handleTempRemove(file, fileList) {
       this.tempFileList = fileList;
     },
@@ -682,7 +470,6 @@
         this.$message.error(response.msg || "涓婁紶澶辫触");
         return;
       }
-
       const newAttachment = {
         id: Date.now(),
         fileName: file.name,
@@ -693,10 +480,10 @@
         uploadTime: this.getCurrentTime(),
         uploader: "褰撳墠鐢ㄦ埛"
       };
-
       this.attachmentData[this.currentUploadType].push(newAttachment);
-      this.updateAssessannexField();
+      console.log(this.attachmentData,'this.attachmentData');
 
+      this.updateAssessannexField();
       this.$message.success("涓婁紶鎴愬姛");
       this.uploadLoading = false;
       this.uploadDialogVisible = false;
@@ -708,12 +495,10 @@
         this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
         return;
       }
-
       this.uploadLoading = true;
-      this.$refs.uploadRef.submit(); // 鉁� 鍙皟鐢ㄤ竴娆�
+      this.$refs.uploadRef.submit();
     },
 
-    // 鍒犻櫎闄勪欢
     handleRemoveAttachment(type, index) {
       this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
         confirmButtonText: "纭畾",
@@ -724,69 +509,157 @@
           if (this.attachmentData[type] && this.attachmentData[type][index]) {
             this.attachmentData[type].splice(index, 1);
             this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
-            this.updateAssessannexField(); // 鏇存柊瀛樺偍瀛楁
+            this.updateAssessannexField();
           }
         })
         .catch(() => {});
     },
-    openOtherFamilyDialog(index) {
-      this.isEditOtherFamily = typeof index === "number";
-      this.editOtherFamilyIndex = index || -1;
 
-      this.currentOtherFamily = this.isEditOtherFamily
-        ? { ...this.otherFamilyList[index] }
-        : { name: "", relation: "", phone: "" };
+    // 瀹跺睘鎿嶄綔鏂规硶
+    openFamilyDialog(isMain) {
+      this.isEditFamilyMember = false;
+      this.editFamilyMemberIndex = -1;
+      this.familyDialogTitle = "娣诲姞鍏朵粬瀹跺睘";
 
-      this.otherFamilyDialogVisible = true;
+      // 濡傛灉杩樻病鏈変换浣曞灞烇紝鍒欐坊鍔犱富瑕佷翰灞�
+      if (this.familyMemberList.length === 0) {
+        this.currentFamilyMember = {
+          name: "",
+          relation: "",
+          phone: "",
+          idcard: "",
+          isMain: true
+        };
+        this.familyDialogTitle = "娣诲姞涓昏浜插睘";
+      } else {
+        this.currentFamilyMember = {
+          name: "",
+          relation: "",
+          phone: "",
+          idcard: "",
+          isMain: false
+        };
+      }
+
+      this.familyDialogVisible = true;
     },
-    editOtherFamily(index) {
-      this.openOtherFamilyDialog(index);
+
+    editFamilyMember(index) {
+      this.isEditFamilyMember = true;
+      this.editFamilyMemberIndex = index;
+      const member = this.familyMemberList[index];
+      this.currentFamilyMember = {
+        name: member.name,
+        relation: member.relation,
+        phone: member.phone || "",
+        idcard: member.idcard || "",
+        isMain: index === 0
+      };
+      this.familyDialogTitle = index === 0 ? "缂栬緫涓昏浜插睘" : "缂栬緫鍏朵粬瀹跺睘";
+      this.familyDialogVisible = true;
     },
-    deleteOtherFamily(index) {
-      this.$confirm("纭鍒犻櫎璇ュ灞烇紵", "鎻愮ず", { type: "warning" }).then(
-        () => {
-          this.otherFamilyList.splice(index, 1);
-          this.updateOtherFamilyField();
-        }
-      );
+
+    deleteFamilyMember(index) {
+      if (index === 0) {
+        this.$message.warning("涓昏浜插睘涓嶅彲鍒犻櫎");
+        return;
+      }
+      this.$confirm("纭鍒犻櫎璇ュ灞烇紵", "鎻愮ず", { type: "warning" })
+        .then(() => {
+          this.familyMemberList.splice(index, 1);
+          this.updateFamilyMemberField();
+        })
+        .catch(() => {});
     },
-    saveOtherFamily() {
-      if (
-        !this.currentOtherFamily.name ||
-        !this.currentOtherFamily.relation ||
-        !this.currentOtherFamily.phone
-      ) {
-        this.$message.warning("璇峰~鍐欏畬鏁翠俊鎭�");
+
+    saveFamilyMember() {
+      if (!this.currentFamilyMember.name) {
+        this.$message.warning("璇疯緭鍏ュ鍚�");
+        return;
+      }
+      if (!this.currentFamilyMember.relation) {
+        this.$message.warning("璇烽�夋嫨涓庢崘璧犺�呭叧绯�");
         return;
       }
 
-      if (this.isEditOtherFamily) {
-        this.otherFamilyList.splice(this.editOtherFamilyIndex, 1, {
-          ...this.currentOtherFamily
-        });
-      } else {
-        this.otherFamilyList.push({ ...this.currentOtherFamily });
+      // 濡傛灉鏄富瑕佷翰灞烇紝楠岃瘉韬唤璇佸拰鐢佃瘽
+      if (this.currentFamilyMember.isMain) {
+        if (!this.currentFamilyMember.idcard) {
+          this.$message.warning("璇疯緭鍏ヤ富瑕佷翰灞炵殑韬唤璇佸彿");
+          return;
+        }
+        if (
+          !/^(\d{15}|\d{18}|\d{17}(\d|X|x))$/.test(
+            this.currentFamilyMember.idcard
+          )
+        ) {
+          this.$message.warning("璇疯緭鍏ユ纭殑韬唤璇佸彿");
+          return;
+        }
+        if (!this.currentFamilyMember.phone) {
+          this.$message.warning("璇疯緭鍏ヤ富瑕佷翰灞炵殑鑱旂郴鐢佃瘽");
+          return;
+        }
+        if (!/^1[3-9]\d{9}$/.test(this.currentFamilyMember.phone)) {
+          this.$message.warning("璇疯緭鍏ユ纭殑鎵嬫満鍙�");
+          return;
+        }
       }
 
-      this.updateOtherFamilyField();
-      this.otherFamilyDialogVisible = false;
+      const memberData = {
+        name: this.currentFamilyMember.name,
+        relation: this.currentFamilyMember.relation,
+        phone: this.currentFamilyMember.isMain
+          ? this.currentFamilyMember.phone
+          : "",
+        idcard: this.currentFamilyMember.isMain
+          ? this.currentFamilyMember.idcard
+          : ""
+      };
+
+      if (this.isEditFamilyMember) {
+        this.familyMemberList.splice(this.editFamilyMemberIndex, 1, memberData);
+      } else {
+        this.familyMemberList.push(memberData);
+      }
+
+      this.updateFamilyMemberField();
+      this.familyDialogVisible = false;
+      this.$message.success(this.isEditFamilyMember ? "缂栬緫鎴愬姛" : "娣诲姞鎴愬姛");
     },
-    updateOtherFamilyField() {
-      this.form.otherFamilyMembers = JSON.stringify(this.otherFamilyList);
+
+    updateFamilyMemberField() {
+      if (this.familyMemberList.length > 0) {
+        const mainMember = this.familyMemberList[0];
+        this.form.relativeconfirmationsignname = mainMember.name;
+        this.form.signfamilyrelations = mainMember.relation;
+        this.form.relativeidcardno = mainMember.idcard || "";
+        this.form.relativephone = mainMember.phone || "";
+
+        const otherMembers = this.familyMemberList.slice(1).map(member => ({
+          name: member.name,
+          relation: member.relation,
+          phone: member.phone || "",
+          idcard: member.idcard || ""
+        }));
+        this.form.otherFamilyMembers = JSON.stringify(otherMembers);
+      } else {
+        this.form.relativeconfirmationsignname = "";
+        this.form.signfamilyrelations = "";
+        this.form.relativeidcardno = "";
+        this.form.relativephone = "";
+        this.form.otherFamilyMembers = "[]";
+      }
     },
-    // 鏇存柊assessannex瀛樺偍瀛楁
+
     updateAssessannexField() {
-      // 灏嗘墍鏈夌被鍨嬬殑闄勪欢鍚堝苟涓轰竴涓暟缁�
       const allAttachments = [];
       Object.values(this.attachmentData).forEach(attachments => {
         allAttachments.push(...attachments);
       });
-
-      // 鏇存柊鍒拌〃鍗曞瓧娈�
       this.form.assessannex = JSON.stringify(allAttachments);
     },
 
-    // 鏂囦欢棰勮
     handlePreview(file) {
       this.currentPreviewFile = {
         fileName: file.fileName,
@@ -796,11 +669,9 @@
       this.previewVisible = true;
     },
 
-    // 鏂囦欢涓嬭浇
     handleDownload(file) {
       const fileUrl = file.fileUrl;
       const fileName = file.fileName;
-
       if (fileUrl) {
         const link = document.createElement("a");
         link.href = fileUrl;
@@ -815,21 +686,18 @@
       }
     },
 
-    // 鑾峰彇鏂囦欢绫诲瀷
     getFileType(fileName) {
       if (!fileName) return "other";
       const extension = this.getFileExtension(fileName);
       const imageTypes = ["jpg", "jpeg", "png"];
       const pdfTypes = ["pdf"];
       const officeTypes = ["doc", "docx"];
-
       if (imageTypes.includes(extension)) return "image";
       if (pdfTypes.includes(extension)) return "pdf";
       if (officeTypes.includes(extension)) return "office";
       return "other";
     },
 
-    // 鑾峰彇鏂囦欢鎵╁睍鍚�
     getFileExtension(filename) {
       return filename
         .split(".")
@@ -837,7 +705,6 @@
         .toLowerCase();
     },
 
-    // 鏂囦欢澶у皬鏍煎紡鍖�
     formatFileSize(size) {
       if (!size) return "0 B";
       const k = 1024;
@@ -846,26 +713,22 @@
       return parseFloat((size / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
     },
 
-    // 鏃ユ湡鏃堕棿鏍煎紡鍖�
     formatDateTime(dateTime) {
       if (!dateTime) return "";
       try {
         const date = new Date(dateTime);
         if (isNaN(date.getTime())) return dateTime;
-
         const year = date.getFullYear();
         const month = String(date.getMonth() + 1).padStart(2, "0");
         const day = String(date.getDate()).padStart(2, "0");
         const hours = String(date.getHours()).padStart(2, "0");
         const minutes = String(date.getMinutes()).padStart(2, "0");
-
         return `${year}-${month}-${day} ${hours}:${minutes}`;
       } catch (error) {
         return dateTime;
       }
     },
 
-    // 鑾峰彇褰撳墠鏃堕棿
     getCurrentTime() {
       const now = new Date();
       return `${now.getFullYear()}-${(now.getMonth() + 1)
@@ -884,6 +747,7 @@
         .toString()
         .padStart(2, "0")}`;
     },
+
     accomplish() {
       this.$confirm("鏄惁瀹屾垚璇ユ渚嬫崘鐚‘璁ゆ楠わ紵", "鎻愰啋", {
         confirmButtonText: "纭畾",
@@ -894,28 +758,27 @@
           this.form.state = 3;
           this.handleSave();
         })
-
         .catch(() => {});
     },
 
-    // 淇濆瓨纭淇℃伅
     async handleSave() {
       try {
         await this.$refs.form.validate();
         this.saveLoading = true;
 
-        this.updateOtherFamilyField();
+        this.updateFamilyMemberField();
         this.updateAssessannexField();
+
         const saveData = {
           ...this.form,
           infoid: this.infoid,
           organdecision: this.organdecision.join(","),
           organdecisionOther: this.organdecisionOther
-          // assessannex瀛楁宸插湪updateAssessannexField涓洿鏂�
         };
         if (saveData.state == 1 || !saveData.state) {
           saveData.state = 2;
         }
+
         let response = null;
         if (saveData.id) {
           response = await relativesEdit(saveData);
@@ -949,6 +812,11 @@
 
 .detail-card {
   margin-bottom: 20px;
+}
+
+.main-family {
+  font-weight: bold;
+  color: #e6a23c;
 }
 
 .attachment-card {
@@ -986,7 +854,7 @@
 
 .empty-attachment {
   text-align: center;
-  padding: 40px 0;
+  padding: 30px 0;
   color: #909399;
 }
 
diff --git a/src/views/business/course/components/DonorMaintenanceStage.vue b/src/views/business/course/components/DonorMaintenanceStage.vue
index 75e2721..7080781 100644
--- a/src/views/business/course/components/DonorMaintenanceStage.vue
+++ b/src/views/business/course/components/DonorMaintenanceStage.vue
@@ -90,30 +90,6 @@
                   <span v-else>鏃犻檮浠�</span>
                 </template>
               </el-table-column>
-              <el-table-column
-                label="鎿嶄綔"
-                align="center"
-                width="200"
-                class-name="small-padding fixed-width"
-              >
-                <template slot-scope="scope">
-                  <el-button
-                    size="mini"
-                    type="text"
-                    icon="el-icon-edit"
-                    @click="handleEditCulture(scope.row)"
-                    >缂栬緫</el-button
-                  >
-                  <el-button
-                    size="mini"
-                    type="text"
-                    icon="el-icon-delete"
-                    style="color: #F56C6C;"
-                    @click="handleDeleteCulture(scope.row)"
-                    >鍒犻櫎</el-button
-                  >
-                </template>
-              </el-table-column>
             </el-table>
           </el-card>
         </el-tab-pane>
@@ -159,30 +135,6 @@
                   <span v-else>鏃犻檮浠�</span>
                 </template>
               </el-table-column>
-              <el-table-column
-                label="鎿嶄綔"
-                align="center"
-                width="180"
-                class-name="small-padding fixed-width"
-              >
-                <template slot-scope="scope">
-                  <el-button
-                    size="mini"
-                    type="text"
-                    icon="el-icon-edit"
-                    @click="handleEditRecord(scope.row)"
-                    >缂栬緫</el-button
-                  >
-                  <el-button
-                    size="mini"
-                    type="text"
-                    icon="el-icon-delete"
-                    style="color: #F56C6C;"
-                    @click="handleDeleteRecord(scope.row)"
-                    >鍒犻櫎</el-button
-                  >
-                </template>
-              </el-table-column>
             </el-table>
           </el-card>
         </el-tab-pane>
@@ -220,160 +172,6 @@
     </el-card>
 
     <!-- 鎶ょ悊鏍告煡璁板綍 -->
-
-    <!-- 鍩瑰吇璁板綍缂栬緫瀵硅瘽妗� -->
-    <el-dialog
-      :title="cultureDialogTitle"
-      :visible.sync="cultureDialogVisible"
-      width="700px"
-      :close-on-click-modal="false"
-    >
-      <el-form
-        :model="cultureForm"
-        ref="cultureForm"
-        :rules="cultureRules"
-        label-width="120px"
-      >
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鍩瑰吇绫诲瀷" prop="cultureType">
-              <el-select
-                v-model="cultureForm.cultureType"
-                placeholder="璇烽�夋嫨鍩瑰吇绫诲瀷"
-                style="width: 100%"
-              >
-                <el-option
-                  v-for="item in cultureTypeOptions"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.label"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="閲囨牱鏃堕棿" prop="sampleTime">
-              <el-date-picker
-                v-model="cultureForm.sampleTime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                placeholder="閫夋嫨閲囨牱鏃堕棿"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鍩瑰吇缁撴灉" prop="result">
-              <el-select
-                v-model="cultureForm.result"
-                placeholder="璇烽�夋嫨鍩瑰吇缁撴灉"
-                style="width: 100%"
-              >
-                <el-option label="闃存��" value="闃存��" />
-                <el-option label="闃虫��" value="闃虫��" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-form-item label="闄勪欢">
-          <UploadAttachment
-            ref="cultureUploadAttachment"
-            :file-list="cultureFileList"
-            :limit="10"
-            :accept="attachmentAccept"
-            :multiple="true"
-            @change="handleCultureAttachmentChange"
-            @upload-success="handleCultureUploadSuccess"
-            @upload-error="handleCultureUploadError"
-            @remove="handleCultureAttachmentRemove"
-          />
-        </el-form-item>
-      </el-form>
-
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="cultureDialogVisible = false">鍙栨秷</el-button>
-        <el-button
-          type="primary"
-          @click="handleSaveCulture"
-          :loading="cultureSaveLoading"
-          >淇濆瓨</el-button
-        >
-      </span>
-    </el-dialog>
-
-    <!-- 鎶ょ悊鏍告煡璁板綍缂栬緫瀵硅瘽妗� -->
-    <el-dialog
-      :title="recordDialogTitle"
-      :visible.sync="recordDialogVisible"
-      width="700px"
-      :close-on-click-modal="false"
-    >
-      <el-form
-        :model="recordForm"
-        ref="recordForm"
-        :rules="recordRules"
-        label-width="120px"
-      >
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鏍告煡鏃堕棿" prop="recordTime">
-              <el-date-picker
-                v-model="recordForm.recordTime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                placeholder="閫夋嫨鏍告煡鏃堕棿"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鏍告煡浜�" prop="recorder">
-              <el-input
-                v-model="recordForm.recorder"
-                placeholder="璇疯緭鍏ユ牳鏌ヤ汉濮撳悕"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-form-item label="鏍告煡璁板綍" prop="checkRecord">
-          <el-input
-            type="textarea"
-            :rows="4"
-            v-model="recordForm.checkRecord"
-            placeholder="璇疯緭鍏ユ牳鏌ヨ褰曞唴瀹�"
-          />
-        </el-form-item>
-
-        <el-form-item label="闄勪欢">
-          <UploadAttachment
-            ref="recordUploadAttachment"
-            :file-list="recordFileList"
-            :limit="10"
-            :accept="attachmentAccept"
-            :multiple="true"
-            @change="handleRecordAttachmentChange"
-            @upload-success="handleRecordUploadSuccess"
-            @upload-error="handleRecordUploadError"
-            @remove="handleRecordAttachmentRemove"
-          />
-        </el-form-item>
-      </el-form>
-
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="recordDialogVisible = false">鍙栨秷</el-button>
-        <el-button
-          type="primary"
-          @click="handleSaveRecord"
-          :loading="recordSaveLoading"
-          >淇濆瓨</el-button
-        >
-      </span>
-    </el-dialog>
 
     <!-- 闄勪欢棰勮瀵硅瘽妗� -->
     <el-dialog
@@ -444,7 +242,6 @@
 <script>
 import { maintainList, maintainedit, maintainAdd } from "@/api/businessApi";
 import Pagination from "@/components/Pagination";
-import UploadAttachment from "@/components/UploadAttachment";
 import FilePreviewDialog from "@/components/FilePreviewDialog";
 import LiverKidneyPanel from "@/components/MaintainComponents/LiverKidneyPanel.vue";
 import BloodRoutinePanel from "@/components/MaintainComponents/BloodRoutinePanel.vue";
@@ -457,7 +254,6 @@
   name: "MaintenanceDetail",
   components: {
     Pagination,
-    UploadAttachment,
     FilePreviewDialog,
     LiverKidneyPanel,
     BloodRoutinePanel,
@@ -480,7 +276,7 @@
   },
   data() {
     return {
-      isEdit: true,
+      isEdit: false,
       currentMaintenanceId: null,
       isEditMode: false,
       form: {
diff --git a/src/views/business/course/components/EthicalReviewStage.vue b/src/views/business/course/components/EthicalReviewStage.vue
index 2d4b6ce..768af02 100644
--- a/src/views/business/course/components/EthicalReviewStage.vue
+++ b/src/views/business/course/components/EthicalReviewStage.vue
@@ -1,141 +1,31 @@
 <template>
   <div class="ethics-review-detail">
+    <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
+
     <el-card class="detail-card">
       <!-- 浼︾悊瀹℃煡鍩烘湰淇℃伅 -->
       <div slot="header" class="clearfix">
         <span class="detail-title">浼︾悊瀹℃煡鍩烘湰淇℃伅</span>
-        <div style="float: right;">
-          <el-button type="primary" @click="handleSave" :loading="saveLoading">
-            淇濆瓨
-          </el-button>
-
-          <el-button
-            type="success"
-            @click="handleCompleteReview"
-            :disabled="form.status == '3' || form.status == '2'"
-            :loading="completeLoading"
-          >
-            瀹℃煡瀹屾垚
-          </el-button>
-
-          <el-button
-            type="warning"
-            @click="handleSuspendReview"
-            :disabled="form.status == '2' || form.status == '3'"
-            :loading="suspendLoading"
-          >
-            瀹℃煡涓
-          </el-button>
-
-          <el-button
-            type="danger"
-            @click="handleEndReview"
-            :disabled="form.status == '2'"
-            :loading="endLoading"
-          >
-            缁撴潫瀹℃煡
-          </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="initiateTheme">
-              <el-input
-                v-model="form.initiateTheme"
-                placeholder="璇疯緭鍏ュ彂璧蜂富棰�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍙戣捣浜�" prop="initiatePerson">
-              <el-input v-model="form.initiatePerson" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="瀹℃煡鐘舵��" prop="status">
-              <el-select v-model="form.status" style="width: 100%">
-                <el-option
-                  v-for="dict in dict.type.sys_ethical"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
+      <el-descriptions title="鍩烘湰淇℃伅" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="鍙戣捣涓婚">{{ form.initiateTheme || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍙戣捣浜�">{{ form.initiatePerson || '-' }}</el-descriptions-item>
+      </el-descriptions>
 
-        <!-- 涓撳鐩稿叧淇℃伅 -->
-
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="浼︾悊瀹℃煡缁撹" prop="expertConclusion">
-              <el-select v-model="form.expertConclusion" style="width: 100%">
-                <el-option label="鍚屾剰" value="1" />
-                <el-option label="瀹℃煡涓�" value="2" />
-                <el-option label="涓嶅悓鎰�" value="0" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="浼︾悊瀹℃煡缁撹鏃堕棿" prop="expertTime">
-              <el-date-picker
-                v-model="form.expertTime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="瀹℃煡鎰忚" prop="expertOpinion">
-              <el-input
-                type="textarea"
-                :rows="2"
-                v-model="form.expertOpinion"
-                placeholder="璇疯緭鍏ユ剰瑙�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="澶囨敞" prop="remark">
-              <el-input
-                type="textarea"
-                :rows="3"
-                v-model="form.remark"
-                placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
+      <el-descriptions title="瀹℃煡缁撹" :column="descriptionColumn" border size="small" style="margin-top: 16px;">
+        <el-descriptions-item label="浼︾悊瀹℃煡缁撹">{{ expertConclusionLabel }}</el-descriptions-item>
+        <el-descriptions-item label="浼︾悊瀹℃煡缁撹鏃堕棿">{{ form.expertTime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="瀹℃煡鎰忚" :span="descriptionColumn">{{ form.expertOpinion || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="澶囨敞" :span="descriptionColumn">{{ form.remark || '-' }}</el-descriptions-item>
+      </el-descriptions>
     </el-card>
 
-    <!-- 闄勪欢涓婁紶 -->
+    <!-- 鐩稿叧闄勪欢 -->
     <el-card class="attachment-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">鐩稿叧闄勪欢</span>
       </div>
-
-      <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
-      <UploadAttachment
-        ref="uploadAttachment"
-        :file-list="attachmentFileList"
-        :limit="10"
-        accept=".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx"
-        @change="handleAttachmentChange"
-        @upload-success="handleUploadSuccess"
-        @upload-error="handleUploadError"
-        @remove="handleAttachmentRemove"
-      />
 
       <!-- 闄勪欢鍒楄〃 -->
       <div
@@ -167,7 +57,7 @@
               <span>{{ formatDateTime(scope.row.createTime) }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="鎿嶄綔" width="266">
+          <el-table-column label="鎿嶄綔" width="180">
             <template slot-scope="scope">
               <el-button
                 size="mini"
@@ -183,13 +73,6 @@
               >
                 涓嬭浇
               </el-button>
-              <el-button
-                size="mini"
-                type="danger"
-                @click="handleRemoveAttachment(scope.$index)"
-              >
-                鍒犻櫎
-              </el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -204,7 +87,7 @@
           class="el-icon-folder-opened"
           style="font-size: 60px; color: #C0C4CC; margin-bottom: 20px;"
         ></i>
-        <p style="color: #909399; font-size: 14px;">鏆傛棤闄勪欢锛岃涓婁紶鐩稿叧鏂囦欢</p>
+        <p style="color: #909399; font-size: 14px;">鏆傛棤闄勪欢</p>
       </div>
     </el-card>
 
@@ -212,27 +95,6 @@
     <el-card class="expert-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">涓撳瀹℃煡鎯呭喌</span>
-        <div style="float: right;">
-          <el-button size="mini" type="primary" @click="handleAddExpert">
-            娣诲姞涓撳
-          </el-button>
-          <el-button
-            size="mini"
-            type="primary"
-            @click="handleSendToNormalExperts"
-            :disabled="!canSendToNormalExperts"
-          >
-            鍙戦�佷笓瀹�
-          </el-button>
-          <el-button
-            size="mini"
-            type="success"
-            @click="handleSendToChiefExpert"
-            :disabled="!canSendToChiefExpert"
-          >
-            鍙戦�佷富濮斾笓瀹�
-          </el-button>
-        </div>
       </div>
 
       <!-- 涓撳缁熻淇℃伅 -->
@@ -348,7 +210,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 }">
@@ -390,246 +272,8 @@
           </template>
         </el-table-column>
 
-        <el-table-column label="鎿嶄綔" width="180" 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.receiveStatus == '2' ||
-                  scope.row.receiveStatus == '3' ||
-                  scope.row.receiveStatus == '4'
-              "
-              :class="{
-                'sent-button':
-                  scope.row.receiveStatus == '2' ||
-                  scope.row.receiveStatus == '3'
-              }"
-            >
-              {{
-                scope.row.receiveStatus == "2" || scope.row.receiveStatus == "3"
-                  ? "宸插彂閫�"
-                  : "鍙戦��"
-              }}
-            </el-button>
-            <el-button
-              v-if="scope.row.receiveStatus == 0"
-              size="mini"
-              type="text"
-              icon="el-icon-delete"
-              @click="handleDeleteExpertReview(scope.row, scope.$index)"
-              style="color: #f56c6c;"
-            >
-              鍒犻櫎
-            </el-button>
-          </template>
-        </el-table-column>
       </el-table>
     </el-card>
-
-    <!-- 娣诲姞涓撳瀵硅瘽妗� -->
-    <el-dialog
-      title="娣诲姞涓撳"
-      :visible.sync="expertDialogVisible"
-      width="800px"
-      @close="handleExpertDialogClose"
-    >
-      <div style="margin-bottom: 20px;">
-        <el-input
-          v-model="expertSearchQuery"
-          placeholder="璇疯緭鍏ヤ笓瀹跺鍚嶆垨缂栧彿鎼滅储"
-          style="width: 300px; margin-right: 10px;"
-          @keyup.enter.native="handleSearchExperts"
-        >
-          <el-button
-            slot="append"
-            icon="el-icon-search"
-            @click="handleSearchExperts"
-          ></el-button>
-        </el-input>
-        <el-select
-          v-model="filterExpertType"
-          placeholder="涓撳绫诲瀷"
-          style="width: 150px; margin-right: 10px;"
-          @change="handleSearchExperts"
-        >
-          <el-option label="鍏ㄩ儴" value=""></el-option>
-          <el-option label="鏅�氫笓瀹�" value="0"></el-option>
-          <el-option label="涓讳换濮斿憳" value="1"></el-option>
-        </el-select>
-        <el-button type="primary" @click="handleSearchExperts">鎼滅储</el-button>
-        <el-button @click="handleResetSearch">閲嶇疆</el-button>
-      </div>
-
-      <el-table
-        :data="filteredExpertList"
-        v-loading="expertListLoading"
-        style="width: 100%"
-        max-height="400"
-        @selection-change="handleExpertSelectionChange"
-      >
-        <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column
-          label="涓撳濮撳悕"
-          prop="username"
-          width="120"
-        ></el-table-column>
-        <el-table-column
-          label="涓撳缂栧彿"
-          prop="userno"
-          width="120"
-        ></el-table-column>
-        <el-table-column label="涓撳绫诲瀷" width="100">
-          <template slot-scope="scope">
-            <el-tag
-              size="small"
-              :type="getIsChiefExpert(scope.row) ? 'danger' : ''"
-            >
-              {{ getIsChiefExpert(scope.row) ? "涓讳换濮斿憳" : "鏅�氫笓瀹�" }}
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column
-          label="鍗曚綅鍚嶇О"
-          prop="unitname"
-          show-overflow-tooltip
-        ></el-table-column>
-        <el-table-column
-          label="鑱岀О"
-          prop="title"
-          width="100"
-        ></el-table-column>
-        <el-table-column
-          label="鑱旂郴鐢佃瘽"
-          prop="telephone"
-          width="120"
-        ></el-table-column>
-      </el-table>
-
-      <div style="margin-top: 20px; text-align: center;">
-        <el-pagination
-          @size-change="handlePageSizeChange"
-          @current-change="handlePageChange"
-          :current-page="expertPage.pageNum"
-          :page-sizes="[10, 20, 50, 100]"
-          :page-size="expertPage.pageSize"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="filteredExpertTotal"
-        ></el-pagination>
-      </div>
-
-      <div slot="footer">
-        <el-button @click="expertDialogVisible = false">鍙栨秷</el-button>
-        <el-button
-          type="primary"
-          @click="handleConfirmAddExpert"
-          :disabled="selectedExperts.length == 0"
-          >纭畾娣诲姞</el-button
-        >
-      </div>
-    </el-dialog>
-
-    <!-- 鍙戦�佷笓瀹跺璇濇 -->
-    <el-dialog
-      :title="sendDialogTitle"
-      :visible.sync="sendDialogVisible"
-      width="500px"
-      @close="handleSendDialogClose"
-    >
-      <el-form :model="sendForm" ref="sendForm" label-width="100px">
-        <el-form-item label="涓撳绫诲瀷" prop="expertType">
-          <el-radio-group
-            v-model="sendForm.expertType"
-            @change="handleExpertTypeChange"
-          >
-            <el-radio label="normal">鏅�氫笓瀹�</el-radio>
-            <el-radio label="chief">涓诲涓撳</el-radio>
-          </el-radio-group>
-        </el-form-item>
-
-        <el-form-item label="鍙戦�佹椂闂�" prop="startTime" required>
-          <el-date-picker
-            v-model="sendForm.startTime"
-            type="datetime"
-            placeholder="璇烽�夋嫨鍙戦�佹椂闂�"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            style="width: 100%"
-          />
-        </el-form-item>
-
-        <el-form-item
-          label="鎴鏃堕棿"
-          prop="endTime"
-          :required="sendForm.expertType !== 'chief'"
-        >
-          <el-date-picker
-            v-model="sendForm.endTime"
-            type="datetime"
-            placeholder="璇烽�夋嫨鎴鏃堕棿"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            style="width: 100%"
-            :disabled="sendForm.expertType === 'chief'"
-          />
-          <div v-if="sendForm.expertType !== 'chief'" style="margin-top: 5px;">
-            <el-button-group>
-              <el-button size="mini" @click="setEndTime(0.5)"
-                >鍗婂皬鏃跺悗</el-button
-              >
-              <el-button size="mini" @click="setEndTime(1)">涓�灏忔椂鍚�</el-button>
-              <el-button size="mini" @click="setEndTime(2)">涓ゅ皬鏃跺悗</el-button>
-              <el-button size="mini" @click="setEndTime(24)">涓�澶╁悗</el-button>
-            </el-button-group>
-          </div>
-          <div
-            v-if="sendForm.expertType === 'chief'"
-            style="font-size: 12px; color: #999; margin-top: 5px;"
-          >
-            涓诲涓撳鏃犻渶璁剧疆鎴鏃堕棿
-          </div>
-        </el-form-item>
-
-        <el-form-item label="鍙戦�佹柟寮�" prop="sendType" required>
-          <el-select
-            v-model="sendForm.sendType"
-            placeholder="璇烽�夋嫨鍙戦�佹柟寮�"
-            style="width: 100%"
-          >
-            <el-option label="绯荤粺鍙戦��" value="0"></el-option>
-            <el-option label="閭欢鍙戦��" value="1"></el-option>
-            <el-option label="鐭俊鍙戦��" value="2"></el-option>
-            <el-option label="鍏朵粬鏂瑰紡" value="3"></el-option>
-          </el-select>
-        </el-form-item>
-
-        <el-form-item label="鍙戦�佹爣棰�" prop="title" required>
-          <el-input v-model="sendForm.title" placeholder="璇疯緭鍏ュ彂閫佹爣棰�" />
-        </el-form-item>
-
-        <el-form-item label="鍙戦�佸唴瀹�" prop="content" required>
-          <el-input
-            type="textarea"
-            :rows="4"
-            v-model="sendForm.content"
-            placeholder="璇疯緭鍏ュ彂閫佺粰涓撳鐨勫鏌ュ唴瀹硅鏄�"
-          />
-        </el-form-item>
-
-        <el-form-item label="璺宠浆閾炬帴" prop="url">
-          <el-input
-            v-model="sendForm.url"
-            placeholder="璇疯緭鍏ヨ烦杞摼鎺ワ紙鍙�夛級"
-          />
-        </el-form-item>
-      </el-form>
-      <div slot="footer">
-        <el-button @click="sendDialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleSendConfirm" :loading="sending"
-          >纭鍙戦��</el-button
-        >
-      </div>
-    </el-dialog>
 
     <!-- 涓撳鍘嗗彶瀹℃壒鎯呭喌瀵硅瘽妗� -->
     <el-dialog
@@ -757,22 +401,24 @@
 <script>
 import { getToken } from "@/utils/auth";
 import {
-  ethicalreviewgetInfoID,
+  reviewinitiateBaseInfoList,
   ethicalreviewedit,
   ethicalreviewadd,
   ethicalreviewInfo,
   ethicalreExpertTotal,
-  sendNotification
+  sendNotification,
+  sendcall
 } from "@/api/businessApi";
 import { listExternalperson } from "@/api/project/externalperson";
 import CaseBasicInfo from "@/components/CaseBasicInfo";
-import UploadAttachment from "@/components/UploadAttachment";
 import FilePreviewDialog from "@/components/FilePreviewDialog";
 import dayjs from "dayjs";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
 
 export default {
   name: "EthicsReviewDetail",
-  components: { CaseBasicInfo, UploadAttachment, FilePreviewDialog },
+  components: { CaseBasicInfo, FilePreviewDialog },
+  mixins: [readonlyDescriptionsMixin],
   dicts: ["sys_user_sex", "sys_ethical", "Review_status"],
   props: {
     infoid: {
@@ -861,7 +507,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,
@@ -902,7 +558,6 @@
         startTime: "",
         endTime: "",
         sendType: "0",
-        title: "浼︾悊瀹℃煡浠诲姟閫氱煡",
         content: "",
         url: ""
       },
@@ -923,17 +578,23 @@
       return this.form.ethicalreviewopinionsList || [];
     },
 
+    // 浼︾悊瀹℃煡缁撹鏂囨湰锛堝彧璇诲睍绀猴級
+    expertConclusionLabel() {
+      const map = { 0: "涓嶅悓鎰�", 1: "鍚屾剰", 2: "瀹℃煡涓�" };
+      return map[this.form.expertConclusion] || "-";
+    },
+
     // 璁$畻灞炴�э細鏅�氫笓瀹舵暟閲�
     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;
     },
 
@@ -945,7 +606,7 @@
     // 璁$畻灞炴�э細宸插悓鎰忎笓瀹舵暟閲�
     approvedExpertsCount() {
       return this.ethicalreviewopinionsList.filter(
-        expert => expert.expertconclusion === "1"
+        expert => expert.expertconclusion == "1"
       ).length;
     },
 
@@ -954,7 +615,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 "閫氳繃";
@@ -970,7 +631,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)) {
@@ -984,10 +645,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")
       );
     },
 
@@ -995,10 +656,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")
       );
     },
 
@@ -1010,7 +671,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;
     },
@@ -1061,9 +722,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 "鍙戦�佷笓瀹跺鏌�";
@@ -1080,8 +741,15 @@
     }
   },
   created() {
+    this.infoid = this.infoid;
     this.caseId = this.infoid;
     this.getDetail(this.infoid, this.id);
+    // 鐩戝惉璺敱鍙樺寲锛岄槻姝㈢敤鎴风寮�椤甸潰
+    window.addEventListener("beforeunload", this.beforeUnloadHandler);
+  },
+  beforeDestroy() {
+    // 绉婚櫎浜嬩欢鐩戝惉鍣�
+    window.removeEventListener("beforeunload", this.beforeUnloadHandler);
   },
   methods: {
     // 鍒濆鍖栨柊澧炴暟鎹�
@@ -1104,36 +772,47 @@
         if (id) {
           response = await ethicalreviewInfo(id);
         } else if (infoid) {
-          response = await ethicalreviewgetInfoID({ InfoId: infoid });
+          response = await reviewinitiateBaseInfoList({ infoid: infoid });
+          if (response.data[0].id) {
+            this.id = response.data[0].id;
+            response = await ethicalreviewInfo(this.id);
+          }
         }
 
-        if (response.code === 200) {
+        if (
+          !response.data.status ||
+          response.data.status == 0 ||
+          response.data.status == 1
+        ) {
+          response.data.status = "2";
+        }
+        if (response.code == 200) {
           let detailData = {};
 
-          if (response.data && id) {
+          if (response.data && this.id) {
             this.form = response.data;
             // 瑙f瀽 filePatch 瀛楁
             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;
-            // 瑙f瀽 filePatch 瀛楁
+          } else if (response.data && this.infoid) {
+            this.form = response.data[0];
             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 +824,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 +877,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 +892,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 +909,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 +933,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 +1025,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 +1080,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 +1090,7 @@
 
     // 涓撳绫诲瀷鍙樻洿澶勭悊
     handleExpertTypeChange() {
-      if (this.sendForm.expertType === "chief") {
+      if (this.sendForm.expertType == "chief") {
         // 涓诲涓撳鏃犻渶璁剧疆鎴鏃堕棿
         this.sendForm.endTime = "";
       } else {
@@ -1407,9 +1115,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,15 +1136,19 @@
               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;
-                this.$router.replace({
-                  query: { ...this.$route.query, id: this.form.id }
-                });
+              if (!this.form.id && response.data) {
+                this.form.id = response.data;
+                this.id = this.form.id;
+                // this.$router.replace({
+                //   query: { ...this.$route.query, id: this.form.id }
+                // });
               }
+              this.refreshPageData();
             } else {
               this.$message.error("淇濆瓨澶辫触锛�" + (response.msg || "鏈煡閿欒"));
             }
@@ -1471,7 +1183,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 +1235,7 @@
 
             const response = await ethicalreviewedit(updateData);
 
-            if (response.code === 200) {
+            if (response.code == 200) {
               this.$message.success("瀹℃煡宸蹭腑姝紝鎵�鏈変笓瀹剁姸鎬佸凡鏇存柊");
               this.form.status = "2";
             } else {
@@ -1555,7 +1267,7 @@
           try {
             const updateData = {
               ...this.form,
-              status: "2", // 瀹℃煡涓
+              status: "4", // 瀹℃煡涓
               endTime: new Date()
                 .toISOString()
                 .replace("T", " ")
@@ -1564,9 +1276,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 +1298,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 +1556,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 +1593,7 @@
 
     // 纭娣诲姞涓撳
     handleConfirmAddExpert() {
-      if (this.selectedExperts.length === 0) {
+      if (this.selectedExperts.length == 0) {
         this.$message.warning("璇烽�夋嫨瑕佹坊鍔犵殑涓撳");
         return;
       }
@@ -1664,7 +1618,7 @@
           expertType: isChief ? "1" : "0", // 涓讳换濮斿憳璁剧疆涓轰富濮斾笓瀹�
           deptName: expert.unitname || "",
           title: expert.title || "",
-          deptname: expert.telephone || "",
+          donorno: expert.telephone || "",
           receiveStatus: "0", // 寰呮帴鏀�
           expertconclusion: "",
           expertopinion: "",
@@ -1719,6 +1673,9 @@
 
     // 鍙戦�佺粰鏅�氫笓瀹�
     handleSendToNormalExperts() {
+      if (!this.validateAllIds(this.ethicalreviewopinionsList)) {
+        return;
+      }
       this.currentSendExperts = this.availableNormalExperts;
       this.sendForm.expertType = "normal";
       this.sendForm.endTime = ""; // 閲嶇疆鎴鏃堕棿
@@ -1727,6 +1684,9 @@
 
     // 鍙戦�佺粰涓诲涓撳
     handleSendToChiefExpert() {
+      if (!this.validateAllIds(this.ethicalreviewopinionsList)) {
+        return;
+      }
       this.currentSendExperts = this.availableChiefExperts;
       this.sendForm.expertType = "chief";
       this.sendForm.endTime = ""; // 涓诲涓撳鏃犻渶鎴鏃堕棿
@@ -1735,12 +1695,40 @@
 
     // 鍙戦�佺粰鍗曚釜涓撳
     handleSendToExpert(expert) {
+      if (!this.validateAllIds(this.ethicalreviewopinionsList)) {
+        return;
+      }
       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;
     },
 
+    validateAllIds(arr, idField = "id") {
+      if (!Array.isArray(arr) || arr.length === 0) {
+        this.$message.warning("璇峰厛閫夋嫨涓撳鍒楄〃");
+        return false;
+      }
+
+      const emptyIdItems = arr.filter(item => {
+        const id = item[idField];
+        return (
+          id === undefined ||
+          id === null ||
+          id === "" ||
+          id.toString().trim() === ""
+        );
+      });
+
+      if (emptyIdItems.length > 0) {
+        this.$message.warning(
+          "褰撳墠閫変腑涓撳鍒楄〃鏈夋湭淇濆瓨鏁版嵁锛岃淇濆瓨鍒锋柊鍚庡啀鍙戦��"
+        );
+        return false;
+      }
+
+      return true;
+    },
     // 鍙戦�佸璇濇鍏抽棴
     handleSendDialogClose() {
       this.sendForm = {
@@ -1749,7 +1737,6 @@
         startTime: "",
         endTime: "",
         sendType: "0",
-        title: "浼︾悊瀹℃煡浠诲姟閫氱煡",
         content: "",
         url: ""
       };
@@ -1769,55 +1756,67 @@
         return;
       }
 
-      if (!this.sendForm.sendType) {
-        this.$message.warning("璇烽�夋嫨鍙戦�佹柟寮�");
-        return;
-      }
+      // if (!this.sendForm.sendType) {
+      //   this.$message.warning("璇烽�夋嫨鍙戦�佹柟寮�");
+      //   return;
+      // }
 
-      if (!this.sendForm.title) {
-        this.$message.warning("璇疯緭鍏ュ彂閫佹爣棰�");
-        return;
-      }
+      // if (!this.sendForm.title) {
+      //   this.$message.warning("璇疯緭鍏ュ彂閫佹爣棰�");
+      //   return;
+      // }
 
-      if (!this.sendForm.content) {
-        this.$message.warning("璇疯緭鍏ュ彂閫佸唴瀹�");
-        return;
-      }
+      // if (!this.sendForm.content) {
+      //   this.$message.warning("璇疯緭鍏ュ彂閫佸唴瀹�");
+      //   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 +1841,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",
@@ -1885,19 +1891,111 @@
           startTime: "",
           endTime: "",
           sendType: "0",
-          title: "浼︾悊瀹℃煡浠诲姟閫氱煡",
           content: "",
           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) {
+      console.log(expert, "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)
+        // };
+        const sendDatas = {
+          expertNo: expert.donorno || "", //7.14
+          id: expert.id || "",
+          infoId: this.infoid || ""
+        };
+
+        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"
+        // });
+        const response = await sendNotification(sendDatas);
+
+        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 +2029,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 +2269,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/course/components/MedicalAssessmentStage.vue b/src/views/business/course/components/MedicalAssessmentStage.vue
index 3a4c17d..1fe761d 100644
--- a/src/views/business/course/components/MedicalAssessmentStage.vue
+++ b/src/views/business/course/components/MedicalAssessmentStage.vue
@@ -7,17 +7,20 @@
         <span>鍣ㄥ畼璇勪及琛�</span>
       </div>
 
-      <!-- 鎹愮尞鍐冲畾琛ㄥ崟 -->
-      <el-form>
-        <el-form-item label-width="100px" label="鎹愮尞鍐冲畾">
-          <el-checkbox-group v-model="organdecisionValues" @change="handleOrganDecisionChange" :disabled="!isEdit">
-            <el-checkbox v-for="dict in dict.type.sys_Organ" :key="dict.value" :label="dict.value">{{ dict.label }}
-            </el-checkbox>
-          </el-checkbox-group>
-          <el-input v-if="showOtherInput" v-model="organdecisionOther" placeholder="璇疯緭鍏ュ叾浠栨崘鐚喅瀹氱殑鍏蜂綋鍐呭"
-            style="margin-top: 10px; width: 300px;" :readonly="!isEdit" @input="handleOtherDecisionInput"></el-input>
-        </el-form-item>
-      </el-form>
+      <!-- 鎹愮尞鍐冲畾锛堝彧璇诲睍绀猴級 -->
+      <el-descriptions title="鎹愮尞鍐冲畾" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="鎹愮尞鍐冲畾">
+          <template v-if="organdecisionValues && organdecisionValues.length">
+            <el-tag v-for="(v, i) in organdecisionValues" :key="i" size="small" style="margin-right: 8px;">
+              {{ getOrganLabel(v) }}
+            </el-tag>
+          </template>
+          <template v-else>-</template>
+        </el-descriptions-item>
+        <el-descriptions-item v-if="showOtherInput" label="鍏朵粬鎹愮尞鍐冲畾">
+          {{ organdecisionOther || '-' }}
+        </el-descriptions-item>
+      </el-descriptions>
 
       <!-- 鍣ㄥ畼璇勪及琛ㄦ牸 -->
       <el-table :data="filteredOrganAssessmentList" v-loading="assessmentLoading" style="width: 100%"
@@ -32,29 +35,16 @@
                 <el-tab-pane v-for="(assessment, index) in getOrganAssessments(scope.row)"
                   :key="`${scope.row.organno}_${index}`" :label="`绗�${index + 1}娆¤瘎浼癭" :name="String(index)">
                   <organ-assessment-form :organ-data="scope.row" :assessment-index="index"
-                    :readonly="!canAssessOrgan(scope.row)" :current-user="currentUser"
+                    :readonly="true" :current-user="currentUser"
                     @update-assessment="handleUpdateAssessment" @delete-assessment="handleDeleteAssessment"
                     @save-assessment="handleSaveAssessment" />
-                </el-tab-pane>
-
-                <!-- 娣诲姞璇勪及鎸夐挳 -->
-                <el-tab-pane name="add" v-if="canAssessOrgan(scope.row) && isEdit">
-                  <template slot="label">
-                    <el-button type="text" icon="el-icon-plus" @click.stop="handleAddNewAssessment(scope.row)"
-                      size="mini">
-                      鏂板璇勪及
-                    </el-button>
-                  </template>
-                  <div class="add-assessment-prompt">
-                    <el-empty description="鐐瑰嚮涓婃柟鎸夐挳娣诲姞鏂扮殑璇勪及"></el-empty>
-                  </div>
                 </el-tab-pane>
 
                 <!-- 璇勪及姹囨�籘ab -->
                 <el-tab-pane label="璇勪及姹囨��" name="summary">
                   <div class="assessment-summary">
                     <!-- 鍩烘湰淇℃伅姹囨�� -->
-                    <el-descriptions title="鍩烘湰淇℃伅姹囨��" :column="2" border>
+                    <el-descriptions title="鍩烘湰淇℃伅姹囨��" :column="descriptionColumn" border>
                       <el-descriptions-item label="鍣ㄥ畼绫诲瀷">
                         <span class="summary-item">{{
                           getOrganLabel(scope.row.organno)
@@ -96,7 +86,7 @@
                               </el-tag>
                             </div>
 
-                            <el-descriptions :column="2" border class="detail-descriptions">
+                            <el-descriptions :column="descriptionColumn" border class="detail-descriptions">
                               <!-- 璇勪及鏃堕棿 -->
                               <el-descriptions-item label="璇勪及鏃堕棿" :span="2">
                                 <span class="time-text">
@@ -163,7 +153,7 @@
 
                     <!-- 鍣ㄥ畼鍩烘湰淇℃伅鍗$墖 -->
                     <el-card header="鍣ㄥ畼淇℃伅" style="margin-top: 20px;" class="organ-info-card">
-                      <el-descriptions :column="2" border>
+                      <el-descriptions :column="descriptionColumn" border>
                         <el-descriptions-item label="鑾峰彇鍓嶆椿妫�">
                           <el-tag :type="scope.row.isbiopsybefore == '1'
                               ? 'success'
@@ -252,30 +242,8 @@
           </template>
         </el-table-column>
 
-        <el-table-column label="鎿嶄綔" align="center" width="150" class-name="small-padding fixed-width">
-          <template slot-scope="scope">
-            <el-button v-if="canAssessOrgan(scope.row) && isEdit" size="mini" type="text"
-              @click="handleToggleExpand(scope.row)">
-              {{
-                expandedRowKeys.includes(scope.row.organno) ? "鏀惰捣" : "璇︽儏"
-              }}
-            </el-button>
-            <el-button v-else-if="!isEdit" size="mini" type="text" @click="handleToggleExpand(scope.row)">
-              {{
-                expandedRowKeys.includes(scope.row.organno) ? "鏀惰捣" : "鏌ョ湅"
-              }}
-            </el-button>
-            <el-button v-else size="mini" type="text" disabled>鏃犳潈闄�</el-button>
-          </template>
-        </el-table-column>
       </el-table>
     </el-card>
-
-    <!-- 鏁翠綋淇濆瓨鎸夐挳 -->
-    <div class="footer-actions" v-if="isEdit">
-      <el-button type="primary" @click="handleSaveAll" :loading="saveLoading">淇濆瓨璇勪及琛�</el-button>
-      <el-button type="success" @click="accomplish" :loading="saveLoading">璇勪及瀹屾垚</el-button>
-    </div>
 
     <!-- 鏂囦欢棰勮寮圭獥 -->
     <FilePreviewDialog :visible="attachmentVisible" :file="currentPreviewFile" @close="attachmentVisible = false" />
@@ -291,10 +259,12 @@
 import CaseBasicInfo from "@/components/CaseBasicInfo";
 import FilePreviewDialog from "@/components/FilePreviewDialog";
 import OrganAssessmentForm from "@/components/assessInfoComponents/OrganAssessmentForm.vue";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
 
 export default {
   name: "AssessmentDetail",
   components: { OrganAssessmentForm, FilePreviewDialog, CaseBasicInfo },
+  mixins: [readonlyDescriptionsMixin],
   dicts: ["sys_user_sex", "sys_Organ", "sys_0_1"],
    props: {
     infoid: {
@@ -419,7 +389,7 @@
   created() {
 
     this.caseId = this.infoid;
-    this.isEdit = true;
+    this.isEdit = false;
     this.getAssessmentDetail();
   },
   methods: {
diff --git a/src/views/business/course/components/OrganAllocationStage.vue b/src/views/business/course/components/OrganAllocationStage.vue
index 4046433..384a886 100644
--- a/src/views/business/course/components/OrganAllocationStage.vue
+++ b/src/views/business/course/components/OrganAllocationStage.vue
@@ -6,44 +6,11 @@
         <span class="detail-title">鍣ㄥ畼鍒嗛厤鍩烘湰淇℃伅</span>
       </div>
 
-      <el-form :model="form" ref="form" :rules="rules" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鍒嗛厤鐘舵��" prop="allocationStatus">
-              <el-select
-                v-model="form.allocationStatus"
-                placeholder="璇烽�夋嫨鍒嗛厤鐘舵��"
-              >
-                <el-option
-                  v-for="dict in dict.type.organ_allocation_status || []"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍒嗛厤鏃堕棿" prop="allocationTime">
-              <el-date-picker
-                v-model="form.allocationTime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-                :disabled="form.allocationStatus == '1'"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="璐熻矗浜�" prop="registrationName">
-              <el-input v-model="form.registrationName" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
+      <el-descriptions title="鍩烘湰淇℃伅" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="鍒嗛厤鐘舵��">{{ selectDictLabel(dict.type.organ_allocation_status, form.allocationStatus) }}</el-descriptions-item>
+        <el-descriptions-item label="鍒嗛厤鏃堕棿">{{ form.allocationTime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="璐熻矗浜�">{{ form.registrationName || '-' }}</el-descriptions-item>
+      </el-descriptions>
     </el-card>
 
     <!-- 鍣ㄥ畼鍒嗛厤璁板綍閮ㄥ垎 -->
@@ -58,49 +25,24 @@
         </div>
       </div>
 
-      <el-form
-        ref="allocationForm"
-        :rules="allocationRules"
-        :model="allocationData"
-        label-position="right"
-      >
-        <el-row>
-          <el-col>
-            <el-form-item label-width="100px" label="鍒嗛厤鍣ㄥ畼">
-              <el-checkbox-group
-                v-model="selectedOrgans"
-                @change="handleOrganSelectionChange"
-              >
-                <el-checkbox
-                  v-for="dict in dict.type.sys_Organ || []"
-                  :key="dict.value"
-                  :label="dict.value"
-                  :disabled="form.allocationStatus == '1'"
-                >
-                  {{ dict.label }}
-                </el-checkbox>
-              </el-checkbox-group>
-              <el-input
-                v-if="showOtherInput"
-                v-model="otherOrganInput"
-                placeholder="璇疯緭鍏ュ叾浠栧櫒瀹樺悕绉�"
-                style="margin-top: 10px; width: 300px;"
-                :disabled="form.allocationStatus == '1'"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+      <el-descriptions title="鍒嗛厤鍣ㄥ畼" :column="1" border size="small" style="margin-bottom: 16px;">
+        <el-descriptions-item label="鍒嗛厤鍣ㄥ畼">
+          <template v-if="selectedOrgans && selectedOrgans.length">
+            <span v-for="(v, i) in selectedOrgans" :key="v">
+              {{ v === 'C01' && otherOrganInput ? '鍏朵粬(' + otherOrganInput + ')' : getOrganLabel(v) }}<span v-if="i < selectedOrgans.length - 1">銆�</span>
+            </span>
+          </template>
+          <template v-else>-</template>
+        </el-descriptions-item>
+      </el-descriptions>
 
-        <el-row>
-          <el-col>
-            <el-form-item>
-              <el-table
-                :data="displayOrgans"
-                v-loading="loading"
-                border
-                style="width: 100%"
-                :row-class-name="getOrganRowClassName"
-              >
+      <el-table
+        :data="displayOrgans"
+        v-loading="loading"
+        border
+        style="width: 100%"
+        :row-class-name="getOrganRowClassName"
+      >
                 <el-table-column
                   label="搴忓彿"
                   type="index"
@@ -133,127 +75,36 @@
                   align="center"
                   width="120"
                   prop="organname"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.organname"
-                      placeholder="鍣ㄥ畼鍚嶇О"
-                      :disabled="true"
-                    />
-                  </template>
-                </el-table-column>
-
-                <!-- <el-table-column
-                  label="鍒嗛厤绯荤粺缂栧彿"
-                  align="center"
-                  width="150"
-                  prop="caseno"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.caseno"
-                      placeholder="鍒嗛厤绯荤粺缂栧彿"
-                      :disabled="
-                        form.allocationStatus == '1' ||
-                          scope.row.allocationstatus == '3'
-                      "
-                    />
-                  </template>
-                </el-table-column> -->
+                  show-overflow-tooltip
+                />
 
                 <el-table-column
                   label="鍒嗛厤寮�濮嬫椂闂�"
                   align="center"
                   width="180"
                   prop="applicanttime"
-                >
-                  <template slot-scope="scope">
-                    <el-date-picker
-                      clearable
-                      size="small"
-                      style="width: 100%"
-                      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' ||
-                          scope.row.allocationstatus == '3'
-                      "
-                    />
-                  </template>
-                </el-table-column>
+                />
 
                 <el-table-column
                   label="鍙椾綋濮撴皬"
                   align="center"
                   width="120"
                   prop="name"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.name"
-                      placeholder="鍙椾綋濮撴皬"
-                      :disabled="
-                        form.allocationStatus == '1' ||
-                          scope.row.allocationstatus == '3'
-                      "
-                    />
-                  </template>
-                </el-table-column>
+                />
 
                 <el-table-column
                   label="绉绘鍖婚櫌"
                   align="center"
                   width="200"
                   prop="transplanthospitalname"
-                >
-                  <template slot-scope="scope">
-                    <el-autocomplete
-                      v-model="scope.row.transplanthospitalname"
-                      :fetch-suggestions="queryHospitalSearch"
-                      placeholder="璇烽�夋嫨鎴栬緭鍏ョЩ妞嶅尰闄�"
-                      style="width: 100%"
-                      clearable
-                    ></el-autocomplete>
-                  </template>
-                  <!-- <template slot-scope="scope">
-                    <el-select
-                      v-model="scope.row.transplanthospitalname"
-                      placeholder="璇烽�夋嫨绉绘鍖婚櫌"
-                      style="width: 100%"
-                    >
-                      <el-option
-                        v-for="dict in dict.type.Geta_hospital"
-                        :key="dict.value"
-                        :label="dict.label"
-                        :value="dict.value"
-                      ></el-option>
-                    </el-select>
-                  </template> -->
-                </el-table-column>
+                  show-overflow-tooltip
+                />
 
                 <!-- 淇敼template涓殑璇存槑鍒� -->
                 <el-table-column
@@ -264,16 +115,7 @@
                 >
                   <template slot-scope="scope">
                     <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'
-                        "
-                      />
+                      <span>{{ scope.row.reallocationreason || '-' }}</span>
                     </div>
                     <div v-else>
                       <!-- 閲嶅垎閰嶈褰曪細鏄剧ず璇︾粏鏌ョ湅鎸夐挳 -->
@@ -311,102 +153,11 @@
                   </template>
                 </el-table-column>
 
-                <el-table-column
-                  label="鎿嶄綔"
-                  align="center"
-                  width="120"
-                  class-name="small-padding fixed-width"
-                  v-if="form.allocationStatus !== '1'"
-                  fixed="right"
-                >
-                  <template slot-scope="scope">
-                    <el-button
-                      size="mini"
-                      type="text"
-                      icon="el-icon-copy-document"
-                      @click="handleRedistribution(scope.row)"
-                      :disabled="scope.row.allocationstatus == '3'"
-                      style="color: #e6a23c;"
-                    >
-                      {{
-                        scope.row.allocationstatus == "3"
-                          ? "宸查噸鍒嗛厤"
-                          : "閲嶅垎閰�"
-                      }}
-                    </el-button>
-                    <el-button
-                      v-if="scope.row.allocationstatus != '3'"
-                      size="mini"
-                      type="text"
-                      icon="el-icon-delete"
-                      @click="handleInvalidate(scope.row)"
-                      :disabled="
-                        scope.row.allocationstatus == '3' ||
-                          scope.row.allocationstatus == '2'
-                      "
-                      style="color: #f56c6c;"
-                    >
-                      {{
-                        scope.row.allocationstatus == "2" ? "宸蹭綔搴�" : "浣滃簾"
-                      }}
-                    </el-button>
-                  </template>
-                </el-table-column>
-              </el-table>
-            </el-form-item>
-          </el-col>
-        </el-row>
+      </el-table>
 
-        <!-- 鍒嗛厤缁熻淇℃伅 -->
-        <!-- <div
-          class="allocation-stats"
-          v-if="
-            allocationData.serviceDonateorganList &&
-              allocationData.serviceDonateorganList.length > 0
-          "
-        >
-          <el-row :gutter="20">
-            <el-col :span="6">
-              <div class="stat-item">
-                <span class="stat-label">宸插垎閰嶅櫒瀹�:</span>
-                <span class="stat-value"
-                  >{{ allocationData.serviceDonateorganList.length }} 涓�</span
-                >
-              </div>
-            </el-col>
-            <el-col :span="6">
-              <div class="stat-item">
-                <span class="stat-label">寰呭鏍�:</span>
-                <span class="stat-value">{{ pendingReviewCount }} 涓�</span>
-              </div>
-            </el-col>
-            <el-col :span="6">
-              <div class="stat-item">
-                <span class="stat-label">娑夊強鍖婚櫌:</span>
-                <span class="stat-value">{{ uniqueHospitals }} 瀹�</span>
-              </div>
-            </el-col>
-            <el-col :span="6">
-              <div class="stat-item">
-                <span class="stat-label">閲嶅垎閰�:</span>
-                <span class="stat-value">{{ redistributedCount }} 涓�</span>
-              </div>
-            </el-col>
-          </el-row>
-        </div> -->
-
-        <div
-          v-if="
-            !allocationData.serviceDonateorganList ||
-              allocationData.serviceDonateorganList.length == 0
-          "
-          class="empty-allocation"
-        >
-          <el-empty description="鏆傛棤鍒嗛厤璁板綍" :image-size="80">
-            <span>璇峰厛閫夋嫨瑕佸垎閰嶇殑鍣ㄥ畼</span>
-          </el-empty>
-        </div>
-      </el-form>
+      <div v-if="!displayOrgans.length" class="empty-allocation">
+        <el-empty description="鏆傛棤鍒嗛厤璁板綍" :image-size="80" />
+      </div>
     </el-card>
 
     <!-- 闄勪欢绠$悊閮ㄥ垎浼樺寲 -->
@@ -414,23 +165,7 @@
       <div class="attachment-header">
         <i class="el-icon-paperclip"></i>
         <span class="attachment-title">鐩稿叧闄勪欢</span>
-        <span class="attachment-tip"
-          >鏀寔涓婁紶鍣ㄥ畼鍒嗛厤鐩稿叧鏂囦欢 (鏈�澶歿{ attachmentLimit }}涓�)</span
-        >
       </div>
-
-      <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
-      <UploadAttachment
-        ref="uploadAttachment"
-        :file-list="attachmentFileList"
-        :limit="attachmentLimit"
-        :accept="attachmentAccept"
-        :multiple="true"
-        @change="handleAttachmentChange"
-        @upload-success="handleUploadSuccess"
-        @upload-error="handleUploadError"
-        @remove="handleAttachmentRemove"
-      />
 
       <!-- 闄勪欢鍒楄〃灞曠ず -->
       <div class="attachment-list" v-if="attachments && attachments.length > 0">
@@ -462,7 +197,7 @@
               <span>{{ formatFileSize(scope.row.fileSize) }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="鎿嶄綔" width="280" fixed="right">
+          <el-table-column label="鎿嶄綔" width="180" fixed="right">
             <template slot-scope="scope">
               <el-button
                 size="mini"
@@ -479,92 +214,15 @@
               >
                 涓嬭浇
               </el-button>
-              <el-button
-                size="mini"
-                type="danger"
-                @click="handleRemoveAttachment(scope.$index)"
-              >
-                鍒犻櫎
-              </el-button>
             </template>
           </el-table-column>
         </el-table>
       </div>
-    </el-card>
-    <div style="text-align: center; margin: 30px 0;">
-      <el-button type="primary" @click="handleSave" :loading="saveLoading">
-        淇濆瓨
-      </el-button>
-      <el-button
-        type="success"
-        @click="handleConfirmAllocation"
-        :disabled="form.allocationStatus == '1'"
-        :loading="confirmLoading"
-      >
-        纭鍒嗛厤
-      </el-button>
-    </div>
-    <!-- 閲嶅垎閰嶅璇濇 -->
-    <el-dialog
-      title="鍣ㄥ畼閲嶅垎閰�"
-      :visible.sync="redistributionDialogVisible"
-      width="500px"
-      @close="handleRedistributionDialogClose"
-    >
-      <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" required>
-          <el-input
-            type="textarea"
-            :rows="4"
-            v-model="redistributionForm.reason"
-            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"
-          :loading="redistributionLoading"
-        >
-          纭閲嶅垎閰�
-        </el-button>
+
+      <div v-else class="empty-attachment">
+        <el-empty description="鏆傛棤闄勪欢" :image-size="80" />
       </div>
-    </el-dialog>
+    </el-card>
     <!-- 鍦╰emplate涓坊鍔犻噸鍒嗛厤璇︽儏寮圭獥 -->
     <el-dialog
       title="閲嶅垎閰嶈鎯�"
@@ -574,7 +232,7 @@
       <div v-loading="redistributionDetailLoading">
         <div v-if="currentRedistributionDetail" style="padding: 20px;">
           <!-- 鍩烘湰淇℃伅 -->
-          <el-descriptions title="閲嶅垎閰嶄俊鎭�" :column="2" border>
+          <el-descriptions title="閲嶅垎閰嶄俊鎭�" :column="descriptionColumn" border size="small">
             <el-descriptions-item label="鍣ㄥ畼鍚嶇О">
               {{ currentRedistributionDetail.organname || "-" }}
             </el-descriptions-item>
@@ -709,20 +367,20 @@
   allocationedit,
   donateorganBaseinfoInfo
 } from "@/api/businessApi";
-import UploadAttachment from "@/components/UploadAttachment";
 import FilePreviewDialog from "@/components/FilePreviewDialog";
 import OrgSelecter from "@/views/project/components/orgselect";
 import CaseBasicInfo from "@/components/CaseBasicInfo";
 import dayjs from "dayjs";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
 
 export default {
   name: "OrganAllocationDetail",
   components: {
-    UploadAttachment,
     OrgSelecter,
     FilePreviewDialog,
     CaseBasicInfo
   },
+  mixins: [readonlyDescriptionsMixin],
   dicts: [
     "sys_BloodType",
     "sys_DonationCategory",
diff --git a/src/views/business/course/components/OrganProcurementStage.vue b/src/views/business/course/components/OrganProcurementStage.vue
index fe95cd1..a3e8163 100644
--- a/src/views/business/course/components/OrganProcurementStage.vue
+++ b/src/views/business/course/components/OrganProcurementStage.vue
@@ -1,5 +1,6 @@
 <template>
   <div class="organ-procurement-detail">
+    <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
 
     <!-- 鍩烘湰淇℃伅 -->
     <el-card class="detail-card">
@@ -7,198 +8,32 @@
         <span class="detail-title">鍣ㄥ畼鑾峰彇鍩烘湰淇℃伅</span>
       </div>
 
-      <el-form :model="form" ref="form" :rules="rules" label-width="120px">
-        <!-- 鎵嬫湳鐩稿叧淇℃伅 -->
-        <el-divider content-position="left">鎵嬫湳淇℃伅</el-divider>
+      <el-descriptions title="鎵嬫湳淇℃伅" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="鎵嬫湳鍖荤敓">{{ form.operationdoctor || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鎵嬫湳寮�濮嬫椂闂�">{{ form.operationbegtime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鎵嬫湳缁撴潫鏃堕棿">{{ form.operationendtime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鑵逛富鍔ㄨ剦鎻掔鏃堕棿">{{ form.abdominalaortacannulatime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鑵逛富鍔ㄨ剦鐏屾敞鏃堕棿">{{ form.abdominalaortaperfusiontime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="闂ㄩ潤鑴夋彃绠℃椂闂�">{{ form.portalveincannulatime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="闂ㄩ潤鑴夌亴娉ㄦ椂闂�">{{ form.portalveinperfusiontime || '-' }}</el-descriptions-item>
+      </el-descriptions>
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="鎵嬫湳鍖荤敓" prop="operationdoctor">
-              <el-input v-model="form.operationdoctor" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鎵嬫湳寮�濮嬫椂闂�" prop="operationbegtime">
-              <el-date-picker
-                v-model="form.operationbegtime"
-                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="operationendtime">
-              <el-date-picker
-                v-model="form.operationendtime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+      <el-descriptions title="鍗忚皟鍛樹俊鎭�" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="杩涙墜鏈鏃堕棿">{{ form.coordinatorInOperating || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍑烘墜鏈鏃堕棿">{{ form.coordinatorOutOperating || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鏄惁榛樺搥缂呮��">{{ form.isspendremember === 1 ? '鏄�' : form.isspendremember === 0 ? '鍚�' : '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鎭㈠閬椾綋浠">{{ form.isrestoreremains === 1 ? '鏄�' : form.isrestoreremains === 0 ? '鍚�' : '-' }}</el-descriptions-item>
+      </el-descriptions>
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item
-              label="鑵逛富鍔ㄨ剦鎻掔鏃堕棿"
-              prop="abdominalaortacannulatime"
-            >
-              <el-date-picker
-                v-model="form.abdominalaortacannulatime"
-                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="abdominalaortaperfusiontime"
-            >
-              <el-date-picker
-                v-model="form.abdominalaortaperfusiontime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+      <el-descriptions title="璐熻矗浜轰俊鎭�" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="璐熻矗浜哄鍚�">{{ form.responsibleusername || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍗忚皟鍛樹竴">{{ form.coordinatedusernameo || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍗忚皟鍛樹簩">{{ form.coordinatedusernamet || '-' }}</el-descriptions-item>
+      </el-descriptions>
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="闂ㄩ潤鑴夋彃绠℃椂闂�" prop="portalveincannulatime">
-              <el-date-picker
-                v-model="form.portalveincannulatime"
-                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="portalveinperfusiontime">
-              <el-date-picker
-                v-model="form.portalveinperfusiontime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <!-- 鍗忚皟鍛樹俊鎭� -->
-        <el-divider content-position="left">鍗忚皟鍛樹俊鎭�</el-divider>
-
-        <el-row :gutter="20">
-          <!-- <el-col :span="8">
-            <el-form-item label="鍗忚皟鍛樺鍚�" prop="coordinatorName">
-              <el-input v-model="form.coordinatorName" />
-            </el-form-item>
-          </el-col> -->
-          <el-col :span="8">
-            <el-form-item label="杩涙墜鏈鏃堕棿" prop="coordinatorInOperating">
-              <el-date-picker
-                v-model="form.coordinatorInOperating"
-                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="coordinatorOutOperating">
-              <el-date-picker
-                v-model="form.coordinatorOutOperating"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <!-- <el-col :span="8">
-            <el-form-item label="鍗忚皟鍛樼瀛�" prop="coordinatorSign">
-              <el-input v-model="form.coordinatorSign" />
-            </el-form-item>
-          </el-col> -->
-          <!-- <el-col :span="8">
-            <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>
-
-        <!-- 璐熻矗浜轰俊鎭� -->
-        <el-divider content-position="left">璐熻矗浜轰俊鎭�</el-divider>
-
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="璐熻矗浜哄鍚�" prop="responsibleusername">
-              <el-input v-model="form.responsibleusername" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <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-input v-model="form.coordinatedusernamet" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <!-- 鑾峰彇鏈烘瀯淇℃伅 -->
-        <el-divider content-position="left">鑾峰彇鏈烘瀯淇℃伅</el-divider>
-
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="鑾峰彇鏈烘瀯鍚嶇О" prop="gainhospitalname">
-              <el-input
-                v-model="form.gainhospitalname"
-                placeholder="璇疯緭鍏ヨ幏鍙栨満鏋勫悕绉�"
-              />
-            </el-form-item>
-          </el-col>
-          <!-- <el-col :span="8">
-            <el-form-item label="鎹愮尞缂栧彿" prop="gainhospitalno">
-              <el-input
-                v-model="form.gainhospitalno"
-                placeholder="璇疯緭鍏ユ崘鐚紪鍙�"
-              />
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
+      <el-descriptions title="鑾峰彇鏈烘瀯淇℃伅" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="鑾峰彇鏈烘瀯鍚嶇О">{{ form.gainhospitalname || '-' }}</el-descriptions-item>
+      </el-descriptions>
     </el-card>
 
     <!-- 鍣ㄥ畼鑾峰彇璁板綍閮ㄥ垎 -->
@@ -213,209 +48,29 @@
         </div>
       </div>
 
-      <el-form
-        ref="procurementForm"
-        :rules="procurementRules"
-        :model="procurementData"
-        label-position="right"
-      >
-        <el-row>
-          <el-col>
-            <el-form-item label-width="100px" label="鎹愮尞鍣ㄥ畼">
-              <el-checkbox-group
-                v-model="selectedOrgans"
-                @change="handleOrganSelectionChange"
-              >
-                <el-checkbox
-                  v-for="dict in dict.type.sys_Organ || []"
-                  :key="dict.value"
-                  :label="dict.value"
-                >
-                  {{ dict.label }}
-                </el-checkbox>
-              </el-checkbox-group>
-            </el-form-item>
-          </el-col>
-        </el-row>
+      <el-descriptions title="鎹愮尞鍣ㄥ畼" :column="1" border size="small" style="margin-bottom: 16px;">
+        <el-descriptions-item label="鎹愮尞鍣ㄥ畼">
+          <template v-if="selectedOrgans && selectedOrgans.length">
+            <span v-for="(v, i) in selectedOrgans" :key="v">
+              {{ getOrganLabel(v) }}<span v-if="i < selectedOrgans.length - 1">銆�</span>
+            </span>
+          </template>
+          <template v-else>-</template>
+        </el-descriptions-item>
+      </el-descriptions>
 
-        <el-row>
-          <el-col>
-            <el-form-item>
-              <el-table
-                :data="displayOrgans"
-                v-loading="loading"
-                border
-                style="width: 100%"
-                :row-class-name="getOrganRowClassName"
-              >
-                <el-table-column
-                  label="鍣ㄥ畼鍚嶇О"
-                  align="center"
-                  width="120"
-                  prop="organname"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.organname"
-                      placeholder="鍣ㄥ畼鍚嶇О"
-                      :disabled="true"
-                    />
-                  </template>
-                </el-table-column>
+      <el-table :data="displayOrgans" v-loading="loading" border style="width: 100%">
+        <el-table-column label="鍣ㄥ畼鍚嶇О" align="center" prop="organname" />
+        <el-table-column label="鑾峰彇寮�濮嬫椂闂�" align="center" prop="organStartTime" />
+        <el-table-column label="鍣ㄥ畼绂讳綋鏃堕棿" align="center" prop="organgettime" />
+        <el-table-column label="鑾峰彇鍖婚櫌" align="center" prop="gainhospitalname" show-overflow-tooltip />
+        <el-table-column label="鑾峰彇鍖诲笀" align="center" prop="organgetdoct" />
+        <el-table-column label="璇存槑" align="center" prop="notgetreason" min-width="200" show-overflow-tooltip />
+      </el-table>
 
-                <el-table-column
-                  label="鑾峰彇寮�濮嬫椂闂�"
-                  align="center"
-                  width="260"
-                  prop="organStartTime"
-                >
-                  <template slot-scope="scope">
-                    <el-date-picker
-                      clearable
-                      size="small"
-                      style="width: 100%"
-                      v-model="scope.row.organStartTime"
-                      type="datetime"
-                      value-format="yyyy-MM-dd HH:mm:ss"
-                      placeholder="閫夋嫨鑾峰彇寮�濮嬫椂闂�"
-                    />
-                  </template>
-                </el-table-column>
-
-                <el-table-column
-                  label="鍣ㄥ畼绂讳綋鏃堕棿"
-                  align="center"
-                  width="260"
-                  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="閫夋嫨鍣ㄥ畼绂讳綋鏃堕棿"
-                    />
-                  </template>
-                </el-table-column>
-
-                <el-table-column
-                  label="鑾峰彇鍖婚櫌"
-                  align="center"
-                  width="300"
-                  prop="gainhospitalname"
-                >
-                  <!-- <template slot-scope="scope">
-                    <el-select
-                      v-model="scope.row.gainhospitalname"
-                      placeholder="璇烽�夋嫨鑾峰彇鍖婚櫌"
-                      style="width: 100%"
-                    >
-                      <el-option
-                        v-for="dict in dict.type.Geta_hospital"
-                        :key="dict.value"
-                        :label="dict.label"
-                        :value="dict.value"
-                      ></el-option>
-
-                    </el-select>
-                  </template> -->
-                  <template slot-scope="scope">
-                    <el-autocomplete
-                      v-model="scope.row.gainhospitalname"
-                      :fetch-suggestions="queryHospitalSearch"
-                      placeholder="璇烽�夋嫨鎴栬緭鍏ヨ幏鍙栧尰闄�"
-                      style="width: 100%"
-                      clearable
-                    ></el-autocomplete>
-                  </template>
-                </el-table-column>
-
-                <el-table-column
-                  label="鑾峰彇鍖诲笀"
-                  align="center"
-                  width="150"
-                  prop="organgetdoct"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.organgetdoct"
-                      placeholder="鑾峰彇鍖诲笀"
-                    />
-                  </template>
-                </el-table-column>
-
-                <!-- <el-table-column
-                  label="鑾峰彇鐘舵��"
-                  align="center"
-                  width="120"
-                  prop="organstate"
-                >
-                  <template slot-scope="scope">
-                    <el-select
-                      v-model="scope.row.organstate"
-                      placeholder="璇烽�夋嫨鑾峰彇鐘舵��"
-                      style="width: 100%"
-                    >
-                      <el-option
-                        v-for="dict in dict.type.Obtain_status"
-                        :key="dict.value"
-                        :label="dict.label"
-                        :value="dict.value"
-                      />
-                    </el-select>
-                  </template>
-                </el-table-column> -->
-
-                <el-table-column
-                  label="璇存槑"
-                  align="center"
-                  prop="notgetreason"
-                  min-width="200"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      type="textarea"
-                      clearable
-                      v-model="scope.row.notgetreason"
-                      placeholder="璇疯緭鍏ユ湭鑾峰彇璇存槑"
-                    />
-                  </template>
-                </el-table-column>
-
-                <el-table-column
-                  label="鎿嶄綔"
-                  align="center"
-                  width="120"
-                  class-name="small-padding fixed-width"
-                >
-                  <template slot-scope="scope">
-                    <el-button
-                      size="mini"
-                      type="text"
-                      icon="el-icon-edit"
-                      @click="handleEditProcurement(scope.row)"
-                    >
-                      缂栬緫
-                    </el-button>
-                  </template>
-                </el-table-column>
-              </el-table>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <div
-          v-if="!procurementData.serviceDonationwitnessorgans"
-          class="empty-procurement"
-        >
-          <el-empty description="鏆傛棤鑾峰彇璁板綍" :image-size="80">
-            <span>璇峰厛閫夋嫨瑕佽幏鍙栫殑鍣ㄥ畼</span>
-          </el-empty>
-        </div>
-      </el-form>
+      <div v-if="!displayOrgans.length" class="empty-procurement">
+        <el-empty description="鏆傛棤鑾峰彇璁板綍" :image-size="80" />
+      </div>
     </el-card>
 
     <!-- 闄勪欢绠$悊閮ㄥ垎 - 鍒嗙被Tab灞曠ず -->
@@ -424,253 +79,96 @@
         <span class="detail-title">鐩稿叧闄勪欢</span>
       </div>
 
-      <!-- 涓婁紶鍖哄煙锛堟棤鍒嗙被閫夋嫨锛岀敱Tab鎺у埗锛� -->
-      <div class="upload-wrapper">
-        <UploadAttachment
-          ref="uploadAttachment"
-          :file-list="attachmentFileList"
-          :limit="attachmentLimit"
-          :accept="attachmentAccept"
-          :multiple="true"
-          @change="handleAttachmentChange"
-          @upload-success="handleUploadSuccess"
-          @upload-error="handleUploadError"
-          @remove="handleAttachmentRemove"
-        />
-        <div style="font-size:12px; color:#909399; margin-top:4px;">
-          褰撳墠涓婁紶鍒嗙被锛�<el-tag size="small" type="info">{{
-            activeTab === "鏈垎绫�" ? "鏈垎绫�" : activeTab
-          }}</el-tag>
-          锛堝垏鎹� Tab 鍙敼鍙樹笂浼犲垎绫伙級
-        </div>
-      </div>
-
-      <!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず锛屾敮鎸佷慨鏀瑰垎绫� -->
-      <div class="attachment-list" v-if="attachments && attachments.length > 0">
-        <el-tabs v-model="activeTab" type="border-card">
-          <el-tab-pane
-            v-for="category in categories"
-            :key="category"
-            :label="category + '(' + getCategoryCount(category) + ')'"
-            :name="category"
+      <!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず -->
+      <el-tabs v-model="activeTab" type="border-card">
+        <el-tab-pane
+          v-for="category in categories"
+          :key="category"
+          :label="category + '(' + getCategoryCount(category) + ')'"
+          :name="category"
+        >
+          <el-table
+            :data="getCategoryFiles(category)"
+            style="width: 100%"
+            size="small"
+            border
           >
-            <el-table
-              :data="getCategoryFiles(category)"
-              style="width: 100%"
-              size="small"
-              border
-            >
-              <el-table-column label="鏂囦欢鍚�" min-width="180">
-                <template #default="scope">
-                  <i
-                    class="el-icon-document"
-                    style="margin-right: 8px; color: #409EFF;"
-                  ></i>
-                  <span class="file-name">{{ scope.row.fileName }}</span>
-                </template>
-              </el-table-column>
-              <!-- 鍙紪杈戝垎绫讳笅鎷� -->
-              <el-table-column label="鍒嗙被" width="150">
-                <template #default="scope">
-                  <el-select
-                    v-model="scope.row.fileType"
-                    size="small"
-                    @change="updateAttachmentCategory(scope.row, $event)"
-                    placeholder="閫夋嫨鍒嗙被"
-                  >
-                    <el-option label="鍘熻〃鎷嶇収" value="鍘熻〃鎷嶇収" />
-                    <el-option label="浼︾悊瀹℃煡鏉愭枡" value="浼︾悊瀹℃煡鏉愭枡" />
-                    <el-option label="姝讳骸鍒ゅ畾鏉愭枡" value="姝讳骸鍒ゅ畾鏉愭枡" />
-                    <el-option label="榛樺搥浠紡鐓х墖" value="榛樺搥浠紡鐓х墖" />
-                    <el-option label="鎹愮尞瑙佽瘉瑙嗛" value="鎹愮尞瑙佽瘉瑙嗛" />
-                    <el-option label="鏈垎绫�" value="" />
-                  </el-select>
-                </template>
-              </el-table-column>
-              <el-table-column label="鏂囦欢绫诲瀷" width="100">
-                <template #default="scope">
-                  <el-tag size="small">{{
-                    getFileTypeText(scope.row.fileName)
-                  }}</el-tag>
-                </template>
-              </el-table-column>
-              <el-table-column label="涓婁紶鏃堕棿" width="160">
-                <template #default="scope">
-                  <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="鏂囦欢澶у皬" width="100">
-                <template #default="scope">
-                  <span>{{ formatFileSize(scope.row.fileSize) }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="鎿嶄綔" width="180" fixed="right">
-                <template #default="scope">
-                  <el-button
-                    size="mini"
-                    type="primary"
-                    @click="handlePreview(scope.row)"
-                    >棰勮</el-button
-                  >
-                  <el-button
-                    size="mini"
-                    type="danger"
-                    @click="handleRemoveAttachmentByFile(scope.row)"
-                    >鍒犻櫎</el-button
-                  >
-                </template>
-              </el-table-column>
-            </el-table>
-          </el-tab-pane>
-        </el-tabs>
-      </div>
-
-      <!-- 鏃犻檮浠舵椂鏄剧ず -->
-      <div v-else style="text-align:center; padding:20px; color:#909399;">
-        鏆傛棤闄勪欢锛岃涓婁紶
-      </div>
+            <el-table-column label="鏂囦欢鍚�" min-width="180">
+              <template #default="scope">
+                <i
+                  class="el-icon-document"
+                  style="margin-right: 8px; color: #409EFF;"
+                ></i>
+                <span class="file-name">{{ scope.row.fileName }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鍒嗙被" width="150">
+              <template #default="scope">
+                <span>{{ scope.row.fileType || '鏈垎绫�' }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鏂囦欢绫诲瀷" width="100">
+              <template #default="scope">
+                <el-tag size="small">{{
+                  getFileTypeText(scope.row.fileName)
+                }}</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="涓婁紶鏃堕棿" width="160">
+              <template #default="scope">
+                <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鏂囦欢澶у皬" width="100">
+              <template #default="scope">
+                <span>{{ formatFileSize(scope.row.fileSize) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鎿嶄綔" width="100" fixed="right">
+              <template #default="scope">
+                <el-button
+                  size="mini"
+                  type="primary"
+                  @click="handlePreview(scope.row)"
+                  >棰勮</el-button
+                >
+              </template>
+            </el-table-column>
+          </el-table>
+          <div
+            v-if="getCategoryFiles(category).length === 0"
+            style="text-align:center; padding:20px; color:#909399;"
+          >
+            鏆傛棤闄勪欢
+          </div>
+        </el-tab-pane>
+      </el-tabs>
     </el-card>
-    <div style="text-align: center; margin: 30px 0;">
-      <el-button type="primary" @click="handleSave" :loading="saveLoading">
-        淇濆瓨
-      </el-button>
-      <el-button
-        type="success"
-        @click="handleProcure"
-        :loading="confirmLoading"
-      >
-        纭鑾峰彇
-      </el-button>
-    </div>
-    <!-- 缂栬緫鑾峰彇璁板綍瀵硅瘽妗� -->
-    <el-dialog
-      title="缂栬緫鍣ㄥ畼鑾峰彇璁板綍"
-      :visible.sync="editDialogVisible"
-      width="600px"
-    >
-      <el-form :model="currentRecord" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鍣ㄥ畼鍚嶇О">
-              <el-input v-model="currentRecord.organname" readonly />
-            </el-form-item>
-          </el-col>
-          <!-- <el-col :span="12">
-            <el-form-item label="鑾峰彇鐘舵��">
-              <el-select v-model="currentRecord.organstate" style="width: 100%">
-                <el-option
-                  v-for="dict in dict.type.Obtain_status"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鑾峰彇鍖诲笀">
-              <el-input
-                v-model="currentRecord.organgetdoct"
-                placeholder="璇疯緭鍏ヨ幏鍙栧尰甯�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍔╂墜">
-              <el-input
-                v-model="currentRecord.assistant"
-                placeholder="璇疯緭鍏ュ姪鎵嬪鍚�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鑾峰彇鎶ゅ+">
-              <el-input
-                v-model="currentRecord.procurementNurse"
-                placeholder="璇疯緭鍏ヨ幏鍙栨姢澹�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鎵嬫湳瀹ゆ姢澹�">
-              <el-input
-                v-model="currentRecord.operatingRoomNurse"
-                placeholder="璇疯緭鍏ユ墜鏈鎶ゅ+"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-form-item label="楹婚唹鍖荤敓">
-          <el-input
-            v-model="currentRecord.anesthesiologist"
-            placeholder="璇疯緭鍏ラ夯閱夊尰鐢�"
-          />
-        </el-form-item>
-
-        <el-form-item label="鏈幏鍙栬鏄�">
-          <el-input
-            type="textarea"
-            :rows="3"
-            v-model="currentRecord.notgetreason"
-            placeholder="璇疯緭鍏ユ湭鑾峰彇鐨勫師鍥犺鏄�"
-          />
-        </el-form-item>
-      </el-form>
-
-      <div slot="footer">
-        <el-button @click="editDialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleEditConfirm">纭</el-button>
-      </div>
-    </el-dialog>
-
     <!-- 鏂囦欢棰勮寮圭獥 -->
-    <el-dialog
-      :title="filePreviewTitle"
-      :visible.sync="filePreviewVisible"
-      width="800px"
-      @close="filePreviewVisible = false"
-    >
-      <div v-if="currentPreviewFile">
-        <div v-if="currentPreviewFile.fileType === 'image'">
-          <img
-            :src="currentPreviewFile.fileUrl"
-            style="max-width: 100%; max-height: 500px;"
-          />
-        </div>
-        <div v-else-if="currentPreviewFile.fileType === 'pdf'">
-          <iframe
-            :src="currentPreviewFile.fileUrl"
-            width="100%"
-            height="500px"
-          ></iframe>
-        </div>
-        <div v-else>
-          <p>涓嶆敮鎸侀瑙堟鏂囦欢绫诲瀷锛岃涓嬭浇鏌ョ湅</p>
-        </div>
-      </div>
-    </el-dialog>
+    <FilePreviewDialog
+      :visible="previewVisible"
+      :file="currentPreviewFile"
+      @close="previewVisible = false"
+      @download="handleDownload"
+    />
   </div>
 </template>
 
 <script>
 import { witnessList, witnessadd, witnessedit } from "@/api/businessApi";
-import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
 import CaseBasicInfo from "@/components/CaseBasicInfo";
+import { getToken } from "@/utils/auth";
 import dayjs from "dayjs";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
 
 export default {
   name: "OrganProcurementDetail",
   components: {
-    UploadAttachment,
+    FilePreviewDialog,
     CaseBasicInfo
   },
+  mixins: [readonlyDescriptionsMixin],
   dicts: [
     "sys_BloodType",
     "Geta_hospital",
@@ -784,19 +282,22 @@
       },
       // 闄勪欢鏁版嵁
       attachments: [],
-      attachmentFileList: [],
-      // 闄勪欢鐩稿叧閰嶇疆
-      attachmentLimit: 10,
-      attachmentAccept:
-        ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt",
+      // 涓婁紶鐩稿叧
+      uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+      headers: {
+        Authorization: "Bearer " + getToken()
+      },
+      uploadDialogVisible: false,
+      uploadLoading: false,
+      tempFileList: [],
+      currentUploadCategory: "",
       // 缂栬緫瀵硅瘽妗�
       editDialogVisible: false,
       currentRecord: {},
       currentEditIndex: -1,
       // 鏂囦欢棰勮鐩稿叧
-      filePreviewVisible: false,
-      currentPreviewFile: null,
-      filePreviewTitle: ""
+      previewVisible: false,
+      currentPreviewFile: null
     };
   },
   computed: {
@@ -854,22 +355,6 @@
       return this.dict.type.sys_Organ || [];
     }
   },
-  watch: {
-    // 鐩戝惉闄勪欢鏁版嵁鍙樺寲
-    attachments: {
-      handler(newAttachments) {
-        this.attachmentFileList = newAttachments.map(item => ({
-          uid: item.id || Math.random(),
-          name: item.fileName,
-          fileSize: item.fileSize,
-          url: item.path || item.fileUrl,
-          uploadTime: item.uploadTime,
-          status: "success"
-        }));
-      },
-      deep: true
-    }
-  },
   created() {
     this.caseId = this.infoid;
 
@@ -884,7 +369,7 @@
 
     // 鍒濆鍖栨暟鎹�
     initData() {
-      const  infoid  = this.infoid;
+      const infoid = this.infoid;
 
       if (!infoid) {
         this.$message.error("缂哄皯蹇呰鐨勮矾鐢卞弬鏁� infoid");
@@ -939,19 +424,8 @@
               fileType: item.fileType || "" // 榛樿绌哄瓧绗︿覆琛ㄧず鏈垎绫�
             }));
             this.form.attachments = this.attachments;
-            // 鍚屾 attachmentFileList
-            this.attachmentFileList = this.attachments.map(item => ({
-              uid: item.id || Math.random(),
-              name: item.fileName,
-              url: item.path || item.fileUrl,
-              fileSize: item.fileSize,
-              uploadTime: item.uploadTime,
-              status: "success",
-              raw: item
-            }));
           } else {
             this.attachments = [];
-            this.attachmentFileList = [];
           }
 
           // 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
@@ -1387,133 +861,163 @@
       this.handleConfirmProcurement();
     },
 
-    // 闄勪欢鐩稿叧鏂规硶
-    /** 闄勪欢鍙樺寲澶勭悊 */
-    handleAttachmentChange(fileList) {
-      this.attachmentFileList = fileList;
+    // ===== 闄勪欢鐩稿叧鏂规硶 =====
+    // 鎵撳紑涓婁紶瀵硅瘽妗�
+    openUploadDialog(category) {
+      this.currentUploadCategory = category;
+      this.tempFileList = [];
+      this.uploadDialogVisible = true;
+      this.$nextTick(() => {
+        if (this.$refs.uploadRef) {
+          this.$refs.uploadRef.clearFiles();
+        }
+      });
     },
 
-    /** 闄勪欢绉婚櫎澶勭悊 */
-   handleAttachmentRemove(file) {
-  // 鐩存帴璋冪敤鏂扮殑鍒犻櫎鏂规硶
-  if (file.raw) {
-    this.handleRemoveAttachmentByFile(file.raw);
-  } else if (file.url) {
-    const target = this.attachments.find(
-      item => item.path === file.url || item.fileUrl === file.url
-    );
-    if (target) {
-      this.handleRemoveAttachmentByFile(target);
-    }
-  }
-},
-
-    /** 涓婁紶鎴愬姛澶勭悊 */
-    handleUploadSuccess({ file, fileList, response }) {
-  if (response.code === 200) {
-    // 鏍规嵁褰撳墠婵�娲荤殑 Tab 鍐冲畾鍒嗙被锛堟湭鍒嗙被 Tab 瀵瑰簲绌哄瓧绗︿覆锛�
-    const category = this.activeTab === '鏈垎绫�' ? '' : this.activeTab;
-    const attachmentObj = {
-      fileName: file.name,
-      path: response.fileUrl || file.url,
-      fileUrl: response.fileUrl || file.url,
-      fileType: category,                    // 鍏抽敭锛氳褰曞垎绫�
-      fileSize: file.size,
-      uploadTime: dayjs().format('YYYY-MM-DD HH:mm:ss')
-    };
-
-    if (!Array.isArray(this.attachments)) {
-      this.attachments = [];
-    }
-    this.attachments.push(attachmentObj);
-    this.attachmentFileList = fileList;
-    this.$message.success('鏂囦欢涓婁紶鎴愬姛');
-  }
-},
-// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
-getCategoryCount(category) {
-  return this.attachments.filter(item => {
-    const type = item.fileType || '';
-    if (category === '鏈垎绫�') {
-      return !this.presetCategories.includes(type);
-    }
-    return type === category;
-  }).length;
-},
-
-// 鑾峰彇鏌愬垎绫荤殑鏂囦欢鍒楄〃
-getCategoryFiles(category) {
-  return this.attachments.filter(item => {
-    const type = item.fileType || '';
-    if (category === '鏈垎绫�') {
-      return !this.presetCategories.includes(type);
-    }
-    return type === category;
-  });
-},
-
-// 鏇存柊闄勪欢鍒嗙被锛堜笅鎷変慨鏀规椂瑙﹀彂锛�
-updateAttachmentCategory(row, newVal) {
-  const target = this.attachments.find(item => item === row);
-  if (target) {
-    target.fileType = newVal; // 鍙兘涓虹┖瀛楃涓�
-    // 鍚屾鏇存柊 attachmentFileList
-    const fileItem = this.attachmentFileList.find(
-      f => f.raw === row || f.url === row.fileUrl
-    );
-    if (fileItem) {
-      fileItem.raw.fileType = newVal;
-      fileItem.fileType = newVal || '鏈垎绫�';
-    }
-    // 濡傛灉褰撳墠婵�娲荤殑tab娌℃湁鏂囦欢浜嗭紝鑷姩鍒囨崲鍒扮涓�涓湁鏂囦欢鐨則ab
-    const currentTabHasFiles = this.getCategoryFiles(this.activeTab).length > 0;
-    if (!currentTabHasFiles) {
-      const firstCategory = this.categories[0];
-      if (firstCategory) this.activeTab = firstCategory;
-    }
-  }
-},
-
-// 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
-handleRemoveAttachmentByFile(file) {
-  const index = this.attachments.findIndex(item => item === file);
-  if (index > -1) {
-    this.attachments.splice(index, 1);
-    // 鍚屾鍒犻櫎 attachmentFileList
-    const fileIndex = this.attachmentFileList.findIndex(
-      f => f.raw === file || f.url === file.fileUrl
-    );
-    if (fileIndex > -1) {
-      this.attachmentFileList.splice(fileIndex, 1);
-    }
-    this.$message.success('闄勪欢鍒犻櫎鎴愬姛');
-  }
-},
-    /** 涓婁紶閿欒澶勭悊 */
-    handleUploadError({ file, fileList, error }) {
-      console.error("闄勪欢涓婁紶澶辫触:", error);
-      this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+    // 涓婁紶鍓嶆牎楠�
+    beforeUpload(file) {
+      const allowedTypes = [
+        "application/pdf",
+        "image/jpeg",
+        "image/png",
+        "application/msword",
+        "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+      ];
+      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");
+      if (!isTypeOk) {
+        this.$message.error(
+          "鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢"
+        );
+        return false;
+      }
+      if (file.size > maxSize) {
+        this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
+        return false;
+      }
+      return true;
     },
 
-    /** 鎵嬪姩鍒犻櫎闄勪欢 */
-    handleRemoveAttachment(index) {
-      this.attachments.splice(index, 1);
-      this.attachmentFileList.splice(index, 1);
-      this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+    // 鏂囦欢閫夋嫨鍙樺寲
+    handleFileChange(file, fileList) {
+      this.tempFileList = fileList;
     },
 
-    /** 鏂囦欢棰勮 */
+    // 涓存椂绉婚櫎
+    handleTempRemove(file, fileList) {
+      this.tempFileList = fileList;
+    },
+
+    // 涓婁紶鎴愬姛澶勭悊
+    handleUploadSuccess(response, file, fileList) {
+      if (response.code !== 200) {
+        this.$message.error(response.msg || "涓婁紶澶辫触");
+        return;
+      }
+      // 鏈垎绫诲搴旂┖瀛楃涓诧紝涓庡睍绀�/淇濆瓨閫昏緫涓�鑷�
+      const category =
+        this.currentUploadCategory === "鏈垎绫�"
+          ? ""
+          : this.currentUploadCategory;
+      const attachmentObj = {
+        fileName: file.name,
+        path: response.fileUrl || response.url || response.data || file.url,
+        fileUrl: response.fileUrl || response.url || response.data || file.url,
+        fileType: category,
+        fileSize: file.size,
+        uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+      };
+      if (!Array.isArray(this.attachments)) {
+        this.attachments = [];
+      }
+      this.attachments.push(attachmentObj);
+      this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+      this.uploadLoading = false;
+      this.uploadDialogVisible = false;
+      this.tempFileList = [];
+    },
+
+    // 鎻愪氦涓婁紶
+    submitUpload() {
+      if (this.tempFileList.length === 0) {
+        this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
+        return;
+      }
+      this.uploadLoading = true;
+      this.$refs.uploadRef.submit();
+    },
+
+    // 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
+    getCategoryCount(category) {
+      return this.attachments.filter(item => {
+        const type = item.fileType || "";
+        if (category === "鏈垎绫�") {
+          return !this.presetCategories.includes(type);
+        }
+        return type === category;
+      }).length;
+    },
+
+    // 鑾峰彇鏌愬垎绫荤殑鏂囦欢鍒楄〃
+    getCategoryFiles(category) {
+      return this.attachments.filter(item => {
+        const type = item.fileType || "";
+        if (category === "鏈垎绫�") {
+          return !this.presetCategories.includes(type);
+        }
+        return type === category;
+      });
+    },
+
+    // 鏇存柊闄勪欢鍒嗙被锛堜笅鎷変慨鏀规椂瑙﹀彂锛�
+    updateAttachmentCategory(row, newVal) {
+      const target = this.attachments.find(item => item === row);
+      if (target) {
+        target.fileType = newVal;
+        const currentTabHasFiles =
+          this.getCategoryFiles(this.activeTab).length > 0;
+        if (!currentTabHasFiles) {
+          const firstCategory = this.categories[0];
+          if (firstCategory) this.activeTab = firstCategory;
+        }
+      }
+    },
+
+    // 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
+    handleRemoveAttachmentByFile(file) {
+      this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(() => {
+          const index = this.attachments.findIndex(item => item === file);
+          if (index > -1) {
+            this.attachments.splice(index, 1);
+            this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+          }
+        })
+        .catch(() => {});
+    },
+
+    // 鏂囦欢棰勮
     handlePreview(file) {
       this.currentPreviewFile = {
         fileName: file.fileName,
         fileUrl: file.path || file.fileUrl,
         fileType: this.getFileType(file.fileName)
       };
-      this.filePreviewTitle = file.fileName;
-      this.filePreviewVisible = true;
+      this.previewVisible = true;
     },
 
-    /** 鏂囦欢涓嬭浇 */
+    // 鏂囦欢涓嬭浇
     handleDownload(file) {
       const fileUrl = file.path || file.fileUrl;
       const fileName = file.fileName;
diff --git a/src/views/business/course/components/OrganUtilizationStage.vue b/src/views/business/course/components/OrganUtilizationStage.vue
index 0545d9b..a3e8163 100644
--- a/src/views/business/course/components/OrganUtilizationStage.vue
+++ b/src/views/business/course/components/OrganUtilizationStage.vue
@@ -1,673 +1,254 @@
 <template>
-  <div class="organ-utilization-detail">
-    <el-form :model="form" ref="form" :rules="rules" label-width="120px">
-      <!-- 鍩烘湰淇℃伅 -->
-      <el-card class="detail-card">
-        <div slot="header" class="clearfix">
-          <span class="detail-title">鍣ㄥ畼鍒╃敤鍩烘湰淇℃伅</span>
-        </div>
+  <div class="organ-procurement-detail">
+    <!-- <case-basic-info :case-id="caseId" :show-attachment="true":column="3" /> -->
 
-        <el-row :gutter="20">
-          <el-col :span="6">
-            <el-form-item label="璐熻矗浜�" prop="responsibleusername">
-              <el-input
-                v-model="form.responsibleusername"
-                placeholder="璇疯緭鍏ヨ礋璐d汉濮撳悕"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="鍗忚皟鍛樹竴" prop="coordinatedusernameo">
-              <el-input
-                v-model="form.coordinatedusernameo"
-                placeholder="璇疯緭鍏ュ崗璋冨憳涓�濮撳悕"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="鍗忚皟鍛樹簩" prop="coordinatedusernamet">
-              <el-input
-                v-model="form.coordinatedusernamet"
-                placeholder="璇疯緭鍏ュ崗璋冨憳浜屽鍚�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="瀹屾垚鏃堕棿" prop="completetime">
-              <el-date-picker
-                v-model="form.completetime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <!-- <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鐧昏浜�" prop="createBy">
-              <el-input v-model="form.createBy" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鐧昏鏃堕棿" prop="createTime">
-              <el-date-picker
-                v-model="form.createTime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row> -->
-      </el-card>
-      <el-card class="detail-card">
-        <div slot="header" class="clearfix">
-          <span class="detail-title">閬椾綋鎹愮尞淇℃伅</span>
-        </div>
-        <el-row :gutter="20">
-          <el-col :span="6">
-            <el-form-item align="left" label="閬椾綋鎺ユ敹" prop="isbodydonation">
-              <el-radio-group v-model="form.isbodydonation">
-                <el-radio
-                  v-for="dict in dict.type.sys_0_1 || []"
-                  :key="dict.value"
-                  :label="dict.value"
-                  >{{ dict.label }}</el-radio
-                >
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="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>
-      </el-card>
-    </el-form>
-    <!-- 鍣ㄥ畼鍒╃敤璁板綍閮ㄥ垎 - 鏁村悎鍙楄�呰鎯� -->
-    <el-card class="utilization-card">
+    <!-- 鍩烘湰淇℃伅 -->
+    <el-card class="detail-card">
       <div slot="header" class="clearfix">
-        <span class="detail-title">鍣ㄥ畼鍒╃敤璁板綍</span>
+        <span class="detail-title">鍣ㄥ畼鑾峰彇鍩烘湰淇℃伅</span>
+      </div>
+
+      <el-descriptions title="鎵嬫湳淇℃伅" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="鎵嬫湳鍖荤敓">{{ form.operationdoctor || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鎵嬫湳寮�濮嬫椂闂�">{{ form.operationbegtime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鎵嬫湳缁撴潫鏃堕棿">{{ form.operationendtime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鑵逛富鍔ㄨ剦鎻掔鏃堕棿">{{ form.abdominalaortacannulatime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鑵逛富鍔ㄨ剦鐏屾敞鏃堕棿">{{ form.abdominalaortaperfusiontime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="闂ㄩ潤鑴夋彃绠℃椂闂�">{{ form.portalveincannulatime || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="闂ㄩ潤鑴夌亴娉ㄦ椂闂�">{{ form.portalveinperfusiontime || '-' }}</el-descriptions-item>
+      </el-descriptions>
+
+      <el-descriptions title="鍗忚皟鍛樹俊鎭�" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="杩涙墜鏈鏃堕棿">{{ form.coordinatorInOperating || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍑烘墜鏈鏃堕棿">{{ form.coordinatorOutOperating || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鏄惁榛樺搥缂呮��">{{ form.isspendremember === 1 ? '鏄�' : form.isspendremember === 0 ? '鍚�' : '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鎭㈠閬椾綋浠">{{ form.isrestoreremains === 1 ? '鏄�' : form.isrestoreremains === 0 ? '鍚�' : '-' }}</el-descriptions-item>
+      </el-descriptions>
+
+      <el-descriptions title="璐熻矗浜轰俊鎭�" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="璐熻矗浜哄鍚�">{{ form.responsibleusername || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍗忚皟鍛樹竴">{{ form.coordinatedusernameo || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="鍗忚皟鍛樹簩">{{ form.coordinatedusernamet || '-' }}</el-descriptions-item>
+      </el-descriptions>
+
+      <el-descriptions title="鑾峰彇鏈烘瀯淇℃伅" :column="descriptionColumn" border size="small">
+        <el-descriptions-item label="鑾峰彇鏈烘瀯鍚嶇О">{{ form.gainhospitalname || '-' }}</el-descriptions-item>
+      </el-descriptions>
+    </el-card>
+
+    <!-- 鍣ㄥ畼鑾峰彇璁板綍閮ㄥ垎 -->
+    <el-card class="procurement-card">
+      <div slot="header" class="clearfix">
+        <span class="detail-title">鍣ㄥ畼鑾峰彇璁板綍</span>
         <div style="float: right;">
           <dict-tag
-            :options="dict.type.utilize_statue"
-            :value="form.completeState"
+            :options="dict.type.Obtain_status"
+            :value="form.witnessState"
           />
         </div>
       </div>
 
-      <el-form
-        ref="utilizationForm"
-        :rules="utilizationRules"
-        :model="utilizationData"
-        label-position="right"
-      >
-        <el-row>
-          <el-col>
-            <el-form-item label-width="100px" label="绉绘鍣ㄥ畼">
-              <el-checkbox-group
-                v-model="selectedOrgans"
-                @change="handleOrganSelectionChange"
-              >
-                <el-checkbox
-                  v-for="dict in dict.type.sys_Organ || []"
-                  :key="dict.value"
-                  :label="dict.value"
-                >
-                  {{ dict.label }}
-                </el-checkbox>
-              </el-checkbox-group>
-            </el-form-item>
-          </el-col>
-        </el-row>
+      <el-descriptions title="鎹愮尞鍣ㄥ畼" :column="1" border size="small" style="margin-bottom: 16px;">
+        <el-descriptions-item label="鎹愮尞鍣ㄥ畼">
+          <template v-if="selectedOrgans && selectedOrgans.length">
+            <span v-for="(v, i) in selectedOrgans" :key="v">
+              {{ getOrganLabel(v) }}<span v-if="i < selectedOrgans.length - 1">銆�</span>
+            </span>
+          </template>
+          <template v-else>-</template>
+        </el-descriptions-item>
+      </el-descriptions>
 
-        <el-row>
-          <el-col>
-            <el-form-item>
-              <el-table
-                :data="displayOrgans"
-                v-loading="loading"
-                border
-                style="width: 100%"
-                :row-class-name="getOrganRowClassName"
-                :expand-row-keys="expandedRows"
-                @expand-change="handleExpandChange"
-                row-key="organno"
-              >
-                <el-table-column type="expand" width="60">
-                  <template slot-scope="scope">
-                    <!-- 灞曞紑琛屽唴瀹� - 鍙楄�呰缁嗕俊鎭� -->
-                    <div class="recipient-detail-expand">
-                      <div class="recipient-header">
-                        <span class="recipient-title">鍙楄�呰缁嗕俊鎭�</span>
-                        <el-tag
-                          v-if="scope.row.transplantstate === '1'"
-                          type="success"
-                          size="small"
-                        >
-                          宸茬Щ妞�
-                        </el-tag>
-                        <el-tag
-                          v-else-if="scope.row.transplantstate === '0'"
-                          type="warning"
-                          size="small"
-                        >
-                          鏈Щ妞�
-                        </el-tag>
-                        <el-tag v-else type="info" size="small">
-                          绉绘涓�
-                        </el-tag>
-                      </div>
+      <el-table :data="displayOrgans" v-loading="loading" border style="width: 100%">
+        <el-table-column label="鍣ㄥ畼鍚嶇О" align="center" prop="organname" />
+        <el-table-column label="鑾峰彇寮�濮嬫椂闂�" align="center" prop="organStartTime" />
+        <el-table-column label="鍣ㄥ畼绂讳綋鏃堕棿" align="center" prop="organgettime" />
+        <el-table-column label="鑾峰彇鍖婚櫌" align="center" prop="gainhospitalname" show-overflow-tooltip />
+        <el-table-column label="鑾峰彇鍖诲笀" align="center" prop="organgetdoct" />
+        <el-table-column label="璇存槑" align="center" prop="notgetreason" min-width="200" show-overflow-tooltip />
+      </el-table>
 
-                      <el-form
-                        :model="scope.row"
-                        label-width="140px"
-                        class="recipient-form"
-                      >
-                        <!-- 鍩烘湰淇℃伅閮ㄥ垎 -->
-                        <div class="form-section">
-                          <h4 class="section-title">鍩烘湰淇℃伅</h4>
-                          <el-row :gutter="20">
-                            <el-col :span="8">
-                              <el-form-item label="鍙楄�呭鍚�">
-                                <el-input
-                                  v-model="scope.row.name"
-                                  placeholder="璇疯緭鍏ュ彈鑰呭鍚�"
-                                />
-                              </el-form-item>
-                            </el-col>
-                            <el-col :span="8">
-                              <el-form-item label="鍑虹敓鏃ユ湡">
-                                <el-date-picker
-                                  v-model="scope.row.birthday"
-                                  type="date"
-                                  value-format="yyyy-MM-dd"
-                                  placeholder="閫夋嫨鍑虹敓鏃ユ湡"
-                                  style="width: 100%"
-                                />
-                              </el-form-item>
-                            </el-col>
-                            <el-col :span="8">
-                              <el-form-item label="鎬у埆">
-                                <el-select
-                                  v-model="scope.row.sex"
-                                  placeholder="璇烽�夋嫨鎬у埆"
-                                  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="骞撮緞">
-                                <el-input
-                                  v-model="scope.row.age"
-                                  placeholder="骞撮緞"
-                                />
-                              </el-form-item>
-                            </el-col>
-                            <el-col :span="8">
-                              <el-form-item label="璇佷欢绫诲瀷">
-                                <el-select
-                                  v-model="scope.row.idcardtype"
-                                  placeholder="璇烽�夋嫨璇佷欢绫诲瀷"
-                                  style="width: 100%"
-                                >
-                                  <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-col>
-                            <el-col :span="8">
-                              <el-form-item label="璇佷欢鍙风爜">
-                                <el-input
-                                  v-model="scope.row.idcardno"
-                                  placeholder="璇佷欢鍙风爜"
-                                />
-                              </el-form-item>
-                            </el-col>
-                          </el-row>
-                        </div>
-
-                        <!-- 鑱旂郴淇℃伅閮ㄥ垎 -->
-                        <div class="form-section">
-                          <h4 class="section-title">鑱旂郴淇℃伅</h4>
-                          <el-row :gutter="20">
-                            <el-col :span="12">
-                              <el-form-item label="绉绘涓績鍚嶇О">
-                                <el-input
-                                  v-model="scope.row.hospitalname"
-                                  placeholder="璇疯緭鍏ョЩ妞嶄腑蹇冨悕绉�"
-                                />
-                              </el-form-item>
-                            </el-col>
-                            <el-col :span="12">
-                              <el-form-item label="鑱旂郴鐢佃瘽">
-                                <el-input
-                                  v-model="scope.row.phone"
-                                  placeholder="鑱旂郴鐢佃瘽"
-                                />
-                              </el-form-item>
-                            </el-col>
-                          </el-row>
-
-                          <el-row :gutter="20">
-                            <el-col :span="24">
-                              <el-form-item label="鐜颁綇鍦板潃">
-                                <el-input
-                                  type="textarea"
-                                  :rows="2"
-                                  v-model="scope.row.residenceaddress"
-                                  placeholder="璇疯緭鍏ヨ缁嗗湴鍧�"
-                                />
-                              </el-form-item>
-                            </el-col>
-                          </el-row>
-                        </div>
-
-                        <!-- 绉绘淇℃伅閮ㄥ垎 -->
-                        <div
-                          class="form-section"
-                          v-if="scope.row.transplantstate === '1'"
-                        >
-                          <h4 class="section-title">绉绘淇℃伅</h4>
-                          <el-row :gutter="20">
-                            <el-col :span="12">
-                              <el-form-item label="绉绘鏃堕棿">
-                                <el-date-picker
-                                  v-model="scope.row.transplanttime"
-                                  type="datetime"
-                                  value-format="yyyy-MM-dd HH:mm:ss"
-                                  placeholder="閫夋嫨绉绘鏃ユ湡"
-                                  style="width: 100%"
-                                />
-                              </el-form-item>
-                            </el-col>
-                            <el-col :span="12">
-                              <el-form-item label="绉绘鍖荤敓">
-                                <el-input
-                                  v-model="scope.row.transplantdoct"
-                                  placeholder="璇疯緭鍏ョЩ妞嶅尰鐢�"
-                                />
-                              </el-form-item>
-                            </el-col>
-                          </el-row>
-                        </div>
-
-                        <!-- 鏈Щ妞嶅師鍥� -->
-                        <div
-                          class="form-section"
-                          v-if="scope.row.transplantstate === '0'"
-                        >
-                          <h4 class="section-title">鏈Щ妞嶄俊鎭�</h4>
-                          <el-row :gutter="20">
-                            <el-col :span="24">
-                              <el-form-item label="鏈Щ妞嶅師鍥�">
-                                <el-input
-                                  type="textarea"
-                                  :rows="3"
-                                  v-model="scope.row.abandonreason"
-                                  placeholder="璇疯緭鍏ユ湭绉绘鍘熷洜"
-                                />
-                              </el-form-item>
-                            </el-col>
-                          </el-row>
-                        </div>
-                      </el-form>
-                    </div>
-                  </template>
-                </el-table-column>
-
-                <el-table-column
-                  label="鍣ㄥ畼鍚嶇О"
-                  align="center"
-                  prop="organname"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.organname"
-                      placeholder="鍣ㄥ畼鍚嶇О"
-                      :disabled="true"
-                    />
-                  </template>
-                </el-table-column>
-
-                <!-- <el-table-column label="绯荤粺缂栧彿" align="center" prop="caseNo">
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.caseNo"
-                      placeholder="绯荤粺缂栧彿"
-                    />
-                  </template>
-                </el-table-column> -->
-
-                <el-table-column
-                  label="绉绘鍖婚櫌"
-                  align="center"
-                  width="260"
-                  prop="hospitalno"
-                >
-                  <template slot-scope="scope">
-                    <el-autocomplete
-                      v-model="scope.row.hospitalname"
-                      :fetch-suggestions="queryHospitalSearch"
-                      placeholder="璇烽�夋嫨鎴栬緭鍏ョЩ妞嶅尰闄�"
-                      style="width: 100%"
-                      clearable
-                    ></el-autocomplete>
-                  </template>
-                </el-table-column>
-                <el-table-column
-                  label="绉绘鐘舵��"
-                  align="center"
-                  prop="transplantstate"
-                >
-                  <template slot-scope="scope">
-                    <el-select
-                      v-model="scope.row.transplantstate"
-                      placeholder="璇烽�夋嫨绉绘鐘舵��"
-                      style="width: 100%"
-                      @change="handleTransplantStatusChange(scope.row, $event)"
-                    >
-                      <el-option
-                        v-for="dict in transplantStatusList"
-                        :key="dict.value"
-                        :label="dict.label"
-                        :value="dict.value"
-                      />
-                    </el-select>
-                  </template>
-                </el-table-column>
-
-                <el-table-column
-                  label="绉绘鏃堕棿"
-                  align="center"
-                  width="220"
-                  prop="transplanttime"
-                >
-                  <template slot-scope="scope">
-                    <el-date-picker
-                      clearable
-                      size="small"
-                      style="width: 100%"
-                      v-model="scope.row.transplanttime"
-                      type="datetime"
-                      value-format="yyyy-MM-dd HH:mm:ss"
-                      placeholder="閫夋嫨绉绘鏃堕棿"
-                    />
-                  </template>
-                </el-table-column>
-
-                <el-table-column
-                  label="绉绘鍖荤敓"
-                  align="center"
-                  prop="transplantdoct"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.transplantdoct"
-                      placeholder="鍖诲笀濮撳悕"
-                    />
-                  </template>
-                </el-table-column>
-
-                <el-table-column label="鍙楄�呭鍚�" align="center" prop="name">
-                  <template slot-scope="scope">
-                    <el-input v-model="scope.row.name" placeholder="鍙楄�呭鍚�" />
-                  </template>
-                </el-table-column>
-              </el-table>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <!-- 缁熻淇℃伅 -->
-
-        <div
-          v-if="
-            !utilizationData.serviceDonatecomporganList ||
-              utilizationData.serviceDonatecomporganList.length == 0
-          "
-          class="empty-utilization"
-        >
-          <el-empty description="鏆傛棤鍒╃敤璁板綍" :image-size="80">
-            <span>璇峰厛閫夋嫨瑕佸埄鐢ㄧ殑鍣ㄥ畼</span>
-          </el-empty>
-        </div>
-      </el-form>
+      <div v-if="!displayOrgans.length" class="empty-procurement">
+        <el-empty description="鏆傛棤鑾峰彇璁板綍" :image-size="80" />
+      </div>
     </el-card>
 
-    <!-- 闄勪欢绠$悊閮ㄥ垎 -->
     <!-- 闄勪欢绠$悊閮ㄥ垎 - 鍒嗙被Tab灞曠ず -->
     <el-card class="attachment-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">鐩稿叧闄勪欢</span>
       </div>
 
-      <!-- 涓婁紶鍖哄煙锛堟棤鍒嗙被閫夋嫨锛岀敱Tab鎺у埗锛� -->
-      <div class="upload-wrapper">
-        <UploadAttachment
-          ref="uploadAttachment"
-          :file-list="attachmentFileList"
-          :limit="attachmentLimit"
-          :accept="attachmentAccept"
-          :multiple="true"
-          @change="handleAttachmentChange"
-          @upload-success="handleUploadSuccess"
-          @upload-error="handleUploadError"
-          @remove="handleAttachmentRemove"
-        />
-        <div style="font-size:12px; color:#909399; margin-top:4px;">
-          褰撳墠涓婁紶鍒嗙被锛�<el-tag size="small" type="info">{{
-            activeTab === "鏈垎绫�" ? "鏈垎绫�" : activeTab
-          }}</el-tag>
-          锛堝垏鎹� Tab 鍙敼鍙樹笂浼犲垎绫伙級
-        </div>
-      </div>
-
-      <!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず锛屾敮鎸佷慨鏀瑰垎绫� -->
-      <div class="attachment-list" v-if="attachments && attachments.length > 0">
-        <el-tabs v-model="activeTab" type="border-card">
-          <el-tab-pane
-            v-for="category in categories"
-            :key="category"
-            :label="category + '(' + getCategoryCount(category) + ')'"
-            :name="category"
+      <!-- 闄勪欢鍒楄〃 - 鍒嗙被Tab灞曠ず -->
+      <el-tabs v-model="activeTab" type="border-card">
+        <el-tab-pane
+          v-for="category in categories"
+          :key="category"
+          :label="category + '(' + getCategoryCount(category) + ')'"
+          :name="category"
+        >
+          <el-table
+            :data="getCategoryFiles(category)"
+            style="width: 100%"
+            size="small"
+            border
           >
-            <el-table
-              :data="getCategoryFiles(category)"
-              style="width: 100%"
-              size="small"
-              border
-            >
-              <el-table-column label="鏂囦欢鍚�" min-width="180">
-                <template #default="scope">
-                  <i
-                    class="el-icon-document"
-                    style="margin-right: 8px; color: #409EFF;"
-                  ></i>
-                  <span class="file-name">{{ scope.row.fileName }}</span>
-                </template>
-              </el-table-column>
-              <!-- 鍙紪杈戝垎绫讳笅鎷� -->
-              <el-table-column label="鍒嗙被" width="150">
-                <template #default="scope">
-                  <el-select
-                    v-model="scope.row.fileType"
-                    size="small"
-                    @change="updateAttachmentCategory(scope.row, $event)"
-                    placeholder="閫夋嫨鍒嗙被"
-                  >
-                    <el-option label="鍘熻〃鎷嶇収" value="鍘熻〃鎷嶇収" />
-                    <el-option label="鎺ュ彈纭涔�" value="鎺ュ彈纭涔�" />
-                    <el-option label="寮冪敤璇存槑" value="寮冪敤璇存槑" />
-                    <el-option label="鎹愮尞璇佷功鐓х墖" value="鎹愮尞璇佷功鐓х墖" />
-                    <el-option label="鏈垎绫�" value="" />
-                  </el-select>
-                </template>
-              </el-table-column>
-              <el-table-column label="鏂囦欢绫诲瀷" width="100">
-                <template #default="scope">
-                  <el-tag size="small">{{
-                    getFileTypeText(scope.row.fileName)
-                  }}</el-tag>
-                </template>
-              </el-table-column>
-              <el-table-column label="涓婁紶鏃堕棿" width="160">
-                <template #default="scope">
-                  <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="鏂囦欢澶у皬" width="120">
-                <template #default="scope">
-                  <span>{{ formatFileSize(scope.row.fileSize) }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="鎿嶄綔" width="180" fixed="right">
-                <template #default="scope">
-                  <el-button
-                    size="mini"
-                    type="primary"
-                    @click="handlePreview(scope.row)"
-                    >棰勮</el-button
-                  >
-                  <el-button
-                    size="mini"
-                    type="danger"
-                    @click="handleRemoveAttachmentByFile(scope.row)"
-                    >鍒犻櫎</el-button
-                  >
-                </template>
-              </el-table-column>
-            </el-table>
-          </el-tab-pane>
-        </el-tabs>
-      </div>
-
-      <!-- 鏃犻檮浠舵椂鏄剧ず -->
-      <div v-else style="text-align:center; padding:20px; color:#909399;">
-        鏆傛棤闄勪欢锛岃涓婁紶
-      </div>
+            <el-table-column label="鏂囦欢鍚�" min-width="180">
+              <template #default="scope">
+                <i
+                  class="el-icon-document"
+                  style="margin-right: 8px; color: #409EFF;"
+                ></i>
+                <span class="file-name">{{ scope.row.fileName }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鍒嗙被" width="150">
+              <template #default="scope">
+                <span>{{ scope.row.fileType || '鏈垎绫�' }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鏂囦欢绫诲瀷" width="100">
+              <template #default="scope">
+                <el-tag size="small">{{
+                  getFileTypeText(scope.row.fileName)
+                }}</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="涓婁紶鏃堕棿" width="160">
+              <template #default="scope">
+                <span>{{ formatDateTime(scope.row.uploadTime) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鏂囦欢澶у皬" width="100">
+              <template #default="scope">
+                <span>{{ formatFileSize(scope.row.fileSize) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鎿嶄綔" width="100" fixed="right">
+              <template #default="scope">
+                <el-button
+                  size="mini"
+                  type="primary"
+                  @click="handlePreview(scope.row)"
+                  >棰勮</el-button
+                >
+              </template>
+            </el-table-column>
+          </el-table>
+          <div
+            v-if="getCategoryFiles(category).length === 0"
+            style="text-align:center; padding:20px; color:#909399;"
+          >
+            鏆傛棤闄勪欢
+          </div>
+        </el-tab-pane>
+      </el-tabs>
     </el-card>
-    <div style="text-align: center; margin: 30px 0;">
-      <el-button type="primary" @click="handleSave" :loading="saveLoading">
-        淇濆瓨
-      </el-button>
-      <el-button
-        type="success"
-        @click="handleComplete"
-        :loading="confirmLoading"
-      >
-        瀹屾垚鍒╃敤
-      </el-button>
-    </div>
-    <!-- 鏂囦欢棰勮瀵硅瘽妗� -->
+    <!-- 鏂囦欢棰勮寮圭獥 -->
     <FilePreviewDialog
-      :visible="filePreviewVisible"
+      :visible="previewVisible"
       :file="currentPreviewFile"
-      @close="filePreviewVisible = false"
-      @download="handleDownloadAttachment"
+      @close="previewVisible = false"
+      @download="handleDownload"
     />
   </div>
 </template>
 
 <script>
-import {
-  completionList,
-  completionadd,
-  completionedit
-} from "@/api/businessApi";
-import UploadAttachment from "@/components/UploadAttachment"; // 鏂板瀵煎叆
-import FilePreviewDialog from "@/components/FilePreviewDialog"; // 鏂板瀵煎叆
+import { witnessList, witnessadd, witnessedit } from "@/api/businessApi";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
 import CaseBasicInfo from "@/components/CaseBasicInfo";
-import dayjs from "dayjs"; // 鏂板瀵煎叆锛岀敤浜庢椂闂村鐞�
+import { getToken } from "@/utils/auth";
+import dayjs from "dayjs";
+import readonlyDescriptionsMixin from "./readonlyDescriptionsMixin";
 
 export default {
-  name: "OrganUtilizationDetail",
+  name: "OrganProcurementDetail",
   components: {
-    UploadAttachment,
     FilePreviewDialog,
     CaseBasicInfo
   },
-    props: {
+  mixins: [readonlyDescriptionsMixin],
+  dicts: [
+    "sys_BloodType",
+    "Geta_hospital",
+    "sys_DonationCategory",
+    "sys_Organ",
+    "Obtain_status"
+  ],
+  props: {
     infoid: {
       type: String,
       default: true
     }
   },
-  dicts: [
-    "Geta_hospital",
-    "sys_BloodType",
-    "sys_Organ",
-    "sys_FamilyRelation",
-    "sys_0_1",
-    "utilize_statue"
-  ],
   data() {
     return {
       caseId: null,
-      activeTab: "鍘熻〃鎷嶇収", // 褰撳墠婵�娲荤殑闄勪欢鍒嗙被Tab
-      presetCategories: ["鍘熻〃鎷嶇収", "鎺ュ彈纭涔�", "寮冪敤璇存槑", "鎹愮尞璇佷功鐓х墖"], // 棰勮鍒嗙被
-      // 琛ㄥ崟鏁版嵁 - 鏍规嵁鎺ュ彛鍙傛暟璋冩暣
+      // 琛ㄥ崟鏁版嵁
       form: {
         id: undefined,
         infoid: undefined,
+        name: "",
         inpatientno: "",
-        completeState: "2",
+        witnessState: "2",
         caseNo: "",
         donorno: "",
         treatmenthospitalname: "",
         treatmenthospitalno: "",
         sex: "",
-        name: "",
         age: "",
         bloodtype: "",
         idcardno: "",
         diagnosisname: "",
-        completetime: "",
+        coordinatorName: "",
+        gainhospitalno: "",
+        gainhospitalname: "",
+        deathtime: "",
+        deathreason: "",
+        deathjudgedocto: "",
+        deathjudgedoctt: "",
+        deathjudgeannex: "",
+        operationbegtime: "",
+        operationendtime: "",
+        operationdoctor: "",
+        isspendremember: 1,
+        isrestoreremains: 1,
+        rememberannex: "",
         responsibleuserid: "",
         responsibleusername: "",
         coordinateduserido: "",
         coordinatedusernameo: "",
         coordinateduseridt: "",
         coordinatedusernamet: "",
-        assessannex: "",
-        donateorgan: "",
-        isbodydonation: "1",
-        receivingunitname: "",
-        createBy: "",
-        createTime: "",
-        updateBy: "",
-        updateTime: "",
+        abdominalaortacannulatime: "",
+        abdominalaortaperfusiontime: "",
+        portalveincannulatime: "",
+        portalveinperfusiontime: "",
+        pulmonaryarterycannulatime: "",
+        pulmonaryarteryperfusiontime: "",
+        aortacannulatime: "",
+        aortaperfusiontime: "",
+        organdonation: "",
+        organdonationOther: "",
+        donationcategory: "",
+        coordinatorInOperating: "",
+        coordinatorOutOperating: "",
+        coordinatorSign: "",
+        coordinatorSignTime: "",
         attachments: []
+      },
+      activeTab: "鍘熻〃鎷嶇収", // 褰撳墠婵�娲荤殑闄勪欢鍒嗙被Tab
+      presetCategories: [
+        "鍘熻〃鎷嶇収",
+        "浼︾悊瀹℃煡鏉愭枡",
+        "姝讳骸鍒ゅ畾鏉愭枡",
+        "榛樺搥浠紡鐓х墖",
+        "鎹愮尞瑙佽瘉瑙嗛"
+      ], // 棰勮鍒嗙被
+      organExpansionMap: {
+        C64: { subItems: ["C64L", "C64R"], subNames: ["宸﹁偩", "鍙宠偩"] },
+        C34: { subItems: ["C34L", "C34R"], subNames: ["宸﹁偤", "鍙宠偤"] }
       },
       // 琛ㄥ崟楠岃瘉瑙勫垯
       rules: {
@@ -677,12 +258,15 @@
         diagnosisname: [
           { required: true, message: "鐤剧梾璇婃柇涓嶈兘涓虹┖", trigger: "blur" }
         ],
-        donorno: [
-          { required: true, message: "鎹愮尞鑰呯紪鍙蜂笉鑳戒负绌�", trigger: "blur" }
+        donationcategory: [
+          { required: true, message: "鎹愮尞绫诲埆涓嶈兘涓虹┖", trigger: "change" }
+        ],
+        operationdoctor: [
+          { required: true, message: "鎵嬫湳鍖荤敓涓嶈兘涓虹┖", trigger: "blur" }
         ]
       },
-      // 鍒╃敤璁板綍楠岃瘉瑙勫垯
-      utilizationRules: {},
+      // 鑾峰彇璁板綍楠岃瘉瑙勫垯
+      procurementRules: {},
       // 淇濆瓨鍔犺浇鐘舵��
       saveLoading: false,
       confirmLoading: false,
@@ -692,44 +276,28 @@
       selectedOrgans: [],
       // 鍖婚櫌鍒楄〃
       hospitalList: [],
-      // 绉绘鐘舵�佸垪琛�
-      transplantStatusList: [
-        { value: "1", label: "宸茬Щ妞�" },
-        { value: "0", label: "鏈Щ妞�" },
-        { value: "2", label: "绉绘涓�" },
-        { value: "3", label: "搴撳瓨" }
-      ],
-      organExpansionMap: {
-        C64: { subItems: ["C64L", "C64R"], subNames: ["宸﹁偩", "鍙宠偩"] },
-        C34: { subItems: ["C34L", "C34R"], subNames: ["宸﹁偤", "鍙宠偤"] }
-      },
-      // 鍒╃敤璁板綍鏁版嵁
-      utilizationData: {
-        serviceDonatecomporganList: []
-      },
-      // 闅忚璁板綍鏁版嵁
-      followupData: {
-        records: []
+      // 鑾峰彇璁板綍鏁版嵁
+      procurementData: {
+        serviceDonationwitnessorgans: []
       },
       // 闄勪欢鏁版嵁
       attachments: [],
-      // 灞曞紑鐨勮keys
-      expandedRows: [],
+      // 涓婁紶鐩稿叧
+      uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+      headers: {
+        Authorization: "Bearer " + getToken()
+      },
+      uploadDialogVisible: false,
+      uploadLoading: false,
+      tempFileList: [],
+      currentUploadCategory: "",
       // 缂栬緫瀵硅瘽妗�
       editDialogVisible: false,
       currentRecord: {},
       currentEditIndex: -1,
-      // 闄勪欢鐩稿叧閰嶇疆 - 鏂板
-      attachmentFileList: [],
-      attachmentLimit: 10,
-      attachmentAccept:
-        ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt",
-
-      // 鏂囦欢棰勮鐩稿叧 - 鏂板
-      filePreviewVisible: false,
-      currentPreviewFile: null,
-      currentFollowup: {},
-      isEditingFollowup: false
+      // 鏂囦欢棰勮鐩稿叧
+      previewVisible: false,
+      currentPreviewFile: null
     };
   },
   computed: {
@@ -737,25 +305,21 @@
     currentUser() {
       return JSON.parse(sessionStorage.getItem("user") || "{}");
     },
+    displayOrgans() {
+      return (this.procurementData.serviceDonationwitnessorgans || []).filter(
+        item => item.delFlag !== 1
+      );
+    },
     categories() {
-     // 濮嬬粓杩斿洖鎵�鏈夐璁惧垎绫� + 鏈垎绫伙紝鍗充娇娌℃湁鏁版嵁涔熸樉绀�
-    const allCategories = ['鍘熻〃鎷嶇収', '鎺ュ彈纭涔�', '寮冪敤璇存槑', '鎹愮尞璇佷功鐓х墖', '鏈垎绫�'];
-    return allCategories;
-    },
-    // 宸茬Щ妞嶆暟閲�
-    transplantedCount() {
-      if (!this.utilizationData.serviceDonatecomporganList) return 0;
-      return this.utilizationData.serviceDonatecomporganList.filter(
-        record => record.transplantstate === "1"
-      ).length;
-    },
-    // 鍞竴鍖婚櫌鏁伴噺
-    uniqueHospitals() {
-      if (!this.utilizationData.serviceDonatecomporganList) return 0;
-      const hospitals = this.utilizationData.serviceDonatecomporganList
-        .map(record => record.hospitalno)
-        .filter(Boolean);
-      return new Set(hospitals).size;
+      // 濮嬬粓杩斿洖鎵�鏈夐璁惧垎绫� + 鏈垎绫伙紝鏃犺鏄惁鏈夋暟鎹�
+      return [
+        "鍘熻〃鎷嶇収",
+        "浼︾悊瀹℃煡鏉愭枡",
+        "姝讳骸鍒ゅ畾鏉愭枡",
+        "榛樺搥浠紡鐓х墖",
+        "鎹愮尞瑙佽瘉瑙嗛",
+        "鏈垎绫�"
+      ];
     },
     organReverseMap() {
       const map = {};
@@ -767,11 +331,24 @@
       }
       return map;
     },
-    // 杩囨护鎺� delFlag=1 鐨勮褰曪紙鐢ㄤ簬琛ㄦ牸灞曠ず锛�
-    displayOrgans() {
-      return (this.utilizationData.serviceDonatecomporganList || []).filter(
-        item => item.delFlag !== 1
-      );
+    // 涓嶅畬鏁寸殑璁板綍鏁伴噺
+    incompleteRecords() {
+      if (!this.procurementData.serviceDonationwitnessorgans) return 0;
+      return this.procurementData.serviceDonationwitnessorgans.filter(
+        record =>
+          !record.organStartTime ||
+          !record.organgettime ||
+          !record.gainhospitalno ||
+          !record.organgetdoct
+      ).length;
+    },
+    // 鍞竴鍖婚櫌鏁伴噺
+    uniqueHospitals() {
+      if (!this.procurementData.serviceDonationwitnessorgans) return 0;
+      const hospitals = this.procurementData.serviceDonationwitnessorgans
+        .map(record => record.gainhospitalno)
+        .filter(Boolean);
+      return new Set(hospitals).size;
     },
     // 鑾峰彇鍣ㄥ畼瀛楀吀
     organDict() {
@@ -779,47 +356,110 @@
     }
   },
   created() {
+    this.caseId = this.infoid;
+
     this.initData();
   },
-  watch: {
-    // 鐩戝惉闄勪欢鏁版嵁鍙樺寲 - 鏂板
-    attachments: {
-      handler(newAttachments) {
-        this.attachmentFileList = newAttachments.map(item => ({
-          uid: item.id || Math.random(),
-          name: item.fileName,
-          fileSize: item.fileSize,
-          url: item.path || item.fileUrl,
-          uploadTime: item.uploadTime,
-          status: "success"
-        }));
-      },
-      deep: true
-    }
-  },
   methods: {
+    // 鏍规嵁瀛楀吀value鑾峰彇label
+    getOrganLabel(organValue) {
+      const dictItem = this.organDict.find(item => item.value === organValue);
+      return dictItem ? dictItem.label : organValue;
+    },
+
     // 鍒濆鍖栨暟鎹�
     initData() {
-      this.caseId = this.infoid;
+      const infoid = this.infoid;
 
-      if (!this.caseId) {
+      if (!infoid) {
         this.$message.error("缂哄皯蹇呰鐨勮矾鐢卞弬鏁� infoid");
         this.$router.back();
         return;
       }
 
-      this.form.infoid = this.caseId;
-      this.form.createBy =
-        this.currentUser.username || this.currentUser.name || "褰撳墠鐢ㄦ埛";
-      this.form.createTime = new Date()
-        .toISOString()
-        .replace("T", " ")
-        .substring(0, 19);
+      this.form.infoid = infoid;
+      // this.generateDonorNo();
 
-      this.getDetail();
+      if (infoid) {
+        this.getDetail(infoid);
+      }
+
+      this.getHospitalData();
+    },
+    getOrganNameByNo(organno) {
+      // 妫�鏌ユ槸鍚﹀湪鏄犲皠鐨勫瓙椤逛腑
+      for (const key in this.organExpansionMap) {
+        const { subItems, subNames } = this.organExpansionMap[key];
+        const idx = subItems.indexOf(organno);
+        if (idx !== -1) {
+          return subNames[idx];
+        }
+      }
+      // 鍚﹀垯浠庡瓧鍏镐腑鑾峰彇
+      return this.getOrganLabel(organno);
+    },
+    // 鑾峰彇璇︽儏
+    async getDetail(infoid) {
+      this.loading = true;
+      try {
+        const response = await witnessList({ infoid });
+        if (
+          response.code === 200 &&
+          response.data &&
+          response.data.length > 0
+        ) {
+          const data = response.data[0];
+          if (!data.witnessState || data.witnessState == 1) {
+            data.witnessState = "2";
+          }
+
+          // 濉厖琛ㄥ崟鏁版嵁
+          Object.assign(this.form, data);
+
+          // 鍒濆鍖栭檮浠�
+          if (this.form.deathjudgeannex) {
+            const parsed = JSON.parse(this.form.deathjudgeannex);
+            this.attachments = parsed.map(item => ({
+              ...item,
+              fileType: item.fileType || "" // 榛樿绌哄瓧绗︿覆琛ㄧず鏈垎绫�
+            }));
+            this.form.attachments = this.attachments;
+          } else {
+            this.attachments = [];
+          }
+
+          // 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
+          if (data.organdonation) {
+            const organArray = Array.isArray(data.organdonation)
+              ? data.organdonation
+              : (data.organdonation || "").split(",").filter(item => item);
+            this.selectedOrgans = organArray;
+            this.form.organdonationOther = data.organdonationOther || "";
+          }
+
+          // 澶勭悊鍣ㄥ畼鑾峰彇璁板綍
+          if (data.serviceDonationwitnessorgans) {
+            this.procurementData.serviceDonationwitnessorgans = Array.isArray(
+              data.serviceDonationwitnessorgans
+            )
+              ? data.serviceDonationwitnessorgans
+              : [];
+          }
+
+          this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
+          this.syncOrgansFromSelection();
+        } else {
+          this.$message.warning("鏈壘鍒板搴旂殑鍣ㄥ畼鑾峰彇鏁版嵁");
+        }
+      } catch (error) {
+        console.error("鑾峰彇鍣ㄥ畼鑾峰彇璇︽儏澶辫触:", error);
+        this.$message.error("鑾峰彇璇︽儏澶辫触");
+      } finally {
+        this.loading = false;
+      }
     },
     syncOrgansFromSelection() {
-      const records = this.utilizationData.serviceDonatecomporganList || [];
+      const records = this.procurementData.serviceDonationwitnessorgans || [];
       const targetNos = [];
       this.selectedOrgans.forEach(val => {
         if (this.organExpansionMap[val]) {
@@ -829,125 +469,77 @@
         }
       });
 
+      // 鏂板鎴栨仮澶�
       targetNos.forEach(no => {
         const existing = records.find(r => r.organno === no);
         if (existing) {
-          if (existing.delFlag === 1) existing.delFlag = 0;
+          if (existing.delFlag === 1) {
+            existing.delFlag = 0; // 鎭㈠鏄剧ず
+          }
         } else {
-          // 浣跨敤鍒涘缓鏂规硶锛岃嚜鍔ㄥ寘鍚� delFlag:0
-          this.createOrganRecord(no);
+          records.push({
+            id: null,
+            organname: this.getOrganNameByNo(no),
+            organno: no,
+            organStartTime: "",
+            organgettime: "",
+            gainhospitalno: "",
+            gainhospitalname: "",
+            organgetdoct: "",
+            assistant: "",
+            procurementNurse: "",
+            operatingRoomNurse: "",
+            anesthesiologist: "",
+            organstate: "1",
+            notgetreason: "",
+            delFlag: 0
+          });
         }
       });
 
-      // 寮哄埗鎵�鏈夎褰� delFlag=0锛堝姞杞芥椂搴旇鍏ㄩ儴鏈夋晥锛�
-      records.forEach(r => (r.delFlag = 0));
-      this.form.donateorgan = this.selectedOrgans.join(",");
+      // 锛堝彲閫夛級濡傛灉鍔犺浇鏃跺悗绔繑鍥炰簡 delFlag=1 鐨勮褰曪紝浣嗗疄闄呭簲璇ユ樉绀猴紝寮哄埗閲嶇疆
+      records.forEach(r => {
+        if (r.delFlag === 1) r.delFlag = 0;
+      });
+
+      this.form.organdonation = this.selectedOrgans.join(",");
     },
-    // 鑾峰彇璇︽儏
-    async getDetail() {
-      this.loading = true;
+    // 鑾峰彇鍖婚櫌鏁版嵁
+    async getHospitalData() {
       try {
-        const response = await completionList({ infoid: this.caseId });
-        if (
-          response.code === 200 &&
-          response.data &&
-          response.data.length > 0
-        ) {
-          const data = response.data[0];
-          if (!data.completeState || data.completeState == 1) {
-            data.completeState = "2";
-          }
-          this.form = data;
-          // 濉厖琛ㄥ崟鏁版嵁
-          // Object.assign(this.form, data);
-          this.form.signfamilyrelations = this.form.signfamilyrelations || "";
-          // 澶勭悊鎹愮尞鍣ㄥ畼瀛楁
-          if (data.donateorgan) {
-            const organArray = Array.isArray(data.donateorgan)
-              ? data.donateorgan
-              : (data.donateorgan || "").split(",").filter(item => item);
-            this.selectedOrgans = organArray;
-          }
-
-          // 澶勭悊鍣ㄥ畼鍒╃敤璁板綍
-          if (data.serviceDonatecomporganList) {
-            this.utilizationData.serviceDonatecomporganList = Array.isArray(
-              data.serviceDonatecomporganList
-            )
-              ? data.serviceDonatecomporganList.map(record => ({
-                  ...record,
-                  transplanttime: record.transplanttime || "",
-                  transplantstate: record.transplantstate
-                    ? record.transplantstate.toString()
-                    : "1"
-                }))
-              : [];
-          }
-          console.log(this.utilizationData.serviceDonatecomporganList);
-
-          // 鍒濆鍖栭檮浠�
-          // 鏀逛负锛堢‘淇濇瘡涓檮浠堕兘鏈� fileType 瀛楁锛�
-          if (this.form.assessannex) {
-            const parsed = JSON.parse(this.form.assessannex);
-            this.attachments = parsed.map(item => ({
-              ...item,
-              fileType: item.fileType || "" // 榛樿绌哄瓧绗︿覆琛ㄧず鏈垎绫�
-            }));
-            this.form.attachments = this.attachments;
-            // 鍚屾 attachmentFileList
-            this.attachmentFileList = this.attachments.map(item => ({
-              uid: item.id || Math.random(),
-              name: item.fileName,
-              url: item.path || item.fileUrl,
-              fileSize: item.fileSize,
-              uploadTime: item.uploadTime,
-              status: "success",
-              raw: item
-            }));
-          } else {
-            this.attachments = [];
-            this.attachmentFileList = [];
-          }
-
-          this.$message.success("鏁版嵁鍔犺浇鎴愬姛");
-          this.syncOrgansFromSelection();
-        } else {
-          this.$message.warning("鏈壘鍒板搴旂殑鍣ㄥ畼鍒╃敤鏁版嵁");
-        }
+        // TODO: 鏇挎崲涓哄疄闄呯殑鍖婚櫌鍒楄〃鎺ュ彛
+        // 鏆傛椂浣跨敤妯℃嫙鏁版嵁
+        this.hospitalList = [
+          { hospitalNo: "H001", hospitalName: "鍖椾含鍗忓拰鍖婚櫌" },
+          { hospitalNo: "H002", hospitalName: "涓婃捣鍗庡北鍖婚櫌" },
+          { hospitalNo: "H003", hospitalName: "骞垮窞涓北鍖婚櫌" },
+          { hospitalNo: "H004", hospitalName: "姝︽眽鍚屾祹鍖婚櫌" },
+          { hospitalNo: "H005", hospitalName: "鎴愰兘鍗庤タ鍖婚櫌" }
+        ];
       } catch (error) {
-        console.error("鑾峰彇鍣ㄥ畼鍒╃敤璇︽儏澶辫触:", error);
-        this.$message.error("鑾峰彇璇︽儏澶辫触");
-      } finally {
-        this.loading = false;
+        console.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触:", error);
+        this.$message.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触");
       }
     },
+    // 绉绘鍖婚櫌妯$硦鎼滅储
+    queryHospitalSearch(queryString, cb) {
+      const hospitals = this.dict.type.Geta_hospital || [];
+      const results = queryString
+        ? hospitals.filter(item =>
+            item.label.toLowerCase().includes(queryString.toLowerCase())
+          )
+        : hospitals;
 
-    // 鑾峰彇鍖婚櫌鏁版嵁
-    // async getHospitalData() {
-    //   try {
-    //     // TODO: 鏇挎崲涓哄疄闄呯殑鍖婚櫌鍒楄〃鎺ュ彛
-    //     // 鏆傛椂浣跨敤妯℃嫙鏁版嵁
-    //     this.hospitalList = [
-    //       { hospitalNo: "H001", hospitalName: "鍖椾含鍗忓拰鍖婚櫌" },
-    //       { hospitalNo: "H002", hospitalName: "涓婃捣鍗庡北鍖婚櫌" },
-    //       { hospitalNo: "H003", hospitalName: "涓婃捣鐟為噾鍖婚櫌" },
-    //       { hospitalNo: "H004", hospitalName: "骞垮窞涓北鍖婚櫌" },
-    //       { hospitalNo: "H005", hospitalName: "姝︽眽鍚屾祹鍖婚櫌" },
-    //       { hospitalNo: "H006", hospitalName: "鎴愰兘鍗庤タ鍖婚櫌" }
-    //     ];
-    //   } catch (error) {
-    //     console.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触:", error);
-    //     this.$message.error("鑾峰彇鍖婚櫌鏁版嵁澶辫触");
-    //   }
-    // },
-
+      // el-autocomplete 闇�瑕� value 瀛楁
+      cb(results.map(item => ({ value: item.label })));
+    },
     // 鍣ㄥ畼閫夋嫨鐘舵�佸彉鍖�
     async handleOrganSelectionChange(selectedValues) {
       // 1. 澶勭悊浜掓枼閫昏緫锛堜慨鏀� this.selectedOrgans锛�
       this.handleExclusiveSelections(selectedValues);
 
       const finalSelected = this.selectedOrgans;
-      const records = this.utilizationData.serviceDonatecomporganList || [];
+      const records = this.procurementData.serviceDonationwitnessorgans || [];
 
       // 2. 鏋勫缓鐩爣鍣ㄥ畼缂栧彿鍒楄〃锛堝睍寮�缁勫悎鍣ㄥ畼锛�
       const targetOrganNos = [];
@@ -959,7 +551,7 @@
         }
       });
 
-      // 3. 鏂板鎴栨仮澶嶈褰曪紙鏃犻渶寮圭獥锛�
+      // 3. 鏂板鎴栨仮澶嶇洰鏍囧櫒瀹樿褰曪紙鏃犲脊绐楋級
       targetOrganNos.forEach(no => {
         const existing = records.find(r => r.organno === no);
         if (existing) {
@@ -967,11 +559,27 @@
             existing.delFlag = 0; // 鎭㈠鏄剧ず
           }
         } else {
-          this.createOrganRecord(no); // 鏂板璁板綍锛堝寘鍚� delFlag:0锛�
+          records.push({
+            id: null,
+            organname: this.getOrganNameByNo(no),
+            organno: no,
+            organStartTime: "",
+            organgettime: "",
+            gainhospitalno: "",
+            gainhospitalname: "",
+            organgetdoct: "",
+            assistant: "",
+            procurementNurse: "",
+            operatingRoomNurse: "",
+            anesthesiologist: "",
+            organstate: "1",
+            notgetreason: "",
+            delFlag: 0
+          });
         }
       });
 
-      // 4. 鎵惧嚭闇�瑕佸彇娑堢殑璁板綍锛堜笉鍦ㄧ洰鏍囬泦鍚堜腑鐨勶級
+      // 4. 鎵惧嚭闇�瑕佸彇娑堢殑璁板綍锛堜笉鍦ㄧ洰鏍囬泦鍚堜腑锛�
       const toRemove = records.filter(r => !targetOrganNos.includes(r.organno));
       const toRemoveSaved = toRemove.filter(r => r.id); // 宸蹭繚瀛橈紝闇�纭
       const toRemoveUnsaved = toRemove.filter(r => !r.id); // 鏈繚瀛橈紝鐩存帴绉婚櫎
@@ -987,7 +595,7 @@
         const organNames = toRemoveSaved.map(r => r.organname).join("銆�");
         try {
           await this.$confirm(
-            `鎮ㄧ‘瀹氳鍙栨秷浠ヤ笅宸蹭繚瀛樼殑鍣ㄥ畼鍒╃敤璁板綍鍚楋紵\n${organNames}\n鍙栨秷鍚庯紝杩欎簺璁板綍灏嗕粠鍒楄〃涓Щ闄わ紙鏁版嵁浠嶄繚鐣欙紝鍙仮澶嶏級銆俙,
+            `鎮ㄧ‘瀹氳鍙栨秷浠ヤ笅宸蹭繚瀛樼殑鍣ㄥ畼鑾峰彇璁板綍鍚楋紵\n${organNames}\n鍙栨秷鍚庯紝杩欎簺璁板綍灏嗕粠鍒楄〃涓Щ闄わ紙鏁版嵁浠嶄繚鐣欙紝鍙仮澶嶏級銆俙,
             "鎻愮ず",
             {
               confirmButtonText: "纭畾绉婚櫎",
@@ -1001,7 +609,6 @@
           });
         } catch (error) {
           // 鐢ㄦ埛鍙栨秷锛氭仮澶嶉�変腑鐘舵��
-          // 灏嗗彇娑堢殑鍣ㄥ畼閲嶆柊鍔犲叆 this.selectedOrgans
           const parentToRestore = new Set();
           toRemoveSaved.forEach(r => {
             const parent = this.organReverseMap[r.organno];
@@ -1016,56 +623,37 @@
               this.selectedOrgans.push(val);
             }
           });
-          // 鎻愮ず鐢ㄦ埛鎿嶄綔宸插彇娑�
           this.$message.info("宸插彇娑堝垹闄ゆ搷浣�");
           // 鏇存柊琛ㄥ崟瀛楁锛堜繚鎸佷竴鑷存�э級
-          this.form.donateorgan = this.selectedOrgans.join(",");
-          // 娉ㄦ剰锛氭鏃� records 涓凡鏂板浜嗙洰鏍囧櫒瀹橈紝骞朵笖涔嬪墠鐨勮褰曟湭琚爣璁板垹闄わ紝鐘舵�佷竴鑷淬��
-          // 浣嗘槸锛屾垜浠繕闇�瑕佺Щ闄や箣鍓嶆柊澧炰絾鐢ㄦ埛鍙兘涓嶆兂淇濈暀鐨勮褰曪紵涓嶄細锛屽洜涓烘柊澧炵殑鏄洰鏍囧櫒瀹橈紝鐢ㄦ埛鏄兂淇濈暀鐨勩��
-          // 鍥犳鐩存帴杩斿洖鍗冲彲銆�
-          return;
+          this.form.organdonation = this.selectedOrgans.join(",");
+          return; // 閫�鍑烘柟娉曪紝閬垮厤缁х画鎵ц
         }
       }
 
       // 5. 鏇存柊琛ㄥ崟瀛楁
-      this.form.donateorgan = this.selectedOrgans.join(",");
+      this.form.organdonation = this.selectedOrgans.join(",");
     },
-    // 绉绘鍖婚櫌妯$硦鎼滅储
-    queryHospitalSearch(queryString, cb) {
-      const hospitals = this.dict.type.Geta_hospital || [];
-      const results = queryString
-        ? hospitals.filter(item =>
-            item.label.toLowerCase().includes(queryString.toLowerCase())
-          )
-        : hospitals;
 
-      // el-autocomplete 闇�瑕� value 瀛楁
-      cb(results.map(item => ({ value: item.label })));
-    },
     // 澶勭悊浜掓枼閫夋嫨
     handleExclusiveSelections(selectedValues) {
-      // 濡傛灉閫夋嫨浜�"鍙岃偩"(鍋囪瀛楀吀鍊间负C64)锛岃嚜鍔ㄥ彇娑堝崟鐙殑"宸﹁偩"(C64L)鍜�"鍙宠偩"(C64R)閫夋嫨
+      // 鍙岃偩涓庡乏鍙宠偩浜掓枼
       if (selectedValues.includes("C64")) {
         this.selectedOrgans = selectedValues.filter(
           item => item !== "C64L" && item !== "C64R"
         );
-      }
-      // 濡傛灉閫夋嫨浜�"宸﹁偩"鎴�"鍙宠偩"锛屽彇娑�"鍙岃偩"閫夋嫨
-      else if (
+      } else if (
         selectedValues.includes("C64L") ||
         selectedValues.includes("C64R")
       ) {
         this.selectedOrgans = selectedValues.filter(item => item !== "C64");
       }
 
-      // 濡傛灉閫夋嫨浜�"鍏ㄨ偤"(鍋囪瀛楀吀鍊间负C34)锛岃嚜鍔ㄥ彇娑堝崟鐙殑"宸﹁偤"(C34L)鍜�"鍙宠偤"(C34R)閫夋嫨
+      // 鍏ㄨ偤涓庡乏鍙宠偤浜掓枼
       if (selectedValues.includes("C34")) {
         this.selectedOrgans = selectedValues.filter(
           item => item !== "C34L" && item !== "C34R"
         );
-      }
-      // 濡傛灉閫夋嫨浜�"宸﹁偤"鎴�"鍙宠偤"锛屽彇娑�"鍏ㄨ偤"閫夋嫨
-      else if (
+      } else if (
         selectedValues.includes("C34L") ||
         selectedValues.includes("C34R")
       ) {
@@ -1077,158 +665,89 @@
     createOrganRecord(organValue) {
       const organName = this.getOrganLabel(organValue);
 
-      this.utilizationData.serviceDonatecomporganList.push({
+      this.procurementData.serviceDonationwitnessorgans.push({
+        id: null,
         organname: organName,
         organno: organValue,
-        caseNo: "",
-        hospitalno: "",
-        hospitalname: "",
-        name: "",
-        transplantdoct: "",
-        transplanttime: "",
-        transplantstate: "1",
-        abandonreason: "",
-        delFlag: 0, // 鏂板
-        sex: "",
-        age: "",
-        birthday: "",
-        phone: "",
-        residenceaddress: "",
-        residenceprovince: "",
-        residenceprovincename: "",
-        residencecity: "",
-        residencecityname: "",
-        residencetown: "",
-        residencetownname: "",
-        residencecommunity: "",
-        residencecommunityname: "",
-        residencecountycode: "",
-        residencecountyname: "",
-        idcardtype: "",
-        idcardno: "",
-        ageunit: ""
+        organStartTime: "",
+        organgettime: "",
+        gainhospitalno: "",
+        gainhospitalname: "",
+        organgetdoct: "",
+        assistant: "",
+        procurementNurse: "",
+        operatingRoomNurse: "",
+        anesthesiologist: "",
+        organstate: "1",
+        notgetreason: ""
       });
     },
 
-    // 鏍规嵁瀛楀吀value鑾峰彇label
-    getOrganLabel(organValue) {
-      const dictItem = this.organDict.find(item => item.value === organValue);
-      return dictItem ? dictItem.label : organValue;
-    },
-
-    // 绉绘鐘舵�佸彉鍖栧鐞�
-    handleTransplantStatusChange(row, status) {
-      if (status === "0") {
-        // 濡傛灉鐘舵�佷负鏈Щ妞嶏紝娓呴櫎鐩稿叧瀛楁
-        // row.transplanttime = "";
-        // row.transplantdoct = "";
-        // row.hospitalno = "";
-        // row.hospitalname = "";
-      } else if (status === "1") {
-        // 濡傛灉鐘舵�佷负宸茬Щ妞嶏紝鑷姩璁剧疆绉绘鏃堕棿涓哄綋鍓嶆椂闂�
-        if (!row.transplanttime) {
-          row.transplanttime = new Date().toISOString().split("T")[0];
-        }
+    // 鍖婚櫌閫夋嫨鍙樺寲
+    handleHospitalChange(row, hospitalNo) {
+      const hospital = this.hospitalList.find(
+        item => item.hospitalNo === hospitalNo
+      );
+      if (hospital) {
+        row.gainhospitalname = hospital.hospitalName;
       }
     },
-
-    // 琛屽睍寮�浜嬩欢
-    handleExpandChange(row, expandedRows) {
-      this.expandedRows = expandedRows.map(item => item.organno);
+    // 缂栬緫鑾峰彇璁板綍
+    handleEditProcurement(row) {
+      const index = this.procurementData.serviceDonationwitnessorgans.findIndex(
+        item => item.organno === row.organno
+      );
+      if (index !== -1) {
+        this.currentRecord = { ...row };
+        this.currentEditIndex = index;
+        this.editDialogVisible = true;
+      }
     },
-
-    // 鍒犻櫎鍣ㄥ畼璁板綍
-    handleRemoveOrgan(index) {
-      this.$confirm("纭鍒犻櫎杩欐潯鍣ㄥ畼璁板綍鍚楋紵", "鎻愮ず", {
-        confirmButtonText: "纭畾",
-        cancelButtonText: "鍙栨秷",
-        type: "warning"
-      })
-        .then(() => {
-          const organno = this.utilizationData.serviceDonatecomporganList[index]
-            .organno;
-          this.utilizationData.serviceDonatecomporganList.splice(index, 1);
-
-          // 浠庨�変腑鐨勫櫒瀹樹腑绉婚櫎
-          const idx = this.selectedOrgans.indexOf(organno);
-          if (idx > -1) {
-            this.selectedOrgans.splice(idx, 1);
-          }
-
-          this.$message.success("鍣ㄥ畼璁板綍鍒犻櫎鎴愬姛");
-        })
-        .catch(() => {});
+    // 纭缂栬緫
+    handleEditConfirm() {
+      if (this.currentEditIndex !== -1) {
+        this.procurementData.serviceDonationwitnessorgans[
+          this.currentEditIndex
+        ] = {
+          ...this.currentRecord
+        };
+        this.$message.success("鑾峰彇璁板綍鏇存柊鎴愬姛");
+        this.editDialogVisible = false;
+      }
     },
-
     // 鍣ㄥ畼琛屾牱寮�
     getOrganRowClassName({ row }) {
       if (
-        row.transplantstate === "1" &&
-        (!row.hospitalno || !row.name || !row.transplanttime)
+        !row.organStartTime ||
+        !row.organgettime ||
+        !row.gainhospitalno ||
+        !row.organgetdoct
       ) {
-        return "warning-row";
-      }
-      if (row.transplantstate === "0" && !row.abandonreason) {
         return "warning-row";
       }
       return "";
     },
-
-    // 鑾峰彇鐘舵�佹爣绛剧被鍨�
-    getStatusTagType(status) {
-      const typeMap = {
-        3: "success",
-        2: "warning",
-        1: "info"
-      };
-      return typeMap[status] || "info";
-    },
-
-    // 鑾峰彇鐘舵�佹枃鏈�
-    getStatusText(status) {
-      const textMap = {
-        3: "宸插畬鎴�",
-        2: "杩涜涓�",
-        1: "寰呭鐞�"
-      };
-      return textMap[status] || "鏈煡";
-    },
-
-    // 鑾峰彇闅忚绫诲瀷鏍囩
-    getFollowupTypeTag(type) {
-      const typeMap = {
-        routine: "success",
-        emergency: "danger",
-        special: "warning"
-      };
-      return typeMap[type] || "info";
-    },
-
-    // 鑾峰彇闅忚绫诲瀷鏂囨湰
-    getFollowupTypeText(type) {
-      const textMap = {
-        routine: "甯歌闅忚",
-        emergency: "绱ф�ラ殢璁�",
-        special: "鐗规畩闅忚"
-      };
-      return textMap[type] || "鏈煡";
-    },
-
     // 淇濆瓨鍩烘湰淇℃伅
     async handleSave() {
       this.$refs.form.validate(async valid => {
         if (valid) {
           this.saveLoading = true;
           try {
+            console.log(this.procurementData.serviceDonationwitnessorgans);
+
             const saveData = {
               ...this.form,
-              assessannex: JSON.stringify(this.attachments),
-              donateorgan: this.selectedOrgans.join(","),
-              serviceDonatecomporganList:
-                this.utilizationData.serviceDonatecomporganList || []
+              deathjudgeannex: JSON.stringify(this.attachments),
+              organdonation: this.selectedOrgans.join(","),
+              serviceDonationwitnessorganList:
+                this.procurementData.serviceDonationwitnessorgans || [],
+              serviceDonationwitnessorgans:
+                this.procurementData.serviceDonationwitnessorgans || []
             };
+            console.log(saveData.serviceDonationwitnessorganList);
+            console.log(saveData.serviceDonationwitnessorgans);
 
-            const apiMethod = this.form.id ? completionedit : completionadd;
+            const apiMethod = this.form.id ? witnessedit : witnessadd;
             const response = await apiMethod(saveData);
 
             if (response.code === 200) {
@@ -1251,14 +770,10 @@
         }
       });
     },
-
-    // 淇濆瓨鍒╃敤璁板綍
-    async handleSaveUtilization() {
-      if (
-        !this.utilizationData.serviceDonatecomporganList ||
-        this.utilizationData.serviceDonatecomporganList.length === 0
-      ) {
-        this.$message.warning("璇峰厛娣诲姞鍒╃敤璁板綍");
+    // 淇濆瓨鑾峰彇璁板綍
+    async handleSaveProcurement() {
+      if (!this.form.id) {
+        this.$message.warning("璇峰厛淇濆瓨鍩烘湰淇℃伅");
         return;
       }
 
@@ -1267,57 +782,44 @@
         const saveData = {
           ...this.form,
           attachments: this.attachments,
-          donateorgan: this.selectedOrgans.join(","),
-          serviceDonatecomporganList:
-            this.utilizationData.serviceDonatecomporganList || []
+          organdonation: this.selectedOrgans.join(","),
+          serviceDonationwitnessorgans:
+            this.procurementData.serviceDonationwitnessorgans || []
         };
 
-        const response = await completionedit(saveData);
+        const response = await witnessedit(saveData);
 
         if (response.code === 200) {
-          this.$message.success("鍒╃敤璁板綍淇濆瓨鎴愬姛");
+          this.$message.success("鑾峰彇璁板綍淇濆瓨鎴愬姛");
         } else {
           this.$message.error(
-            "淇濆瓨鍒╃敤璁板綍澶辫触锛�" + (response.msg || "鏈煡閿欒")
+            "淇濆瓨鑾峰彇璁板綍澶辫触锛�" + (response.msg || "鏈煡閿欒")
           );
         }
       } catch (error) {
-        console.error("淇濆瓨鍒╃敤璁板綍澶辫触:", error);
-        this.$message.error("淇濆瓨鍒╃敤璁板綍澶辫触");
+        console.error("淇濆瓨鑾峰彇璁板綍澶辫触:", error);
+        this.$message.error("淇濆瓨鑾峰彇璁板綍澶辫触");
       } finally {
         this.saveLoading = false;
       }
     },
-
-    // 纭瀹屾垚鍒╃敤
-    async handleConfirmUtilization() {
-      // 妫�鏌ュ埄鐢ㄨ褰曟槸鍚﹀畬鏁�
-      const incompleteRecords = this.utilizationData.serviceDonatecomporganList.filter(
-        record => {
-          if (record.transplantstate === "1") {
-            return !record.hospitalno || !record.name || !record.transplanttime;
-          } else if (record.transplantstate === "0") {
-            return !record.abandonreason;
-          }
-          return false;
-        }
-      );
-
-      if (incompleteRecords.length > 0) {
-        this.$message.warning("璇峰厛瀹屽杽鎵�鏈夊埄鐢ㄨ褰曠殑淇℃伅");
+    // 纭瀹屾垚鑾峰彇
+    async handleConfirmProcurement() {
+      if (this.incompleteRecords > 0) {
+        this.$message.warning("璇峰厛瀹屽杽鎵�鏈夎幏鍙栬褰曠殑淇℃伅");
         return;
       }
 
-      this.$confirm("纭瀹屾垚鍣ㄥ畼鍒╃敤鍚楋紵瀹屾垚鍚庡皢鏃犳硶淇敼鍒╃敤淇℃伅銆�", "鎻愮ず", {
+      this.$confirm("纭瀹屾垚鍣ㄥ畼鑾峰彇鍚楋紵瀹屾垚鍚庡皢鏃犳硶淇敼鑾峰彇淇℃伅銆�", "鎻愮ず", {
         confirmButtonText: "纭畾",
         cancelButtonText: "鍙栨秷",
         type: "warning"
       })
         .then(async () => {
           this.confirmLoading = true;
-          this.form.completeState = "3";
-          this.form.completetime =
-            this.form.completetime ||
+          this.form.witnessState = "3";
+          this.form.operationendtime =
+            this.form.operationendtime ||
             new Date()
               .toISOString()
               .replace("T", " ")
@@ -1327,126 +829,131 @@
             const saveData = {
               ...this.form,
               attachments: this.attachments,
-              donateorgan: this.selectedOrgans.join(","),
-              serviceDonatecomporganList:
-                this.utilizationData.serviceDonatecomporganList || []
+              organdonation: this.selectedOrgans.join(","),
+              serviceDonationwitnessorgans:
+                this.procurementData.serviceDonationwitnessorgans || []
             };
 
-            const response = await completionedit(saveData);
+            const response = await witnessedit(saveData);
 
             if (response.code === 200) {
-              this.$message.success("鍣ㄥ畼鍒╃敤宸插畬鎴�");
+              this.$message.success("鍣ㄥ畼鑾峰彇宸插畬鎴�");
             } else {
               this.$message.error(
-                "纭鍒╃敤澶辫触锛�" + (response.msg || "鏈煡閿欒")
+                "纭鑾峰彇澶辫触锛�" + (response.msg || "鏈煡閿欒")
               );
-              this.form.completeState = "2";
-              this.form.completetime = "";
+              this.form.witnessState = "2";
+              this.form.operationendtime = "";
             }
           } catch (error) {
-            console.error("纭鍒╃敤澶辫触:", error);
-            this.$message.error("纭鍒╃敤澶辫触");
-            this.form.completeState = "2";
-            this.form.completetime = "";
+            console.error("纭鑾峰彇澶辫触:", error);
+            this.$message.error("纭鑾峰彇澶辫触");
+            this.form.witnessState = "2";
+            this.form.operationendtime = "";
           } finally {
             this.confirmLoading = false;
           }
         })
         .catch(() => {});
     },
-
-    // 瀹屾垚鍒╃敤
-    handleComplete() {
-      this.handleConfirmUtilization();
+    // 纭鑾峰彇鎸夐挳鍒悕
+    handleProcure() {
+      this.handleConfirmProcurement();
     },
 
-    // 淇濆瓨闅忚璁板綍
-    handleSaveFollowup() {
-      if (!this.currentFollowup.organNo) {
-        this.$message.warning("璇烽�夋嫨鍣ㄥ畼");
-        return;
-      }
-
-      if (!this.currentFollowup.followupTime) {
-        this.$message.warning("璇烽�夋嫨闅忚鏃堕棿");
-        return;
-      }
-
-      this.saveLoading = true;
-
-      // 鑾峰彇鍣ㄥ畼鍚嶇О
-      const organRecord = this.utilizationData.serviceDonatecomporganList.find(
-        item => item.organno === this.currentFollowup.organNo
-      );
-      const organName = organRecord ? organRecord.organname : "";
-
-      const followupData = {
-        ...this.currentFollowup,
-        organName: organName,
-        utilizationId: this.form.id
-      };
-
-      // TODO: 鏇挎崲涓哄疄闄呯殑闅忚璁板綍淇濆瓨鎺ュ彛
-      setTimeout(() => {
-        if (this.isEditingFollowup) {
-          // 鏇存柊鐜版湁璁板綍
-          const index = this.followupData.records.findIndex(
-            item => item.id === this.currentFollowup.id
-          );
-          if (index !== -1) {
-            this.followupData.records[index] = {
-              ...followupData,
-              id: this.currentFollowup.id
-            };
-          }
-        } else {
-          // 娣诲姞鏂拌褰�
-          this.followupData.records.push({ ...followupData, id: Date.now() });
+    // ===== 闄勪欢鐩稿叧鏂规硶 =====
+    // 鎵撳紑涓婁紶瀵硅瘽妗�
+    openUploadDialog(category) {
+      this.currentUploadCategory = category;
+      this.tempFileList = [];
+      this.uploadDialogVisible = true;
+      this.$nextTick(() => {
+        if (this.$refs.uploadRef) {
+          this.$refs.uploadRef.clearFiles();
         }
-        this.$message.success("闅忚璁板綍淇濆瓨鎴愬姛");
-        this.followupDialogVisible = false;
-        this.saveLoading = false;
-      }, 1000);
-    },
-    /** 闄勪欢鍙樺寲澶勭悊 */
-    handleAttachmentChange(fileList) {
-      this.attachmentFileList = fileList;
+      });
     },
 
-    /** 闄勪欢绉婚櫎澶勭悊 */
-    handleAttachmentRemove(file) {
-      if (file.url) {
-        const index = this.attachments.findIndex(
-          item => item.path === file.url || item.fileUrl === file.url
+    // 涓婁紶鍓嶆牎楠�
+    beforeUpload(file) {
+      const allowedTypes = [
+        "application/pdf",
+        "image/jpeg",
+        "image/png",
+        "application/msword",
+        "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+      ];
+      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");
+      if (!isTypeOk) {
+        this.$message.error(
+          "鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼爌df銆乯pg銆乸ng銆乨oc鎴杁ocx鏍煎紡鏂囦欢"
         );
-        if (index > -1) {
-          this.attachments.splice(index, 1);
-          this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
-        }
+        return false;
       }
+      if (file.size > maxSize) {
+        this.$message.error("鏂囦欢澶у皬涓嶈兘瓒呰繃10MB");
+        return false;
+      }
+      return true;
     },
-    /** 涓婁紶鎴愬姛澶勭悊 */
-    handleUploadSuccess({ file, fileList, response }) {
-      if (response.code === 200) {
-        // 鏍规嵁褰撳墠婵�娲荤殑 Tab 鍐冲畾鍒嗙被锛堟湭鍒嗙被 Tab 瀵瑰簲绌哄瓧绗︿覆锛�
-        const category = this.activeTab === "鏈垎绫�" ? "" : this.activeTab;
-        const attachmentObj = {
-          fileName: file.name,
-          path: response.fileUrl || file.url,
-          fileUrl: response.fileUrl || file.url,
-          fileType: category, // 鍏抽敭锛氳褰曞垎绫�
-          fileSize: file.size,
-          uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
-        };
 
-        if (!Array.isArray(this.attachments)) {
-          this.attachments = [];
-        }
-        this.attachments.push(attachmentObj);
-        this.attachmentFileList = fileList; // 淇濇寔鍚屾
-        this.$message.success("鏂囦欢涓婁紶鎴愬姛");
-      }
+    // 鏂囦欢閫夋嫨鍙樺寲
+    handleFileChange(file, fileList) {
+      this.tempFileList = fileList;
     },
+
+    // 涓存椂绉婚櫎
+    handleTempRemove(file, fileList) {
+      this.tempFileList = fileList;
+    },
+
+    // 涓婁紶鎴愬姛澶勭悊
+    handleUploadSuccess(response, file, fileList) {
+      if (response.code !== 200) {
+        this.$message.error(response.msg || "涓婁紶澶辫触");
+        return;
+      }
+      // 鏈垎绫诲搴旂┖瀛楃涓诧紝涓庡睍绀�/淇濆瓨閫昏緫涓�鑷�
+      const category =
+        this.currentUploadCategory === "鏈垎绫�"
+          ? ""
+          : this.currentUploadCategory;
+      const attachmentObj = {
+        fileName: file.name,
+        path: response.fileUrl || response.url || response.data || file.url,
+        fileUrl: response.fileUrl || response.url || response.data || file.url,
+        fileType: category,
+        fileSize: file.size,
+        uploadTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+      };
+      if (!Array.isArray(this.attachments)) {
+        this.attachments = [];
+      }
+      this.attachments.push(attachmentObj);
+      this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+      this.uploadLoading = false;
+      this.uploadDialogVisible = false;
+      this.tempFileList = [];
+    },
+
+    // 鎻愪氦涓婁紶
+    submitUpload() {
+      if (this.tempFileList.length === 0) {
+        this.$message.warning("璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢");
+        return;
+      }
+      this.uploadLoading = true;
+      this.$refs.uploadRef.submit();
+    },
+
     // 鑾峰彇鏌愬垎绫荤殑鏂囦欢鏁伴噺
     getCategoryCount(category) {
       return this.attachments.filter(item => {
@@ -1473,16 +980,7 @@
     updateAttachmentCategory(row, newVal) {
       const target = this.attachments.find(item => item === row);
       if (target) {
-        target.fileType = newVal; // 鍙兘涓虹┖瀛楃涓�
-        // 鍚屾鏇存柊 attachmentFileList
-        const fileItem = this.attachmentFileList.find(
-          f => f.raw === row || f.url === row.fileUrl
-        );
-        if (fileItem) {
-          fileItem.raw.fileType = newVal;
-          fileItem.fileType = newVal || "鏈垎绫�";
-        }
-        // 濡傛灉褰撳墠婵�娲荤殑tab娌℃湁鏂囦欢浜嗭紝鑷姩鍒囨崲鍒扮涓�涓湁鏂囦欢鐨則ab
+        target.fileType = newVal;
         const currentTabHasFiles =
           this.getCategoryFiles(this.activeTab).length > 0;
         if (!currentTabHasFiles) {
@@ -1494,42 +992,33 @@
 
     // 鎸夋枃浠跺璞″垹闄わ紙鐢ㄤ簬琛ㄦ牸涓殑鍒犻櫎鎸夐挳锛�
     handleRemoveAttachmentByFile(file) {
-      const index = this.attachments.findIndex(item => item === file);
-      if (index > -1) {
-        this.attachments.splice(index, 1);
-        // 鍚屾鍒犻櫎 attachmentFileList
-        const fileIndex = this.attachmentFileList.findIndex(
-          f => f.raw === file || f.url === file.fileUrl
-        );
-        if (fileIndex > -1) {
-          this.attachmentFileList.splice(fileIndex, 1);
-        }
-        this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
-      }
-    },
-    /** 涓婁紶閿欒澶勭悊 */
-    handleUploadError({ file, fileList, error }) {
-      console.error("闄勪欢涓婁紶澶辫触:", error);
-      this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+      this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(() => {
+          const index = this.attachments.findIndex(item => item === file);
+          if (index > -1) {
+            this.attachments.splice(index, 1);
+            this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+          }
+        })
+        .catch(() => {});
     },
 
-    /** 鎵嬪姩鍒犻櫎闄勪欢 */
-    handleRemoveAttachment(index) {
-      // 鐩存帴璋冪敤鏂扮殑鍒犻櫎鏂规硶
-      this.handleRemoveAttachmentByFile(file.raw || file);
-    },
-
-    /** 鏂囦欢棰勮 */
+    // 鏂囦欢棰勮
     handlePreview(file) {
       this.currentPreviewFile = {
         fileName: file.fileName,
         fileUrl: file.path || file.fileUrl,
         fileType: this.getFileType(file.fileName)
       };
-      this.filePreviewVisible = true;
+      this.previewVisible = true;
     },
-    /** 鏂囦欢涓嬭浇 */
-    handleDownloadAttachment(file) {
+
+    // 鏂囦欢涓嬭浇
+    handleDownload(file) {
       const fileUrl = file.path || file.fileUrl;
       const fileName = file.fileName;
 
@@ -1642,24 +1131,36 @@
 };
 </script>
 
-<style lang="scss" scoped>
-.organ-utilization-detail {
+<style scoped>
+.organ-procurement-detail {
   padding: 20px;
   background-color: #f5f7fa;
   min-height: 100vh;
 }
 
-.detail-card,
-.utilization-card,
-.followup-card,
-.attachment-card {
+.detail-card {
   margin-bottom: 20px;
   border-radius: 8px;
   box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
   border: 1px solid #e4e7ed;
 }
 
-/* 鏂板闄勪欢澶撮儴鏍峰紡 */
+.procurement-card {
+  margin-bottom: 20px;
+  border-radius: 8px;
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  border: 1px solid #e4e7ed;
+}
+
+.attachment-card {
+  margin-bottom: 20px;
+  border-radius: 8px;
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  border: 1px solid #e4e7ed;
+  padding: 20px;
+  background: #fafafa;
+}
+
 .attachment-header {
   display: flex;
   align-items: center;
@@ -1672,7 +1173,6 @@
 .attachment-title {
   font-weight: 600;
   color: #303133;
-  font-size: 16px;
 }
 
 .attachment-tip {
@@ -1682,7 +1182,7 @@
 }
 
 .attachment-list {
-  margin-top: 20px;
+  margin-top: 16px;
 }
 
 .list-title {
@@ -1695,16 +1195,8 @@
 .file-name {
   font-size: 13px;
   margin-left: 8px;
-  color: #606266;
 }
 
-/* 鏂囦欢鍥炬爣鏍峰紡 */
-.el-icon-document {
-  font-size: 16px;
-  vertical-align: middle;
-}
-
-/* 淇濇寔鍘熸湁鏍峰紡 */
 .detail-title {
   font-size: 18px;
   font-weight: 600;
@@ -1712,42 +1204,11 @@
   line-height: 1.4;
 }
 
-/* 琛ㄦ牸鏁翠綋鏍峰紡 */
-:deep(.el-table) {
-  border-radius: 8px;
-  overflow: hidden;
-}
-
-:deep(.el-table th) {
-  background-color: #f5f7fa;
-  color: #606266;
-  font-weight: 600;
-}
-
-:deep(.el-table .cell) {
-  padding: 12px 8px;
-  line-height: 1.5;
-}
-
-/* 鏂戦┈绾硅〃鏍艰 */
-:deep(.el-table__row.warning-row) {
-  background-color: #fdf6ec;
-}
-
-:deep(.el-table__row.default-row) {
-  background-color: #f0f9ff;
-}
-
-/* 榧犳爣鎮仠鏁堟灉 */
-:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
-  background-color: #f5f7fa !important;
-}
-
 /* 缁熻淇℃伅鏍峰紡 */
-.utilization-stats {
+.procurement-stats {
   margin-top: 20px;
   padding: 15px;
-  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  background: linear-gradient(135deg, #a6b2e7 0%, #8a66ad 100%);
   border-radius: 8px;
   color: white;
 }
@@ -1773,214 +1234,17 @@
   color: white;
 }
 
-/* 灞曞紑琛屾牱寮� */
-.recipient-detail-expand {
-  padding: 20px;
+/* 绌虹姸鎬佹牱寮� */
+.empty-procurement {
+  text-align: center;
+  padding: 40px 0;
+  color: #909399;
   background: #fafafa;
-  border-radius: 8px;
-  margin: 10px 0;
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-}
-
-.recipient-header {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  margin-bottom: 20px;
-  padding-bottom: 15px;
-  border-bottom: 2px solid #e4e7ed;
-}
-
-.recipient-title {
-  font-size: 16px;
-  font-weight: 600;
-  color: #303133;
-}
-
-/* 琛ㄥ崟閮ㄥ垎鏍峰紡 */
-.recipient-form {
-  background: white;
-  padding: 20px;
-  border-radius: 8px;
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
-}
-
-/* 琛ㄥ崟閮ㄥ垎鏍囬 */
-.form-section {
-  margin-bottom: 25px;
-  padding-bottom: 20px;
-  border-bottom: 1px solid #f0f0f0;
-
-  &:last-child {
-    margin-bottom: 0;
-    padding-bottom: 0;
-    border-bottom: none;
-  }
-}
-
-.section-title {
-  font-size: 15px;
-  font-weight: 600;
-  color: #409eff;
-  margin: 0 0 15px 0;
-  padding-left: 10px;
-  border-left: 4px solid #409eff;
-  line-height: 1.2;
-}
-
-/* 琛ㄥ崟琛岄棿璺� */
-:deep(.el-form-item) {
-  margin-bottom: 20px;
-
-  .el-form-item__label {
-    font-weight: 500;
-    color: #606266;
-    padding-right: 10px;
-  }
-
-  .el-form-item__content {
-    line-height: 1.5;
-  }
-}
-
-/* 琛ㄥ崟杈撳叆妗嗘牱寮� */
-:deep(.el-input__inner) {
-  height: 36px;
-  line-height: 36px;
   border-radius: 4px;
-  transition: all 0.3s ease;
-
-  &:focus {
-    border-color: #409eff;
-    box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
-  }
-
-  &:disabled {
-    background-color: #f5f7fa;
-    border-color: #e4e7ed;
-    color: #c0c4cc;
-    cursor: not-allowed;
-  }
-}
-
-/* 鏂囨湰鍩熸牱寮� */
-:deep(.el-textarea__inner) {
-  min-height: 80px;
-  border-radius: 4px;
-  transition: all 0.3s ease;
-
-  &:focus {
-    border-color: #409eff;
-    box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
-  }
-
-  &:disabled {
-    background-color: #f5f7fa;
-    border-color: #e4e7ed;
-    color: #c0c4cc;
-    cursor: not-allowed;
-  }
-}
-
-/* 閫夋嫨妗嗘牱寮� */
-:deep(.el-select) {
-  width: 100%;
-
-  .el-input__inner {
-    border-radius: 4px;
-  }
-
-  &.is-disabled {
-    .el-input__inner {
-      background-color: #f5f7fa;
-      border-color: #e4e7ed;
-      color: #c0c4cc;
-    }
-  }
-}
-
-/* 鏃ユ湡閫夋嫨鍣ㄦ牱寮� */
-:deep(.el-date-editor) {
-  width: 100%;
-
-  &.el-input__inner {
-    border-radius: 4px;
-  }
-
-  &.is-disabled {
-    .el-input__inner {
-      background-color: #f5f7fa;
-      border-color: #e4e7ed;
-      color: #c0c4cc;
-    }
-  }
-}
-
-/* 鍝嶅簲寮忚皟鏁� */
-@media (max-width: 768px) {
-  .recipient-detail-expand {
-    padding: 15px;
-  }
-
-  .recipient-form {
-    padding: 15px;
-  }
-
-  .attachment-header {
-    flex-wrap: wrap;
-  }
-
-  .attachment-tip {
-    width: 100%;
-    margin-top: 8px;
-    margin-left: 0;
-  }
-
-  .form-section {
-    margin-bottom: 20px;
-    padding-bottom: 15px;
-  }
-
-  :deep(.el-form-item) {
-    margin-bottom: 15px;
-  }
-
-  .section-title {
-    font-size: 14px;
-    margin-bottom: 12px;
-  }
-}
-
-:deep(.el-divider) {
   margin: 20px 0;
-  background-color: #e4e7ed;
 }
 
-/* 琛ㄥ崟鏍囩鍜岃緭鍏ユ鏍峰紡 */
-:deep(.el-form-item__label) {
-  font-weight: 500;
-  color: #606266;
-}
-
-:deep(.el-input__inner:focus) {
-  border-color: #409eff;
-  box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
-}
-
-/* 鎸夐挳鏍峰紡浼樺寲 */
-:deep(.el-button--primary) {
-  background: linear-gradient(135deg, #409eff 0%, #3375e0 100%);
-  border: none;
-  border-radius: 4px;
-  transition: all 0.3s ease;
-}
-
-:deep(.el-button--primary:hover) {
-  transform: translateY(-1px);
-  box-shadow: 0 4px 12px rgba(64, 158, 255, 0.4);
-}
-
-/* 搴曢儴鎿嶄綔鎸夐挳 */
+/* 瀵硅瘽妗嗗簳閮ㄦ寜閽� */
 .dialog-footer {
   margin-top: 20px;
   text-align: center;
@@ -1993,49 +1257,23 @@
   min-width: 120px;
 }
 
-/* 绌虹姸鎬佹牱寮� */
-.empty-utilization {
-  text-align: center;
-  padding: 40px 0;
-  color: #909399;
-  background: #fafafa;
-  border-radius: 4px;
-  margin: 20px 0;
+/* 琛ㄦ牸琛屾牱寮� */
+:deep(.warning-row) {
+  background-color: #fff7e6 !important;
 }
 
-/* 鏂囦欢淇℃伅鏍峰紡 */
-.file-info {
-  display: flex;
-  align-items: center;
-  padding: 5px 0;
+:deep(.warning-row:hover) {
+  background-color: #ffecc2 !important;
 }
 
-.file-info i {
-  font-size: 18px;
-  margin-right: 10px;
-}
-
-/* 骞虫澘璁惧閫傞厤 */
-@media (max-width: 1024px) {
-  .organ-utilization-detail {
-    padding: 15px;
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 768px) {
+  .organ-procurement-detail {
+    padding: 10px;
   }
 
-  :deep(.el-col) {
+  .procurement-stats .el-col {
     margin-bottom: 10px;
-  }
-}
-
-/* 鎵嬫満璁惧閫傞厤 */
-
-/* 瓒呭皬灞忓箷璁惧 */
-@media (max-width: 480px) {
-  .organ-utilization-detail {
-    padding: 5px;
-  }
-
-  :deep(.el-card__header) {
-    padding: 10px 15px;
   }
 }
 </style>
diff --git a/src/views/business/course/components/readonlyDescriptionsMixin.js b/src/views/business/course/components/readonlyDescriptionsMixin.js
new file mode 100644
index 0000000..92749c5
--- /dev/null
+++ b/src/views/business/course/components/readonlyDescriptionsMixin.js
@@ -0,0 +1,36 @@
+/**
+ * 娴佺▼鍙板彧璇绘弿杩板垪琛ㄧ殑鍝嶅簲寮忓垪鏁� mixin
+ * 鐢ㄤ簬鍚勯樁娈佃鎯呯粍浠讹紝鏍规嵁绐楀彛瀹藉害鑷�傚簲 el-descriptions 鐨� column锛�
+ *  - >= 1920px锛�4 鍒楋紙瀹藉睆锛�
+ *  - >= 1200px锛�3 鍒楋紙涓睆锛�
+ *  - >= 768px 锛�2 鍒楋紙绐勫睆锛�
+ *  -  < 768px 锛�1 鍒楋紙鎵嬫満锛�
+ */
+export default {
+  data() {
+    return {
+      windowWidth: 0
+    };
+  },
+  computed: {
+    descriptionColumn() {
+      const w = this.windowWidth;
+      if (w >= 1920) return 4;
+      if (w >= 1200) return 3;
+      if (w >= 768) return 2;
+      return 1;
+    }
+  },
+  mounted() {
+    this.windowWidth = window.innerWidth;
+    this.__handleWindowResize = () => {
+      this.windowWidth = window.innerWidth;
+    };
+    window.addEventListener("resize", this.__handleWindowResize);
+  },
+  beforeDestroy() {
+    if (this.__handleWindowResize) {
+      window.removeEventListener("resize", this.__handleWindowResize);
+    }
+  }
+};
diff --git a/src/views/business/course/index.vue b/src/views/business/course/index.vue
index 431fb4b..fe1cf19 100644
--- a/src/views/business/course/index.vue
+++ b/src/views/business/course/index.vue
@@ -62,7 +62,11 @@
 
         <!-- 鍙充晶鍐呭 -->
         <div class="content-section">
-          <case-basic-info :case-id="caseId" :show-attachment="true" />
+          <case-basic-info
+            :case-id="caseId"
+            :show-attachment="true"
+            :column="descriptionColumn"
+          />
 
           <div class="stage-detail-section">
             <div class="section-header">
@@ -102,7 +106,7 @@
   }
 
   // 瀹屾垚 / 瀹屾垚XX
-  if (/瀹屾垚|瀹岀粨/.test(l)) {
+  if (/瀹屾垚|瀹岀粨|宸茬‘璁�/.test(l)) {
     return "completed";
   }
 
@@ -126,6 +130,7 @@
 import OrganUtilizationStage from "./components/OrganUtilizationStage";
 
 import dayjs from "dayjs";
+import readonlyDescriptionsMixin from "./components/readonlyDescriptionsMixin";
 
 // ============== 瀛楀吀鏄犲皠锛堜綘鍚庨潰鑷繁鏀癸級 ==============
 const STAGE_DICT_MAP = {
@@ -165,6 +170,7 @@
 
 export default {
   name: "DonationProcessDetail",
+  mixins: [readonlyDescriptionsMixin],
   components: {
     CaseBasicInfo,
     DonorMaintenanceStage,
@@ -416,7 +422,7 @@
 
 .stage-detail-section {
   flex: 1;
-  /* 鍗犳嵁鍓╀綑绌洪棿 */
+  /* 鍗犳嵁鍓╀綑绌洪棿锛岄摵婊″彸渚у唴瀹瑰尯 */
   background: white;
   border-radius: 6px;
   padding: 20px;
@@ -425,7 +431,7 @@
   flex-direction: column;
   min-height: 400px;
   /* 鏈�灏忛珮搴� */
-  max-height: 800px;
+  /* max-height: 1000px; */
   /* 鏈�澶ч珮搴︼紝鍙牴鎹渶瑕佽皟鏁� */
   overflow: hidden;
   /* 闅愯棌澶栧眰婧㈠嚭 */
@@ -643,5 +649,8 @@
     min-height: 300px;
     max-height: 400px;
   }
+  .basic-info-card {
+    margin-bottom: 0;
+  }
 }
 </style>
diff --git a/src/views/business/decide/DecideInfo copy.vue b/src/views/business/decide/DecideInfo copy.vue
index 239e5f9..6f5fa44 100644
--- a/src/views/business/decide/DecideInfo copy.vue
+++ b/src/views/business/decide/DecideInfo copy.vue
@@ -1,6 +1,6 @@
 <template>
   <div class="death-judgment-detail">
-    <case-basic-info :case-id="caseId" :show-attachment="true" />
+    <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
     <el-card class="detail-card">
       <!-- 鍩虹淇℃伅 -->
       <div slot="header" class="clearfix">
diff --git a/src/views/business/decide/DecideInfo.vue b/src/views/business/decide/DecideInfo.vue
index 9522c29..a297929 100644
--- a/src/views/business/decide/DecideInfo.vue
+++ b/src/views/business/decide/DecideInfo.vue
@@ -1,6 +1,6 @@
 <template>
   <div class="death-judgment-detail">
-    <case-basic-info :case-id="caseId" :show-attachment="true" />
+    <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
     <!-- 鍏叡淇℃伅妯″潡锛堢嫭绔嬫樉绀猴級 -->
 
     <!-- 鍒ゅ畾绫诲瀷鏍囩椤� -->
@@ -51,7 +51,7 @@
       </el-form>
     </el-card> -->
     <!-- 鑴戞浜″垽瀹氭ā鍧� -->
-    <el-card v-if="activeJudgmentType === 'brain'" class="detail-card">
+    <el-card v-if="activeJudgmentType === 'brain'" class="detail-card paper-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">鑴戞浜″垽瀹氫俊鎭�</span>
 
@@ -65,73 +65,63 @@
         </el-button>
       </div>
 
-      <el-form :model="form" ref="brainForm" :rules="rules" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="姝讳骸鍘熷洜" prop="deathreason">
-              <el-input v-model="form.deathreason" :readonly="!isEdit" />
-            </el-form-item>
-          </el-col>
-        </el-row>
+      <el-form :model="form" ref="brainForm" :rules="rules" label-width="120px" class="paper-form">
+        <div class="form-row">
+          <el-form-item label="姝讳骸鍘熷洜" prop="deathreason" class="col-1-3">
+            <el-input v-model="form.deathreason" :readonly="!isEdit" />
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="姝讳骸鏃堕棿" prop="deathtime">
-              <el-date-picker
-                v-model="form.deathtime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-                :disabled="!isEdit"
+        <div class="form-row">
+          <el-form-item label="姝讳骸鏃堕棿" prop="deathtime" class="col-1-3">
+            <el-date-picker
+              v-model="form.deathtime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+              :disabled="!isEdit"
+            />
+          </el-form-item>
+          <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="deathjudgedocto" class="col-1-3">
+            <el-input v-model="form.deathjudgedocto" :readonly="!isEdit" />
+          </el-form-item>
+          <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="deathjudgedoctt" class="col-1-3">
+            <el-input v-model="form.deathjudgedoctt" :readonly="!isEdit" />
+          </el-form-item>
+        </div>
+        <div class="form-row">
+          <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓" class="col-full">
+            <div
+              v-for="(doctor, index) in brainExtraDoctors"
+              :key="index"
+              style="display: flex; align-items: center; margin-bottom: 8px;"
+            >
+              <el-input
+                v-model="brainExtraDoctors[index]"
+                placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
+                style="flex: 1; margin-right: 10px;"
+                :readonly="!isEdit"
               />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="deathjudgedocto">
-              <el-input v-model="form.deathjudgedocto" :readonly="!isEdit" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="deathjudgedoctt">
-              <el-input v-model="form.deathjudgedoctt" :readonly="!isEdit" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓">
-              <div
-                v-for="(doctor, index) in brainExtraDoctors"
-                :key="index"
-                style="display: flex; align-items: center; margin-bottom: 8px;"
-              >
-                <el-input
-                  v-model="brainExtraDoctors[index]"
-                  placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
-                  style="flex: 1; margin-right: 10px;"
-                  :readonly="!isEdit"
-                />
-                <el-button
-                  v-if="isEdit"
-                  type="danger"
-                  icon="el-icon-minus"
-                  circle
-                  size="mini"
-                  @click="removeBrainDoctor(index)"
-                />
-              </div>
               <el-button
                 v-if="isEdit"
-                type="primary"
-                icon="el-icon-plus"
-                size="small"
-                @click="addBrainDoctor"
-              >
-                娣诲姞鍖荤敓
-              </el-button>
-            </el-form-item>
-          </el-col>
-        </el-row>
+                type="danger"
+                icon="el-icon-minus"
+                circle
+                size="mini"
+                @click="removeBrainDoctor(index)"
+              />
+            </div>
+            <el-button
+              v-if="isEdit"
+              type="primary"
+              icon="el-icon-plus"
+              size="small"
+              @click="addBrainDoctor"
+            >
+              娣诲姞鍖荤敓
+            </el-button>
+          </el-form-item>
+        </div>
       </el-form>
 
       <!-- 鑴戞浜¤瘎浼拌〃闄勪欢 -->
@@ -253,7 +243,7 @@
     </el-card>
 
     <!-- 蹇冩浜″垽瀹氭ā鍧� -->
-    <el-card v-else class="detail-card">
+    <el-card v-else class="detail-card paper-card">
       <div slot="header" class="clearfix">
         <span class="detail-title">蹇冩浜″垽瀹氫俊鎭�</span>
         <el-button
@@ -275,79 +265,69 @@
         </el-button>
       </div>
 
-      <el-form :model="form" ref="heartForm" :rules="rules" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="蹇冩浜″師鍥�" prop="heartdeathreason">
-              <el-input v-model="form.heartdeathreason" :readonly="!isEdit" />
-            </el-form-item>
-          </el-col>
-        </el-row>
+      <el-form :model="form" ref="heartForm" :rules="rules" label-width="120px" class="paper-form">
+        <div class="form-row">
+          <el-form-item label="蹇冩浜″師鍥�" prop="heartdeathreason" class="col-1-3">
+            <el-input v-model="form.heartdeathreason" :readonly="!isEdit" />
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="蹇冩浜″垽瀹氬畬鎴愭椂闂�" prop="heartdeathtime">
-              <el-date-picker
-                v-model="form.heartdeathtime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-                :disabled="!isEdit"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="heartdeathjudgedocto">
+        <div class="form-row">
+          <el-form-item label="蹇冩浜″垽瀹氬畬鎴愭椂闂�" prop="heartdeathtime" class="col-1-3">
+            <el-date-picker
+              v-model="form.heartdeathtime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+              :disabled="!isEdit"
+            />
+          </el-form-item>
+          <el-form-item label="鍒ゅ畾鍖荤敓涓�" prop="heartdeathjudgedocto" class="col-1-3">
+            <el-input
+              v-model="form.heartdeathjudgedocto"
+              :readonly="!isEdit"
+            />
+          </el-form-item>
+          <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="heartdeathjudgedoctt" class="col-1-3">
+            <el-input
+              v-model="form.heartdeathjudgedoctt"
+              :readonly="!isEdit"
+            />
+          </el-form-item>
+        </div>
+        <div class="form-row">
+          <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓" class="col-full">
+            <div
+              v-for="(doctor, index) in heartExtraDoctors"
+              :key="index"
+              style="display: flex; align-items: center; margin-bottom: 8px;"
+            >
               <el-input
-                v-model="form.heartdeathjudgedocto"
+                v-model="heartExtraDoctors[index]"
+                placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
+                style="flex: 1; margin-right: 10px;"
                 :readonly="!isEdit"
               />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍒ゅ畾鍖荤敓浜�" prop="heartdeathjudgedoctt">
-              <el-input
-                v-model="form.heartdeathjudgedoctt"
-                :readonly="!isEdit"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="鍏朵粬鍒ゅ畾鍖荤敓">
-              <div
-                v-for="(doctor, index) in heartExtraDoctors"
-                :key="index"
-                style="display: flex; align-items: center; margin-bottom: 8px;"
-              >
-                <el-input
-                  v-model="heartExtraDoctors[index]"
-                  placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
-                  style="flex: 1; margin-right: 10px;"
-                  :readonly="!isEdit"
-                />
-                <el-button
-                  v-if="isEdit"
-                  type="danger"
-                  icon="el-icon-minus"
-                  circle
-                  size="mini"
-                  @click="removeHeartDoctor(index)"
-                />
-              </div>
               <el-button
                 v-if="isEdit"
-                type="primary"
-                icon="el-icon-plus"
-                size="small"
-                @click="addHeartDoctor"
-              >
-                娣诲姞鍖荤敓
-              </el-button>
-            </el-form-item>
-          </el-col>
-        </el-row>
+                type="danger"
+                icon="el-icon-minus"
+                circle
+                size="mini"
+                @click="removeHeartDoctor(index)"
+              />
+            </div>
+            <el-button
+              v-if="isEdit"
+              type="primary"
+              icon="el-icon-plus"
+              size="small"
+              @click="addHeartDoctor"
+            >
+              娣诲姞鍖荤敓
+            </el-button>
+          </el-form-item>
+        </div>
       </el-form>
 
       <!-- 蹇冩浜¤瘎浼拌〃闄勪欢 -->
@@ -1398,4 +1378,73 @@
 :deep(.image-preview-dialog .el-message-box__content) {
   text-align: center;
 }
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+  padding: 16px;
+}
+
+.paper-form {
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+.paper-form >>> .form-row {
+  display: flex;
+  width: 100%;
+  border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+  display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #ecf5ff;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
 </style>
diff --git a/src/views/business/ethicalReview/ethicalReviewInfo.vue b/src/views/business/ethicalReview/ethicalReviewInfo.vue
index 2da5b62..36c22e2 100644
--- a/src/views/business/ethicalReview/ethicalReviewInfo.vue
+++ b/src/views/business/ethicalReview/ethicalReviewInfo.vue
@@ -1,28 +1,24 @@
 <template>
   <div class="ethics-review-detail">
-    <case-basic-info :case-id="caseId" :show-attachment="true" />
+    <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
 
-    <el-card class="detail-card">
+    <el-card class="detail-card paper-card">
       <!-- 浼︾悊瀹℃煡鍩烘湰淇℃伅 -->
       <div slot="header" class="clearfix">
         <span class="detail-title">浼︾悊瀹℃煡鍩烘湰淇℃伅</span>
       </div>
 
-      <el-form :model="form" ref="form" :rules="rules" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="鍙戣捣涓婚" prop="initiateTheme">
-              <el-input
-                v-model="form.initiateTheme"
-                placeholder="璇疯緭鍏ュ彂璧蜂富棰�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="鍙戣捣浜�" prop="initiatePerson">
-              <el-input v-model="form.initiatePerson" />
-            </el-form-item>
-          </el-col>
+      <el-form :model="form" ref="form" :rules="rules" label-width="120px" class="paper-form">
+        <div class="form-row">
+          <el-form-item label="鍙戣捣涓婚" prop="initiateTheme" class="col-1-3">
+            <el-input
+              v-model="form.initiateTheme"
+              placeholder="璇疯緭鍏ュ彂璧蜂富棰�"
+            />
+          </el-form-item>
+          <el-form-item label="鍙戣捣浜�" prop="initiatePerson" class="col-1-3">
+            <el-input v-model="form.initiatePerson" />
+          </el-form-item>
           <!-- <el-col :span="8">
             <el-form-item label="瀹℃煡鐘舵��" prop="status">
               <el-select v-model="form.status" style="width: 100%">
@@ -35,57 +31,49 @@
               </el-select>
             </el-form-item>
           </el-col> -->
-        </el-row>
+        </div>
 
         <!-- 涓撳鐩稿叧淇℃伅 -->
 
-        <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="浼︾悊瀹℃煡缁撹" prop="expertConclusion">
-              <el-select v-model="form.expertConclusion" style="width: 100%">
-                <el-option label="鍚屾剰" value="1" />
-                <el-option label="瀹℃煡涓�" value="2" />
-                <el-option label="涓嶅悓鎰�" value="0" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="浼︾悊瀹℃煡缁撹鏃堕棿" prop="expertTime">
-              <el-date-picker
-                v-model="form.expertTime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="浼︾悊瀹℃煡缁撹" prop="expertConclusion" class="col-1-3">
+            <el-select v-model="form.expertConclusion" style="width: 100%">
+              <el-option label="鍚屾剰" value="1" />
+              <el-option label="瀹℃煡涓�" value="2" />
+              <el-option label="涓嶅悓鎰�" value="0" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="浼︾悊瀹℃煡缁撹鏃堕棿" prop="expertTime" class="col-1-3">
+            <el-date-picker
+              v-model="form.expertTime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="瀹℃煡鎰忚" prop="expertOpinion">
-              <el-input
-                type="textarea"
-                :rows="2"
-                v-model="form.expertOpinion"
-                placeholder="璇疯緭鍏ユ剰瑙�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="瀹℃煡鎰忚" prop="expertOpinion" class="col-full">
+            <el-input
+              type="textarea"
+              :rows="2"
+              v-model="form.expertOpinion"
+              placeholder="璇疯緭鍏ユ剰瑙�"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="澶囨敞" prop="remark">
-              <el-input
-                type="textarea"
-                :rows="3"
-                v-model="form.remark"
-                placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="澶囨敞" prop="remark" class="col-full">
+            <el-input
+              type="textarea"
+              :rows="3"
+              v-model="form.remark"
+              placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+            />
+          </el-form-item>
+        </div>
       </el-form>
     </el-card>
 
@@ -1163,7 +1151,7 @@
     },
 
     // 鑾峰彇璇︽儏
-    async getDetail(infoid, id) {
+   async getDetail(infoid, id) {
       try {
         this.expertLoading = true;
         let response = {};
@@ -1171,7 +1159,12 @@
           response = await ethicalreviewInfo(id);
         } else if (infoid) {
           response = await reviewinitiateBaseInfoList({ infoid: infoid });
+          if (response.data[0].id) {
+            this.id = response.data[0].id;
+            response = await ethicalreviewInfo(this.id);
+          }
         }
+
         if (
           !response.data.status ||
           response.data.status == 0 ||
@@ -1182,7 +1175,7 @@
         if (response.code == 200) {
           let detailData = {};
 
-          if (response.data && id) {
+          if (response.data && this.id) {
             this.form = response.data;
             // 瑙f瀽 filePatch 瀛楁
             this.parseFilePatch(this.form.filePatch);
@@ -1191,7 +1184,7 @@
             if (!this.form.ethicalreviewopinionsList) {
               this.$set(this.form, "ethicalreviewopinionsList", []);
             }
-          } else if (response.data && infoid) {
+          } else if (response.data && this.infoid) {
             this.form = response.data[0];
             this.parseFilePatch(this.form.filePatch);
             this.initAttachmentFileList();
@@ -1534,8 +1527,8 @@
               // 淇濆瓨鎴愬姛鍚庢洿鏂板師濮嬫暟鎹�
               this.saveOriginalData();
               this.isEdit = false;
-              if (!this.form.id && response.data && response.data.id) {
-                this.form.id = response.data.id;
+              if (!this.form.id && response.data ) {
+                this.form.id = response.data;
                 this.id = this.form.id;
                 // this.$router.replace({
                 //   query: { ...this.$route.query, id: this.form.id }
@@ -2748,4 +2741,73 @@
     margin-bottom: 10px;
   }
 }
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+  padding: 16px;
+}
+
+.paper-form {
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+.paper-form >>> .form-row {
+  display: flex;
+  width: 100%;
+  border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+  display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #ecf5ff;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
 </style>
diff --git a/src/views/business/followupVisit/info.vue b/src/views/business/followupVisit/info.vue
index 8d54bf1..5af828e 100644
--- a/src/views/business/followupVisit/info.vue
+++ b/src/views/business/followupVisit/info.vue
@@ -146,7 +146,7 @@
     </el-card>
 
     <!-- 缂栬緫/鏂板鍖哄煙 - 濮嬬粓鏄剧ず -->
-    <el-card class="edit-area-card">
+    <el-card class="edit-area-card paper-card">
       <div slot="header" class="clearfix">
         <span>{{ editForm.id ? '缂栬緫闅忚璁板綍' : '鏂板闅忚璁板綍' }}</span>
         <div style="float: right;">
@@ -165,171 +165,162 @@
         :model="editForm"
         :rules="editRules"
         label-width="120px"
+        class="paper-form"
       >
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="闅忚搴忓彿" prop="seqno">
-              <el-input-number
-                v-model="editForm.seqno"
-                :min="1"
-                :max="20"
-                placeholder="璇疯緭鍏ラ殢璁垮簭鍙�"
-                style="width: 200px"
-              />
-              <span style="margin-left: 10px; color: #999;">(绗瑊{ editForm.seqno || 1 }}娆¢殢璁�)</span>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="闅忚鏃堕棿" prop="followuptime">
-              <el-date-picker
-                v-model="editForm.followuptime"
-                type="datetime"
-                placeholder="閫夋嫨闅忚鏃堕棿"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 200px"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="闅忚搴忓彿" prop="seqno" class="col-half">
+            <el-input-number
+              v-model="editForm.seqno"
+              :min="1"
+              :max="20"
+              placeholder="璇疯緭鍏ラ殢璁垮簭鍙�"
+              style="width: 200px"
+            />
+            <span style="margin-left: 10px; color: #999;">(绗瑊{ editForm.seqno || 1 }}娆¢殢璁�)</span>
+          </el-form-item>
+          <el-form-item label="闅忚鏃堕棿" prop="followuptime" class="col-half">
+            <el-date-picker
+              v-model="editForm.followuptime"
+              type="datetime"
+              placeholder="閫夋嫨闅忚鏃堕棿"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 200px"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="鍣ㄥ畼鍙椾綋鑰呭鍚�" prop="recipientname">
-              <el-input
-                v-model="editForm.recipientname"
-                placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呭鍚�"
-                maxlength="50"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍙椾綋鐢佃瘽" prop="recipientphone">
-              <el-input
-                v-model="editForm.recipientphone"
-                placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呯數璇�"
-                maxlength="20"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="鍣ㄥ畼鍙椾綋鑰呭鍚�" prop="recipientname" class="col-half">
+            <el-input
+              v-model="editForm.recipientname"
+              placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呭鍚�"
+              maxlength="50"
+            />
+          </el-form-item>
+          <el-form-item label="鍙椾綋鐢佃瘽" prop="recipientphone" class="col-half">
+            <el-input
+              v-model="editForm.recipientphone"
+              placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呯數璇�"
+              maxlength="20"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="绉绘鍖婚櫌鍚嶇О" prop="hospitalname">
-              <el-input
-                v-model="editForm.hospitalname"
-                placeholder="璇疯緭鍏ョЩ妞嶅尰闄㈠悕绉�"
-                maxlength="100"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="绉绘绉戝" prop="hospitaldept">
-              <el-input
-                v-model="editForm.hospitaldept"
-                placeholder="璇疯緭鍏ョЩ妞嶅尰闄㈢瀹�"
-                maxlength="50"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="绉绘鍖婚櫌鍚嶇О" prop="hospitalname" class="col-half">
+            <el-input
+              v-model="editForm.hospitalname"
+              placeholder="璇疯緭鍏ョЩ妞嶅尰闄㈠悕绉�"
+              maxlength="100"
+            />
+          </el-form-item>
+          <el-form-item label="绉绘绉戝" prop="hospitaldept" class="col-half">
+            <el-input
+              v-model="editForm.hospitaldept"
+              placeholder="璇疯緭鍏ョЩ妞嶅尰闄㈢瀹�"
+              maxlength="50"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="闅忚鍖荤敓濮撳悕" prop="doctorname">
-              <el-input
-                v-model="editForm.doctorname"
-                placeholder="璇疯緭鍏ユ帴鍙楅殢璁垮尰鐢熷鍚�"
-                maxlength="50"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍖荤敓鐢佃瘽" prop="doctorphone">
-              <el-input
-                v-model="editForm.doctorphone"
-                placeholder="璇疯緭鍏ユ帴鍙楅殢璁垮尰鐢熺數璇�"
-                maxlength="20"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="闅忚鍖荤敓濮撳悕" prop="doctorname" class="col-half">
+            <el-input
+              v-model="editForm.doctorname"
+              placeholder="璇疯緭鍏ユ帴鍙楅殢璁垮尰鐢熷鍚�"
+              maxlength="50"
+            />
+          </el-form-item>
+          <el-form-item label="鍖荤敓鐢佃瘽" prop="doctorphone" class="col-half">
+            <el-input
+              v-model="editForm.doctorphone"
+              placeholder="璇疯緭鍏ユ帴鍙楅殢璁垮尰鐢熺數璇�"
+              maxlength="20"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="鎹愮尞缁撴灉" prop="donateresult">
-              <el-select
-                v-model="editForm.donateresult"
-                placeholder="璇烽�夋嫨鎹愮尞缁撴灉"
-                style="width: 200px"
-              >
-                <el-option label="鎴愬姛" value="1" />
-                <el-option label="澶辫触" value="0" />
-                <el-option label="杩涜涓�" value="2" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="闅忚鑰�" prop="followupno">
-              <el-input
-                v-model="editForm.followupno"
-                placeholder="璇疯緭鍏ラ殢璁胯��"
-                maxlength="50"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="鎹愮尞缁撴灉" prop="donateresult" class="col-half">
+            <el-select
+              v-model="editForm.donateresult"
+              placeholder="璇烽�夋嫨鎹愮尞缁撴灉"
+              style="width: 200px"
+            >
+              <el-option label="鎴愬姛" value="1" />
+              <el-option label="澶辫触" value="0" />
+              <el-option label="杩涜涓�" value="2" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="闅忚鑰�" prop="followupno" class="col-half">
+            <el-input
+              v-model="editForm.followupno"
+              placeholder="璇疯緭鍏ラ殢璁胯��"
+              maxlength="50"
+            />
+          </el-form-item>
+        </div>
 
-        <el-form-item label="闅忚鎻忚堪" prop="followupdescribe">
-          <el-input
-            v-model="editForm.followupdescribe"
-            type="textarea"
-            placeholder="璇疯緭鍏ラ殢璁挎弿杩�"
-            maxlength="1000"
-            :rows="3"
-            show-word-limit
-          />
-        </el-form-item>
+        <div class="form-row">
+          <el-form-item label="闅忚鎻忚堪" prop="followupdescribe" class="col-full">
+            <el-input
+              v-model="editForm.followupdescribe"
+              type="textarea"
+              placeholder="璇疯緭鍏ラ殢璁挎弿杩�"
+              maxlength="1000"
+              :rows="3"
+              show-word-limit
+            />
+          </el-form-item>
+        </div>
 
-        <el-form-item label="鍖荤敓鎻忚堪" prop="doctordescribe">
-          <el-input
-            v-model="editForm.doctordescribe"
-            type="textarea"
-            placeholder="璇疯緭鍏ュ尰鐢熸弿杩�"
-            maxlength="500"
-            :rows="3"
-            show-word-limit
-          />
-        </el-form-item>
+        <div class="form-row">
+          <el-form-item label="鍖荤敓鎻忚堪" prop="doctordescribe" class="col-full">
+            <el-input
+              v-model="editForm.doctordescribe"
+              type="textarea"
+              placeholder="璇疯緭鍏ュ尰鐢熸弿杩�"
+              maxlength="500"
+              :rows="3"
+              show-word-limit
+            />
+          </el-form-item>
+        </div>
 
-        <el-form-item label="鍙椾綋鑰呮弿杩�" prop="recipientdescribe">
-          <el-input
-            v-model="editForm.recipientdescribe"
-            type="textarea"
-            placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呮弿杩�"
-            maxlength="500"
-            :rows="3"
-            show-word-limit
-          />
-        </el-form-item>
+        <div class="form-row">
+          <el-form-item label="鍙椾綋鑰呮弿杩�" prop="recipientdescribe" class="col-full">
+            <el-input
+              v-model="editForm.recipientdescribe"
+              type="textarea"
+              placeholder="璇疯緭鍏ュ櫒瀹樺彈浣撹�呮弿杩�"
+              maxlength="500"
+              :rows="3"
+              show-word-limit
+            />
+          </el-form-item>
+        </div>
 
-        <el-form-item label="澶囨敞" prop="remark">
-          <el-input
-            v-model="editForm.remark"
-            type="textarea"
-            placeholder="璇疯緭鍏ュ娉�"
-            maxlength="500"
-            :rows="3"
-            show-word-limit
-          />
-        </el-form-item>
+        <div class="form-row">
+          <el-form-item label="澶囨敞" prop="remark" class="col-full">
+            <el-input
+              v-model="editForm.remark"
+              type="textarea"
+              placeholder="璇疯緭鍏ュ娉�"
+              maxlength="500"
+              :rows="3"
+              show-word-limit
+            />
+          </el-form-item>
+        </div>
 
-        <el-form-item>
-          <el-button type="primary" @click="submitEditForm">
-            {{ editForm.id ? '淇濆瓨淇敼' : '鍒涘缓闅忚' }}
-          </el-button>
-          <el-button @click="resetEditForm">閲嶇疆</el-button>
-        </el-form-item>
+        <div class="form-row">
+          <el-form-item class="col-full">
+            <el-button type="primary" @click="submitEditForm">
+              {{ editForm.id ? '淇濆瓨淇敼' : '鍒涘缓闅忚' }}
+            </el-button>
+            <el-button @click="resetEditForm">閲嶇疆</el-button>
+          </el-form-item>
+        </div>
       </el-form>
     </el-card>
   </div>
@@ -740,4 +731,73 @@
   cursor: pointer;
   background-color: #f5f7fa;
 }
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+  padding: 16px;
+}
+
+.paper-form {
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+.paper-form >>> .form-row {
+  display: flex;
+  width: 100%;
+  border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+  display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #ecf5ff;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
 </style>
diff --git a/src/views/business/maintain/maintainInfo.vue b/src/views/business/maintain/maintainInfo.vue
index 212bdc6..e92fc17 100644
--- a/src/views/business/maintain/maintainInfo.vue
+++ b/src/views/business/maintain/maintainInfo.vue
@@ -1,6 +1,6 @@
 <template>
   <div class="maintenance-detail">
-    <case-basic-info :case-id="caseId" :show-attachment="true" />
+    <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
 
     <el-card class="assessment-card">
       <div slot="header" class="clearfix">
@@ -1366,4 +1366,73 @@
 .custom-positive-tooltip {
   max-width: 400px;
 }
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+  padding: 0;
+}
+
+.paper-form {
+  border-top: 1px solid #d0d3db;
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+.paper-form >>> .form-row {
+  display: flex;
+  width: 100%;
+}
+
+.paper-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+  display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #f3f5f9;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
 </style>
diff --git a/src/views/business/transfer/TransportEdit.vue b/src/views/business/transfer/TransportEdit.vue
index 7481687..b334b74 100644
--- a/src/views/business/transfer/TransportEdit.vue
+++ b/src/views/business/transfer/TransportEdit.vue
@@ -47,9 +47,10 @@
       :model="formData"
       :rules="formRules"
       label-width="120px"
+      class="paper-form"
     >
       <!-- 鍩虹淇℃伅 -->
-      <el-card class="form-section" shadow="never">
+      <el-card class="form-section paper-card" shadow="never">
         <div slot="header" class="section-header">
           <i
             class="el-icon-document"
@@ -58,70 +59,60 @@
           <span>鍩虹淇℃伅</span>
         </div>
 
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
-              <el-input
-                v-model="formData.caseNo"
-                :disabled="true"
-                placeholder="鑷姩浠庢渚嬭幏鍙�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="妗堜緥缂栧彿" prop="caseNo" class="col-half">
+            <el-input
+              v-model="formData.caseNo"
+              :disabled="true"
+              placeholder="鑷姩浠庢渚嬭幏鍙�"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鎮h�呭鍚�" prop="patName">
-              <el-input
-                v-model="formData.patName"
-                :disabled="true"
-                placeholder="鑷姩浠庢渚嬭幏鍙�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鎬у埆" prop="sex">
-              <el-select
-                v-model="formData.sex"
-                :disabled="true"
-                placeholder="璇烽�夋嫨鎬у埆"
-                style="width: 100%"
-              >
-                <el-option label="鐢�" value="1" />
-                <el-option label="濂�" value="2" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="鎮h�呭鍚�" prop="patName" class="col-half">
+            <el-input
+              v-model="formData.patName"
+              :disabled="true"
+              placeholder="鑷姩浠庢渚嬭幏鍙�"
+            />
+          </el-form-item>
+          <el-form-item label="鎬у埆" prop="sex" class="col-half">
+            <el-select
+              v-model="formData.sex"
+              :disabled="true"
+              placeholder="璇烽�夋嫨鎬у埆"
+              style="width: 100%"
+            >
+              <el-option label="鐢�" value="1" />
+              <el-option label="濂�" value="2" />
+            </el-select>
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="骞撮緞" prop="age">
-              <el-input-number
-                v-model="formData.age"
-                :min="0"
-                :max="120"
-                :disabled="true"
-                placeholder="鑷姩浠庢渚嬭幏鍙�"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname">
-              <el-input
-                v-model="formData.diagnosisname"
-                :disabled="true"
-                placeholder="鑷姩浠庢渚嬭幏鍙�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="骞撮緞" prop="age" class="col-half">
+            <el-input-number
+              v-model="formData.age"
+              :min="0"
+              :max="120"
+              :disabled="true"
+              placeholder="鑷姩浠庢渚嬭幏鍙�"
+              style="width: 100%"
+            />
+          </el-form-item>
+          <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname" class="col-half">
+            <el-input
+              v-model="formData.diagnosisname"
+              :disabled="true"
+              placeholder="鑷姩浠庢渚嬭幏鍙�"
+            />
+          </el-form-item>
+        </div>
       </el-card>
 
       <!-- 鍖婚櫌淇℃伅 -->
-      <el-card class="form-section" shadow="never">
+      <el-card class="form-section paper-card" shadow="never">
         <div slot="header" class="section-header">
           <i
             class="el-icon-office-building"
@@ -130,47 +121,39 @@
           <span>鍖婚櫌淇℃伅</span>
         </div>
 
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="娌荤枟鍖婚櫌" prop="treatmentHospitalName">
-              <el-input
-                v-model="formData.treatmentHospitalName"
-                :disabled="true"
-                placeholder="鑷姩浠庢渚嬭幏鍙�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="娌荤枟绉戝" prop="treatmentDeptName">
-              <el-input
-                v-model="formData.treatmentDeptName"
-                placeholder="璇疯緭鍏ユ不鐤楃瀹ゅ悕绉�"
-              />
-            </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>
+        <div class="form-row">
+          <el-form-item label="娌荤枟鍖婚櫌" prop="treatmentHospitalName" class="col-half">
+            <el-input
+              v-model="formData.treatmentHospitalName"
+              :disabled="true"
+              placeholder="鑷姩浠庢渚嬭幏鍙�"
+            />
+          </el-form-item>
+          <el-form-item label="娌荤枟绉戝" prop="treatmentDeptName" class="col-half">
+            <el-input
+              v-model="formData.treatmentDeptName"
+              placeholder="璇疯緭鍏ユ不鐤楃瀹ゅ悕绉�"
+            />
+          </el-form-item>
+        </div>
+        <div class="form-row">
+          <el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor" class="col-half">
+            <el-input
+              v-model="formData.icuDoctor"
+              placeholder="璇疯緭鍏CU璇勪及鍖荤敓"
+            />
+          </el-form-item>
+          <el-form-item label="ICU鍖荤敓鐢佃瘽" prop="icuDoctorPhone" class="col-half">
+            <el-input
+              v-model="formData.icuDoctorPhone"
+              placeholder="璇疯緭鍏CU鍖荤敓鎵嬫満鍙�"
+            />
+          </el-form-item>
+        </div>
       </el-card>
 
       <!-- 杞繍淇℃伅 -->
-      <el-card class="form-section" shadow="never">
+      <el-card class="form-section paper-card" shadow="never">
         <div slot="header" class="section-header">
           <i
             class="el-icon-location-information"
@@ -179,29 +162,25 @@
           <span>杞繍淇℃伅</span>
         </div>
 
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鍑哄彂鍦扮偣" prop="transportStartPlace">
-              <el-input
-                v-model="formData.transportStartPlace"
-                placeholder="璇疯緭鍏ュ嚭鍙戝湴鐐�"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍑哄彂鏃堕棿" prop="transportStartTime">
-              <el-date-picker
-                v-model="formData.transportStartTime"
-                type="datetime"
-                placeholder="閫夋嫨鍑哄彂鏃堕棿"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+        <div class="form-row">
+          <el-form-item label="鍑哄彂鍦扮偣" prop="transportStartPlace" class="col-half">
+            <el-input
+              v-model="formData.transportStartPlace"
+              placeholder="璇疯緭鍏ュ嚭鍙戝湴鐐�"
+            />
+          </el-form-item>
+          <el-form-item label="鍑哄彂鏃堕棿" prop="transportStartTime" class="col-half">
+            <el-date-picker
+              v-model="formData.transportStartTime"
+              type="datetime"
+              placeholder="閫夋嫨鍑哄彂鏃堕棿"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%"
+            />
+          </el-form-item>
+        </div>
 
-        <el-row :gutter="20">
+        <div class="form-row">
           <!-- <el-col :span="12">
             <el-form-item label="杞繍鐘舵��" prop="transitStatus">
               <el-select
@@ -217,19 +196,17 @@
               </el-select>
             </el-form-item>
           </el-col> -->
-          <el-col :span="12">
-            <el-form-item label="璐熻矗鍗忚皟鍛�" prop="contactPerson">
-              <el-input
-                v-model="formData.contactPerson"
-                placeholder="璇疯緭鍏ュ崗璋冨憳濮撳悕"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+          <el-form-item label="璐熻矗鍗忚皟鍛�" prop="contactPerson" class="col-half">
+            <el-input
+              v-model="formData.contactPerson"
+              placeholder="璇疯緭鍏ュ崗璋冨憳濮撳悕"
+            />
+          </el-form-item>
+        </div>
       </el-card>
 
       <!-- 鍖绘姢浜哄憳淇℃伅 -->
-      <el-card class="form-section" shadow="never">
+      <el-card class="form-section paper-card" shadow="never">
         <div slot="header" class="section-header">
           <i
             class="el-icon-user"
@@ -238,15 +215,13 @@
           <span>鍖绘姢浜哄憳淇℃伅</span>
         </div>
 
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="杞繍鍖荤敓" prop="doctor">
-              <el-input
-                v-model="formData.doctor"
-                placeholder="璇疯緭鍏ヨ浆杩愬尰鐢�"
-              />
-            </el-form-item>
-          </el-col>
+        <div class="form-row">
+          <el-form-item label="杞繍鍖荤敓" prop="doctor" class="col-half">
+            <el-input
+              v-model="formData.doctor"
+              placeholder="璇疯緭鍏ヨ浆杩愬尰鐢�"
+            />
+          </el-form-item>
           <!-- <el-col :span="12">
             <el-form-item label="鍖荤敓鐢佃瘽" prop="doctorPhone">
               <el-input
@@ -255,12 +230,10 @@
               />
             </el-form-item>
           </el-col> -->
-           <el-col :span="12">
-            <el-form-item label="杞繍鎶ゅ+" prop="nurse">
-              <el-input v-model="formData.nurse" placeholder="璇疯緭鍏ユ姢澹鍚�" />
-            </el-form-item>
-          </el-col>
-        </el-row>
+          <el-form-item label="杞繍鎶ゅ+" prop="nurse" class="col-half">
+            <el-input v-model="formData.nurse" placeholder="璇疯緭鍏ユ姢澹鍚�" />
+          </el-form-item>
+        </div>
 
         <!-- <el-row :gutter="20">
 
@@ -274,15 +247,13 @@
           </el-col>
         </el-row> -->
 
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="杞繍椹鹃┒鍛�" prop="driver">
-              <el-input
-                v-model="formData.driver"
-                placeholder="璇疯緭鍏ラ┚椹跺憳濮撳悕"
-              />
-            </el-form-item>
-          </el-col>
+        <div class="form-row">
+          <el-form-item label="杞繍椹鹃┒鍛�" prop="driver" class="col-half">
+            <el-input
+              v-model="formData.driver"
+              placeholder="璇疯緭鍏ラ┚椹跺憳濮撳悕"
+            />
+          </el-form-item>
           <!-- <el-col :span="12">
             <el-form-item label="椹鹃┒鍛樼數璇�" prop="driverPhone">
               <el-input
@@ -291,7 +262,7 @@
               />
             </el-form-item>
           </el-col> -->
-        </el-row>
+        </div>
       </el-card>
 
       <!-- 闄勪欢淇℃伅 -->
@@ -390,7 +361,7 @@
       </el-card>
 
       <!-- 澶囨敞淇℃伅 -->
-      <el-card class="form-section" shadow="never">
+      <el-card class="form-section paper-card" shadow="never">
         <div slot="header" class="section-header">
           <i
             class="el-icon-edit"
@@ -398,16 +369,18 @@
           ></i>
           <span>澶囨敞淇℃伅</span>
         </div>
-        <el-form-item prop="remark">
-          <el-input
-            v-model="formData.remark"
-            type="textarea"
-            :rows="4"
-            placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
-            maxlength="500"
-            show-word-limit
-          />
-        </el-form-item>
+        <div class="form-row">
+          <el-form-item prop="remark" class="col-full">
+            <el-input
+              v-model="formData.remark"
+              type="textarea"
+              :rows="4"
+              placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+              maxlength="500"
+              show-word-limit
+            />
+          </el-form-item>
+        </div>
       </el-card>
     </el-form>
 
@@ -857,4 +830,88 @@
 .case-info-card {
   border-left: 4px solid #67c23a;
 }
+
+/* ===== 绾歌川琛ㄦ牸缃戞牸鏍峰紡 ===== */
+.paper-card >>> .el-card__body {
+  padding: 16px;
+}
+
+.paper-form {
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
+
+.paper-form >>> .form-row {
+  display: flex;
+  width: 100%;
+  border-top: 1px solid #d0d3db;
+}
+
+.paper-form >>> .el-form-item {
+  flex: 0 0 33.3333%;
+  display: flex;
+  margin: 0;
+  background: #fff;
+  border-right: 1px solid #d0d3db;
+  border-bottom: 1px solid #d0d3db;
+}
+.paper-form >>> .el-form-item::after,
+.paper-form >>> .el-form-item::before {
+  display: none;
+}
+
+.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
+.paper-form >>> .col-half { flex: 0 0 50%; }
+.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
+.paper-form >>> .col-full { flex: 0 0 100%; }
+
+.paper-form >>> .el-form-item__label {
+  flex: 0 0 120px;
+  width: 120px !important;
+  float: none;
+  padding: 0 8px !important;
+  background: #ecf5ff;
+  border-right: 1px solid #d0d3db;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 13px;
+  font-weight: 600;
+  color: #2c3038;
+  line-height: 1.3;
+  white-space: normal;
+  word-break: break-all;
+}
+.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+  color: #f56c6c;
+  margin-right: 2px;
+}
+
+.paper-form >>> .el-form-item__content {
+  flex: 1;
+  margin-left: 0 !important;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  padding: 6px 10px;
+  background: #fff;
+  min-height: 42px;
+  line-height: 1.4;
+}
+
+/* ===== TransportEdit 鐗规畩閫傞厤锛氳〃鍗曞唴鏈夊涓垎鍖� el-card锛屾瘡涓垎鍖哄悇鑷嫭绔嬫垚瀹屾暣缃戞牸 ===== */
+.paper-form {
+  border: none;
+  background: transparent;
+}
+.paper-form >>> .paper-card {
+  border: none;
+  box-shadow: none;
+}
+.paper-form >>> .paper-card >>> .el-card__body {
+  border-top: 1px solid #d0d3db;
+  border-left: 1px solid #d0d3db;
+  background: #fff;
+}
 </style>
diff --git a/vue.config.js b/vue.config.js
index df11e23..46b25ec 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -33,9 +33,9 @@
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        // target: `http://www.qdopo.com:9095`,
-        target:`http://192.168.76.25:9095`,//鎵撳寘鍦板潃
-        // target:`http://192.168.100.10:8080`,
+        // target: `https://opo.qduh.cn`,
+        // target:`http://192.168.76.25:9095`,//鎵撳寘鍦板潃
+        target:`http://192.168.100.10:8080`,
         // target: `http://localhost:8080`,
         // target:`http://192.168.100.137:8080`,
         // target: `https://slb.hospitalstar.com:9093`,
diff --git "a/\347\256\241\347\220\206\347\253\2578.20.zip" "b/\347\256\241\347\220\206\347\253\2578.20.zip"
new file mode 100644
index 0000000..a17503e
--- /dev/null
+++ "b/\347\256\241\347\220\206\347\253\2578.20.zip"
Binary files differ

--
Gitblit v1.9.3