From 0c03027d7f238bf5beb98e85463f53f0bd92bbaa Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期一, 20 四月 2026 17:56:01 +0800
Subject: [PATCH] 青岛维护

---
 src/views/business/appear/index.vue           | 1483 ++++++++++++++++++++--
 src/views/OfficeRelated/conference/index.vue  | 1007 +++++++++++++--
 src/views/business/transfer/index.vue         |  286 ++++
 src/views/business/transfer/TransportEdit.vue |  100 +
 src/views/business/appear/caseDetail.vue      |  914 ++++++++-----
 5 files changed, 3,046 insertions(+), 744 deletions(-)

diff --git a/src/views/OfficeRelated/conference/index.vue b/src/views/OfficeRelated/conference/index.vue
index bc55057..30ec96d 100644
--- a/src/views/OfficeRelated/conference/index.vue
+++ b/src/views/OfficeRelated/conference/index.vue
@@ -128,7 +128,10 @@
           prop="organizerName"
           label="缁勭粐鑰�"
           width="120"
-        />
+          ><template #default="scope">
+            <span>{{ scope.organizerName || scope.createBy }}</span>
+          </template>
+        </el-table-column>
         <el-table-column
           align="center"
           prop="locationName"
@@ -270,35 +273,98 @@
         </div>
 
         <!-- 浼氳绾闄勪欢灞曠ず -->
-        <div
-          class="minutes-attachments"
-          v-if="
-            currentRecord.recordattachment &&
-              parseAttachments(currentRecord.recordattachment).length > 0
-          "
-        >
-          <el-divider content-position="left">浼氳绾闄勪欢</el-divider>
-          <div class="attachment-list">
+        <div class="detail-attachments">
+          <div
+            v-if="parseAttachments(currentRecord.recordattachment).length > 0"
+            class="attachment-grid"
+          >
             <div
               v-for="file in parseAttachments(currentRecord.recordattachment)"
               :key="file.id || file.name"
-              class="attachment-item"
+              class="attachment-card"
             >
-              <el-link
-                type="primary"
-                :href="file.url"
-                target="_blank"
-                class="file-link"
-              >
-                <i
-                  :class="getFileIcon(file.type || file.name)"
-                  style="margin-right: 8px;"
-                ></i>
-                {{ file.name }}
-                <span class="file-size" v-if="file.size"
-                  >({{ formatFileSize(file.size) }})</span
+              <template v-if="isImageFile(file)">
+                <!-- 鍥剧墖浣跨敤 el-image 棰勮 -->
+                <el-image
+                  class="image-attachment"
+                  :src="getFileUrl(file)"
+                  :preview-src-list="getImagePreviewList(file)"
+                  fit="cover"
+                  :style="{ width: imageSize, height: imageSize }"
+                  lazy
                 >
-              </el-link>
+                  <div slot="error" class="image-error">
+                    <i class="el-icon-picture-outline"></i>
+                    <span>鍔犺浇澶辫触</span>
+                  </div>
+                  <div slot="placeholder" class="image-loading">
+                    <i class="el-icon-loading"></i>
+                  </div>
+                </el-image>
+                <div class="image-info">
+                  <div class="file-name" :title="file.name">
+                    {{ file.name }}
+                  </div>
+                  <div class="file-actions">
+                    <el-button
+                      type="text"
+                      size="mini"
+                      @click="handleDownload(file)"
+                      icon="el-icon-download"
+                      title="涓嬭浇"
+                    />
+                    <el-button
+                      type="text"
+                      size="mini"
+                      @click="handlePreview(file)"
+                      icon="el-icon-view"
+                      title="棰勮"
+                    />
+                  </div>
+                </div>
+              </template>
+
+              <template v-else>
+                <!-- 闈炲浘鐗囨枃浠朵繚鎸佸師鏈夋牱寮� -->
+                <el-card shadow="hover" class="file-card">
+                  <div class="file-content">
+                    <i
+                      :class="getFileIcon(file.type || file.name)"
+                      class="file-icon"
+                    ></i>
+                    <div class="file-info">
+                      <div class="file-name" :title="file.name">
+                        {{ file.name }}
+                      </div>
+                      <div class="file-meta">
+                        <span class="file-type">{{
+                          getFileTypeText(file)
+                        }}</span>
+                        <span class="file-size" v-if="file.size">
+                          {{ formatFileSize(file.size) }}
+                        </span>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="file-actions" v-if="file.url">
+                    <el-button
+                      type="text"
+                      size="mini"
+                      @click="handleDownload(file)"
+                    >
+                      涓嬭浇
+                    </el-button>
+                    <el-button
+                      v-if="canPreview(file)"
+                      type="text"
+                      size="mini"
+                      @click="handlePreview(file)"
+                    >
+                      棰勮
+                    </el-button>
+                  </div>
+                </el-card>
+              </template>
             </div>
           </div>
         </div>
@@ -393,6 +459,7 @@
         </el-descriptions-item>
 
         <!-- 浼氳闄勪欢 -->
+        鎴戠悊瑙f偍鐨勯渶姹傦紝鎮ㄥ笇鏈涘皢浼氳闄勪欢涓殑鍥剧墖鏂囦欢浠l-image鐨勯瑙堝浘褰㈠紡灞曠ず锛屽叾浠栨枃浠剁被鍨嬩繚鎸佸師鏈夌殑灞曠ず鏂瑰紡銆傝鎴戜慨鏀硅繖閮ㄥ垎浠g爜锛�
         <el-descriptions-item label="浼氳闄勪欢" :span="2">
           <div class="detail-attachments">
             <div
@@ -402,37 +469,94 @@
               "
               class="attachment-grid"
             >
+              <!-- 鍥剧墖闄勪欢 - 浣跨敤 el-image 棰勮褰㈠紡 -->
               <div
                 v-for="file in parseAttachments(currentRecord.attachment)"
                 :key="file.id || file.name"
                 class="attachment-card"
               >
-                <el-card shadow="hover" class="file-card">
-                  <div class="file-content">
-                    <i
-                      :class="getFileIcon(file.type || file.name)"
-                      class="file-icon"
-                    ></i>
-                    <div class="file-info">
-                      <div class="file-name" :title="file.name">
-                        {{ file.name }}
-                      </div>
-                      <div class="file-meta">
-                        <span class="file-size" v-if="file.size">{{
-                          formatFileSize(file.size)
-                        }}</span>
-                      </div>
+                <template v-if="isImageFile(file)">
+                  <!-- 鍥剧墖浣跨敤 el-image 棰勮 -->
+                  <el-image
+                    class="image-attachment"
+                    :src="getFileUrl(file)"
+                    :preview-src-list="getImagePreviewList(file)"
+                    fit="cover"
+                    :style="{ width: imageSize, height: imageSize }"
+                    lazy
+                  >
+                    <div slot="error" class="image-error">
+                      <i class="el-icon-picture-outline"></i>
+                      <span>鍔犺浇澶辫触</span>
+                    </div>
+                    <div slot="placeholder" class="image-loading">
+                      <i class="el-icon-loading"></i>
+                    </div>
+                  </el-image>
+                  <div class="image-info">
+                    <div class="file-name" :title="file.name">
+                      {{ file.name }}
+                    </div>
+                    <div class="file-actions">
+                      <el-button
+                        type="text"
+                        size="mini"
+                        @click="handleDownload(file)"
+                        icon="el-icon-download"
+                        title="涓嬭浇"
+                      />
+                      <el-button
+                        type="text"
+                        size="mini"
+                        @click="handlePreview(file)"
+                        icon="el-icon-view"
+                        title="棰勮"
+                      />
                     </div>
                   </div>
-                  <div class="file-actions" v-if="file.url">
-                    <el-button
-                      type="text"
-                      size="mini"
-                      @click="handleDownload(file)"
-                      >涓嬭浇</el-button
-                    >
-                  </div>
-                </el-card>
+                </template>
+
+                <template v-else>
+                  <!-- 闈炲浘鐗囨枃浠朵繚鎸佸師鏈夋牱寮� -->
+                  <el-card shadow="hover" class="file-card">
+                    <div class="file-content">
+                      <i
+                        :class="getFileIcon(file.type || file.name)"
+                        class="file-icon"
+                      ></i>
+                      <div class="file-info">
+                        <div class="file-name" :title="file.name">
+                          {{ file.name }}
+                        </div>
+                        <div class="file-meta">
+                          <span class="file-type">{{
+                            getFileTypeText(file)
+                          }}</span>
+                          <span class="file-size" v-if="file.size">
+                            {{ formatFileSize(file.size) }}
+                          </span>
+                        </div>
+                      </div>
+                    </div>
+                    <div class="file-actions" v-if="file.url">
+                      <el-button
+                        type="text"
+                        size="mini"
+                        @click="handleDownload(file)"
+                      >
+                        涓嬭浇
+                      </el-button>
+                      <el-button
+                        v-if="canPreview(file)"
+                        type="text"
+                        size="mini"
+                        @click="handlePreview(file)"
+                      >
+                        棰勮
+                      </el-button>
+                    </div>
+                  </el-card>
+                </template>
               </div>
             </div>
             <div v-else class="no-attachment">
@@ -474,7 +598,7 @@
     <el-dialog
       :title="`${isEditing ? '缂栬緫' : '鏂板'}浼氳`"
       :visible.sync="editDialogVisible"
-      width="700px"
+      width="800px"
       :before-close="handleEditClose"
     >
       <el-form
@@ -502,16 +626,16 @@
           </el-select>
         </el-form-item>
 
-        <el-form-item label="浼氳鍦扮偣" prop="locationId">
+        <el-form-item label="浼氳鍦扮偣" prop="locationName">
           <el-select
-            v-model="editForm.locationId"
+            v-model="editForm.locationName"
             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-option label="绗竴浼氳瀹�" value="绗竴浼氳瀹�" />
+            <el-option label="绗簩浼氳瀹�" value="绗簩浼氳瀹�" />
+            <el-option label="绗笁浼氳瀹�" value="绗笁浼氳瀹�" />
+            <el-option label="绾夸笂浼氳" value="绾夸笂浼氳" />
           </el-select>
         </el-form-item>
 
@@ -573,47 +697,84 @@
           />
         </el-form-item>
 
+        <!-- 淇敼浼氳闄勪欢閮ㄥ垎 -->
         <el-form-item label="浼氳闄勪欢">
-          <div class="attachment-upload-section">
-            <div class="upload-tip">涓婁紶浼氳鐩稿叧璧勬枡鏂囦欢</div>
-            <el-upload
-              class="attachment-upload"
-              action="#"
-              :auto-upload="false"
-              :on-change="handleAttachmentChange"
-              :file-list="editForm.attachmentFiles"
-              :limit="10"
-              multiple
-            >
-              <el-button size="small" type="primary" icon="el-icon-upload">
-                涓婁紶浼氳闄勪欢
-              </el-button>
-              <div slot="tip" class="el-upload__tip">
-                鏀寔鏂囨。銆佸浘鐗囩瓑鏍煎紡锛屽崟涓枃浠朵笉瓒呰繃20MB
-              </div>
-            </el-upload>
-            <div
-              v-if="
-                editForm.attachmentFiles && editForm.attachmentFiles.length > 0
-              "
-              class="uploaded-files"
-            >
-              <div
-                v-for="(file, index) in editForm.attachmentFiles"
-                :key="file.uid || index"
-                class="file-item"
+          <div class="attachment-section">
+            <div class="attachment-header">
+              <i class="el-icon-paperclip"></i>
+              <span class="attachment-title">浼氳闄勪欢涓婁紶</span>
+              <span class="attachment-tip"
+                >鏀寔涓婁紶鏂囨。銆佸浘鐗囩瓑鏂囦欢 (鏈�澶歿{ attachmentLimit }}涓�)</span
               >
-                <span class="file-name">{{ file.name }}</span>
-                <el-button
-                  type="text"
-                  size="mini"
-                  @click="handleRemoveAttachmentFile(index)"
-                  style="color: #F56C6C;"
-                >
-                  鍒犻櫎
-                </el-button>
-              </div>
             </div>
+
+            <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
+            <UploadAttachment
+              ref="uploadAttachment"
+              :file-list="attachmentFileList"
+              :limit="attachmentLimit"
+              :accept="attachmentAccept"
+              @change="handleAttachmentChange"
+              @upload-success="handleAttachmentUploadSuccess"
+              @upload-error="handleAttachmentUploadError"
+              @remove="handleAttachmentRemove"
+            />
+          </div>
+
+          <!-- 浼氳闄勪欢鍒楄〃 -->
+          <div
+            class="attachment-list"
+            v-if="editForm.attachment && editForm.attachment.length > 0"
+          >
+            <div class="list-title">
+              宸蹭笂浼犻檮浠� ({{ editForm.attachment.length }})
+            </div>
+            <el-table
+              :data="editForm.attachment"
+              style="width: 100%"
+              size="small"
+              border
+            >
+              <el-table-column label="鏂囦欢鍚�" min-width="200">
+                <template #default="scope">
+                  <i
+                    class="el-icon-document"
+                    style="margin-right: 8px; color: #409EFF;"
+                  ></i>
+                  <span class="file-name">{{ scope.row.name }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鏂囦欢绫诲瀷" width="100">
+                <template #default="scope">
+                  <el-tag size="small">{{
+                    getFileType(scope.row.name)
+                  }}</el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="鏂囦欢澶у皬" width="100">
+                <template #default="scope">
+                  <span>{{ formatFileSize(scope.row.size) }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎿嶄綔" width="200">
+                <template #default="scope">
+                  <el-button
+                    size="mini"
+                    type="primary"
+                    @click="handlePreviewAttachment(scope.row)"
+                  >
+                    棰勮
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    @click="handleRemoveMeetingAttachment(scope.$index)"
+                  >
+                    鍒犻櫎
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
           </div>
         </el-form-item>
 
@@ -633,25 +794,86 @@
           </div>
         </el-form-item>
 
+        <!-- 淇敼浼氳绾闄勪欢閮ㄥ垎 -->
         <el-form-item label="绾闄勪欢">
-          <div class="attachment-upload-section">
-            <div class="upload-tip">涓婁紶涓庝細璁邯瑕佺浉鍏崇殑琛ュ厖鏉愭枡</div>
-            <el-upload
-              class="minutes-upload"
-              action="#"
-              :auto-upload="false"
-              :on-change="handleMinutesAttachmentChange"
-              :file-list="editForm.recordattachmentFiles"
-              :limit="5"
-              multiple
+          <div class="attachment-section">
+            <div class="attachment-header">
+              <i class="el-icon-paperclip"></i>
+              <span class="attachment-title">绾闄勪欢涓婁紶</span>
+              <span class="attachment-tip"
+                >鏀寔涓婁紶涓庣邯瑕佺浉鍏崇殑琛ュ厖鏉愭枡 (鏈�澶歿{
+                  minutesAttachmentLimit
+                }}涓�)</span
+              >
+            </div>
+
+            <UploadAttachment
+              ref="uploadMinutesAttachment"
+              :file-list="minutesAttachmentFileList"
+              :limit="minutesAttachmentLimit"
+              :accept="minutesAttachmentAccept"
+              @change="handleMinutesAttachmentChange"
+              @upload-success="handleMinutesUploadSuccess"
+              @upload-error="handleMinutesUploadError"
+              @remove="handleMinutesAttachmentRemove"
+            />
+          </div>
+
+          <div
+            class="attachment-list"
+            v-if="
+              editForm.recordattachment && editForm.recordattachment.length > 0
+            "
+          >
+            <div class="list-title">
+              宸蹭笂浼犵邯瑕侀檮浠� ({{ editForm.recordattachment.length }})
+            </div>
+            <el-table
+              :data="editForm.recordattachment"
+              style="width: 100%"
+              size="small"
+              border
             >
-              <el-button size="small" type="primary" icon="el-icon-upload">
-                涓婁紶绾闄勪欢
-              </el-button>
-              <div slot="tip" class="el-upload__tip">
-                鏀寔鍥剧墖銆佹枃妗g瓑鏍煎紡锛屽崟涓枃浠朵笉瓒呰繃10MB
-              </div>
-            </el-upload>
+              <el-table-column label="鏂囦欢鍚�" min-width="200">
+                <template #default="scope">
+                  <i
+                    class="el-icon-document"
+                    style="margin-right: 8px; color: #409EFF;"
+                  ></i>
+                  <span class="file-name">{{ scope.row.name }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鏂囦欢绫诲瀷" width="100">
+                <template #default="scope">
+                  <el-tag size="small">{{
+                    getFileType(scope.row.name)
+                  }}</el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="鏂囦欢澶у皬" width="100">
+                <template #default="scope">
+                  <span>{{ formatFileSize(scope.row.size) }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎿嶄綔" width="200">
+                <template #default="scope">
+                  <el-button
+                    size="mini"
+                    type="primary"
+                    @click="handlePreviewMinutesAttachment(scope.row)"
+                  >
+                    棰勮
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    @click="handleRemoveMinutesAttachment(scope.$index)"
+                  >
+                    鍒犻櫎
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
           </div>
         </el-form-item>
 
@@ -672,6 +894,13 @@
         </el-button>
       </span>
     </el-dialog>
+    <!-- 鏂囦欢棰勮寮圭獥 -->
+    <FilePreviewDialog
+      :visible="previewVisible"
+      :file="currentPreviewFile"
+      @close="previewVisible = false"
+      @download="handleDownload"
+    />
   </div>
 </template>
 
@@ -684,9 +913,15 @@
   meetingDel,
   exporremeeting
 } from "@/api/officeManagementApi";
-
+import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
+import dayjs from "dayjs";
 export default {
   name: "MeetingManagement",
+  components: {
+    UploadAttachment,
+    FilePreviewDialog
+  },
   data() {
     return {
       // 鏌ヨ鍙傛暟
@@ -716,6 +951,7 @@
       isEditing: false,
       // 琛ㄦ牸鏁版嵁
       tableData: [],
+      imageSize: "100px", // 鍥剧墖鏄剧ず澶у皬
       // 缂栬緫琛ㄥ崟鏁版嵁
       editForm: this.getDefaultFormData(),
       // 琛ㄥ崟楠岃瘉瑙勫垯
@@ -742,7 +978,24 @@
         reminderMinutes: [
           { required: true, message: "璇疯緭鍏ユ彁鍓嶆彁閱掓椂闂�", trigger: "blur" }
         ]
-      }
+      },
+      // 闄勪欢鐩稿叧閰嶇疆
+      attachmentLimit: 10,
+      minutesAttachmentLimit: 5,
+      attachmentAccept:
+        ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.zip,.rar",
+      minutesAttachmentAccept: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx",
+
+      // 鏂囦欢棰勮鐩稿叧
+      previewVisible: false,
+      currentPreviewFile: null,
+
+      // 闄勪欢鏂囦欢鍒楄〃
+      attachmentFileList: [],
+      minutesAttachmentFileList: [],
+
+      // 缂栬緫琛ㄥ崟鏁版嵁 - 淇敼榛樿鍊�
+      editForm: this.getDefaultFormData()
     };
   },
   mounted() {
@@ -783,7 +1036,111 @@
         this.loading = false;
       }
     },
+    // 淇敼鑾峰彇鏂囦欢绫诲瀷鏂规硶
+    getFileType(fileName) {
+      if (!fileName) return "other";
+      const extension = fileName
+        .split(".")
+        .pop()
+        .toLowerCase();
+      const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"];
+      const pdfTypes = ["pdf"];
+      const officeTypes = ["doc", "docx", "xls", "xlsx", "ppt", "pptx"];
+      const zipTypes = ["zip", "rar"];
 
+      if (imageTypes.includes(extension)) return "image";
+      if (pdfTypes.includes(extension)) return "pdf";
+      if (officeTypes.includes(extension)) return "office";
+      if (zipTypes.includes(extension)) return "archive";
+      return "other";
+    },
+    // 鍒ゆ柇鏄惁涓哄浘鐗囨枃浠�
+    isImageFile(file) {
+      if (!file || !file.name) return false;
+      const imageExtensions = [
+        "jpg",
+        "jpeg",
+        "png",
+        "gif",
+        "bmp",
+        "webp",
+        "svg"
+      ];
+      const extension = file.name
+        .split(".")
+        .pop()
+        .toLowerCase();
+      return imageExtensions.includes(extension);
+    },
+
+    // 鑾峰彇鏂囦欢URL
+    getFileUrl(file) {
+      return file.url || file.path || file.fileUrl || "";
+    },
+
+    // 鑾峰彇鍥剧墖棰勮鍒楄〃
+    getImagePreviewList(file) {
+      const url = this.getFileUrl(file);
+      if (!url) return [];
+      return [url];
+    },
+    // 鑾峰彇鏂囦欢绫诲瀷鏂囨湰
+    getFileTypeText(file) {
+      if (!file.name) return "鏂囦欢";
+      const ext = file.name
+        .split(".")
+        .pop()
+        .toLowerCase();
+      const typeMap = {
+        pdf: "PDF鏂囨。",
+        doc: "Word鏂囨。",
+        docx: "Word鏂囨。",
+        xls: "Excel琛ㄦ牸",
+        xlsx: "Excel琛ㄦ牸",
+        ppt: "PPT婕旂ず",
+        pptx: "PPT婕旂ず",
+        zip: "鍘嬬缉鍖�",
+        rar: "鍘嬬缉鍖�",
+        txt: "鏂囨湰鏂囨。",
+        jpg: "鍥剧墖",
+        jpeg: "鍥剧墖",
+        png: "鍥剧墖",
+        gif: "鍥剧墖"
+      };
+      return typeMap[ext] || "鏂囦欢";
+    },
+
+    // 鍒ゆ柇鏂囦欢鏄惁鍙互棰勮
+    canPreview(file) {
+      if (!file.name) return false;
+      const previewableExtensions = ["pdf", "jpg", "jpeg", "png", "gif", "txt"];
+      const extension = file.name
+        .split(".")
+        .pop()
+        .toLowerCase();
+      return previewableExtensions.includes(extension);
+    },
+
+    // 鏂囦欢棰勮
+    handlePreview(file) {
+      this.currentPreviewFile = {
+        fileName: file.name,
+        fileUrl: this.getFileUrl(file),
+        fileType: this.getFileType(file.name)
+      };
+      this.previewVisible = true;
+    },
+    // 闄勪欢杞崲涓轰笂浼犳枃浠跺垪琛�
+    parseAttachmentToFileList(attachments) {
+      if (!attachments || !Array.isArray(attachments)) return [];
+      return attachments.map((item, index) => ({
+        uid: item.id || `attachment-${index}-${Date.now()}`,
+        name: item.name || item.fileName,
+        url: item.url || item.path || item.fileUrl,
+        size: item.size,
+        status: "success"
+      }));
+    },
     // 鑾峰彇鏂囦欢鍥炬爣
     getFileIcon(fileName) {
       if (!fileName) return "el-icon-document";
@@ -917,9 +1274,9 @@
       }
     },
 
-    // 鏍煎紡鍖栨枃浠跺ぇ灏�
+    // 鏂囦欢澶у皬鏍煎紡鍖�
     formatFileSize(bytes) {
-      if (!bytes) 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));
@@ -950,7 +1307,20 @@
       try {
         const response = await meetingInfo(id);
         if (response.code === 200) {
-          this.currentRecord = response.data || {};
+          const data = response.data || {};
+          // 瑙f瀽闄勪欢
+          if (data.attachment && typeof data.attachment === "string") {
+            data.attachment = this.parseAttachments(data.attachment);
+          }
+          if (
+            data.recordattachment &&
+            typeof data.recordattachment === "string"
+          ) {
+            data.recordattachment = this.parseAttachments(
+              data.recordattachment
+            );
+          }
+          this.currentRecord = data;
           this.detailDialogVisible = true;
         } else {
           this.$message.error(response.msg || "鑾峰彇璇︽儏澶辫触");
@@ -965,6 +1335,8 @@
     handleAdd() {
       this.isEditing = false;
       this.editForm = this.getDefaultFormData();
+      this.attachmentFileList = [];
+      this.minutesAttachmentFileList = [];
       this.editDialogVisible = true;
       this.$nextTick(() => {
         this.$refs.editForm && this.$refs.editForm.clearValidate();
@@ -977,21 +1349,26 @@
         const response = await meetingInfo(id);
         if (response.code === 200) {
           this.isEditing = true;
-          this.currentRecord = response.data || {};
-          this.editForm = { ...response.data };
+          const data = response.data || {};
 
           // 瑙f瀽闄勪欢
-          if (this.editForm.attachment) {
-            this.editForm.attachmentFiles = this.parseAttachments(
-              this.editForm.attachment
+          if (data.attachment) {
+            data.attachment = this.parseAttachments(data.attachment);
+            this.attachmentFileList = this.parseAttachmentToFileList(
+              data.attachment
             );
           }
-          if (this.editForm.recordattachment) {
-            this.editForm.recordattachmentFiles = this.parseAttachments(
-              this.editForm.recordattachment
+          if (data.recordattachment) {
+            data.recordattachment = this.parseAttachments(
+              data.recordattachment
+            );
+            this.minutesAttachmentFileList = this.parseAttachmentToFileList(
+              data.recordattachment
             );
           }
 
+          this.currentRecord = data;
+          this.editForm = { ...data };
           this.editDialogVisible = true;
           this.detailDialogVisible = false;
           this.$nextTick(() => {
@@ -1070,33 +1447,156 @@
       }
     },
 
-    // 鏂囦欢涓婁紶澶勭悊
-    handleAttachmentChange(file, fileList) {
-      this.editForm.attachmentFiles = fileList;
+    // 闄勪欢鍙樺寲澶勭悊
+    handleAttachmentChange(fileList) {
+      this.attachmentFileList = fileList;
     },
 
-    handleMinutesAttachmentChange(file, fileList) {
-      this.editForm.recordattachmentFiles = fileList;
+    handleMinutesAttachmentChange(fileList) {
+      this.minutesAttachmentFileList = fileList;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleAttachmentUploadSuccess({ file, fileList, response }) {
+      if (response && response.code === 200) {
+        if (!this.editForm.attachment) {
+          this.editForm.attachment = [];
+        }
+
+        console.log(file, "file");
+        console.log(response, "response");
+
+        const attachmentObj = {
+          name: file.name,
+          url: response.data || file.url,
+          fileName: file.name,
+          size: file.size || 0,
+          type: this.getFileExtension(file.name),
+          createTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+        };
+        console.log(this.editForm.attachment, "this.editForm.attachment");
+
+        this.editForm.attachment.push(attachmentObj);
+        console.log(this.editForm.attachment, "this.editForm.attachment");
+
+        this.$message.success("浼氳闄勪欢涓婁紶鎴愬姛");
+      }
+    },
+    handleMinutesUploadSuccess({ file, fileList, response }) {
+      if (response && response.code === 200) {
+        if (!this.editForm.recordattachment) {
+          this.editForm.recordattachment = [];
+        }
+
+        const attachmentObj = {
+          name: file.name,
+          url: response.data || file.url,
+          fileName: file.name,
+          size: file.size || 0,
+          type: this.getFileExtension(file.name),
+          createTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
+        };
+        this.editForm.recordattachment.push(attachmentObj);
+        this.$message.success("绾闄勪欢涓婁紶鎴愬姛");
+      }
+    },
+    // 闄勪欢涓婁紶閿欒澶勭悊
+    handleAttachmentUploadError({ file, fileList, error }) {
+      console.error("浼氳闄勪欢涓婁紶澶辫触:", error);
+      this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
     },
 
-    // 鍒犻櫎宸蹭笂浼犵殑鏂囦欢
-    handleRemoveAttachmentFile(index) {
-      this.editForm.attachmentFiles.splice(index, 1);
+    handleMinutesUploadError({ file, fileList, error }) {
+      console.error("绾闄勪欢涓婁紶澶辫触:", error);
+      this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+    },
+    // 闄勪欢绉婚櫎澶勭悊
+    handleAttachmentRemove(file) {
+      if (file.url && this.editForm.attachment) {
+        const index = this.editForm.attachment.findIndex(
+          item =>
+            item.url === file.url ||
+            item.path === file.url ||
+            item.fileUrl === file.url
+        );
+        if (index > -1) {
+          this.editForm.attachment.splice(index, 1);
+        }
+      }
     },
 
+    handleMinutesAttachmentRemove(file) {
+      if (file.url && this.editForm.recordattachment) {
+        const index = this.editForm.recordattachment.findIndex(
+          item =>
+            item.url === file.url ||
+            item.path === file.url ||
+            item.fileUrl === file.url
+        );
+        if (index > -1) {
+          this.editForm.recordattachment.splice(index, 1);
+        }
+      }
+    },
+    // 鎵嬪姩鍒犻櫎闄勪欢
+    handleRemoveMeetingAttachment(index) {
+      if (this.editForm.attachment && this.editForm.attachment[index]) {
+        this.editForm.attachment.splice(index, 1);
+        this.attachmentFileList.splice(index, 1);
+        this.$message.success("浼氳闄勪欢鍒犻櫎鎴愬姛");
+      }
+    },
+
+    handleRemoveMinutesAttachment(index) {
+      if (
+        this.editForm.recordattachment &&
+        this.editForm.recordattachment[index]
+      ) {
+        this.editForm.recordattachment.splice(index, 1);
+        this.minutesAttachmentFileList.splice(index, 1);
+        this.$message.success("绾闄勪欢鍒犻櫎鎴愬姛");
+      }
+    },
+    // 鏂囦欢棰勮
+    handlePreviewAttachment(file) {
+      this.currentPreviewFile = {
+        fileName: file.name || file.fileName,
+        fileUrl: file.url || file.path || file.fileUrl,
+        fileType: this.getFileType(file.name)
+      };
+      this.previewVisible = true;
+    },
+
+    handlePreviewMinutesAttachment(file) {
+      this.currentPreviewFile = {
+        fileName: file.name || file.fileName,
+        fileUrl: file.url || file.path || file.fileUrl,
+        fileType: this.getFileType(file.name)
+      };
+      this.previewVisible = true;
+    },
     // 鏂囦欢涓嬭浇
     handleDownload(file) {
       if (file.url) {
         const link = document.createElement("a");
         link.href = file.url;
-        link.download = file.name;
+        link.download = file.name || file.fileName || "download";
+        link.style.display = "none";
+        document.body.appendChild(link);
         link.click();
-        this.$message.success(`寮�濮嬩笅杞�: ${file.name}`);
+        document.body.removeChild(link);
+        this.$message.success("寮�濮嬩笅杞芥枃浠�");
       } else {
-        this.$message.warning("鏂囦欢鍦板潃涓嶅瓨鍦�");
+        this.$message.warning("鏂囦欢鍦板潃涓嶅瓨鍦紝鏃犳硶涓嬭浇");
       }
     },
-
+    // 鑾峰彇鏂囦欢鎵╁睍鍚�
+    getFileExtension(filename) {
+      if (!filename) return "";
+      return filename
+        .split(".")
+        .pop()
+        .toLowerCase();
+    },
     // 淇濆瓨璁板綍
     async handleSave() {
       try {
@@ -1113,34 +1613,55 @@
           }
         }
 
+        // 妫�鏌ユ槸鍚︽湁鏈笂浼犲畬鎴愮殑鏂囦欢
+        const pendingFiles = [
+          ...this.attachmentFileList.filter(item => item.status !== "success"),
+          ...this.minutesAttachmentFileList.filter(
+            item => item.status !== "success"
+          )
+        ];
+
+        if (pendingFiles.length > 0) {
+          this.$message.warning(
+            "杩樻湁鏂囦欢鏈笂浼犲畬鎴愶紝璇峰厛涓婁紶鎵�鏈夋枃浠舵垨绉婚櫎鏈笂浼犵殑鏂囦欢"
+          );
+          return;
+        }
+
         this.saveLoading = true;
 
-        // 澶勭悊闄勪欢
+        // 鍑嗗鏁版嵁
         const formData = { ...this.editForm };
 
-        if (formData.attachmentFiles) {
+        // 澶勭悊闄勪欢涓篔SON瀛楃涓�
+        if (formData.attachment && Array.isArray(formData.attachment)) {
           formData.attachment = JSON.stringify(
-            formData.attachmentFiles.map(file => ({
-              name: file.name,
-              url: file.url || "",
-              size: file.size || 0,
-              type: file.type || file.name.split(".").pop()
+            formData.attachment.map(item => ({
+              name: item.name || item.fileName,
+              url: item.url || item.path || item.fileUrl,
+              size: item.size || 0,
+              type:
+                item.type || this.getFileExtension(item.name || item.fileName)
             }))
           );
         }
 
-        if (formData.recordattachmentFiles) {
+        if (
+          formData.recordattachment &&
+          Array.isArray(formData.recordattachment)
+        ) {
           formData.recordattachment = JSON.stringify(
-            formData.recordattachmentFiles.map(file => ({
-              name: file.name,
-              url: file.url || "",
-              size: file.size || 0,
-              type: file.type || file.name.split(".").pop()
+            formData.recordattachment.map(item => ({
+              name: item.name || item.fileName,
+              url: item.url || item.path || item.fileUrl,
+              size: item.size || 0,
+              type:
+                item.type || this.getFileExtension(item.name || item.fileName)
             }))
           );
         }
 
-        // 娓呯悊鏂囦欢鍒楄〃瀛楁
+        // 娓呯悊涓存椂瀛楁
         delete formData.attachmentFiles;
         delete formData.recordattachmentFiles;
 
@@ -1179,6 +1700,8 @@
       this.editDialogVisible = false;
       this.currentRecord = {};
       this.editForm = this.getDefaultFormData();
+      this.attachmentFileList = [];
+      this.minutesAttachmentFileList = [];
       this.$nextTick(() => {
         this.$refs.editForm && this.$refs.editForm.clearValidate();
       });
@@ -1216,7 +1739,7 @@
       console.log("鎺掑簭鍙樺寲:", sort);
     },
 
-    // 鑾峰彇榛樿琛ㄥ崟鏁版嵁
+    // 榛樿琛ㄥ崟鏁版嵁
     getDefaultFormData() {
       return {
         id: null,
@@ -1227,19 +1750,14 @@
         endTime: "",
         summary: "",
         content: "",
-        attachment: null,
-        attachmentFiles: [],
-        status: 1, // 榛樿寰呭紑濮�
-        isRecurring: 0,
-        recurringPattern: null,
-        parentMeetingId: null,
-        reminderMinutes: 30,
+        attachment: [], // 鏀逛负鏁扮粍
         recordcontent: "",
-        recordattachment: null,
-        recordattachmentFiles: [],
+        recordattachment: [], // 鏀逛负鏁扮粍
         recorderBy: "",
         remark: "",
-        approvalStatus: 0 // 榛樿寰呭鏍�
+        status: 1,
+        reminderMinutes: 30,
+        approvalStatus: 0
       };
     }
   }
@@ -1247,6 +1765,170 @@
 </script>
 
 <style scoped>
+.meeting-management {
+  padding: 20px;
+}
+
+.attachment-section {
+  margin-bottom: 16px;
+}
+
+.attachment-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16px;
+  padding: 8px 0;
+  border-bottom: 1px solid #ebeef5;
+}
+
+.attachment-title {
+  font-weight: bold;
+  margin: 0 8px;
+}
+
+.attachment-tip {
+  font-size: 12px;
+  color: #909399;
+}
+
+.attachment-list {
+  margin-top: 16px;
+}
+
+.list-title {
+  font-weight: bold;
+  margin-bottom: 12px;
+  color: #303133;
+}
+/* 鍥剧墖闄勪欢鏍峰紡 */
+.image-attachment {
+  border-radius: 4px;
+  border: 1px solid #ebeef5;
+  cursor: pointer;
+  transition: all 0.3s;
+  margin-bottom: 8px;
+}
+
+.image-attachment:hover {
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+  transform: translateY(-2px);
+}
+
+.image-info {
+  text-align: center;
+  padding: 4px 0;
+}
+
+.image-info .file-name {
+  font-size: 12px;
+  color: #606266;
+  margin-bottom: 4px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 100px;
+}
+
+.image-info .file-actions {
+  display: flex;
+  justify-content: center;
+  gap: 8px;
+}
+
+.image-loading,
+.image-error {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  height: 100%;
+  color: #909399;
+  font-size: 12px;
+}
+
+.image-loading i,
+.image-error i {
+  font-size: 20px;
+  margin-bottom: 4px;
+}
+
+/* 鏂囦欢鍗$墖鏍峰紡 */
+.file-card {
+  width: 100%;
+  min-height: 60px;
+  margin-bottom: 8px;
+}
+
+.file-content {
+  display: flex;
+  align-items: center;
+}
+
+.file-icon {
+  font-size: 24px;
+  margin-right: 12px;
+  color: #409eff;
+  flex-shrink: 0;
+}
+
+.file-info {
+  flex: 1;
+  min-width: 0;
+}
+
+.file-name {
+  font-size: 13px;
+  font-weight: 500;
+  margin-bottom: 4px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.file-meta {
+  display: flex;
+  justify-content: space-between;
+  font-size: 12px;
+  color: #909399;
+}
+
+.file-actions {
+  margin-top: 8px;
+  text-align: right;
+}
+
+/* 闄勪欢缃戞牸甯冨眬 */
+.attachment-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
+  gap: 16px;
+}
+
+.attachment-card {
+  display: flex;
+  flex-direction: column;
+}
+
+/* 鍝嶅簲寮忚皟鏁� */
+@media (max-width: 768px) {
+  .attachment-grid {
+    grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
+    gap: 12px;
+  }
+
+  .image-attachment {
+    width: 80px !important;
+    height: 80px !important;
+  }
+}
+.file-name {
+  font-size: 13px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+/* 鍏朵粬鏍峰紡淇濇寔涓嶅彉 */
 .meeting-management {
   padding: 20px;
 }
@@ -1276,6 +1958,7 @@
 .attachment-item {
   margin-bottom: 8px;
 }
+
 .minutes-content {
   margin-bottom: 16px;
 }
@@ -1291,6 +1974,7 @@
     margin: 0 -20px;
   }
 }
+
 /* 鍝嶅簲寮忚璁� */
 @media (max-width: 768px) {
   .page-header {
@@ -1304,6 +1988,7 @@
     justify-content: space-between;
   }
 }
+
 /* 鏂板闄勪欢鐩稿叧鏍峰紡 */
 .attachment-upload-section {
   border: 1px solid #ebeef5;
diff --git a/src/views/business/appear/caseDetail.vue b/src/views/business/appear/caseDetail.vue
index 2c9d4b5..362085c 100644
--- a/src/views/business/appear/caseDetail.vue
+++ b/src/views/business/appear/caseDetail.vue
@@ -13,10 +13,7 @@
           caseData.name || "-"
         }}</el-descriptions-item>
         <el-descriptions-item label="鎬у埆">
-          <dict-tag
-            :options="dict.type.sys_user_sex"
-            :value="caseData.sex ? parseInt(caseData.sex) : ''"
-          />
+          <dict-tag :options="dict.type.sys_user_sex" :value="caseData.sex" />
         </el-descriptions-item>
         <el-descriptions-item label="骞撮緞">
           {{ caseData.age || "-"
@@ -130,6 +127,12 @@
         <el-descriptions-item label="閮ㄩ棬鍚嶇О">{{
           caseData.deptName || "-"
         }}</el-descriptions-item>
+        <el-descriptions-item label="閮ㄩ棬缂栧彿">{{
+          caseData.deptNo || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="涓婃姤鍖婚櫌">{{
+          caseData.toHospital || "-"
+        }}</el-descriptions-item>
       </el-descriptions>
     </el-card>
 
@@ -160,7 +163,7 @@
           </el-tag>
         </el-descriptions-item>
         <el-descriptions-item label="鎶ュ憡鏃堕棿">{{
-          formatDateTime(caseData.reporttime)
+          formatDateTime(caseData.createTime)
         }}</el-descriptions-item>
         <el-descriptions-item label="鏄惁缁堟妗堜緥">
           {{ caseData.terminationCase === "1" ? "宸茬粓姝�" : "杩涜涓�" }}
@@ -169,46 +172,112 @@
     </el-card>
 
     <!-- 闄勪欢淇℃伅妯″潡 -->
-    <el-card class="detail-section" v-if="attachmentList.length > 0">
+    <el-card
+      class="detail-section"
+      v-if="caseData.annexfilesList && caseData.annexfilesList.length > 0"
+    >
       <div slot="header" class="section-header">
         <span class="section-title">闄勪欢淇℃伅</span>
       </div>
-      <el-table :data="attachmentList" style="width: 100%">
-        <el-table-column label="鏂囦欢鍚�" width="300">
-          <template slot-scope="scope">
-            <i class="el-icon-document" style="margin-right: 8px;"></i>
-            <span>{{ scope.row.fileName }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="鏂囦欢绫诲瀷" width="120">
-          <template slot-scope="scope">
-            <el-tag size="small">{{ scope.row.fileType }}</el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column label="澶у皬" width="100">
-          <template slot-scope="scope">
-            <span>{{ formatFileSize(scope.row.fileSize) }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="涓婁紶鏃堕棿" width="180">
-          <template slot-scope="scope">
-            <span>{{ scope.row.uploadTime }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="鎿嶄綔">
-          <template slot-scope="scope">
-            <el-button size="mini" @click="handlePreview(scope.row)"
-              >棰勮</el-button
-            >
-            <el-button
-              size="mini"
-              type="success"
-              @click="handleDownload(scope.row)"
-              >涓嬭浇</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
+      <div class="detail-attachments">
+        <div class="attachment-grid">
+          <div
+            v-for="file in caseData.annexfilesList"
+            :key="file.id || file.fileName"
+            class="attachment-card"
+          >
+            <template v-if="isImageFile(file.fileName || file.path)">
+              <!-- 鍥剧墖浣跨敤 el-image 棰勮 -->
+              <el-image
+                class="image-attachment"
+                :src="getFileUrl(file)"
+                :preview-src-list="getImagePreviewList(file)"
+                fit="cover"
+                :style="{ width: '120px', height: '120px' }"
+                lazy
+              >
+                <div slot="error" class="image-error">
+                  <i class="el-icon-picture-outline"></i>
+                  <span>鍔犺浇澶辫触</span>
+                </div>
+                <div slot="placeholder" class="image-loading">
+                  <i class="el-icon-loading"></i>
+                </div>
+              </el-image>
+              <div class="image-info">
+                <div class="file-name" :title="file.fileName">
+                  {{ file.fileName }}
+                </div>
+                <div class="file-actions">
+                  <el-button
+                    type="text"
+                    size="mini"
+                    @click="handleDownload(file)"
+                    icon="el-icon-download"
+                    title="涓嬭浇"
+                  />
+                  <el-button
+                    type="text"
+                    size="mini"
+                    @click="handlePreview(file)"
+                    icon="el-icon-view"
+                    title="棰勮"
+                  />
+                </div>
+              </div>
+            </template>
+
+            <template v-else>
+              <!-- 闈炲浘鐗囨枃浠朵娇鐢ㄥ崱鐗囨牱寮� -->
+              <el-card shadow="hover" class="file-card">
+                <div class="file-content">
+                  <i :class="getFileIcon(file.fileName)" class="file-icon"></i>
+                  <div class="file-info">
+                    <div class="file-name" :title="file.fileName">
+                      {{ file.fileName }}
+                    </div>
+                    <div class="file-meta">
+                      <span class="file-type">{{
+                        getFileTypeText(file.fileName)
+                      }}</span>
+                      <span v-if="file.createTime" class="file-time">
+                        {{ formatDateTime(file.createTime) }}
+                      </span>
+                    </div>
+                  </div>
+                </div>
+                <div class="file-actions">
+                  <el-button
+                    type="text"
+                    size="mini"
+                    @click="handleDownload(file)"
+                  >
+                    涓嬭浇
+                  </el-button>
+                  <el-button
+                    v-if="canPreview(file.fileName)"
+                    type="text"
+                    size="mini"
+                    @click="handlePreview(file)"
+                  >
+                    棰勮
+                  </el-button>
+                </div>
+              </el-card>
+            </template>
+          </div>
+        </div>
+      </div>
+    </el-card>
+
+    <!-- 澶囨敞淇℃伅 -->
+    <el-card class="detail-section" v-if="caseData.remark">
+      <div slot="header" class="section-header">
+        <span class="section-title">澶囨敞淇℃伅</span>
+      </div>
+      <div class="remark-content">
+        {{ caseData.remark }}
+      </div>
     </el-card>
 
     <!-- 瀹℃壒淇℃伅妯″潡锛堢姸鎬佷负宸插悓鎰忔垨宸查┏鍥炴椂鏄剧ず锛� -->
@@ -225,133 +294,108 @@
             {{ caseData.reportStatus === "3" ? "宸插悓鎰�" : "宸查┏鍥�" }}
           </el-tag>
         </el-descriptions-item>
-        <el-descriptions-item label="瀹℃壒鏃堕棿">{{
-          formatDateTime(caseData.updateTime)
-        }}</el-descriptions-item>
         <el-descriptions-item label="瀹℃壒浜�">{{
           caseData.updateBy || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="瀹℃壒鏃堕棿">{{
+          formatDateTime(caseData.updateTime)
         }}</el-descriptions-item>
         <el-descriptions-item label="瀹℃壒鎰忚">{{
           caseData.remark || "鏃�"
         }}</el-descriptions-item>
       </el-descriptions>
     </el-card>
-
-    <!-- PDF棰勮寮圭獥 -->
-    <el-dialog
-      :title="previewTitle"
-      :append-to-body="true"
-      :visible.sync="pdfPreviewVisible"
-      width="90%"
-      top="5vh"
-      :close-on-click-modal="true"
-      class="pdf-preview-dialog"
-      @close="handlePdfDialogClose"
+    <el-card
+      class="detail-section"
+      v-if="
+        caseData.isTransport == '2' &&
+          caseData.serviceTransport &&
+          caseData.serviceTransport.length > 0
+      "
     >
-      <div class="pdf-preview-container" v-loading="pdfLoading">
-        <!-- PDF鎺у埗宸ュ叿鏍� -->
-        <div class="pdf-toolbar">
-          <el-button-group>
-            <el-button
-              size="mini"
-              @click="changePage(currentPage - 1)"
-              :disabled="currentPage <= 1"
-              icon="el-icon-arrow-left"
-            >
-              涓婁竴椤�
-            </el-button>
-            <el-button size="mini" disabled>
-              绗� {{ currentPage }} 椤� / 鍏� {{ pageCount }} 椤�
-            </el-button>
-            <el-button
-              size="mini"
-              @click="changePage(currentPage + 1)"
-              :disabled="currentPage >= pageCount"
-              icon="el-icon-arrow-right"
-            >
-              涓嬩竴椤�
-            </el-button>
-          </el-button-group>
-
-          <el-button-group class="zoom-controls">
-            <el-button size="mini" @click="zoomOut" :disabled="scale <= 50">
-              <i class="el-icon-zoom-out"></i> 缂╁皬
-            </el-button>
-            <el-button size="mini" disabled> {{ scale }}% </el-button>
-            <el-button size="mini" @click="zoomIn" :disabled="scale >= 200">
-              <i class="el-icon-zoom-in"></i> 鏀惧ぇ
-            </el-button>
-            <el-button size="mini" @click="resetZoom">
-              <i class="el-icon-refresh-left"></i> 閲嶇疆
-            </el-button>
-          </el-button-group>
-
-          <el-button
-            size="mini"
-            type="success"
-            @click="downloadPdf(currentFile)"
-            icon="el-icon-download"
-          >
-            涓嬭浇
-          </el-button>
-        </div>
-
-        <!-- PDF娓叉煋鍖哄煙 -->
-        <div class="pdf-viewport">
-          <pdf
-            ref="pdf"
-            :src="pdfUrl"
-            :page="currentPage"
-            :rotate="pageRotate"
-            @num-pages="pageCount = $event"
-            @page-loaded="currentPage = $event"
-            @loaded="loadPdfHandler"
-            @error="pdfErrorHandler"
-            :style="{
-              width: scale + '%',
-              transform: 'scale(' + scale / 100 + ')',
-              transformOrigin: '0 0'
-            }"
-          ></pdf>
-        </div>
+      <div slot="header" class="section-header">
+        <span class="section-title">杞繍淇℃伅</span>
+        <el-button
+          v-if="caseData.reportStatus === '3'"
+          type="primary"
+          size="small"
+          icon="el-icon-truck"
+          @click="handleViewTransport"
+        >
+          鏌ョ湅杞繍璇︽儏
+        </el-button>
       </div>
-    </el-dialog>
 
-    <!-- 鍥剧墖棰勮寮圭獥 -->
-    <el-dialog
-      :append-to-body="true"
-      :title="previewTitle"
-      :visible.sync="imagePreviewVisible"
-      width="60%"
-      top="10vh"
-      :close-on-click-modal="true"
+      <el-descriptions :column="2" border>
+        <el-descriptions-item
+          v-for="transport in caseData.serviceTransport"
+          :key="transport.id"
+        >
+          <!-- 杞繍鍗曞垪琛� -->
+          <div class="transport-info">
+            <div class="transport-item">
+              <strong>杞繍鍗曞彿:</strong> {{ transport.reportId || "-" }}
+            </div>
+            <div class="transport-item">
+              <strong>鎮h�呭鍚�:</strong> {{ transport.patName || "-" }}
+            </div>
+            <div class="transport-item">
+              <strong>鍑哄彂鍦扮偣:</strong>
+              {{ transport.transportStartPlace || "-" }}
+            </div>
+            <div class="transport-item">
+              <strong>鍑哄彂鏃堕棿:</strong>
+              {{ formatDateTime(transport.transportStartTime) }}
+            </div>
+            <div class="transport-item">
+              <strong>杞繍鐘舵��:</strong>
+              <el-tag :type="getTransportStatusTag(transport)" size="small">
+                {{ getTransportStatusText(transport) }}
+              </el-tag>
+            </div>
+            <div class="transport-item">
+              <strong>璐熻矗鍗忚皟鍛�:</strong> {{ transport.contactPerson || "-" }}
+            </div>
+            <div class="transport-item" v-if="transport.remark">
+              <strong>澶囨敞:</strong> {{ transport.remark }}
+            </div>
+          </div>
+        </el-descriptions-item>
+      </el-descriptions>
+    </el-card>
+
+    <!-- 鏃犺浆杩愪俊鎭絾闇�瑕佽浆杩愮殑鎻愮ず -->
+    <el-card
+      class="detail-section"
+      v-else-if="caseData.isTransport === '2' && caseData.reportStatus === '3'"
     >
-      <div class="image-preview-container">
-        <img :src="previewUrl" alt="棰勮鍥剧墖" class="preview-image" />
+      <div slot="header" class="section-header">
+        <span class="section-title">杞繍淇℃伅</span>
+        <el-button
+          type="primary"
+          size="small"
+          icon="el-icon-truck"
+          @click="handleCreateTransport"
+        >
+          鍒涘缓杞繍鍗�
+        </el-button>
       </div>
-    </el-dialog>
 
-    <!-- 涓嶆敮鎸侀瑙堢殑鏂囦欢绫诲瀷 -->
-    <el-dialog
-      :title="previewTitle"
-      :visible.sync="unsupportedPreviewVisible"
-      width="400px"
-      :close-on-click-modal="true"
-    >
-      <div class="unsupported-preview">
-        <el-alert
-          title="璇ユ枃浠舵牸寮忎笉鏀寔鍦ㄧ嚎棰勮锛岃涓嬭浇鍚庢煡鐪�"
-          type="warning"
-          show-icon
-          :closable="false"
-        />
-        <div style="text-align: center; margin-top: 20px;">
-          <el-button type="primary" @click="handleDownload(currentFile)">
-            <i class="el-icon-download"></i> 涓嬭浇鏂囦欢
-          </el-button>
-        </div>
-      </div>
-    </el-dialog>
+      <el-alert
+        title="璇ユ渚嬮渶瑕佽浆杩愶紝浣嗗皻鏈垱寤鸿浆杩愬崟"
+        type="warning"
+        description="璇风偣鍑讳笂鏂规寜閽垱寤鸿浆杩愬崟"
+        show-icon
+        :closable="false"
+      />
+    </el-card>
+    <!-- 鏂囦欢棰勮寮圭獥 -->
+    <FilePreviewDialog
+      :visible="previewVisible"
+      :file="currentPreviewFile"
+      @close="previewVisible = false"
+      @download="handleDownload"
+    />
 
     <div class="detail-footer" v-if="showtitle">
       <el-button @click="handleClose">鍏抽棴</el-button>
@@ -361,11 +405,13 @@
 
 <script>
 import pdf from "vue-pdf";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
 
 export default {
   name: "CaseDetail",
   components: {
-    pdf
+    pdf,
+    FilePreviewDialog
   },
   props: {
     caseData: {
@@ -378,52 +424,29 @@
     }
   },
   dicts: ["sys_user_sex", "sys_BloodType"],
-  filters: {
-    statusFilter(status) {
-      const statusMap = {
-        "0": "warning",
-        "1": "success",
-        "2": "danger"
-      };
-      return statusMap[status];
-    },
-    statusTextFilter(status) {
-      const statusMap = {
-        "0": "寰呭鎵�",
-        "1": "宸查�氳繃",
-        "2": "宸查┏鍥�"
-      };
-      return statusMap[status];
-    }
-  },
   data() {
     return {
-      // 棰勮鐩稿叧鏁版嵁锛堜繚鎸佸師鏈変唬鐮侊級
-      pdfPreviewVisible: false,
-      imagePreviewVisible: false,
-      unsupportedPreviewVisible: false,
-      pdfLoading: false,
-      pdfUrl: "",
-      currentPage: 1,
-      pageCount: 0,
-      scale: 100,
-      pageRotate: 0,
-      previewTitle: "",
-      previewUrl: "",
-      currentFile: null,
+      // 棰勮鐩稿叧
+      previewVisible: false,
+      currentPreviewFile: null,
 
-      // 闄勪欢鍒楄〃
-      attachmentList: []
+      // 鍥剧墖棰勮鐩稿叧
+      imagePreviewUrls: []
     };
   },
-  watch: {
-    caseData: {
-      immediate: true,
-      handler(newVal) {
-        if (newVal && newVal.annexfilesList) {
-          this.loadAttachments(newVal.annexfilesList);
-        }
+  computed: {
+    // 鏀堕泦鎵�鏈夊浘鐗嘦RL鐢ㄤ簬棰勮
+    allImageUrls() {
+      if (
+        !this.caseData.annexfilesList ||
+        !Array.isArray(this.caseData.annexfilesList)
+      ) {
+        return [];
       }
+      return this.caseData.annexfilesList
+        .filter(file => this.isImageFile(file.fileName || file.path))
+        .map(file => this.getFileUrl(file))
+        .filter(url => url);
     }
   },
   methods: {
@@ -431,37 +454,10 @@
       this.$emit("close");
     },
 
-    // 鍔犺浇闄勪欢
-    loadAttachments(annexfilesList) {
-      if (!annexfilesList || !Array.isArray(annexfilesList)) {
-        this.attachmentList = [];
-        return;
-      }
-
-      this.attachmentList = annexfilesList.map((file, index) => ({
-        id: index + 1,
-        fileName: file.fileName || `闄勪欢${index + 1}`,
-        fileType: this.getFileExtension(file.fileUrl || ""),
-        fileSize: file.fileSize || 0,
-        uploadTime: file.uploadTime || this.formatDateTime(new Date()),
-        fileUrl: file.fileUrl || ""
-      }));
-    },
-
-    // 鑾峰彇鏂囦欢鎵╁睍鍚�
-    getFileExtension(filename) {
-      return (
-        filename
-          .split(".")
-          .pop()
-          ?.toLowerCase() || "unknown"
-      );
-    },
-
     // 鏍煎紡鍖栨棩鏈熸椂闂�
-    formatDateTime(dateString) {
-      if (!dateString) return "-";
-      return dateString.replace("T", " ").substring(0, 19);
+    formatDateTime(dateTime) {
+      if (!dateTime) return "-";
+      return dateTime.replace("T", " ").substring(0, 19);
     },
 
     // 鏍煎紡鍖栨棩鏈�
@@ -469,7 +465,75 @@
       if (!dateString) return "-";
       return dateString.split("T")[0];
     },
+    getTransportStatusTag(transport) {
+      if (!transport.transitStatus) return "info";
+      switch (transport.transitStatus.toString()) {
+        case "1":
+          return "warning"; // 寰呰浆杩�
+        case "2":
+          return "primary"; // 杞繍涓�
+        case "3":
+          return "success"; // 杞繍瀹屾垚
+        case "4":
+          return "danger"; // 杞繍鍙栨秷
+        case "5":
+          return "info"; // 鏆傚瓨
+        default:
+          return "info";
+      }
+    },
 
+    /** 鑾峰彇杞繍鐘舵�佹枃鏈� */
+    getTransportStatusText(transport) {
+      if (!transport.transitStatus) return "鏈煡";
+      switch (transport.transitStatus.toString()) {
+        case "1":
+          return "寰呰浆杩�";
+        case "2":
+          return "杞繍涓�";
+        case "3":
+          return "杞繍瀹屾垚";
+        case "4":
+          return "杞繍鍙栨秷";
+        case "5":
+          return "鏆傚瓨";
+        default:
+          return "鏈煡";
+      }
+    },
+
+    /** 鏌ョ湅杞繍璇︽儏 */
+    handleViewTransport() {
+      if (
+        this.caseData.serviceTransport &&
+        this.caseData.serviceTransport.length > 0
+      ) {
+        const transport = this.caseData.serviceTransport[0];
+        this.$router.push({
+          path: "/business/transport/detail",
+          query: {
+            id: transport.id,
+            caseNo: this.caseData.caseNo
+          }
+        });
+      }
+    },
+
+    /** 鍒涘缓杞繍鍗� */
+    handleCreateTransport() {
+      this.$router.push({
+        path: "/business/transport/create",
+        query: {
+          caseId: this.caseData.id,
+          caseNo: this.caseData.caseNo,
+          patName: this.caseData.name,
+          age: this.caseData.age,
+          sex: this.caseData.sex,
+          diagnosisname: this.caseData.diagnosisname,
+          treatmentHospitalName: this.caseData.treatmenthospitalname
+        }
+      });
+    },
     // 鑾峰彇瀹屾暣鎴风睄鍦板潃
     getFullRegisterAddress() {
       const {
@@ -550,113 +614,127 @@
       return typeMap[type] || type || "-";
     },
 
-    // 鏂囦欢棰勮鐩稿叧鏂规硶锛堜繚鎸佸師鏈変唬鐮侊級
+    // 鏂囦欢澶勭悊鐩稿叧鏂规硶
+    isImageFile(fileName) {
+      if (!fileName) return false;
+      const imageExtensions = [
+        "jpg",
+        "jpeg",
+        "png",
+        "gif",
+        "bmp",
+        "webp",
+        "svg"
+      ];
+      const extension = fileName
+        .split(".")
+        .pop()
+        .toLowerCase();
+      return imageExtensions.includes(extension);
+    },
+
+    getFileUrl(file) {
+      return file.path || file.fileUrl || "";
+    },
+
+    getImagePreviewList(file) {
+      // 杩斿洖鎵�鏈夊浘鐗囩殑URL鍒楄〃锛屽疄鐜扮偣鍑讳换鎰忓浘鐗囨煡鐪嬫墍鏈夊浘鐗�
+      return this.allImageUrls;
+    },
+
+    getFileIcon(fileName) {
+      if (!fileName) return "el-icon-document";
+      const ext = fileName
+        .split(".")
+        .pop()
+        .toLowerCase();
+      const iconMap = {
+        pdf: "el-icon-document",
+        doc: "el-icon-document",
+        docx: "el-icon-document",
+        xls: "el-icon-document",
+        xlsx: "el-icon-document",
+        jpg: "el-icon-picture",
+        jpeg: "el-icon-picture",
+        png: "el-icon-picture",
+        gif: "el-icon-picture"
+      };
+      return iconMap[ext] || "el-icon-document";
+    },
+
+    getFileTypeText(fileName) {
+      if (!fileName) return "鏂囦欢";
+      const ext = fileName
+        .split(".")
+        .pop()
+        .toLowerCase();
+      const typeMap = {
+        pdf: "PDF鏂囨。",
+        doc: "Word鏂囨。",
+        docx: "Word鏂囨。",
+        xls: "Excel琛ㄦ牸",
+        xlsx: "Excel琛ㄦ牸",
+        jpg: "鍥剧墖",
+        jpeg: "鍥剧墖",
+        png: "鍥剧墖",
+        gif: "鍥剧墖"
+      };
+      return typeMap[ext] || "鏂囦欢";
+    },
+
+    canPreview(fileName) {
+      if (!fileName) return false;
+      const previewableExtensions = ["pdf", "jpg", "jpeg", "png", "gif"];
+      const extension = fileName
+        .split(".")
+        .pop()
+        .toLowerCase();
+      return previewableExtensions.includes(extension);
+    },
+
+    // 鏂囦欢棰勮
+    handlePreview(file) {
+      this.currentPreviewFile = {
+        fileName: file.fileName,
+        fileUrl: this.getFileUrl(file),
+        fileType: this.getFileType(file.fileName)
+      };
+      this.previewVisible = true;
+    },
+
     getFileType(fileName) {
+      if (!fileName) return "other";
       const extension = fileName
         .split(".")
         .pop()
         .toLowerCase();
       const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"];
       const pdfTypes = ["pdf"];
+      const officeTypes = ["doc", "docx", "xls", "xlsx"];
+
       if (imageTypes.includes(extension)) return "image";
       if (pdfTypes.includes(extension)) return "pdf";
+      if (officeTypes.includes(extension)) return "office";
       return "other";
     },
 
-    handlePreview(file) {
-      this.currentFile = file;
-      this.previewTitle = `棰勮 - ${file.fileName}`;
-      this.previewUrl = file.fileUrl;
-      const fileType = this.getFileType(file.fileName);
-
-      switch (fileType) {
-        case "pdf":
-          this.previewPdf(file);
-          break;
-        case "image":
-          this.previewImage(file);
-          break;
-        default:
-          this.previewUnsupported(file);
-          break;
-      }
-    },
-
-    previewPdf(file) {
-      this.pdfPreviewVisible = true;
-      this.pdfLoading = true;
-      this.currentPage = 1;
-      this.scale = 100;
-      this.pageRotate = 0;
-      this.pdfUrl = file.fileUrl;
-    },
-
-    loadPdfHandler() {
-      this.pdfLoading = false;
-      this.currentPage = 1;
-    },
-
-    pdfErrorHandler(error) {
-      console.error("PDF鍔犺浇澶辫触:", error);
-      this.pdfLoading = false;
-      this.$message.error("PDF鏂囦欢鍔犺浇澶辫触锛岃灏濊瘯涓嬭浇鍚庢煡鐪�");
-      this.pdfPreviewVisible = false;
-    },
-
-    changePage(newPage) {
-      if (newPage < 1 || newPage > this.pageCount) return;
-      this.currentPage = newPage;
-    },
-
-    zoomIn() {
-      if (this.scale >= 200) return;
-      this.scale += 10;
-    },
-
-    zoomOut() {
-      if (this.scale <= 50) return;
-      this.scale -= 10;
-    },
-
-    resetZoom() {
-      this.scale = 100;
-    },
-
-    previewImage(file) {
-      this.imagePreviewVisible = true;
-    },
-
-    previewUnsupported(file) {
-      this.unsupportedPreviewVisible = true;
-    },
-
-    handlePdfDialogClose() {
-      this.pdfUrl = "";
-      this.currentPage = 1;
-      this.pageCount = 0;
-    },
-
+    // 鏂囦欢涓嬭浇
     handleDownload(file) {
-      const link = document.createElement("a");
-      link.href = file.fileUrl;
-      link.download = file.fileName;
-      link.style.display = "none";
-      document.body.appendChild(link);
-      link.click();
-      document.body.removeChild(link);
-      this.$message.success("寮�濮嬩笅杞芥枃浠�");
-    },
+      const fileUrl = this.getFileUrl(file);
+      const fileName = file.fileName;
 
-    downloadPdf(file) {
-      this.handleDownload(file);
-    },
-
-    formatFileSize(bytes) {
-      if (bytes === 0) return "0 B";
-      const k = 1024;
-      const sizes = ["B", "KB", "MB", "GB"];
-      const i = Math.floor(Math.log(bytes) / Math.log(k));
-      return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
+      if (fileUrl) {
+        const link = document.createElement("a");
+        link.href = fileUrl;
+        link.download = fileName;
+        link.style.display = "none";
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+        this.$message.success("寮�濮嬩笅杞芥枃浠�");
+      } else {
+        this.$message.warning("鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇");
+      }
     }
   }
 };
@@ -667,83 +745,144 @@
   padding: 0 20px;
 }
 
-/* PDF棰勮瀵硅瘽妗嗘牱寮� */
-.pdf-preview-dialog {
-  margin-top: 5vh !important;
+.detail-section {
+  margin-bottom: 16px;
 }
 
-.pdf-preview-dialog >>> .el-dialog {
-  min-height: 80vh;
-  display: flex;
-  flex-direction: column;
-}
-
-.pdf-preview-dialog >>> .el-dialog__body {
-  flex: 1;
-  padding: 0;
-  display: flex;
-  flex-direction: column;
-}
-
-.pdf-preview-container {
-  display: flex;
-  flex-direction: column;
-  height: 100%;
-}
-
-/* PDF宸ュ叿鏍忔牱寮� */
-.pdf-toolbar {
-  padding: 15px 20px;
-  background: #f5f7fa;
-  border-bottom: 1px solid #ebeef5;
+.section-header {
   display: flex;
   justify-content: space-between;
   align-items: center;
-  flex-wrap: wrap;
-  gap: 10px;
 }
 
-.zoom-controls {
-  margin: 0 15px;
+.section-title {
+  font-size: 16px;
+  font-weight: bold;
+  color: #303133;
 }
 
-/* PDF瑙嗗浘鍖哄煙鏍峰紡 */
-.pdf-viewport {
-  flex: 1;
-  overflow: auto;
-  padding: 20px;
-  background: #f8f9fa;
+/* 闄勪欢鏍峰紡 */
+.detail-attachments {
+  padding: 10px 0;
+}
+
+.attachment-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
+  gap: 16px;
+}
+
+.attachment-card {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+/* 鍥剧墖闄勪欢鏍峰紡 */
+.image-attachment {
+  border-radius: 4px;
+  border: 1px solid #ebeef5;
+  cursor: pointer;
+  transition: all 0.3s;
+  margin-bottom: 8px;
+}
+
+.image-attachment:hover {
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
+  transform: translateY(-2px);
+}
+
+.image-info {
+  text-align: center;
+  width: 100%;
+}
+
+.image-info .file-name {
+  font-size: 12px;
+  color: #606266;
+  margin-bottom: 4px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  max-width: 120px;
+}
+
+.image-info .file-actions {
   display: flex;
   justify-content: center;
-  align-items: flex-start;
+  gap: 8px;
 }
 
-/* 鍥剧墖棰勮鏍峰紡 */
-.image-preview-container {
+.image-loading,
+.image-error {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  height: 100%;
+  color: #909399;
+  font-size: 12px;
+}
+
+.image-loading i,
+.image-error i {
+  font-size: 20px;
+  margin-bottom: 4px;
+}
+
+/* 鏂囦欢鍗$墖鏍峰紡 */
+.file-card {
+  width: 100%;
+  min-height: 60px;
+  margin-bottom: 8px;
+}
+
+.file-content {
+  display: flex;
+  align-items: center;
+  padding: 8px;
+}
+
+.file-icon {
+  font-size: 24px;
+  margin-right: 12px;
+  color: #409eff;
+  flex-shrink: 0;
+}
+
+.file-info {
+  flex: 1;
+  min-width: 0;
+}
+
+.file-name {
+  font-size: 13px;
+  font-weight: 500;
+  margin-bottom: 4px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.file-meta {
+  display: flex;
+  justify-content: space-between;
+  font-size: 12px;
+  color: #909399;
+}
+
+.file-actions {
   text-align: center;
-  padding: 20px;
+  padding: 8px;
+  border-top: 1px solid #f0f0f0;
 }
 
-.preview-image {
-  max-width: 100%;
-  max-height: 70vh;
-  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
-  .pdf-toolbar {
-    flex-direction: column;
-    gap: 10px;
-  }
-
-  .zoom-controls {
-    margin: 10px 0;
-  }
-
-  .pdf-preview-dialog {
-    width: 95% !important;
-  }
+/* 澶囨敞鏍峰紡 */
+.remark-content {
+  padding: 12px;
+  line-height: 1.6;
+  color: #606266;
+  white-space: pre-line;
 }
 
 .detail-footer {
@@ -758,4 +897,19 @@
   background-color: #f5f7fa;
   font-weight: bold;
 }
+/* 杞繍淇℃伅鏍峰紡 */
+.transport-info {
+  padding: 10px;
+}
+
+.transport-item {
+  margin-bottom: 8px;
+  line-height: 1.6;
+}
+
+.transport-item strong {
+  display: inline-block;
+  width: 100px;
+  color: #606266;
+}
 </style>
diff --git a/src/views/business/appear/index.vue b/src/views/business/appear/index.vue
index 550ecda..4c578c3 100644
--- a/src/views/business/appear/index.vue
+++ b/src/views/business/appear/index.vue
@@ -67,6 +67,7 @@
     </el-row>
 
     <!-- 鏁版嵁琛ㄦ牸 -->
+    <!-- 鏁版嵁琛ㄦ牸 -->
     <el-table
       v-loading="loading"
       :data="caseList"
@@ -74,12 +75,18 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column
+        label="妗堜緥缂栧彿"
+        align="center"
+        prop="caseNo"
+        width="150"
+        fixed
+      />
+      <el-table-column
         label="涓婃姤鏃堕棿"
         align="center"
         prop="reporttime"
         width="160"
       />
-
       <el-table-column
         label="鎹愮尞鑰呭鍚�"
         align="center"
@@ -87,27 +94,23 @@
         width="100"
       />
       <el-table-column label="鎬у埆" align="center" prop="sex" width="80">
-        <template slot-scope="scope">
-          <dict-tag
-            :options="dict.type.sys_user_sex"
-            :value="parseInt(scope.row.sex)"
-          />
+        <template #default="scope">
+          <dict-tag :options="dict.type.sys_user_sex" :value="scope.row.sex" />
         </template>
       </el-table-column>
       <el-table-column label="骞撮緞" align="center" prop="age" width="80" />
       <el-table-column label="琛�鍨�" align="center" prop="bloodType" width="80">
-        <template slot-scope="scope">
+        <template #default="scope">
           <dict-tag
             :options="dict.type.sys_BloodType"
-            :value="scope.row.bloodtype"
+            :value="scope.row.bloodType"
           />
         </template>
       </el-table-column>
-
       <el-table-column
         label="GCS璇勫垎"
         align="center"
-        prop="gscScore"
+        prop="gcsScore"
         width="80"
         show-overflow-tooltip
       />
@@ -130,9 +133,16 @@
         prop="reportStatus"
         width="100"
       >
-        <template slot-scope="scope">
+        <template #default="scope">
           <el-tag :type="scope.row.reportStatus | statusFilter">
             {{ scope.row.reportStatus | statusTextFilter }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="杞繍鐘舵��" align="center" width="100">
+        <template #default="scope">
+          <el-tag :type="getTransportStatusTag(scope.row)">
+            {{ getTransportStatusText(scope.row) }}
           </el-tag>
         </template>
       </el-table-column>
@@ -141,9 +151,9 @@
         align="center"
         fixed="right"
         class-name="small-padding fixed-width"
-        width="200"
+        width="350"
       >
-        <template slot-scope="scope">
+        <template #default="scope">
           <el-button
             size="mini"
             type="text"
@@ -151,15 +161,37 @@
             @click="handleDetail(scope.row)"
             >璇︽儏</el-button
           >
-
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleEdit(scope.row)"
+            v-if="
+              scope.row.reportStatus !== '3' &&
+                scope.row.reportStatus !== '4' &&
+                scope.row.delFlag === 0
+            "
+            >缂栬緫</el-button
+          >
           <el-button
             size="mini"
             type="text"
             icon="el-icon-check"
             @click="handleApprove(scope.row)"
-            v-if="scope.row.reportStatus === '2'"
+            v-if="scope.row.reportStatus === '2' && scope.row.delFlag === 0"
             >瀹℃壒</el-button
           >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-truck"
+            :type="shouldShowTransportButton(scope.row) ? 'primary' : 'text'"
+            @click="handleTransport(scope.row)"
+            v-if="shouldShowTransportButton(scope.row)"
+            :disabled="!canGoToTransport(scope.row)"
+          >
+            {{ getTransportButtonText(scope.row) }}
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -237,26 +269,709 @@
         <el-button type="primary" @click="submitApprove">纭畾</el-button>
       </div>
     </el-dialog>
+
+    <!-- 鏂板/缂栬緫妗堜緥寮规 -->
+    <el-dialog
+      :title="`${isEditing ? '缂栬緫' : '鏂板'}妗堜緥`"
+      :visible.sync="editOpen"
+      width="68%"
+      append-to-body
+      :close-on-click-modal="false"
+      @close="handleEditClose"
+    >
+      <el-form
+        ref="editForm"
+        :model="editForm"
+        :rules="editRules"
+        label-width="120px"
+      >
+        <!-- 鍩烘湰淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-user"
+              style="color: #409EFF; margin-right: 8px;"
+            ></i>
+            <span>鍩烘湰淇℃伅</span>
+          </div>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
+                <el-input
+                  v-model="editForm.caseNo"
+                  placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鎹愮尞鑰呭鍚�" prop="name">
+                <el-input
+                  v-model="editForm.name"
+                  placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎬у埆" prop="sex">
+                <el-select
+                  v-model="editForm.sex"
+                  placeholder="璇烽�夋嫨鎬у埆"
+                  style="width: 100%"
+                >
+                  <el-option label="鐢�" value="0" />
+                  <el-option label="濂�" value="1" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="骞撮緞" prop="age">
+                <el-input-number
+                  v-model="editForm.age"
+                  :min="0"
+                  :max="120"
+                  placeholder="璇疯緭鍏ュ勾榫�"
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="骞撮緞鍗曚綅" prop="ageunit">
+                <el-select
+                  v-model="editForm.ageunit"
+                  placeholder="璇烽�夋嫨骞撮緞鍗曚綅"
+                  style="width: 100%"
+                >
+                  <el-option label="宀�" value="year" />
+                  <el-option label="鏈�" value="month" />
+                  <el-option label="澶�" value="day" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="琛�鍨�" prop="bloodType">
+                <el-select
+                  v-model="editForm.bloodType"
+                  placeholder="璇烽�夋嫨琛�鍨�"
+                  style="width: 100%"
+                >
+                  <el-option label="A鍨�" value="A" />
+                  <el-option label="B鍨�" value="B" />
+                  <el-option label="O鍨�" value="O" />
+                  <el-option label="AB鍨�" value="AB" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="Rh闃存��" prop="rhYin">
+                <el-radio-group v-model="editForm.rhYin">
+                  <el-radio label="0">鍚�</el-radio>
+                  <el-radio label="1">鏄�</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍑虹敓鏃ユ湡" prop="birthday">
+                <el-date-picker
+                  v-model="editForm.birthday"
+                  type="date"
+                  placeholder="閫夋嫨鍑虹敓鏃ユ湡"
+                  value-format="yyyy-MM-dd"
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="璇佷欢绫诲瀷" prop="idcardtype">
+                <el-select
+                  v-model="editForm.idcardtype"
+                  placeholder="璇烽�夋嫨璇佷欢绫诲瀷"
+                  style="width: 100%"
+                >
+                  <el-option label="韬唤璇�" value="1" />
+                  <el-option label="鎶ょ収" value="2" />
+                  <el-option label="鍐涘畼璇�" value="3" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="璇佷欢鍙风爜" prop="idcardno">
+                <el-input
+                  v-model="editForm.idcardno"
+                  placeholder="璇疯緭鍏ヨ瘉浠跺彿鐮�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="姘戞棌" prop="nation">
+                <el-input v-model="editForm.nation" placeholder="璇疯緭鍏ユ皯鏃�" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍥界睄" prop="nationality">
+                <el-input
+                  v-model="editForm.nationality"
+                  placeholder="璇疯緭鍏ュ浗绫�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="绫嶈疮" prop="nativeplace">
+                <el-input
+                  v-model="editForm.nativeplace"
+                  placeholder="璇疯緭鍏ョ睄璐�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="瀛﹀巻" prop="education">
+                <el-input
+                  v-model="editForm.education"
+                  placeholder="璇疯緭鍏ュ鍘�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鑱屼笟" prop="occupation">
+                <el-input
+                  v-model="editForm.occupation"
+                  placeholder="璇疯緭鍏ヨ亴涓�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
+                <el-input
+                  v-model="editForm.phone"
+                  placeholder="璇疯緭鍏ヨ仈绯荤數璇�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-card>
+
+        <!-- 鍦板潃淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-location-information"
+              style="color: #67C23A; margin-right: 8px;"
+            ></i>
+            <span>鍦板潃淇℃伅</span>
+          </div>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎴风睄鍦板潃鐪�">
+                <el-input
+                  v-model="editForm.registerprovincename"
+                  placeholder="璇疯緭鍏ユ埛绫嶅湴鍧�鐪�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鎴风睄鍦板潃甯�">
+                <el-input
+                  v-model="editForm.registercityname"
+                  placeholder="璇疯緭鍏ユ埛绫嶅湴鍧�甯�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎴风睄琛楅亾">
+                <el-input
+                  v-model="editForm.registertownname"
+                  placeholder="璇疯緭鍏ユ埛绫嶈閬�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鎴风睄绀惧尯">
+                <el-input
+                  v-model="editForm.registercommunityname"
+                  placeholder="璇疯緭鍏ユ埛绫嶇ぞ鍖�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="鎴风睄璇︾粏鍦板潃" prop="registeraddress">
+            <el-input
+              v-model="editForm.registeraddress"
+              type="textarea"
+              :rows="2"
+              placeholder="璇疯緭鍏ヨ缁嗙殑鎴风睄鍦板潃"
+            />
+          </el-form-item>
+
+          <el-divider>鐜颁綇鍦板潃</el-divider>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鐜颁綇鍦板潃鐪�">
+                <el-input
+                  v-model="editForm.residenceprovincename"
+                  placeholder="璇疯緭鍏ョ幇浣忓湴鍧�鐪�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鐜颁綇鍦板潃甯�/鍖�">
+                <el-input
+                  v-model="editForm.residencecountyname"
+                  placeholder="璇疯緭鍏ョ幇浣忓湴鍧�甯�/鍖�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鐜颁綇鍦板潃琛楅亾">
+                <el-input
+                  v-model="editForm.residencetownname"
+                  placeholder="璇疯緭鍏ョ幇浣忓湴鍧�琛楅亾"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鐜颁綇鍦板潃绀惧尯">
+                <el-input
+                  v-model="editForm.residencecommunityname"
+                  placeholder="璇疯緭鍏ョ幇浣忓湴鍧�绀惧尯"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="鐜颁綇璇︾粏鍦板潃" prop="residenceaddress">
+            <el-input
+              v-model="editForm.residenceaddress"
+              type="textarea"
+              :rows="2"
+              placeholder="璇疯緭鍏ヨ缁嗙殑鐜颁綇鍦板潃"
+            />
+          </el-form-item>
+        </el-card>
+
+        <!-- 鍖荤枟淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-first-aid-kit"
+              style="color: #E6A23C; margin-right: 8px;"
+            ></i>
+            <span>鍖荤枟淇℃伅</span>
+          </div>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname">
+                <el-input
+                  v-model="editForm.diagnosisname"
+                  placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂悕绉�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="GCS璇勫垎" prop="gcsScore">
+                <el-input
+                  v-model="editForm.gcsScore"
+                  placeholder="璇疯緭鍏CS璇勫垎"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="鐥呮儏姒傚喌" prop="illnessoverview">
+            <el-input
+              v-model="editForm.illnessoverview"
+              type="textarea"
+              :rows="3"
+              placeholder="璇疯緭鍏ョ梾鎯呮鍐�"
+              maxlength="500"
+              show-word-limit
+            />
+          </el-form-item>
+
+          <el-form-item label="鐥呬汉鐘跺喌" prop="patientstate">
+            <el-input
+              v-model="editForm.patientstate"
+              type="textarea"
+              :rows="2"
+              placeholder="璇疯緭鍏ョ梾浜虹姸鍐�"
+              maxlength="200"
+              show-word-limit
+            />
+          </el-form-item>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="浼犳煋鐥呮儏鍐�" prop="infectious">
+                <el-input
+                  v-model="editForm.infectious"
+                  placeholder="璇疯緭鍏ヤ紶鏌撶梾鎯呭喌"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="浼犳煋鐥呭叾浠栬鏄�">
+                <el-input
+                  v-model="editForm.infectiousOther"
+                  placeholder="璇疯緭鍏ヤ紶鏌撶梾鍏朵粬璇存槑"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="鏄惁闇�瑕佽浆杩�" prop="isTransport">
+            <el-radio-group v-model="editForm.isTransport">
+              <el-radio label="1">涓嶉渶瑕�</el-radio>
+              <el-radio label="2">闇�瑕�</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-card>
+
+        <!-- 鍖婚櫌淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-office-building"
+              style="color: #909399; margin-right: 8px;"
+            ></i>
+            <span>鍖婚櫌淇℃伅</span>
+          </div>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="娌荤枟鍖婚櫌" prop="treatmenthospitalname">
+                <el-input
+                  v-model="editForm.treatmenthospitalname"
+                  placeholder="璇疯緭鍏ユ不鐤楀尰闄㈠悕绉�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="娌荤枟绉戝" prop="treatmentdeptname">
+                <el-input
+                  v-model="editForm.treatmentdeptname"
+                  placeholder="璇疯緭鍏ユ不鐤楃瀹ゅ悕绉�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="浣忛櫌鍙�" prop="inpatientno">
+                <el-input
+                  v-model="editForm.inpatientno"
+                  placeholder="璇疯緭鍏ヤ綇闄㈠彿"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
+                <el-input
+                  v-model="editForm.deptName"
+                  placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="閮ㄩ棬缂栧彿" prop="deptNo">
+                <el-input
+                  v-model="editForm.deptNo"
+                  placeholder="璇疯緭鍏ラ儴闂ㄧ紪鍙�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓婃姤鍖婚櫌" prop="toHospital">
+                <el-input
+                  v-model="editForm.toHospital"
+                  placeholder="璇疯緭鍏ヤ笂鎶ョ殑鍖婚櫌"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-card>
+
+        <!-- 涓婃姤淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-s-data"
+              style="color: #F56C6C; margin-right: 8px;"
+            ></i>
+            <span>涓婃姤淇℃伅</span>
+          </div>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎶ュ憡鑰呭鍚�" prop="infoName">
+                <el-input
+                  v-model="editForm.infoName"
+                  placeholder="璇疯緭鍏ユ姤鍛婅�呭鍚�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鎶ュ憡鑰呯紪鍙�" prop="infoNo">
+                <el-input
+                  v-model="editForm.infoNo"
+                  placeholder="璇疯緭鍏ユ姤鍛婅�呯紪鍙�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎶ュ憡鑰呯數璇�" prop="reporterphone">
+                <el-input
+                  v-model="editForm.reporterphone"
+                  placeholder="璇疯緭鍏ユ姤鍛婅�呰仈绯荤數璇�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍗忚皟鍛樺鍚�" prop="coordinatorName">
+                <el-input
+                  v-model="editForm.coordinatorName"
+                  placeholder="璇疯緭鍏ュ崗璋冨憳濮撳悕"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鍗忚皟鍛樼紪鍙�" prop="coordinatorNo">
+                <el-input
+                  v-model="editForm.coordinatorNo"
+                  placeholder="璇疯緭鍏ュ崗璋冨憳缂栧彿"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鏄惁缁堟妗堜緥" prop="terminationCase">
+                <el-radio-group v-model="editForm.terminationCase">
+                  <el-radio label="0">杩涜涓�</el-radio>
+                  <el-radio label="1">宸茬粓姝�</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="涓婃姤鐘舵��" prop="reportStatus">
+            <el-select
+              v-model="editForm.reportStatus"
+              placeholder="璇烽�夋嫨涓婃姤鐘舵��"
+              style="width: 100%"
+              :disabled="isEditing"
+            >
+              <el-option label="宸蹭笂鎶�" value="1" />
+              <el-option label="宸查槄璇�" value="2" />
+              <el-option label="宸插悓鎰�" value="3" />
+              <el-option label="宸查┏鍥�" value="4" />
+            </el-select>
+          </el-form-item>
+        </el-card>
+
+        <!-- 闄勪欢淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-folder"
+              style="color: #409EFF; margin-right: 8px;"
+            ></i>
+            <span>闄勪欢淇℃伅</span>
+          </div>
+
+          <div class="attachment-section">
+            <div class="attachment-header">
+              <i class="el-icon-paperclip"></i>
+              <span class="attachment-title">闄勪欢涓婁紶</span>
+              <span class="attachment-tip"
+                >鏀寔涓婁紶鐥呭巻銆佹楠屾姤鍛婄瓑鏂囦欢 (鏈�澶歿{
+                  attachmentLimit
+                }}涓�)</span
+              >
+            </div>
+
+            <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
+            <UploadAttachment
+              ref="uploadAttachment"
+              :file-list="attachmentFileList"
+              :limit="attachmentLimit"
+              :accept="attachmentAccept"
+              @change="handleAttachmentChange"
+              @upload-success="handleUploadSuccess"
+              @upload-error="handleUploadError"
+              @remove="handleAttachmentRemove"
+            />
+          </div>
+
+          <!-- 闄勪欢鍒楄〃 -->
+          <div
+            class="attachment-list"
+            v-if="editForm.annexfilesList && editForm.annexfilesList.length > 0"
+          >
+            <div class="list-title">
+              宸蹭笂浼犻檮浠� ({{ editForm.annexfilesList.length }})
+            </div>
+            <el-table
+              :data="editForm.annexfilesList"
+              style="width: 100%"
+              size="small"
+              border
+            >
+              <el-table-column label="鏂囦欢鍚�" min-width="200">
+                <template #default="scope">
+                  <i
+                    class="el-icon-document"
+                    style="margin-right: 8px; color: #409EFF;"
+                  ></i>
+                  <span class="file-name">{{ scope.row.fileName }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鏂囦欢绫诲瀷" width="100">
+                <template #default="scope">
+                  <el-tag size="small">{{
+                    getFileType(scope.row.fileName)
+                  }}</el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="鍒涘缓鏃堕棿" width="160">
+                <template #default="scope">
+                  <span>{{ formatDateTime(scope.row.createTime) }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="澶囨敞"
+                min-width="150"
+                show-overflow-tooltip
+              >
+                <template #default="scope">
+                  <span>{{ scope.row.remart || "鏃�" }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎿嶄綔" width="200" fixed="right">
+                <template #default="scope">
+                  <el-button
+                    size="mini"
+                    type="primary"
+                    @click="handlePreview(scope.row)"
+                  >
+                    棰勮
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    @click="handleRemoveAttachment(scope.$index)"
+                  >
+                    鍒犻櫎
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </el-card>
+
+        <!-- 澶囨敞淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-edit"
+              style="color: #67C23A; margin-right: 8px;"
+            ></i>
+            <span>澶囨敞淇℃伅</span>
+          </div>
+          <el-form-item prop="remark">
+            <el-input
+              v-model="editForm.remark"
+              type="textarea"
+              :rows="4"
+              placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+              maxlength="500"
+              show-word-limit
+            />
+          </el-form-item>
+        </el-card>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="handleEditClose">鍙栨秷</el-button>
+        <el-button type="primary" :loading="saveLoading" @click="handleSave"
+          >淇濆瓨</el-button
+        >
+      </div>
+    </el-dialog>
+
+    <!-- 鏂囦欢棰勮寮圭獥 -->
+    <FilePreviewDialog
+      :visible="previewVisible"
+      :file="currentPreviewFile"
+      @close="previewVisible = false"
+      @download="handleDownload"
+    />
   </div>
 </template>
 
 <script>
 import CaseDetail from "./caseDetail";
+import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
 import {
   donateList,
   donateInfo,
   donateDel,
-  donateEdit
+  donateEdit,
+  donateAdd
 } from "@/api/businessApi/index";
+import dayjs from "dayjs";
 
 export default {
   name: "CaseList",
-  components: { CaseDetail },
+  components: {
+    CaseDetail,
+    UploadAttachment,
+    FilePreviewDialog
+  },
   dicts: ["sys_user_sex", "sys_BloodType"],
   data() {
     return {
       // 閬僵灞�
       loading: false,
+      saveLoading: false,
       // 閫変腑鏁扮粍
       ids: [],
       // 闈炲崟涓鐢�
@@ -271,22 +986,14 @@
       detailOpen: false,
       // 瀹℃壒寮规鏄惁鏄剧ず
       approveOpen: false,
+      // 缂栬緫寮规鏄惁鏄剧ず
+      editOpen: false,
+      // 缂栬緫鐘舵��
+      isEditing: false,
       // 璇︽儏寮规鏍囬
       detailTitle: "",
       // 褰撳墠鎿嶄綔鐨勬渚�
       currentCase: {},
-      // 鎬у埆閫夐」
-      genderOptions: [
-        { value: "0", label: "鐢�" },
-        { value: "1", label: "濂�" }
-      ],
-      // 琛�鍨嬮�夐」
-      bloodTypeOptions: [
-        { value: "A", label: "A鍨�" },
-        { value: "B", label: "B鍨�" },
-        { value: "O", label: "O鍨�" },
-        { value: "AB", label: "AB鍨�" }
-      ],
       // 鏌ヨ鍙傛暟
       queryParams: {
         pageNum: 1,
@@ -309,7 +1016,36 @@
         approveOpinion: [
           { required: true, message: "璇疯緭鍏ュ鎵规剰瑙�", trigger: "blur" }
         ]
-      }
+      },
+      // 缂栬緫琛ㄥ崟
+      editForm: this.getDefaultFormData(),
+      // 琛ㄥ崟楠岃瘉瑙勫垯
+      editRules: {
+        caseNo: [
+          { required: true, message: "璇疯緭鍏ユ渚嬬紪鍙�", trigger: "blur" }
+        ],
+        name: [
+          { required: true, message: "璇疯緭鍏ユ崘鐚�呭鍚�", trigger: "blur" }
+        ],
+        sex: [{ required: true, message: "璇烽�夋嫨鎬у埆", trigger: "change" }],
+        age: [{ required: true, message: "璇疯緭鍏ュ勾榫�", trigger: "blur" }],
+        diagnosisname: [
+          { required: true, message: "璇疯緭鍏ョ柧鐥呰瘖鏂�", trigger: "blur" }
+        ],
+        treatmenthospitalname: [
+          { required: true, message: "璇疯緭鍏ユ不鐤楀尰闄�", trigger: "blur" }
+        ],
+        reportStatus: [
+          { required: true, message: "璇烽�夋嫨涓婃姤鐘舵��", trigger: "change" }
+        ]
+      },
+      // 闄勪欢鐩稿叧閰嶇疆
+      attachmentLimit: 10,
+      attachmentAccept: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx",
+      attachmentFileList: [],
+      // 棰勮鐩稿叧
+      previewVisible: false,
+      currentPreviewFile: null
     };
   },
   filters: {
@@ -346,66 +1082,199 @@
       } catch (error) {
         console.error("鑾峰彇妗堜緥鍒楄〃澶辫触:", error);
         this.$modal.msgError("鑾峰彇妗堜緥鍒楄〃澶辫触");
-        // 妯℃嫙鏁版嵁
-        this.caseList = this.getMockData();
-        this.total = this.caseList.length;
+        this.caseList = [];
+        this.total = 0;
       } finally {
         this.loading = false;
       }
     },
-
-    /** 妯℃嫙鏁版嵁 */
-    getMockData() {
-      return [
-        {
-          id: 1,
-          caseNo: "DON20241219001",
-          name: "寮犱笁",
-          sex: "0",
-          age: 38,
-          bloodType: "A",
-          gscScore: "1",
-          diagnosisname:
-            "鑴戝浼ゅ鑷磋剳姝讳骸锛岀粡鎶㈡晳鏃犳晥瀹e竷鑴戞浜°�傚灞炲悓鎰忓櫒瀹樻崘鐚��",
-          treatmenthospitalname: "闈掑矝澶у闄勫睘鍖婚櫌",
-          reportStatus: "2",
-          reporttime: "2024-12-19 09:30:00",
-          reportername: "鏉庡尰鐢�",
-          idcardno: "370203198510123456",
-          nation: "姹夋棌",
-          phone: "13800138000",
-          registeraddress: "灞变笢鐪侀潚宀涘競甯傚崡鍖洪娓腑璺�100鍙�",
-          inpatientno: "ZY20241219001",
-          treatmentdeptname: "绁炵粡澶栫",
-          doctorname: "鐜嬩富浠�",
-          infectious: "鏃�",
-          illnessoverview:
-            "鎮h�呭洜浜ら�氫簨鏁呭鑷翠弗閲嶈剳澶栦激锛岀粡鎶㈡晳鏃犳晥瀹e竷鑴戞浜°��",
-          hospitalLevel: "涓夌骇鐢茬瓑",
-          contactperson: "寮犳姢澹�",
-          contactphone: "13900139000",
-          hospitalAddress: "灞变笢鐪侀潚宀涘競甯傚崡鍖烘睙鑻忚矾1鍙�"
-        },
-        {
-          id: 2,
-          caseNo: "DON20241218001",
-          name: "鏉庡洓",
-          sex: "0",
-          age: 45,
-          bloodType: "O",
-          gscScore: "3",
-          diagnosisname: "鎬ユ�у績鑲屾姝伙紝蹇冭剰鍔熻兘琛扮",
-          treatmenthospitalname: "闈掑矝甯傜珛鍖婚櫌",
-          reportStatus: "3",
-          reporttime: "2024-12-18 14:20:00",
-          approvetime: "2024-12-18 16:30:00",
-          reportername: "鍒樺尰鐢�",
-          approvername: "瀹℃牳涓撳憳A",
-          approveopinion: "璧勬枡榻愬叏锛岀鍚堟崘鐚潯浠讹紝鍚屾剰閫氳繃銆�"
-        }
-      ];
+    // 杞繍------------------
+    /** 鍒ゆ柇鏄惁闇�瑕佹樉绀鸿浆杩愭寜閽� */
+    shouldShowTransportButton(row) {
+      // 鍙湁宸插悓鎰忕殑妗堜緥鎵嶈兘杩涜杞繍鎿嶄綔
+      // return row.reportStatus == "3" && row.delFlag == 0;
+      return row.reportStatus != "4";
     },
 
+    /** 鍒ゆ柇鏄惁鍙互璺宠浆鍒拌浆杩愬崟 */
+    canGoToTransport(row) {
+      // 闇�瑕佽浆杩愶紙isTransport === "2"锛変笖娌℃湁杞繍淇℃伅锛坰erviceTransport涓嶅瓨鍦ㄦ垨涓虹┖鏁扮粍锛�
+      return row.isTransport == "2" && row.serviceTransport;
+    },
+
+    /** 鑾峰彇杞繍鎸夐挳鏂囨湰 */
+    getTransportButtonText(row) {
+      if (row.isTransport == "2") {
+        if (
+          row.serviceTransport &&
+          Array.isArray(row.serviceTransport) &&
+          row.serviceTransport.length > 0
+        ) {
+          return "鏌ョ湅杞繍鍗�";
+        } else {
+          return "鍓嶅線杞繍鍗�";
+        }
+      }
+      return "杞繍";
+    },
+
+    /** 鑾峰彇杞繍鐘舵�佹爣绛炬牱寮� */
+    getTransportStatusTag(row) {
+      if (row.isTransport === "1") {
+        return "info"; // 涓嶉渶瑕佽浆杩�
+      }
+      if (
+        row.serviceTransport &&
+        Array.isArray(row.serviceTransport) &&
+        row.serviceTransport.length > 0
+      ) {
+        // 鏍规嵁杞繍鍗曠姸鎬佹樉绀轰笉鍚岄鑹�
+        const transport = row.serviceTransport[0];
+        if (transport.transitStatus) {
+          switch (transport.transitStatus.toString()) {
+            case "1":
+              return "warning"; // 寰呰浆杩�
+            case "2":
+              return "primary"; // 杞繍涓�
+            case "3":
+              return "success"; // 杞繍瀹屾垚
+            case "4":
+              return "danger"; // 杞繍鍙栨秷
+            case "5":
+              return "info"; // 鏆傚瓨
+            default:
+              return "info";
+          }
+        }
+        return "primary"; // 鏈夎浆杩愪俊鎭絾鏃犵姸鎬�
+      }
+      return "danger"; // 闇�瑕佽浆杩愪絾鏃犺浆杩愪俊鎭�
+    },
+
+    /** 鑾峰彇杞繍鐘舵�佹枃鏈� */
+    getTransportStatusText(row) {
+      if (row.isTransport === "1") {
+        return "鏃犻渶杞繍";
+      }
+      if (
+        row.serviceTransport &&
+        Array.isArray(row.serviceTransport) &&
+        row.serviceTransport.length > 0
+      ) {
+        const transport = row.serviceTransport[0];
+        if (transport.transitStatus) {
+          switch (transport.transitStatus.toString()) {
+            case "1":
+              return "寰呰浆杩�";
+            case "2":
+              return "杞繍涓�";
+            case "3":
+              return "杞繍瀹屾垚";
+            case "4":
+              return "杞繍鍙栨秷";
+            case "5":
+              return "鏆傚瓨";
+            default:
+              return "鏈夎浆杩愬崟";
+          }
+        }
+        return "鏈夎浆杩愬崟";
+      }
+      return "闇�杞繍";
+    },
+
+    /** 澶勭悊杞繍鎿嶄綔 */
+    async handleTransport(row) {
+      try {
+        // 鍏堣幏鍙栨渶鏂扮殑妗堜緥淇℃伅
+        const caseData = row;
+
+        if (caseData.isTransport == "2") {
+          if (
+            caseData.serviceTransport &&
+            Array.isArray(caseData.serviceTransport) &&
+            caseData.serviceTransport.length > 0
+          ) {
+            // 宸叉湁杞繍鍗曪紝璺宠浆鍒拌浆杩愬崟璇︽儏椤�
+            const transport = caseData.serviceTransport[0];
+            this.goToTransportDetail(transport.id, row.caseNo);
+          } else {
+            // 娌℃湁杞繍鍗曪紝璺宠浆鍒板垱寤鸿浆杩愬崟椤甸潰
+            this.goToCreateTransport(row);
+          }
+        } else {
+          this.$message.warning("璇ユ渚嬩笉闇�瑕佽浆杩�");
+        }
+      } catch (error) {
+        console.error("鑾峰彇妗堜緥淇℃伅澶辫触:", error);
+        this.$message.error("鑾峰彇妗堜緥淇℃伅澶辫触");
+      }
+    },
+
+    /** 璺宠浆鍒板垱寤鸿浆杩愬崟椤甸潰 */
+    goToCreateTransport(caseData) {
+      // 杩欓噷鍙互璺宠浆鍒板垱寤鸿浆杩愬崟鐨勯〉闈�
+      // 鏂瑰紡1锛氬湪鏂伴〉闈㈡墦寮�
+      this.$router.push({
+        path: "/report/transfer",
+        query: {
+          autoCreate: "true",
+          caseId: caseData.id,
+          caseNo: caseData.caseNo,
+          patName: caseData.name,
+          age: caseData.age,
+          sex: caseData.sex,
+          diagnosisname: caseData.diagnosisname,
+          treatmentHospitalName: caseData.treatmenthospitalname
+        }
+      });
+
+      // 鏂瑰紡2锛氬湪褰撳墠椤甸潰鎵撳紑寮规锛堟帹鑽愶級
+      // this.openTransportDialog(caseData);
+    },
+
+    /** 鎵撳紑杞繍鍗曞脊妗� */
+    openTransportDialog(caseData) {
+      this.$modal.confirm({
+        title: "鍒涘缓杞繍鍗�",
+        message: `鎮ㄥ皢鍒涘缓妗堜緥銆�${caseData.caseNo} - ${caseData.name}銆戠殑杞繍鍗曪紝鏄惁缁х画锛焋,
+        confirmButtonText: "鍓嶅線鍒涘缓",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+        beforeClose: (action, instance, done) => {
+          if (action === "confirm") {
+            // 璺宠浆鍒拌浆杩愬崟鍒涘缓椤甸潰
+            this.$router.push({
+              path: "/report/transfer",
+              query: {
+                caseId: caseData.id,
+                caseNo: caseData.caseNo,
+                patName: caseData.name,
+                age: caseData.age,
+                sex: caseData.sex,
+                diagnosisname: caseData.diagnosisname,
+                treatmentHospitalName: caseData.treatmenthospitalname
+              }
+            });
+            done();
+          } else {
+            done();
+          }
+        }
+      });
+    },
+
+    /** 璺宠浆鍒拌浆杩愬崟璇︽儏椤� */
+    goToTransportDetail(transportId, caseNo) {
+      this.$router.push({
+        path: "/report/transfer",
+        query: {
+          id: transportId,
+          caseNo: caseNo
+        }
+      });
+    },
+    // ---------------------------------end
     // 澶氶�夋閫変腑鏁版嵁
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
@@ -421,85 +1290,99 @@
 
     /** 閲嶇疆鎸夐挳鎿嶄綔 */
     resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        caseNo: undefined,
+        name: undefined,
+        reportStatus: undefined
+      };
+      this.getList();
     },
 
     /** 璇︽儏鎸夐挳鎿嶄綔 */
     async handleDetail(row) {
       try {
-        // 鍏堣幏鍙栨渚嬭鎯�
-        const response = await donateInfo(row.id);
-        this.currentCase = response.data || response || row;
+        this.currentCase = row;
 
-        // 濡傛灉鐘舵�佹槸"宸蹭笂鎶�"(1)锛屽垯浣跨敤瀹屾暣鏁版嵁鏇存柊涓�"宸查槄璇�"(2)
+        // 濡傛灉鐘舵�佹槸"宸蹭笂鎶�"(1)锛屽垯鏇存柊涓�"宸查槄璇�"(2)
         if (this.currentCase.reportStatus === "1") {
           try {
-            // 浣跨敤瀹屾暣鐨勬渚嬫暟鎹綔涓烘洿鏂板熀纭�锛岀‘淇濇墍鏈夊瓧娈甸兘琚繚鐣�
             const updateData = {
-              ...this.currentCase, // 灞曞紑鎵�鏈夌幇鏈夊瓧娈�
-              reportStatus: "2", // 鏇存柊鐘舵�佷负宸查槄璇�
-              updateTime: new Date()
-                .toISOString()
-                .replace("T", " ")
-                .substring(0, 19),
-              updateBy: "褰撳墠鐢ㄦ埛" // 娣诲姞鏇存柊浜轰俊鎭�
+              ...this.currentCase,
+              reportStatus: "2",
+              updateTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+              updateBy: this.$store.state.user?.name || "褰撳墠鐢ㄦ埛"
             };
 
             await donateEdit(updateData);
-
-            // 鏇存柊鏈湴鏁版嵁鍜屽綋鍓嶆樉绀虹殑鏁版嵁
             this.currentCase.reportStatus = "2";
             this.currentCase.updateTime = updateData.updateTime;
-            row.reportStatus = "2"; // 鏇存柊鍒楄〃涓殑鐘舵��
-
+            row.reportStatus = "2";
             this.$modal.msgSuccess("鐘舵�佸凡鏇存柊涓哄凡闃呰");
           } catch (updateError) {
             console.error("鐘舵�佹洿鏂板け璐�:", updateError);
-            this.$modal.msgError("鐘舵�佹洿鏂板け璐ワ紝浣嗗皢缁х画鏄剧ず璇︽儏");
-            // 鏇存柊澶辫触鏃讹紝缁х画浣跨敤鍘熷鐘舵�佹樉绀鸿鎯�
           }
         }
 
         this.detailTitle = `妗堜緥璇︽儏 - ${this.currentCase.caseNo ||
           row.caseNo}`;
         this.detailOpen = true;
+        console.log(this.currentCase, "this.currentCase");
       } catch (error) {
         console.error("鑾峰彇妗堜緥璇︽儏澶辫触:", error);
-        // 濡傛灉鑾峰彇璇︽儏澶辫触锛屼娇鐢ㄨ鏁版嵁浣滀负鍚庡
         this.currentCase = row;
         this.detailTitle = `妗堜緥璇︽儏 - ${row.caseNo}`;
         this.detailOpen = true;
-
-        // 鍗充娇鑾峰彇璇︽儏澶辫触锛屼篃灏濊瘯鏇存柊鐘舵�侊紙浣跨敤琛屾暟鎹級
-        if (row.reportStatus === "1") {
-          try {
-            const updateData = {
-              id: row.id,
-              reportStatus: "2",
-              updateTime: new Date()
-                .toISOString()
-                .replace("T", " ")
-                .substring(0, 19),
-              updateBy: "褰撳墠鐢ㄦ埛"
-              // 娉ㄦ剰锛氳繖閲屽彧鑳戒紶閫掗儴鍒嗗瓧娈碉紝鍥犱负璇︽儏鑾峰彇澶辫触浜�
-            };
-
-            await donateEdit(updateData);
-            row.reportStatus = "2";
-            this.currentCase.reportStatus = "2";
-            this.$modal.msgSuccess("鐘舵�佸凡鏇存柊涓哄凡闃呰");
-          } catch (updateError) {
-            console.error("鐘舵�佹洿鏂板け璐�:", updateError);
-          }
-        }
       }
+    },
+
+    /** 缂栬緫鎸夐挳鎿嶄綔 */
+    async handleEdit(row) {
+      try {
+        const response = await donateInfo(row.id);
+        if (response.code === 200 || response.data) {
+          this.isEditing = true;
+          const data = response.data || response;
+
+          // 澶勭悊闄勪欢
+          if (data.annexfilesList) {
+            this.attachmentFileList = this.parseAttachmentToFileList(
+              data.annexfilesList
+            );
+          } else {
+            this.attachmentFileList = [];
+          }
+
+          this.currentCase = data;
+          this.editForm = { ...data };
+          this.editOpen = true;
+          this.$nextTick(() => {
+            this.$refs.editForm && this.$refs.editForm.clearValidate();
+          });
+        } else {
+          this.$message.error(response.msg || "鑾峰彇璁板綍澶辫触");
+        }
+      } catch (error) {
+        console.error("鑾峰彇璁板綍澶辫触:", error);
+        this.$modal.msgError("鑾峰彇璁板綍澶辫触");
+      }
+    },
+
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.isEditing = false;
+      this.editForm = this.getDefaultFormData();
+      this.attachmentFileList = [];
+      this.editOpen = true;
+      this.$nextTick(() => {
+        this.$refs.editForm && this.$refs.editForm.clearValidate();
+      });
     },
 
     /** 瀹℃壒鎸夐挳鎿嶄綔 */
     async handleApprove(row) {
       try {
-        // 鍏堣幏鍙栨渚嬭鎯呮暟鎹紝纭繚鏈夊畬鏁存暟鎹�
         const response = await donateInfo(row.id);
         this.currentCase = response.data || response || row;
 
@@ -516,7 +1399,6 @@
         this.approveOpen = true;
       } catch (error) {
         console.error("鑾峰彇妗堜緥璇︽儏澶辫触:", error);
-        // 濡傛灉鑾峰彇璇︽儏澶辫触锛屼娇鐢ㄨ鏁版嵁浣滀负鍚庡
         this.currentCase = row;
         this.approveForm.id = row.id;
         this.approveForm.approveResult = "3";
@@ -531,31 +1413,20 @@
       try {
         const valid = await this.$refs.approveForm.validate();
         if (valid) {
-          // 浣跨敤瀹屾暣鐨勬渚嬫暟鎹綔涓哄熀纭�锛岀‘淇濇墍鏈夊瓧娈甸兘琚繚鐣�
           const approveData = {
-            ...this.currentCase, // 灞曞紑鎵�鏈夌幇鏈夊瓧娈�
+            ...this.currentCase,
             reportStatus: this.approveForm.approveResult,
-            approveOpinion: this.approveForm.approveOpinion,
-            approvername: "褰撳墠鐢ㄦ埛", // 瀹為檯椤圭洰涓簲璇ヨ幏鍙栧綋鍓嶇櫥褰曠敤鎴�
-            approvetime: new Date()
-              .toISOString()
-              .replace("T", " ")
-              .substring(0, 19),
-            updateTime: new Date()
-              .toISOString()
-              .replace("T", " ")
-              .substring(0, 19),
-            updateBy: "褰撳墠鐢ㄦ埛"
+            remark: this.approveForm.approveOpinion,
+            approvername: this.$store.state.user?.name || "褰撳墠鐢ㄦ埛",
+            approvetime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+            updateTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+            updateBy: this.$store.state.user?.name || "褰撳墠鐢ㄦ埛"
           };
-
-          // 绉婚櫎鍙兘涓嶉渶瑕佺殑瀛楁锛堟牴鎹疄闄匒PI闇�姹傝皟鏁达級
-          delete approveData.createTime; // 鍒涘缓鏃堕棿涓嶅簲琚洿鏂�
-          delete approveData.createBy; // 鍒涘缓浜轰笉搴斿彉
 
           await donateEdit(approveData);
           this.$modal.msgSuccess("瀹℃壒鎴愬姛");
           this.approveOpen = false;
-          this.getList(); // 閲嶆柊鍔犺浇鍒楄〃
+          this.getList();
         }
       } catch (error) {
         console.error("瀹℃壒澶辫触:", error);
@@ -563,11 +1434,6 @@
           this.$modal.msgError("瀹℃壒澶辫触");
         }
       }
-    },
-
-    /** 鏂板鎸夐挳鎿嶄綔 */
-    handleAdd() {
-      this.$router.push("/case/add");
     },
 
     /** 鍒犻櫎鎸夐挳鎿嶄綔 */
@@ -586,41 +1452,328 @@
           this.$modal.msgError("鍒犻櫎澶辫触");
         }
       }
+    },
+
+    /** 鑾峰彇榛樿琛ㄥ崟鏁版嵁 */
+    getDefaultFormData() {
+      return {
+        id: undefined,
+        caseNo: undefined,
+        name: undefined,
+        sex: undefined,
+        age: undefined,
+        ageunit: "year",
+        bloodType: undefined,
+        rhYin: "0",
+        birthday: undefined,
+        idcardtype: "1",
+        idcardno: undefined,
+        nation: undefined,
+        nationality: undefined,
+        nativeplace: undefined,
+        education: undefined,
+        occupation: undefined,
+        phone: undefined,
+        // 鎴风睄鍦板潃
+        registerprovincename: undefined,
+        registercityname: undefined,
+        registertownname: undefined,
+        registercommunityname: undefined,
+        registeraddress: undefined,
+        // 鐜颁綇鍦板潃
+        residenceprovincename: undefined,
+        residencecountyname: undefined,
+        residencetownname: undefined,
+        residencecommunityname: undefined,
+        residenceaddress: undefined,
+        // 鍖荤枟淇℃伅
+        diagnosisname: undefined,
+        illnessoverview: undefined,
+        patientstate: undefined,
+        gcsScore: undefined,
+        infectious: undefined,
+        infectiousOther: undefined,
+        isTransport: "1",
+        // 鍖婚櫌淇℃伅
+        treatmenthospitalname: undefined,
+        treatmentdeptname: undefined,
+        inpatientno: undefined,
+        deptName: undefined,
+        deptNo: undefined,
+        toHospital: undefined,
+        // 涓婃姤淇℃伅
+        infoName: undefined,
+        infoNo: undefined,
+        reporterphone: undefined,
+        coordinatorName: undefined,
+        coordinatorNo: undefined,
+        terminationCase: "0",
+        reportStatus: "1", // 榛樿宸蹭笂鎶�
+        // 闄勪欢
+        annexfilesList: [],
+        // 鍏朵粬
+        remark: undefined,
+        createBy: undefined,
+        createTime: undefined,
+        updateBy: undefined,
+        updateTime: undefined,
+        delFlag: 0
+      };
+    },
+
+    /** 闄勪欢杞崲 */
+    parseAttachmentToFileList(attachments) {
+      if (!attachments || !Array.isArray(attachments)) return [];
+      return attachments.map((item, index) => ({
+        uid: item.id || `attachment-${index}-${Date.now()}`,
+        name: item.fileName,
+        url: item.path || item.fileUrl,
+        status: "success",
+        raw: item
+      }));
+    },
+
+    /** 闄勪欢鍙樺寲澶勭悊 */
+    handleAttachmentChange(fileList) {
+      this.attachmentFileList = fileList;
+    },
+
+    /** 闄勪欢涓婁紶鎴愬姛澶勭悊 */
+    handleUploadSuccess({ file, fileList, response }) {
+      if (response && response.code === 200) {
+        if (!this.editForm.annexfilesList) {
+          this.editForm.annexfilesList = [];
+        }
+        const attachmentObj = {
+          fileName: file.name,
+          path: response.data || file.url,
+          fileUrl: response.data || file.url,
+          type: this.getFileExtension(file.name),
+          createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+          remart: file.raw?.remart || "",
+          caseNo: this.editForm.caseNo
+        };
+
+        this.editForm.annexfilesList.push(attachmentObj);
+        this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+      }
+    },
+
+    /** 闄勪欢涓婁紶閿欒澶勭悊 */
+    handleUploadError({ file, fileList, error }) {
+      console.error("闄勪欢涓婁紶澶辫触:", error);
+      this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+    },
+
+    /** 闄勪欢绉婚櫎澶勭悊 */
+    handleAttachmentRemove(file) {
+      if (file.url && this.editForm.annexfilesList) {
+        const index = this.editForm.annexfilesList.findIndex(
+          item => item.path === file.url || item.fileUrl === file.url
+        );
+        if (index > -1) {
+          this.editForm.annexfilesList.splice(index, 1);
+        }
+      }
+    },
+
+    /** 鎵嬪姩鍒犻櫎闄勪欢 */
+    handleRemoveAttachment(index) {
+      this.editForm.annexfilesList.splice(index, 1);
+      this.attachmentFileList.splice(index, 1);
+      this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+    },
+
+    /** 鏂囦欢棰勮 */
+    handlePreview(file) {
+      this.currentPreviewFile = {
+        fileName: file.fileName,
+        fileUrl: file.path || file.fileUrl,
+        fileType: this.getFileType(file.fileName)
+      };
+      this.previewVisible = true;
+    },
+
+    /** 鏂囦欢涓嬭浇 */
+    handleDownload(file) {
+      const fileUrl = file.path || file.fileUrl;
+      const fileName = file.fileName;
+
+      if (fileUrl) {
+        const link = document.createElement("a");
+        link.href = fileUrl;
+        link.download = fileName;
+        link.style.display = "none";
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+        this.$message.success("寮�濮嬩笅杞芥枃浠�");
+      } else {
+        this.$message.warning("鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇");
+      }
+    },
+
+    /** 鑾峰彇鏂囦欢绫诲瀷 */
+    getFileType(fileName) {
+      if (!fileName) return "other";
+      const extension = fileName
+        .split(".")
+        .pop()
+        .toLowerCase();
+      const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"];
+      const pdfTypes = ["pdf"];
+      const officeTypes = ["doc", "docx", "xls", "xlsx"];
+
+      if (imageTypes.includes(extension)) return "image";
+      if (pdfTypes.includes(extension)) return "pdf";
+      if (officeTypes.includes(extension)) return "office";
+      return "other";
+    },
+
+    /** 鑾峰彇鏂囦欢鎵╁睍鍚� */
+    getFileExtension(filename) {
+      if (!filename) return "";
+      return filename
+        .split(".")
+        .pop()
+        .toLowerCase();
+    },
+
+    /** 鏃ユ湡鏃堕棿鏍煎紡鍖� */
+    formatDateTime(dateTime) {
+      if (!dateTime) return "";
+      return dayjs(dateTime).format("YYYY-MM-DD HH:mm:ss");
+    },
+
+    /** 鍏抽棴缂栬緫瀵硅瘽妗� */
+    handleEditClose() {
+      this.editOpen = false;
+      this.currentCase = {};
+      this.editForm = this.getDefaultFormData();
+      this.attachmentFileList = [];
+      this.$nextTick(() => {
+        this.$refs.editForm && this.$refs.editForm.clearValidate();
+      });
+    },
+
+    /** 淇濆瓨琛ㄥ崟 */
+    async handleSave() {
+      try {
+        const valid = await this.$refs.editForm.validate();
+        if (!valid) return;
+
+        const pendingFiles = this.attachmentFileList.filter(
+          item => item.status !== "success"
+        );
+        if (pendingFiles.length > 0) {
+          this.$message.warning(
+            "杩樻湁鏂囦欢鏈笂浼犲畬鎴愶紝璇峰厛涓婁紶鎵�鏈夋枃浠舵垨绉婚櫎鏈笂浼犵殑鏂囦欢"
+          );
+          return;
+        }
+
+        this.saveLoading = true;
+
+        const requestData = { ...this.editForm };
+        let response;
+
+        if (this.isEditing) {
+          response = await donateEdit(requestData);
+        } else {
+          // 鏂板鏃惰缃垱寤轰俊鎭�
+          requestData.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
+          requestData.createBy = this.$store.state.user?.name || "褰撳墠鐢ㄦ埛";
+          response = await donateAdd(requestData);
+        }
+
+        if (response.code === 200) {
+          this.$message.success(this.isEditing ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
+          this.handleEditClose();
+          this.getList();
+        } else {
+          this.$message.error(response.msg || "鎿嶄綔澶辫触");
+        }
+      } catch (error) {
+        console.error("淇濆瓨澶辫触:", error);
+        this.$message.error("鎿嶄綔澶辫触锛岃绋嶅悗閲嶈瘯");
+      } finally {
+        this.saveLoading = false;
+      }
     }
   }
 };
 </script>
 
 <style scoped>
+.app-container {
+  padding: 20px;
+}
+
 .filter-card {
   margin-bottom: 20px;
 }
+
 .mb8 {
   margin-bottom: 8px;
 }
-/* 璇︽儏椤甸潰鏍峰紡浼樺寲 */
-.case-detail-container {
-  max-height: 70vh;
-  overflow-y: auto;
-  padding: 0 10px;
-}
 
-.detail-section {
+/* 琛ㄥ崟鍖哄煙鏍峰紡 */
+.form-section {
   margin-bottom: 16px;
 }
 
 .section-header {
   display: flex;
-  justify-content: space-between;
   align-items: center;
-}
-
-.section-title {
-  font-size: 16px;
   font-weight: bold;
   color: #303133;
 }
 
+.dialog-footer {
+  text-align: right;
+  padding: 20px 0 0;
+}
+
+/* 闄勪欢鏍峰紡 */
+.attachment-section {
+  margin-bottom: 16px;
+}
+
+.attachment-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16px;
+  padding: 8px 0;
+  border-bottom: 1px solid #ebeef5;
+}
+
+.attachment-title {
+  font-weight: bold;
+  margin: 0 8px;
+}
+
+.attachment-tip {
+  font-size: 12px;
+  color: #909399;
+}
+
+.attachment-list {
+  margin-top: 16px;
+}
+
+.list-title {
+  font-weight: bold;
+  margin-bottom: 12px;
+  color: #303133;
+}
+
+.file-name {
+  font-size: 13px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
 /* 瀹℃壒寮规鏍峰紡 */
 .approve-dialog >>> .el-dialog__body {
   padding: 0;
diff --git a/src/views/business/transfer/TransportEdit.vue b/src/views/business/transfer/TransportEdit.vue
index e27c247..996f8cd 100644
--- a/src/views/business/transfer/TransportEdit.vue
+++ b/src/views/business/transfer/TransportEdit.vue
@@ -7,6 +7,31 @@
     :close-on-click-modal="false"
     @close="handleClose"
   >
+    <!-- 妗堜緥淇℃伅灞曠ず鍖哄煙 -->
+    <div v-if="selectedCase && !isEdit" class="selected-case-info">
+      <el-alert
+        title="鍏宠仈妗堜緥淇℃伅"
+        type="success"
+        :closable="false"
+        style="margin-bottom: 16px;"
+      />
+      <el-card shadow="never" class="case-info-card">
+        <el-descriptions :column="2" border>
+          <el-descriptions-item label="妗堜緥缂栧彿">{{ selectedCase.caseNo }}</el-descriptions-item>
+          <el-descriptions-item label="鎮h�呭鍚�">{{ selectedCase.name }}</el-descriptions-item>
+          <el-descriptions-item label="鎬у埆">
+            <dict-tag
+              :options="dict.type.sys_user_sex"
+              :value="selectedCase.sex"
+            />
+          </el-descriptions-item>
+          <el-descriptions-item label="骞撮緞">{{ selectedCase.age }}</el-descriptions-item>
+          <el-descriptions-item label="鐤剧梾璇婃柇">{{ selectedCase.diagnosisname }}</el-descriptions-item>
+          <el-descriptions-item label="娌荤枟鍖婚櫌">{{ selectedCase.treatmenthospitalname }}</el-descriptions-item>
+        </el-descriptions>
+      </el-card>
+    </div>
+
     <el-form
       ref="editForm"
       :model="formData"
@@ -34,7 +59,8 @@
             <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
               <el-input
                 v-model="formData.caseNo"
-                placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+                :disabled="true"
+                placeholder="鑷姩浠庢渚嬭幏鍙�"
               />
             </el-form-item>
           </el-col>
@@ -45,7 +71,8 @@
             <el-form-item label="鎮h�呭鍚�" prop="patName">
               <el-input
                 v-model="formData.patName"
-                placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
+                :disabled="true"
+                placeholder="鑷姩浠庢渚嬭幏鍙�"
               />
             </el-form-item>
           </el-col>
@@ -53,6 +80,7 @@
             <el-form-item label="鎬у埆" prop="sex">
               <el-select
                 v-model="formData.sex"
+                :disabled="true"
                 placeholder="璇烽�夋嫨鎬у埆"
                 style="width: 100%"
               >
@@ -70,7 +98,8 @@
                 v-model="formData.age"
                 :min="0"
                 :max="120"
-                placeholder="璇疯緭鍏ュ勾榫�"
+                :disabled="true"
+                placeholder="鑷姩浠庢渚嬭幏鍙�"
                 style="width: 100%"
               />
             </el-form-item>
@@ -79,7 +108,8 @@
             <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname">
               <el-input
                 v-model="formData.diagnosisname"
-                placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂悕绉�"
+                :disabled="true"
+                placeholder="鑷姩浠庢渚嬭幏鍙�"
               />
             </el-form-item>
           </el-col>
@@ -98,7 +128,8 @@
             <el-form-item label="娌荤枟鍖婚櫌" prop="treatmentHospitalName">
               <el-input
                 v-model="formData.treatmentHospitalName"
-                placeholder="璇疯緭鍏ユ不鐤楀尰闄㈠悕绉�"
+                :disabled="true"
+                placeholder="鑷姩浠庢渚嬭幏鍙�"
               />
             </el-form-item>
           </el-col>
@@ -372,6 +403,7 @@
     UploadAttachment,
     FilePreviewDialog
   },
+  dicts: ["sys_user_sex", "sys_BloodType"],
   props: {
     editOpen: {
       type: Boolean,
@@ -384,6 +416,10 @@
     isEdit: {
       type: Boolean,
       default: false
+    },
+    selectedCase: {
+      type: Object,
+      default: null
     }
   },
   data() {
@@ -428,9 +464,18 @@
   watch: {
     editOpen(val) {
       if (val) {
-        this.formData = this.isEdit
-          ? { ...this.getDefaultFormData(), ...this.transportData }
-          : this.getDefaultFormData();
+        if (this.isEdit) {
+          // 缂栬緫妯″紡锛屼娇鐢ㄤ紶鍏ョ殑杞繍鍗曟暟鎹�
+          this.formData = { ...this.getDefaultFormData(), ...this.transportData };
+        } else {
+          // 鏂板妯″紡
+          this.formData = this.getDefaultFormData();
+
+          // 濡傛灉鏈夐�変腑鐨勬渚嬶紝鐢ㄦ渚嬩俊鎭~鍏呰〃鍗�
+          if (this.selectedCase) {
+            this.fillFormWithCaseData(this.selectedCase);
+          }
+        }
 
         this.initAttachmentList();
 
@@ -438,6 +483,15 @@
           this.$refs.editForm && this.$refs.editForm.clearValidate();
         });
       }
+    },
+
+    selectedCase: {
+      handler(newVal) {
+        if (newVal && !this.isEdit) {
+          this.fillFormWithCaseData(newVal);
+        }
+      },
+      deep: true
     }
   },
   methods: {
@@ -472,6 +526,23 @@
         updateBy: undefined,
         updateTime: undefined,
         delFlag: 0
+      };
+    },
+
+    /** 鐢ㄦ渚嬫暟鎹~鍏呰〃鍗� */
+    fillFormWithCaseData(caseData) {
+      this.formData = {
+        ...this.formData,
+        caseNo: caseData.caseNo || '',
+        patName: caseData.name || '',
+        sex: caseData.sex || '',
+        age: caseData.age || '',
+        diagnosisname: caseData.diagnosisname || '',
+        treatmentHospitalName: caseData.treatmenthospitalname || '',
+        treatmentDeptName: caseData.treatmentdeptname || '',
+        // 鍙互璁剧疆涓�浜涢粯璁ゅ��
+        transportStartPlace: caseData.treatmenthospitalname || '',
+        contactPerson: caseData.coordinatorName || ''
       };
     },
 
@@ -526,7 +597,7 @@
           createTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
           transportId: this.formData.id,
           delFlag: 0,
-          caseNo:this.formData.caseNo
+          caseNo: this.formData.caseNo
         };
 
         this.formData.annexfilesList.push(attachmentObj);
@@ -709,13 +780,12 @@
   font-size: 13px;
 }
 
-.file-path {
-  font-size: 12px;
-  color: #909399;
+/* 妗堜緥淇℃伅灞曠ず鏍峰紡 */
+.selected-case-info {
+  margin-bottom: 20px;
 }
 
-::v-deep .el-card__header {
-  background: #f5f7fa;
-  border-bottom: 1px solid #ebeef5;
+.case-info-card {
+  border-left: 4px solid #67c23a;
 }
 </style>
diff --git a/src/views/business/transfer/index.vue b/src/views/business/transfer/index.vue
index 9c33c9e..39faefb 100644
--- a/src/views/business/transfer/index.vue
+++ b/src/views/business/transfer/index.vue
@@ -281,11 +281,120 @@
         @close="detailOpen = false"
       />
     </el-dialog>
+
+    <!-- 妗堜緥閫夋嫨瀵硅瘽妗� -->
+    <el-dialog
+      title="閫夋嫨杞繍妗堜緥"
+      :visible.sync="selectCaseOpen"
+      width="900px"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <div class="case-select-container">
+        <el-card class="search-card">
+          <el-form :model="caseQueryParams" inline>
+            <el-form-item label="妗堜緥缂栧彿">
+              <el-input
+                v-model="caseQueryParams.caseNo"
+                placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+                clearable
+                style="width: 180px"
+              />
+            </el-form-item>
+            <el-form-item label="鎮h�呭鍚�">
+              <el-input
+                v-model="caseQueryParams.patName"
+                placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
+                clearable
+                style="width: 150px"
+              />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="el-icon-search" @click="searchCaseList"
+                >鎼滅储</el-button
+              >
+              <el-button icon="el-icon-refresh" @click="resetCaseSearch"
+                >閲嶇疆</el-button
+              >
+            </el-form-item>
+          </el-form>
+        </el-card>
+
+        <el-card>
+          <el-table
+            v-loading="caseLoading"
+            :data="availableCaseList"
+            @row-click="handleCaseSelect"
+            highlight-current-row
+            style="width: 100%"
+          >
+            <el-table-column label="妗堜緥缂栧彿" prop="caseNo" width="150" align="center" />
+            <el-table-column label="鎮h�呭鍚�" prop="name" width="120" align="center" />
+            <el-table-column label="鎬у埆" width="80" align="center">
+              <template slot-scope="scope">
+                <dict-tag
+                  :options="dict.type.sys_user_sex"
+                  :value="scope.row.sex"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column label="骞撮緞" prop="age" width="80" align="center" />
+            <el-table-column label="琛�鍨�" width="80" align="center">
+              <template slot-scope="scope">
+                <dict-tag
+                  :options="dict.type.sys_BloodType"
+                  :value="scope.row.bloodType"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column label="鐤剧梾璇婃柇" prop="diagnosisname" min-width="200" show-overflow-tooltip />
+            <el-table-column label="娌荤枟鍖婚櫌" prop="treatmenthospitalname" width="150" />
+            <el-table-column label="鏄惁宸茶浆杩�" width="100" align="center">
+              <template slot-scope="scope">
+                <el-tag
+                  :type="hasTransport(scope.row) ? 'danger' : 'success'"
+                  size="small"
+                >
+                  {{ hasTransport(scope.row) ? '宸茶浆杩�' : '鍙浆杩�' }}
+                </el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="鎿嶄綔" width="80" align="center">
+              <template slot-scope="scope">
+                <el-button
+                  type="text"
+                  size="mini"
+                  @click="selectCase(scope.row)"
+                  :disabled="hasTransport(scope.row)"
+                >
+                  閫夋嫨
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+
+          <!-- 鍒嗛〉 -->
+          <pagination
+            v-show="caseTotal > 0"
+            :total="caseTotal"
+            :page.sync="caseQueryParams.pageNum"
+            :limit.sync="caseQueryParams.pageSize"
+            @pagination="searchCaseList"
+          />
+        </el-card>
+      </div>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="selectCaseOpen = false">鍙栨秷</el-button>
+      </div>
+    </el-dialog>
+
     <!-- 鏂板锛氫慨鏀瑰脊妗� -->
     <transport-edit
       :edit-open="editOpen"
       :transport-data="currentTransport"
       :is-edit="isEditing"
+      :selected-case="selectedCase"
       @update:edit-open="editOpen = $event"
       @close="handleEditClose"
       @save-success="handleSaveSuccess"
@@ -318,7 +427,8 @@
   transportAdd,
   transportEdit,
   transportDelete,
-  transportInfo
+  transportInfo,
+  donateList
 } from "@/api/businessApi/index";
 import TransportDetail from "./transportDetail";
 import TransportEdit from "./TransportEdit";
@@ -329,6 +439,7 @@
   dicts: ["sys_user_sex", "sys_BloodType"],
   data() {
     return {
+
       // 閬僵灞�
       loading: false,
       // 閫変腑鏁扮粍
@@ -341,10 +452,12 @@
       showSearch: true,
       // 鎬绘潯鏁�
       total: 0,
-      // 杞繍鍗曡〃鏍兼暟鎹� - 鐩存帴浣跨敤鍚庣杩斿洖鐨勬暟鎹粨鏋�
+      // 杞繍鍗曡〃鏍兼暟鎹�
       transportList: [],
       // 璇︽儏寮规鏄惁鏄剧ず
       detailOpen: false,
+      // 妗堜緥閫夋嫨寮规鏄惁鏄剧ず
+      selectCaseOpen: false,
       // 鎿嶄綔纭寮规鏄惁鏄剧ず
       actionOpen: false,
       // 鏂板锛氫慨鏀瑰脊妗嗙浉鍏虫暟鎹�
@@ -366,28 +479,42 @@
         pendingTransports: 0,
         completedTransports: 0
       },
-      // 鏌ヨ鍙傛暟锛堝畬鍏ㄩ�傞厤鍚庣鎺ュ彛锛�
+      // 鏌ヨ鍙傛暟
       queryParams: {
         pageNum: 1,
         pageSize: 10,
-        caseNo: undefined, // 妗堜緥缂栧彿
-        patName: undefined, // 鎮h�呭鍚�
-        transitStatus: undefined, // 杞繍鐘舵�侊細1寰呰浆杩� 2杞繍涓� 3杞繍瀹屾垚 4杞繍鍙栨秷 5鏆傚瓨
-        searchValue: undefined, // 鎼滅储鍊�
-        params: {} // 鍏朵粬鍙傛暟瀵硅薄
+        caseNo: undefined,
+        patName: undefined,
+        transitStatus: undefined,
+        searchValue: undefined,
+        params: {}
+      },
+      // 妗堜緥閫夋嫨鐩稿叧
+      caseLoading: false,
+      availableCaseList: [],
+      caseTotal: 0,
+      selectedCase: null,
+      caseQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        caseNo: undefined,
+        patName: undefined,
+        // 鍙煡璇㈠凡鍚屾剰涓旈渶瑕佽浆杩愮殑妗堜緥
+        // reportStatus: "3", // 宸插悓鎰�
+        isTransport: "2"   // 闇�瑕佽浆杩�
       }
     };
   },
   created() {
     this.getList();
+     this.checkAutoCreate();
   },
   methods: {
-    /** 鏌ヨ杞繍鍗曞垪琛� - 鐩存帴浣跨敤鍚庣鏁版嵁缁撴瀯 */
+    /** 鏌ヨ杞繍鍗曞垪琛� */
     async getList() {
       this.loading = true;
 
       try {
-        // 鏋勫缓绗﹀悎鍚庣鎺ュ彛鐨勮姹傚弬鏁� [1,2](@ref)
         const requestParams = {
           pageNum: this.queryParams.pageNum,
           pageSize: this.queryParams.pageSize,
@@ -397,20 +524,15 @@
           searchValue: this.queryParams.searchValue
         };
 
-        // 澶勭悊鏃堕棿鑼冨洿鍙傛暟 [5](@ref)
         if (this.dateRange && this.dateRange.length === 2) {
           requestParams.transportStartTime = this.dateRange.join(",");
         }
 
-        // 璋冪敤姝e紡鎺ュ彛 [3](@ref)
         const response = await transportList(requestParams);
 
         if (response.code === 200) {
-          // 鐩存帴浣跨敤鍚庣杩斿洖鐨勬暟鎹粨鏋勶紝涓嶈繘琛岃浆鎹� [8](@ref)
           this.transportList = response.rows || response.data || [];
           this.total = response.total || 0;
-
-          // 鏇存柊缁熻鏁版嵁
           this.updateStats();
         } else {
           this.$modal.msgError(response.msg || "鑾峰彇杞繍鍗曞垪琛ㄥけ璐�");
@@ -421,6 +543,109 @@
       } finally {
         this.loading = false;
       }
+    },
+  checkAutoCreate() {
+    const query = this.$route.query;
+    if (query.autoCreate === 'true') {
+      // 鑷姩鎵撳紑妗堜緥閫夋嫨寮规
+      this.selectCaseOpen = true;
+      this.resetCaseSearch();
+
+      // 濡傛灉鏈夌壒瀹氱殑妗堜緥缂栧彿锛屽彲浠ラ鍏堟悳绱�
+      if (query.caseNo) {
+        this.caseQueryParams.caseNo = query.caseNo;
+        this.searchCaseList();
+      }
+    }
+  },
+    /** 鎼滅储鍙敤妗堜緥 */
+    async searchCaseList() {
+      this.caseLoading = true;
+      try {
+        const response = await donateList(this.caseQueryParams);
+        if (response.code === 200) {
+          this.availableCaseList = response.rows || response.data || [];
+          this.caseTotal = response.total || 0;
+        } else {
+          this.$modal.msgError(response.msg || "鑾峰彇妗堜緥鍒楄〃澶辫触");
+        }
+      } catch (error) {
+        console.error("鑾峰彇妗堜緥鍒楄〃澶辫触:", error);
+        this.$modal.msgError("鑾峰彇妗堜緥鍒楄〃澶辫触");
+      } finally {
+        this.caseLoading = false;
+      }
+    },
+
+    /** 閲嶇疆妗堜緥鎼滅储 */
+    resetCaseSearch() {
+      this.caseQueryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        caseNo: undefined,
+        patName: undefined,
+        // reportStatus: "3",
+        isTransport: "2"
+      };
+      this.searchCaseList();
+    },
+
+    /** 鍒ゆ柇妗堜緥鏄惁宸叉湁杞繍鍗� */
+    hasTransport(caseData) {
+      // 妫�鏌ユ渚嬫槸鍚︽湁杞繍淇℃伅
+      if (caseData.serviceTransport &&
+          Array.isArray(caseData.serviceTransport) &&
+          caseData.serviceTransport.length > 0) {
+        return true;
+      }
+      return false;
+    },
+
+    /** 閫夋嫨妗堜緥 */
+    selectCase(caseData) {
+      if (this.hasTransport(caseData)) {
+        this.$message.warning("璇ユ渚嬪凡鏈夎浆杩愬崟锛岃閫夋嫨鍏朵粬妗堜緥");
+        return;
+      }
+
+      this.selectedCase = caseData;
+      this.selectCaseOpen = false;
+
+      // 鎵撳紑杞繍鍗曠紪杈戦〉闈紝骞朵紶鍏ラ�変腑鐨勬渚�
+      this.currentTransport = this.convertCaseToTransport(caseData);
+      this.isEditing = false;
+      this.editOpen = true;
+    },
+
+    /** 灏嗘渚嬩俊鎭浆鎹负杞繍鍗曟牸寮� */
+    convertCaseToTransport(caseData) {
+      return {
+        caseNo: caseData.caseNo,
+        patName: caseData.name,
+        sex: caseData.sex,
+        age: caseData.age,
+        diagnosisname: caseData.diagnosisname,
+        treatmentHospitalName: caseData.treatmenthospitalname,
+        treatmentDeptName: caseData.treatmentdeptname,
+        // 鍏朵粬瀛楁鍙互鏍规嵁闇�瑕佷粠妗堜緥涓幏鍙�
+        transportStartPlace: caseData.treatmenthospitalname || '',
+        contactPerson: caseData.coordinatorName || '',
+        transitStatus: 1, // 榛樿寰呰浆杩�
+        // 娓呯┖鍏朵粬瀛楁
+        id: undefined,
+        reportId: undefined,
+        transportStartTime: undefined,
+        doctor: undefined,
+        doctorPhone: undefined,
+        nurse: undefined,
+        nursePhone: undefined,
+        driver: undefined,
+        driverPhone: undefined,
+        icuDoctor: undefined,
+        icuDoctorPhone: undefined,
+        annexfilesList: [],
+        remark: undefined
+      };
     },
 
     /** 鑾峰彇鐘舵�佹爣绛剧被鍨� */
@@ -496,20 +721,24 @@
     handleUpdate(row) {
       this.currentTransport = row || {};
       this.isEditing = true;
+      this.selectedCase = null; // 缂栬緫鏃朵笉浼犲叆妗堜緥淇℃伅
       this.editOpen = true;
     },
 
     /** 鏂板缓杞繍鍗� */
     handleAdd() {
+      // 鎵撳紑妗堜緥閫夋嫨寮规
+      this.selectCaseOpen = true;
+      this.selectedCase = null;
       this.currentTransport = {};
-      this.isEditing = false;
-      this.editOpen = true;
+      this.resetCaseSearch(); // 閲嶇疆骞舵悳绱㈡渚�
     },
 
     /** 淇敼寮规鍏抽棴澶勭悊 */
     handleEditClose() {
       this.editOpen = false;
       this.currentTransport = {};
+      this.selectedCase = null;
     },
 
     /** 淇濆瓨鎴愬姛澶勭悊 */
@@ -533,7 +762,7 @@
       this.actionOpen = true;
     },
 
-    /** 纭鎿嶄綔 - 浣跨敤鍚庣鍘熷鏁版嵁缁撴瀯 [4](@ref) */
+    /** 纭鎿嶄綔 */
     async confirmAction() {
       try {
         let requestData = {
@@ -546,12 +775,11 @@
           requestData.transitStatus = 3; // 璁剧疆涓鸿浆杩愬畬鎴�
         }
 
-        // 鐩存帴浼犻�掑悗绔渶瑕佺殑鍙傛暟 [8](@ref)
         const response = await transportEdit(requestData);
 
         if (response.code === 200) {
           this.$modal.msgSuccess(`${this.actionText}杞繍鎴愬姛`);
-          this.getList(); // 鍒锋柊鍒楄〃
+          this.getList();
         } else {
           this.$modal.msgError(response.msg || `${this.actionText}杞繍澶辫触`);
         }
@@ -562,7 +790,7 @@
       this.actionOpen = false;
     },
 
-    /** 鍒犻櫎鎸夐挳鎿嶄綔 - 浣跨敤鍚庣鍘熷ID [1](@ref) */
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
     async handleDelete(row) {
       const ids = row.reportId || row.id || this.ids;
 
@@ -575,7 +803,7 @@
 
         if (response.code === 200) {
           this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-          this.getList(); // 鍒锋柊鍒楄〃
+          this.getList();
         } else {
           this.$modal.msgError(response.msg || "鍒犻櫎澶辫触");
         }
@@ -589,7 +817,6 @@
 
     /** 瀵煎嚭鎸夐挳鎿嶄綔 */
     handleExport() {
-      // 鐩存帴浣跨敤鍚庣鍙傛暟缁撴瀯杩涜瀵煎嚭 [5](@ref)
       this.download(
         "system/transport/export",
         {
@@ -597,12 +824,25 @@
         },
         `transport_${new Date().getTime()}.xlsx`
       );
+    },
+
+    // 鐐瑰嚮琛岄�夋嫨妗堜緥
+    handleCaseSelect(row) {
+      this.selectCase(row);
     }
   }
 };
 </script>
 
 <style scoped>
+.case-select-container {
+  max-height: 600px;
+  overflow: auto;
+}
+
+.search-card {
+  margin-bottom: 20px;
+}
 .filter-card {
   margin-bottom: 20px;
 }

--
Gitblit v1.9.3