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

---
 src/views/business/course/components/OrganUtilizationStage.vue | 2050 ++++++++++++++++++----------------------------------------
 1 files changed, 644 insertions(+), 1,406 deletions(-)

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>

--
Gitblit v1.9.3