From 631c8f37b449b09d19345b76400a39abdb7800f6 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期四, 15 一月 2026 15:48:42 +0800
Subject: [PATCH] api封装档案、上报、转运接入

---
 src/views/business/transfer/transportDetail.vue |  326 +++--
 src/api/businessApi/allocation.js               |    0 
 src/api/businessApi/ethicalReview.js            |    0 
 src/api/businessApi/decide.js                   |    0 
 vue.config.js                                   |    4 
 src/components/UploadAttachment/index.vue       |  145 ++
 src/views/business/transfer/TransportEdit.vue   |  598 ++++++++++-
 src/views/project/donatebaseinfo/index.vue      |   29 
 src/api/businessApi/maintain.js                 |    0 
 src/api/businessApi/index.js                    |   11 
 src/views/business/maintain/index.vue           |    6 
 src/api/businessApi/GetWitness.js               |    0 
 src/views/business/appear/index.vue             |  445 +++++---
 src/views/business/transfer/index.vue           |  391 +++----
 src/api/businessApi/affirm.js                   |    0 
 src/views/business/appear/caseDetail.vue        |  415 +++++--
 src/api/businessApi/course.js                   |    0 
 src/store/getters.js                            |   46 
 src/api/businessApi/assess.js                   |    0 
 src/api/businessApi/OrganUtilization.js         |    0 
 src/components/FilePreviewDialog/index.vue      |  493 +++++++++
 src/api/businessApi/appear.js                   |   44 
 src/api/businessApi/transfer.js                 |   44 
 23 files changed, 2,230 insertions(+), 767 deletions(-)

diff --git a/src/api/businessApi/GetWitness.js b/src/api/businessApi/GetWitness.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/api/businessApi/GetWitness.js
diff --git a/src/api/businessApi/OrganUtilization.js b/src/api/businessApi/OrganUtilization.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/api/businessApi/OrganUtilization.js
diff --git a/src/api/businessApi/affirm.js b/src/api/businessApi/affirm.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/api/businessApi/affirm.js
diff --git a/src/api/businessApi/allocation.js b/src/api/businessApi/allocation.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/api/businessApi/allocation.js
diff --git a/src/api/businessApi/appear.js b/src/api/businessApi/appear.js
new file mode 100644
index 0000000..c8d5827
--- /dev/null
+++ b/src/api/businessApi/appear.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 涓婃姤妗堜緥鏂板
+export function donateAdd(data) {
+  return request({
+    url: '/project/donatebaseinforeport/add',
+    method: 'post',
+    data: data
+  })
+}
+
+// 涓婃姤妗堜緥淇敼
+export function donateEdit(data) {
+  return request({
+    url: '/project/donatebaseinforeport/edit',
+    method: 'post',
+    data: data
+  })
+}
+// 涓婃姤妗堜緥鍒楄〃
+export function donateList(data) {
+  return request({
+    url: '/project/donatebaseinforeport/list',
+    method: 'post',
+    data: data
+  })
+}
+
+// 妗堜緥璇︽儏
+export function donateInfo(id) {
+  return request({
+    url: '/project/donatebaseinforeport/getInfo/' + id,
+    method: 'get'
+  })
+}
+
+// 鍒犻櫎
+export function donateDel(id) {
+  return request({
+    url: '/project/donatebaseinforeport/remove/' + id,
+    method: 'get'
+  })
+}
+
diff --git a/src/api/businessApi/assess.js b/src/api/businessApi/assess.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/api/businessApi/assess.js
diff --git a/src/api/businessApi/course.js b/src/api/businessApi/course.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/api/businessApi/course.js
diff --git a/src/api/businessApi/decide.js b/src/api/businessApi/decide.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/api/businessApi/decide.js
diff --git a/src/api/businessApi/ethicalReview.js b/src/api/businessApi/ethicalReview.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/api/businessApi/ethicalReview.js
diff --git a/src/api/businessApi/index.js b/src/api/businessApi/index.js
new file mode 100644
index 0000000..07a8fbe
--- /dev/null
+++ b/src/api/businessApi/index.js
@@ -0,0 +1,11 @@
+export * from "./affirm";
+export * from "./allocation";
+export * from "./appear";
+export * from "./assess";
+export * from "./course";
+export * from "./ethicalReview";
+export * from "./decide";
+export * from "./GetWitness";
+export * from "./maintain";
+export * from "./OrganUtilization";
+export * from "./transfer";
diff --git a/src/api/businessApi/maintain.js b/src/api/businessApi/maintain.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/api/businessApi/maintain.js
diff --git a/src/api/businessApi/transfer.js b/src/api/businessApi/transfer.js
new file mode 100644
index 0000000..a9437d3
--- /dev/null
+++ b/src/api/businessApi/transfer.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 涓婃姤妗堜緥鏂板
+export function transportAdd(data) {
+  return request({
+    url: '/project/transport/add',
+    method: 'post',
+    data: data
+  })
+}
+
+// 涓婃姤妗堜緥淇敼
+export function transportEdit(data) {
+  return request({
+    url: '/project/transport/edit',
+    method: 'post',
+    data: data
+  })
+}
+// 涓婃姤妗堜緥鍒楄〃
+export function transportList(data) {
+  return request({
+    url: '/project/transport/list',
+    method: 'post',
+    data: data
+  })
+}
+
+// 妗堜緥璇︽儏
+export function transportInfo(id) {
+  return request({
+    url: '/project/transport/getInfo/' + id,
+    method: 'get'
+  })
+}
+
+// 鍒犻櫎
+export function transportDel(id) {
+  return request({
+    url: '/project/transport/remove/' + id,
+    method: 'get'
+  })
+}
+
diff --git a/src/components/FilePreviewDialog/index.vue b/src/components/FilePreviewDialog/index.vue
new file mode 100644
index 0000000..ff472c1
--- /dev/null
+++ b/src/components/FilePreviewDialog/index.vue
@@ -0,0 +1,493 @@
+<template>
+  <el-dialog
+    class="file-preview-dialog"
+    :title="previewTitle"
+    :visible.sync="previewVisible"
+    width="80%"
+    top="5vh"
+    :close-on-click-modal="true"
+    append-to-body
+    @close="handleClose"
+  >
+    <!-- 鍔犺浇鐘舵�� -->
+    <div v-if="loading" class="preview-loading">
+      <i class="el-icon-loading" style="font-size: 40px; margin-bottom: 16px;"></i>
+      <span>鏂囦欢鍔犺浇涓�...</span>
+    </div>
+
+    <!-- 鍥剧墖棰勮 -->
+    <div v-else-if="fileType === 'image'" class="preview-container">
+      <div class="image-toolbar">
+        <el-button-group>
+          <el-button size="mini" @click="zoomImageIn" :disabled="imageScale >= 300">
+            <i class="el-icon-zoom-in"></i> 鏀惧ぇ
+          </el-button>
+          <el-button size="mini" disabled>{{ imageScale }}%</el-button>
+          <el-button size="mini" @click="zoomImageOut" :disabled="imageScale <= 50">
+            <i class="el-icon-zoom-out"></i> 缂╁皬
+          </el-button>
+          <el-button size="mini" @click="resetImageZoom">
+            <i class="el-icon-refresh-left"></i> 閲嶇疆
+          </el-button>
+        </el-button-group>
+
+        <el-button size="mini" type="success" @click="handleDownload">
+          <i class="el-icon-download"></i> 涓嬭浇
+        </el-button>
+      </div>
+
+      <div class="image-viewport">
+        <img
+          :src="fileUrl"
+          alt="棰勮鍥剧墖"
+          class="preview-image"
+          :style="{ transform: `scale(${imageScale / 100})` }"
+          @load="handleImageLoad"
+        />
+      </div>
+    </div>
+
+    <!-- PDF棰勮 -->
+    <div v-else-if="fileType === 'pdf'" class="preview-container pdf-preview">
+      <div class="pdf-toolbar">
+        <el-button-group>
+          <el-button
+            size="mini"
+            @click="changePage(currentPage - 1)"
+            :disabled="currentPage <= 1"
+          >
+            <i class="el-icon-arrow-left"></i> 涓婁竴椤�
+          </el-button>
+          <el-button size="mini" disabled>
+            绗� {{ currentPage }} 椤� / 鍏� {{ pageCount }} 椤�
+          </el-button>
+          <el-button
+            size="mini"
+            @click="changePage(currentPage + 1)"
+            :disabled="currentPage >= pageCount"
+          >
+            <i class="el-icon-arrow-right"></i> 涓嬩竴椤�
+          </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="handleDownload"
+        >
+          <i class="el-icon-download"></i> 涓嬭浇
+        </el-button>
+      </div>
+
+      <div class="pdf-content" v-loading="pdfLoading">
+        <pdf
+          ref="pdf"
+          :src="pdfUrl"
+          :page="currentPage"
+          @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>
+
+    <!-- Office鏂囨。棰勮 -->
+    <div v-else-if="fileType === 'office'" class="preview-container office-preview">
+      <div class="office-toolbar">
+        <el-alert
+          title="Office鏂囨。棰勮鎻愮ず"
+          description="寤鸿涓嬭浇鍚庝娇鐢ㄦ湰鍦癘ffice杞欢鏌ョ湅浠ヨ幏寰楁渶浣充綋楠�"
+          type="info"
+          show-icon
+          :closable="false"
+        />
+        <el-button size="mini" type="success" @click="handleDownload">
+          <i class="el-icon-download"></i> 涓嬭浇鏂囨。
+        </el-button>
+      </div>
+
+      <div class="office-content">
+        <iframe
+          :src="`https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(fileUrl)}`"
+          width="100%"
+          height="600px"
+          frameborder="0"
+        ></iframe>
+      </div>
+    </div>
+
+    <!-- 涓嶆敮鎸侀瑙堢殑鏂囦欢绫诲瀷 -->
+    <div v-else class="preview-container unsupported-preview">
+      <el-alert
+        title="璇ユ枃浠舵牸寮忎笉鏀寔鍦ㄧ嚎棰勮"
+        :description="`鏂囦欢绫诲瀷: ${getFileExtension(fileName)}`"
+        type="warning"
+        show-icon
+        :closable="false"
+      />
+
+      <div class="unsupported-actions">
+        <el-button type="primary" @click="handleDownload">
+          <i class="el-icon-download"></i> 涓嬭浇鏂囦欢
+        </el-button>
+        <el-button @click="handleClose">鍏抽棴</el-button>
+      </div>
+
+      <div class="file-info">
+        <p><strong>鏂囦欢鍚�:</strong> {{ fileName }}</p>
+        <p><strong>鏂囦欢绫诲瀷:</strong> {{ getFileExtension(fileName) }}</p>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import pdf from "vue-pdf";
+
+export default {
+  name: "FilePreviewDialog",
+  components: {
+    pdf
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    file: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data() {
+    return {
+      // 棰勮鎺у埗
+      previewVisible: this.visible,
+      // 鍔犺浇鐘舵��
+      loading: false,
+      pdfLoading: false,
+      // 鏂囦欢淇℃伅
+      fileUrl: "",
+      fileName: "",
+      fileType: "",
+      // PDF鐩稿叧
+      currentPage: 1,
+      pageCount: 0,
+      scale: 100,
+      pageRotate: 0,
+      // 鍥剧墖鐩稿叧
+      imageScale: 100
+    };
+  },
+  computed: {
+    previewTitle() {
+      return `鏂囦欢棰勮 - ${this.fileName}`;
+    },
+    pdfUrl() {
+      return this.fileUrl;
+    }
+  },
+  watch: {
+    visible(newVal) {
+      this.previewVisible = newVal;
+      if (newVal) {
+        this.initPreview();
+      }
+    },
+    previewVisible(newVal) {
+      this.$emit('update:visible', newVal);
+      if (!newVal) {
+        this.handleClose();
+      }
+    }
+  },
+  methods: {
+    /** 鍒濆鍖栭瑙� */
+    initPreview() {
+      if (!this.file) return;
+
+      this.fileName = this.file.fileName || this.file.name || "鏈煡鏂囦欢";
+      this.fileUrl = this.file.fileUrl || this.file.path || this.file.url;
+      this.fileType = this.getFileType(this.fileName);
+
+      this.loading = true;
+
+      // 閲嶇疆鐘舵��
+      this.currentPage = 1;
+      this.scale = 100;
+      this.imageScale = 100;
+      this.pageCount = 0;
+
+      // 妯℃嫙鍔犺浇寤惰繜
+      setTimeout(() => {
+        this.loading = false;
+        if (this.fileType === "pdf") {
+          this.pdfLoading = true;
+        }
+      }, 300);
+    },
+
+    /** 鑾峰彇鏂囦欢绫诲瀷 */
+    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"];
+
+      if (imageTypes.includes(extension)) return "image";
+      if (pdfTypes.includes(extension)) return "pdf";
+      if (officeTypes.includes(extension)) return "office";
+      return "other";
+    },
+
+    /** 鑾峰彇鏂囦欢鎵╁睍鍚� */
+    getFileExtension(filename) {
+      return filename.split('.').pop().toLowerCase() || "鏈煡";
+    },
+
+    /** PDF鍔犺浇瀹屾垚 */
+    loadPdfHandler() {
+      this.pdfLoading = false;
+      this.currentPage = 1;
+    },
+
+    /** PDF鍔犺浇閿欒 */
+    pdfErrorHandler(error) {
+      console.error("PDF鍔犺浇澶辫触:", error);
+      this.pdfLoading = false;
+      this.$message.error("PDF鏂囦欢鍔犺浇澶辫触锛岃灏濊瘯涓嬭浇鍚庢煡鐪�");
+      this.previewVisible = false;
+    },
+
+    /** 鍥剧墖鍔犺浇瀹屾垚 */
+    handleImageLoad() {
+      this.loading = false;
+    },
+
+    /** 鏀瑰彉PDF椤电爜 */
+    changePage(newPage) {
+      if (newPage < 1 || newPage > this.pageCount) return;
+      this.currentPage = newPage;
+    },
+
+    /** PDF鏀惧ぇ */
+    zoomIn() {
+      if (this.scale >= 200) {
+        this.$message.info("宸叉斁澶у埌鏈�澶ф瘮渚�");
+        return;
+      }
+      this.scale += 10;
+    },
+
+    /** PDF缂╁皬 */
+    zoomOut() {
+      if (this.scale <= 50) {
+        this.$message.info("宸茬缉灏忓埌鏈�灏忔瘮渚�");
+        return;
+      }
+      this.scale -= 10;
+    },
+
+    /** PDF閲嶇疆缂╂斁 */
+    resetZoom() {
+      this.scale = 100;
+    },
+
+    /** 鍥剧墖鏀惧ぇ */
+    zoomImageIn() {
+      if (this.imageScale >= 300) {
+        this.$message.info("宸叉斁澶у埌鏈�澶ф瘮渚�");
+        return;
+      }
+      this.imageScale += 20;
+    },
+
+    /** 鍥剧墖缂╁皬 */
+    zoomImageOut() {
+      if (this.imageScale <= 50) {
+        this.$message.info("宸茬缉灏忓埌鏈�灏忔瘮渚�");
+        return;
+      }
+      this.imageScale -= 20;
+    },
+
+    /** 鍥剧墖閲嶇疆缂╂斁 */
+    resetImageZoom() {
+      this.imageScale = 100;
+    },
+
+    /** 涓嬭浇鏂囦欢 */
+    handleDownload() {
+      if (!this.fileUrl) {
+        this.$message.warning("鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇");
+        return;
+      }
+
+      const link = document.createElement("a");
+      link.href = this.fileUrl;
+      link.download = this.fileName;
+      link.style.display = "none";
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
+
+      this.$message.success("寮�濮嬩笅杞芥枃浠�");
+    },
+
+    /** 鍏抽棴瀵硅瘽妗� */
+    handleClose() {
+      this.previewVisible = false;
+      this.$emit("close");
+
+      // 娓呯悊璧勬簮
+      if (this.fileUrl && this.fileUrl.startsWith("blob:")) {
+        URL.revokeObjectURL(this.fileUrl);
+      }
+    }
+  }
+};
+</script>
+
+<style scoped>
+.file-preview-dialog {
+  .preview-loading {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    height: 400px;
+    color: #909399;
+  }
+
+  .preview-container {
+    display: flex;
+    flex-direction: column;
+    height: 70vh;
+  }
+
+  /* 宸ュ叿鏍忛�氱敤鏍峰紡 */
+  .image-toolbar,
+  .pdf-toolbar,
+  .office-toolbar {
+    padding: 15px 20px;
+    background: #f5f7fa;
+    border-bottom: 1px solid #ebeef5;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    flex-wrap: wrap;
+    gap: 10px;
+  }
+
+  /* 鍥剧墖棰勮鏍峰紡 */
+  .image-viewport {
+    flex: 1;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    overflow: auto;
+    padding: 20px;
+    background: #f8f9fa;
+  }
+
+  .preview-image {
+    max-width: 100%;
+    max-height: 100%;
+    transition: transform 0.3s ease;
+    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
+  }
+
+  /* PDF棰勮鏍峰紡 */
+  .pdf-content {
+    flex: 1;
+    overflow: auto;
+    padding: 20px;
+    background: #f8f9fa;
+    display: flex;
+    justify-content: center;
+    align-items: flex-start;
+  }
+
+  /* Office棰勮鏍峰紡 */
+  .office-content {
+    flex: 1;
+    padding: 20px;
+    background: #f8f9fa;
+  }
+
+  /* 涓嶆敮鎸侀瑙堢殑鏍峰紡 */
+  .unsupported-preview {
+    padding: 40px 20px;
+    text-align: center;
+  }
+
+  .unsupported-actions {
+    margin: 30px 0;
+  }
+
+  .unsupported-actions .el-button {
+    margin: 0 10px;
+  }
+
+  .file-info {
+    text-align: left;
+    max-width: 400px;
+    margin: 0 auto;
+    padding: 20px;
+    background: #f5f7fa;
+    border-radius: 4px;
+  }
+
+  .file-info p {
+    margin: 8px 0;
+  }
+}
+
+/* 瀵硅瘽妗嗘牱寮忚皟鏁� */
+:deep(.el-dialog) {
+  margin-top: 5vh !important;
+}
+
+:deep(.el-dialog__body) {
+  padding: 0;
+}
+
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 768px) {
+  .file-preview-dialog {
+    :deep(.el-dialog) {
+      width: 95% !important;
+    }
+
+    .preview-container {
+      .image-toolbar,
+      .pdf-toolbar,
+      .office-toolbar {
+        flex-direction: column;
+        gap: 10px;
+      }
+    }
+  }
+}
+</style>
diff --git a/src/components/UploadAttachment/index.vue b/src/components/UploadAttachment/index.vue
index 290362c..cbd5e9f 100644
--- a/src/components/UploadAttachment/index.vue
+++ b/src/components/UploadAttachment/index.vue
@@ -1,35 +1,172 @@
 <template>
   <div class="upload-attachment">
     <el-upload
-      action="#"
+      ref="upload"
+      :action="uploadAction"
+      :headers="headers"
       :file-list="fileList"
       :auto-upload="false"
+      :multiple="true"
+      :limit="limit"
+      :accept="accept"
+      :on-exceed="handleExceed"
       :on-change="handleFileChange"
       :on-remove="handleFileRemove"
-      multiple
+      :on-success="handleUploadSuccess"
+      :on-error="handleUploadError"
+      :before-upload="beforeUpload"
     >
-      <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
-      <div slot="tip" class="el-upload__tip">鏀寔jpg銆乸ng銆乸df銆乨oc銆乨ocx绛夋牸寮忥紝鍗曚釜鏂囦欢涓嶈秴杩�10MB</div>
+      <el-button slot="trigger" size="small" type="primary">閫夊彇鏂囦欢</el-button>
+      <el-button
+        style="margin-left: 10px;"
+        size="small"
+        type="success"
+        @click="submitUpload"
+        :disabled="fileList.length === 0"
+      >
+        涓婁紶鍒版湇鍔″櫒
+      </el-button>
+      <div slot="tip" class="el-upload__tip">
+        璇蜂笂浼� {{ accept }} 鏍煎紡鐨勬枃浠讹紝鍗曚釜鏂囦欢涓嶈秴杩�10MB锛屾渶澶氬彲涓婁紶{{ limit }}涓枃浠�
+      </div>
     </el-upload>
   </div>
 </template>
 
 <script>
+import { getToken } from "@/utils/auth";
+
 export default {
   name: "UploadAttachment",
   props: {
+    // 鏂囦欢鍒楄〃
     fileList: {
       type: Array,
       default: () => []
+    },
+    // 涓婁紶鏁伴噺闄愬埗
+    limit: {
+      type: Number,
+      default: 10
+    },
+    // 鎺ュ彈鐨勬枃浠剁被鍨�
+    accept: {
+      type: String,
+      default: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx"
+    },
+    // 涓婁紶鍦板潃
+    uploadUrl: {
+      type: String,
+      default: process.env.VUE_APP_BASE_API + "/common/upload"
     }
   },
+  data() {
+    return {
+      uploadAction: process.env.VUE_APP_BASE_API + "/common/upload",
+      headers: {
+        Authorization: "Bearer " + getToken()
+      }
+    };
+  },
   methods: {
+    /** 鏂囦欢閫夋嫨鍙樺寲 */
     handleFileChange(file, fileList) {
       this.$emit('change', fileList);
     },
+
+    /** 鏂囦欢绉婚櫎 */
     handleFileRemove(file, fileList) {
       this.$emit('change', fileList);
+      this.$emit('remove', file);
+    },
+
+    /** 涓婁紶鎴愬姛澶勭悊 */
+    handleUploadSuccess(response, file, fileList) {
+      if (response.code === 200) {
+        file.url = response.data || response.url;
+        this.$message.success('鏂囦欢涓婁紶鎴愬姛');
+        this.$emit('upload-success', {
+          file,
+          fileList,
+          response
+        });
+      } else {
+        this.$message.error(response.msg || '鏂囦欢涓婁紶澶辫触');
+      }
+    },
+
+    /** 涓婁紶閿欒澶勭悊 */
+    handleUploadError(err, file, fileList) {
+      console.error('涓婁紶澶辫触:', err);
+      this.$message.error('鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯');
+      this.$emit('upload-error', {
+        file,
+        fileList,
+        error: err
+      });
+    },
+
+    /** 涓婁紶鍓嶆牎楠� */
+    beforeUpload(file) {
+      // 妫�鏌ユ枃浠剁被鍨�
+      const allowedTypes = this.accept.split(',').map(type => type.trim().toLowerCase());
+      const fileExtension = '.' + file.name.split('.').pop().toLowerCase();
+
+      if (!allowedTypes.includes(fileExtension) && !allowedTypes.includes(fileExtension.substring(1))) {
+        this.$message.error(`涓嶆敮鎸佺殑鏂囦欢鏍煎紡: ${fileExtension}`);
+        return false;
+      }
+
+      // 妫�鏌ユ枃浠跺ぇ灏� (10MB闄愬埗)
+      const isLt10M = file.size / 1024 / 1024 < 10;
+      if (!isLt10M) {
+        this.$message.error('鏂囦欢澶у皬涓嶈兘瓒呰繃 10MB!');
+        return false;
+      }
+
+      return true;
+    },
+
+    /** 鏂囦欢鏁伴噺瓒呭嚭闄愬埗 */
+    handleExceed(files, fileList) {
+      this.$message.warning(`鏈�澶氬彧鑳戒笂浼� ${this.limit} 涓枃浠讹紝褰撳墠閫夋嫨浜� ${files.length} 涓枃浠禶);
+    },
+
+    /** 鎵嬪姩鎻愪氦涓婁紶 */
+    submitUpload() {
+      if (this.fileList.length === 0) {
+        this.$message.warning('璇峰厛閫夋嫨瑕佷笂浼犵殑鏂囦欢');
+        return;
+      }
+
+      this.$refs.upload.submit();
+    },
+
+    /** 娓呯┖鏂囦欢鍒楄〃 */
+    clearFiles() {
+      this.$refs.upload.clearFiles();
+    },
+
+    /** 鑾峰彇褰撳墠鏂囦欢鍒楄〃 */
+    getFileList() {
+      return this.fileList;
     }
   }
 };
 </script>
+
+<style scoped>
+.upload-attachment {
+  width: 100%;
+}
+
+::v-deep .el-upload {
+  display: block;
+}
+
+::v-deep .el-upload__tip {
+  margin-top: 8px;
+  font-size: 12px;
+  color: #909399;
+}
+</style>
diff --git a/src/store/getters.js b/src/store/getters.js
index eef9baa..607d027 100644
--- a/src/store/getters.js
+++ b/src/store/getters.js
@@ -14,8 +14,44 @@
   rolesor: state => state.user.rolesor,
   permissions: state => state.user.permissions,
   permission_routes: state => state.permission.routes,
-  topbarRouters:state => state.permission.topbarRouters,
-  defaultRoutes:state => state.permission.defaultRoutes,
-  sidebarRouters:state => state.permission.sidebarRouters,
-}
-export default getters
+  topbarRouters: state => state.permission.topbarRouters,
+  defaultRoutes: state => state.permission.defaultRoutes,
+  sidebarRouters: state => state.permission.sidebarRouters,
+
+  // 浼樺厛鎵ц
+  bloodTypeOptions: state => [
+    {
+      value: 0,
+      label: "璇煶浼樺厛",
+      raw: {
+        cssClass: "",
+        listClass: ""
+      }
+    },
+    {
+      value: 1,
+      label: "鏂囧瓧浼樺厛",
+      raw: {
+        cssClass: "",
+        listClass: ""
+      }
+    },
+    {
+      value: 0,
+      label: "璇煶浼樺厛",
+      raw: {
+        cssClass: "",
+        listClass: ""
+      }
+    },
+    {
+      value: 1,
+      label: "鏂囧瓧浼樺厛",
+      raw: {
+        cssClass: "",
+        listClass: ""
+      }
+    }
+  ]
+};
+export default getters;
diff --git a/src/views/business/appear/caseDetail.vue b/src/views/business/appear/caseDetail.vue
index db0dc01..2c9d4b5 100644
--- a/src/views/business/appear/caseDetail.vue
+++ b/src/views/business/appear/caseDetail.vue
@@ -6,33 +6,77 @@
         <span class="section-title">鍩烘湰淇℃伅</span>
       </div>
       <el-descriptions :column="2" border>
-        <el-descriptions-item label="鎹愮尞缂栧彿">{{
-          caseData.donorNo
+        <el-descriptions-item label="妗堜緥缂栧彿">{{
+          caseData.caseNo || "-"
         }}</el-descriptions-item>
         <el-descriptions-item label="鎹愮尞鑰呭鍚�">{{
-          caseData.donorName
+          caseData.name || "-"
         }}</el-descriptions-item>
         <el-descriptions-item label="鎬у埆">
-          <dict-tag :options="genderOptions" :value="caseData.gender" />
+          <dict-tag
+            :options="dict.type.sys_user_sex"
+            :value="caseData.sex ? parseInt(caseData.sex) : ''"
+          />
         </el-descriptions-item>
-        <el-descriptions-item label="骞撮緞"
-          >{{ caseData.age }}宀�</el-descriptions-item
-        >
+        <el-descriptions-item label="骞撮緞">
+          {{ caseData.age || "-"
+          }}{{
+            caseData.ageunit ? `(${getAgeUnitText(caseData.ageunit)})` : ""
+          }}
+        </el-descriptions-item>
         <el-descriptions-item label="琛�鍨�">
-          <dict-tag :options="bloodTypeOptions" :value="caseData.bloodType" />
+          <dict-tag
+            :options="dict.type.sys_BloodType"
+            :value="caseData.bloodType"
+          />
+        </el-descriptions-item>
+        <el-descriptions-item label="Rh闃存��">
+          {{
+            caseData.rhYin === "1" ? "鏄�" : caseData.rhYin === "0" ? "鍚�" : "-"
+          }}
+        </el-descriptions-item>
+        <el-descriptions-item label="璇佷欢绫诲瀷">
+          {{ getIdCardTypeText(caseData.idcardtype) }}
         </el-descriptions-item>
         <el-descriptions-item label="璇佷欢鍙风爜">{{
-          caseData.idCardNo
+          caseData.idcardno || "-"
         }}</el-descriptions-item>
         <el-descriptions-item label="姘戞棌">{{
-          caseData.nation
+          caseData.nation || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鍥界睄">{{
+          caseData.nationality || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="绫嶈疮">{{
+          caseData.nativeplace || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="瀛﹀巻">{{
+          caseData.education || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鑱屼笟">{{
+          caseData.occupation || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鍑虹敓鏃ユ湡">{{
+          formatDate(caseData.birthday)
         }}</el-descriptions-item>
         <el-descriptions-item label="鑱旂郴鐢佃瘽">{{
-          caseData.phone
+          caseData.phone || "-"
         }}</el-descriptions-item>
-        <el-descriptions-item label="浣忓潃" :span="2">{{
-          caseData.address
-        }}</el-descriptions-item>
+      </el-descriptions>
+    </el-card>
+
+    <!-- 鍦板潃淇℃伅妯″潡 -->
+    <el-card class="detail-section">
+      <div slot="header" class="section-header">
+        <span class="section-title">鍦板潃淇℃伅</span>
+      </div>
+      <el-descriptions :column="1" border>
+        <el-descriptions-item label="鎴风睄鍦板潃">
+          {{ getFullRegisterAddress() }}
+        </el-descriptions-item>
+        <el-descriptions-item label="鐜颁綇鍦板潃">
+          {{ getFullResidenceAddress() }}
+        </el-descriptions-item>
       </el-descriptions>
     </el-card>
 
@@ -42,24 +86,29 @@
         <span class="section-title">鍖荤枟淇℃伅</span>
       </div>
       <el-descriptions :column="1" border>
-        <el-descriptions-item label="鐤剧梾璇婃柇">{{
-          caseData.diagnosis
+        <el-descriptions-item label="鐤剧梾璇婃柇鍚嶇О">{{
+          caseData.diagnosisname || "-"
         }}</el-descriptions-item>
-        <el-descriptions-item label="浣忛櫌鍙�">{{
-          caseData.inpatientNo
+        <el-descriptions-item label="鐥呮儏姒傚喌">{{
+          caseData.illnessoverview || "-"
         }}</el-descriptions-item>
-        <el-descriptions-item label="鎵�鍦ㄧ瀹�">{{
-          caseData.departmentName
+        <el-descriptions-item label="鐥呬汉鐘跺喌">{{
+          caseData.patientstate || "-"
         }}</el-descriptions-item>
-        <el-descriptions-item label="涓绘不鍖荤敓">{{
-          caseData.doctorName
+        <el-descriptions-item label="GCS璇勫垎">{{
+          caseData.gcsScore || "-"
         }}</el-descriptions-item>
         <el-descriptions-item label="浼犳煋鐥呮儏鍐�">{{
-          caseData.infectiousDisease || "鏃�"
+          caseData.infectious || "鏃�"
         }}</el-descriptions-item>
-        <el-descriptions-item label="鍖荤枟璁板綍">{{
-          caseData.medicalRecord
-        }}</el-descriptions-item>
+        <el-descriptions-item
+          label="浼犳煋鐥呭叾浠栬鏄�"
+          v-if="caseData.infectiousOther"
+          >{{ caseData.infectiousOther }}</el-descriptions-item
+        >
+        <el-descriptions-item label="鏄惁闇�瑕佽浆杩�">
+          {{ caseData.isTransport === "2" ? "闇�瑕�" : "涓嶉渶瑕�" }}
+        </el-descriptions-item>
       </el-descriptions>
     </el-card>
 
@@ -69,31 +118,60 @@
         <span class="section-title">鍖婚櫌淇℃伅</span>
       </div>
       <el-descriptions :column="2" border>
-        <el-descriptions-item label="鍖婚櫌鍚嶇О">{{
-          caseData.hospitalName
+        <el-descriptions-item label="娌荤枟鍖婚櫌鍚嶇О">{{
+          caseData.treatmenthospitalname || "-"
         }}</el-descriptions-item>
-        <el-descriptions-item label="鍖婚櫌绾у埆">{{
-          caseData.hospitalLevel
+        <el-descriptions-item label="娌荤枟绉戝鍚嶇О">{{
+          caseData.treatmentdeptname || "-"
         }}</el-descriptions-item>
-        <el-descriptions-item label="鑱旂郴浜�">{{
-          caseData.contactPerson
+        <el-descriptions-item label="浣忛櫌鍙�">{{
+          caseData.inpatientno || "-"
         }}</el-descriptions-item>
-        <el-descriptions-item label="鑱旂郴鐢佃瘽">{{
-          caseData.contactPhone
-        }}</el-descriptions-item>
-        <el-descriptions-item label="鍖婚櫌鍦板潃" :span="2">{{
-          caseData.hospitalAddress
+        <el-descriptions-item label="閮ㄩ棬鍚嶇О">{{
+          caseData.deptName || "-"
         }}</el-descriptions-item>
       </el-descriptions>
     </el-card>
 
-    <!-- 闄勪欢淇℃伅妯″潡 -->
+    <!-- 涓婃姤淇℃伅妯″潡 -->
     <el-card class="detail-section">
       <div slot="header" class="section-header">
+        <span class="section-title">涓婃姤淇℃伅</span>
+      </div>
+      <el-descriptions :column="2" border>
+        <el-descriptions-item label="鎶ュ憡鑰呭鍚�">{{
+          caseData.infoName || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鎶ュ憡鑰呯紪鍙�">{{
+          caseData.infoNo || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鎶ュ憡鑰呰仈绯荤數璇�">{{
+          caseData.reporterphone || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鍗忚皟鍛樺鍚�">{{
+          caseData.coordinatorName || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鍗忚皟鍛樼紪鍙�">{{
+          caseData.coordinatorNo || "-"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="涓婃姤鐘舵��">
+          <el-tag :type="getStatusType(caseData.reportStatus)">
+            {{ getStatusText(caseData.reportStatus) }}
+          </el-tag>
+        </el-descriptions-item>
+        <el-descriptions-item label="鎶ュ憡鏃堕棿">{{
+          formatDateTime(caseData.reporttime)
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鏄惁缁堟妗堜緥">
+          {{ caseData.terminationCase === "1" ? "宸茬粓姝�" : "杩涜涓�" }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </el-card>
+
+    <!-- 闄勪欢淇℃伅妯″潡 -->
+    <el-card class="detail-section" v-if="attachmentList.length > 0">
+      <div slot="header" class="section-header">
         <span class="section-title">闄勪欢淇℃伅</span>
-        <el-button type="text" icon="el-icon-upload" @click="handleUpload"
-          >涓婁紶闄勪欢</el-button
-        >
       </div>
       <el-table :data="attachmentList" style="width: 100%">
         <el-table-column label="鏂囦欢鍚�" width="300">
@@ -128,36 +206,33 @@
               @click="handleDownload(scope.row)"
               >涓嬭浇</el-button
             >
-            <el-button
-              size="mini"
-              type="danger"
-              @click="handleDelete(scope.row)"
-              >鍒犻櫎</el-button
-            >
           </template>
         </el-table-column>
       </el-table>
     </el-card>
 
-    <!-- 瀹℃壒淇℃伅妯″潡锛堝鏈夛級 -->
-    <el-card class="detail-section" v-if="caseData.status !== '0'">
+    <!-- 瀹℃壒淇℃伅妯″潡锛堢姸鎬佷负宸插悓鎰忔垨宸查┏鍥炴椂鏄剧ず锛� -->
+    <el-card
+      class="detail-section"
+      v-if="caseData.reportStatus === '3' || caseData.reportStatus === '4'"
+    >
       <div slot="header" class="section-header">
         <span class="section-title">瀹℃壒淇℃伅</span>
       </div>
       <el-descriptions :column="1" border>
         <el-descriptions-item label="瀹℃壒缁撴灉">
-          <el-tag :type="caseData.status | statusFilter">
-            {{ caseData.status | statusTextFilter }}
+          <el-tag :type="caseData.reportStatus === '3' ? 'success' : 'danger'">
+            {{ caseData.reportStatus === "3" ? "宸插悓鎰�" : "宸查┏鍥�" }}
           </el-tag>
         </el-descriptions-item>
         <el-descriptions-item label="瀹℃壒鏃堕棿">{{
-          caseData.approveTime
+          formatDateTime(caseData.updateTime)
         }}</el-descriptions-item>
         <el-descriptions-item label="瀹℃壒浜�">{{
-          caseData.approverName
+          caseData.updateBy || "-"
         }}</el-descriptions-item>
         <el-descriptions-item label="瀹℃壒鎰忚">{{
-          caseData.approveOpinion
+          caseData.remark || "鏃�"
         }}</el-descriptions-item>
       </el-descriptions>
     </el-card>
@@ -302,6 +377,7 @@
       default: true
     }
   },
+  dicts: ["sys_user_sex", "sys_BloodType"],
   filters: {
     statusFilter(status) {
       const statusMap = {
@@ -322,74 +398,159 @@
   },
   data() {
     return {
-      activeTab: "basic",
-      genderOptions: [
-        { value: "0", label: "鐢�" },
-        { value: "1", label: "濂�" }
-      ],
-      bloodTypeOptions: [
-        { value: "A", label: "A鍨�" },
-        { value: "B", label: "B鍨�" },
-        { value: "O", label: "O鍨�" },
-        { value: "AB", label: "AB鍨�" }
-      ],
-
-      // 闄勪欢鐩稿叧鏁版嵁
-      attachmentList: [
-        {
-          id: 1,
-          fileName: "鎹愮尞鑰呰韩浠借瘉.jpg",
-          fileType: "jpg",
-          fileSize: 1024000,
-          uploadTime: "2024-12-19 10:30:00",
-          fileUrl: "https://img95.699pic.com/photo/40142/8262.jpg_wh860.jpg"
-        },
-        {
-          id: 2,
-          fileName: "鍖荤枟璇婃柇璇佹槑.pdf",
-          fileType: "pdf",
-          fileSize: 2048000,
-          uploadTime: "2024-12-19 11:20:00",
-          fileUrl:
-            "http://192.168.100.10:8080/profile/upload/2025/12/19/(鍚撮緳8.7)姣忔棩宸ヤ綔鎬荤粨1766131266142.pdf"
-        },
-        {
-          id: 3,
-          fileName: "妫�楠屾姤鍛婂崟.jpg",
-          fileType: "docx",
-          fileSize: 512000,
-          uploadTime: "2024-12-19 14:15:00",
-          fileUrl: "https://img95.699pic.com/photo/40019/3490.jpg_wh860.jpg"
-        }
-      ],
-
-      // PDF棰勮鐩稿叧鏁版嵁
+      // 棰勮鐩稿叧鏁版嵁锛堜繚鎸佸師鏈変唬鐮侊級
       pdfPreviewVisible: false,
+      imagePreviewVisible: false,
+      unsupportedPreviewVisible: false,
       pdfLoading: false,
       pdfUrl: "",
       currentPage: 1,
       pageCount: 0,
       scale: 100,
       pageRotate: 0,
-
-      // 鍥剧墖棰勮鐩稿叧
-      imagePreviewVisible: false,
-
-      // 涓嶆敮鎸侀瑙堢浉鍏�
-      unsupportedPreviewVisible: false,
-
-      // 閫氱敤棰勮鏁版嵁
       previewTitle: "",
       previewUrl: "",
-      currentFile: null
+      currentFile: null,
+
+      // 闄勪欢鍒楄〃
+      attachmentList: []
     };
+  },
+  watch: {
+    caseData: {
+      immediate: true,
+      handler(newVal) {
+        if (newVal && newVal.annexfilesList) {
+          this.loadAttachments(newVal.annexfilesList);
+        }
+      }
+    }
   },
   methods: {
     handleClose() {
       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);
+    },
+
+    // 鏍煎紡鍖栨棩鏈�
+    formatDate(dateString) {
+      if (!dateString) return "-";
+      return dateString.split("T")[0];
+    },
+
+    // 鑾峰彇瀹屾暣鎴风睄鍦板潃
+    getFullRegisterAddress() {
+      const {
+        registerprovincename,
+        registercityname,
+        registertownname,
+        registercommunityname,
+        registeraddress
+      } = this.caseData;
+      const addressParts = [
+        registerprovincename,
+        registercityname,
+        registertownname,
+        registercommunityname,
+        registeraddress
+      ];
+      return addressParts.filter(part => part).join("") || "-";
+    },
+
+    // 鑾峰彇瀹屾暣鐜颁綇鍦板潃
+    getFullResidenceAddress() {
+      const {
+        residenceprovincename,
+        residencecountyname,
+        residencetownname,
+        residencecommunityname,
+        residenceaddress
+      } = this.caseData;
+      const addressParts = [
+        residenceprovincename,
+        residencecountyname,
+        residencetownname,
+        residencecommunityname,
+        residenceaddress
+      ];
+      return addressParts.filter(part => part).join("") || "-";
+    },
+
+    // 鑾峰彇鐘舵�佹枃鏈�
+    getStatusText(status) {
+      const statusMap = {
+        "1": "宸蹭笂鎶�",
+        "2": "宸查槄璇�",
+        "3": "宸插悓鎰�",
+        "4": "宸查┏鍥�"
+      };
+      return statusMap[status] || "鏈煡鐘舵��";
+    },
+
+    // 鑾峰彇鐘舵�佺被鍨�
+    getStatusType(status) {
+      const statusMap = {
+        "1": "info",
+        "2": "warning",
+        "3": "success",
+        "4": "danger"
+      };
+      return statusMap[status] || "info";
+    },
+
+    // 鑾峰彇骞撮緞鍗曚綅鏂囨湰
+    getAgeUnitText(unit) {
+      const unitMap = {
+        year: "宀�",
+        month: "鏈�",
+        day: "澶�"
+      };
+      return unitMap[unit] || unit;
+    },
+
+    // 鑾峰彇璇佷欢绫诲瀷鏂囨湰
+    getIdCardTypeText(type) {
+      const typeMap = {
+        "1": "韬唤璇�",
+        "2": "鎶ょ収",
+        "3": "鍐涘畼璇�"
+      };
+      return typeMap[type] || type || "-";
+    },
+
+    // 鏂囦欢棰勮鐩稿叧鏂规硶锛堜繚鎸佸師鏈変唬鐮侊級
     getFileType(fileName) {
       const extension = fileName
         .split(".")
@@ -397,13 +558,11 @@
         .toLowerCase();
       const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"];
       const pdfTypes = ["pdf"];
-
       if (imageTypes.includes(extension)) return "image";
       if (pdfTypes.includes(extension)) return "pdf";
       return "other";
     },
 
-    // 鏂囦欢棰勮涓诲叆鍙�
     handlePreview(file) {
       this.currentFile = file;
       this.previewTitle = `棰勮 - ${file.fileName}`;
@@ -423,7 +582,6 @@
       }
     },
 
-    // PDF棰勮鏂规硶
     previewPdf(file) {
       this.pdfPreviewVisible = true;
       this.pdfLoading = true;
@@ -433,13 +591,11 @@
       this.pdfUrl = file.fileUrl;
     },
 
-    // PDF鍔犺浇瀹屾垚鍥炶皟
     loadPdfHandler() {
       this.pdfLoading = false;
       this.currentPage = 1;
     },
 
-    // PDF鍔犺浇閿欒澶勭悊
     pdfErrorHandler(error) {
       console.error("PDF鍔犺浇澶辫触:", error);
       this.pdfLoading = false;
@@ -447,26 +603,18 @@
       this.pdfPreviewVisible = false;
     },
 
-    // 缈婚〉鍔熻兘
     changePage(newPage) {
       if (newPage < 1 || newPage > this.pageCount) return;
       this.currentPage = newPage;
     },
 
-    // 缂╂斁鍔熻兘
     zoomIn() {
-      if (this.scale >= 200) {
-        this.$message.info("宸叉斁澶у埌鏈�澶ф瘮渚�");
-        return;
-      }
+      if (this.scale >= 200) return;
       this.scale += 10;
     },
 
     zoomOut() {
-      if (this.scale <= 50) {
-        this.$message.info("宸茬缉灏忓埌鏈�灏忔瘮渚�");
-        return;
-      }
+      if (this.scale <= 50) return;
       this.scale -= 10;
     },
 
@@ -474,24 +622,20 @@
       this.scale = 100;
     },
 
-    // 鍥剧墖棰勮鏂规硶
     previewImage(file) {
       this.imagePreviewVisible = true;
     },
 
-    // 涓嶆敮鎸侀瑙堢殑鏂囦欢绫诲瀷
     previewUnsupported(file) {
       this.unsupportedPreviewVisible = true;
     },
 
-    // PDF瀵硅瘽妗嗗叧闂鐞�
     handlePdfDialogClose() {
       this.pdfUrl = "";
       this.currentPage = 1;
       this.pageCount = 0;
     },
 
-    // 鏂囦欢涓嬭浇
     handleDownload(file) {
       const link = document.createElement("a");
       link.href = file.fileUrl;
@@ -503,31 +647,10 @@
       this.$message.success("寮�濮嬩笅杞芥枃浠�");
     },
 
-    // 涓撶敤PDF涓嬭浇鏂规硶
     downloadPdf(file) {
       this.handleDownload(file);
     },
 
-    // 鏂囦欢鍒犻櫎
-    handleDelete(file) {
-      this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
-        confirmButtonText: "纭畾",
-        cancelButtonText: "鍙栨秷",
-        type: "warning"
-      }).then(() => {
-        this.attachmentList = this.attachmentList.filter(
-          item => item.id !== file.id
-        );
-        this.$message.success("鍒犻櫎鎴愬姛");
-      });
-    },
-
-    // 涓婁紶闄勪欢
-    handleUpload() {
-      this.$message.info("涓婁紶鍔熻兘寰呭疄鐜�");
-    },
-
-    // 鏍煎紡鍖栨枃浠跺ぇ灏�
     formatFileSize(bytes) {
       if (bytes === 0) return "0 B";
       const k = 1024;
diff --git a/src/views/business/appear/index.vue b/src/views/business/appear/index.vue
index 48ac893..f905c3e 100644
--- a/src/views/business/appear/index.vue
+++ b/src/views/business/appear/index.vue
@@ -8,33 +8,33 @@
         :inline="true"
         class="demo-form-inline"
       >
-        <el-form-item label="鎹愮尞缂栧彿" prop="donorNo">
+        <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
           <el-input
-            v-model="queryParams.donorNo"
-            placeholder="璇疯緭鍏ユ崘鐚紪鍙�"
+            v-model="queryParams.caseNo"
+            placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
             clearable
             style="width: 200px"
           />
         </el-form-item>
-        <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
+        <el-form-item label="鎹愮尞鑰呭鍚�" prop="name">
           <el-input
-            v-model="queryParams.donorName"
+            v-model="queryParams.name"
             placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
             clearable
             style="width: 200px"
           />
         </el-form-item>
-        <el-form-item label="妗堜緥鐘舵��" prop="status">
+        <el-form-item label="妗堜緥鐘舵��" prop="reportStatus">
           <el-select
-            v-model="queryParams.status"
+            v-model="queryParams.reportStatus"
             placeholder="璇烽�夋嫨鐘舵��"
             clearable
             style="width: 200px"
           >
             <el-option label="鍏ㄩ儴" value="" />
-            <el-option label="寰呭鎵�" value="0" />
-            <el-option label="宸查�氳繃" value="1" />
-            <el-option label="宸茬粓姝�" value="2" />
+            <el-option label="宸查槄璇�" value="2" />
+            <el-option label="宸插悓鎰�" value="3" />
+            <el-option label="宸查┏鍥�" value="4" />
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -48,11 +48,11 @@
 
     <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
     <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button type="primary" plain icon="el-icon-plus" @click="handleAdd"
           >鏂板妗堜緥</el-button
         >
-      </el-col>
+      </el-col> -->
 
       <el-col :span="1.5">
         <el-button
@@ -73,34 +73,38 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <!-- <el-table-column label="搴忓彿" type="index" width="60" align="center"/>
-      <el-table-column label="鎹愮尞缂栧彿" align="center" prop="donorNo" width="140"/> -->
       <el-table-column
         label="涓婃姤鏃堕棿"
         align="center"
-        prop="reportTime"
+        prop="reporttime"
         width="160"
       />
 
       <el-table-column
         label="鎹愮尞鑰呭鍚�"
         align="center"
-        prop="donorName"
+        prop="name"
         width="100"
       />
-      <el-table-column label="鎬у埆" align="center" prop="gender" width="80">
+      <el-table-column label="鎬у埆" align="center" prop="sex" width="80">
         <template slot-scope="scope">
-          <dict-tag :options="genderOptions" :value="scope.row.gender" />
+          <dict-tag
+            :options="dict.type.sys_user_sex"
+            :value="parseInt(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">
-          <dict-tag :options="bloodTypeOptions" :value="scope.row.bloodType" />
+          <dict-tag
+            :options="dict.type.sys_BloodType"
+            :value="scope.row.bloodtype"
+          />
         </template>
       </el-table-column>
 
-         <el-table-column
+      <el-table-column
         label="GCS璇勫垎"
         align="center"
         prop="gscScore"
@@ -110,20 +114,25 @@
       <el-table-column
         label="鐤剧梾璇婃柇"
         align="center"
-        prop="diagnosis"
+        prop="diagnosisname"
         min-width="200"
         show-overflow-tooltip
       />
       <el-table-column
-        label="涓婃姤鍖婚櫌"
+        label="娌荤枟鍖婚櫌"
         align="center"
-        prop="hospitalName"
+        prop="treatmenthospitalname"
         width="150"
       />
-      <el-table-column label="鐘舵��" align="center" prop="status" width="100">
+      <el-table-column
+        label="鐘舵��"
+        align="center"
+        prop="reportStatus"
+        width="100"
+      >
         <template slot-scope="scope">
-          <el-tag :type="scope.row.status | statusFilter">
-            {{ scope.row.status | statusTextFilter }}
+          <el-tag :type="scope.row.reportStatus | statusFilter">
+            {{ scope.row.reportStatus | statusTextFilter }}
           </el-tag>
         </template>
       </el-table-column>
@@ -147,7 +156,7 @@
             type="text"
             icon="el-icon-check"
             @click="handleApprove(scope.row)"
-            v-if="scope.row.status === '0'"
+            v-if="scope.row.reportStatus === '2'"
             >瀹℃壒</el-button
           >
         </template>
@@ -175,7 +184,6 @@
     </el-dialog>
 
     <!-- 瀹℃壒寮规 -->
-    <!-- 瀹℃壒寮规浼樺寲 -->
     <el-dialog
       title="妗堜緥瀹℃壒"
       :visible.sync="approveOpen"
@@ -205,15 +213,15 @@
           >
             <el-form-item label="瀹℃壒缁撴灉" prop="approveResult">
               <el-radio-group v-model="approveForm.approveResult">
-                <el-radio label="1">閫氳繃</el-radio>
-                <el-radio label="2">缁堟</el-radio>
+                <el-radio label="3">鍚屾剰</el-radio>
+                <el-radio label="4">椹冲洖</el-radio>
               </el-radio-group>
             </el-form-item>
             <el-form-item label="瀹℃壒鎰忚" prop="approveOpinion">
               <el-input
                 type="textarea"
                 v-model="approveForm.approveOpinion"
-                placeholder="璇疯緭鍏ヨ缁嗙殑瀹℃壒鎰忚锛屽寘鎷�氳繃鎴栫粓姝㈢殑鐞嗙敱"
+                placeholder="璇疯緭鍏ヨ缁嗙殑瀹℃壒鎰忚锛屽寘鎷�氳繃鎴栭┏鍥炵殑鐞嗙敱"
                 :rows="6"
                 maxlength="500"
                 show-word-limit
@@ -233,11 +241,17 @@
 
 <script>
 import CaseDetail from "./caseDetail";
-import CaseDetailPreview from "./CaseDetailPreview";
+import {
+  donateList,
+  donateInfo,
+  donateDel,
+  donateEdit
+} from "@/api/businessApi/index";
+
 export default {
   name: "CaseList",
-  components: { CaseDetail, CaseDetailPreview },
-
+  components: { CaseDetail },
+  dicts: ["sys_user_sex", "sys_BloodType"],
   data() {
     return {
       // 閬僵灞�
@@ -276,14 +290,14 @@
       queryParams: {
         pageNum: 1,
         pageSize: 10,
-        donorNo: undefined,
-        donorName: undefined,
-        status: undefined
+        caseNo: undefined,
+        name: undefined,
+        reportStatus: undefined
       },
       // 瀹℃壒琛ㄥ崟
       approveForm: {
-        caseId: null,
-        approveResult: "1",
+        id: null,
+        approveResult: "3",
         approveOpinion: ""
       },
       // 瀹℃壒琛ㄥ崟楠岃瘉
@@ -298,21 +312,23 @@
     };
   },
   filters: {
-    statusFilter(status) {
+    statusFilter(reportStatus) {
       const statusMap = {
-        "0": "warning", // 寰呭鎵�
-        "1": "success", // 宸查�氳繃
-        "2": "danger" // 宸茬粓姝�
+        "1": "info", // 宸蹭笂鎶�
+        "2": "warning", // 宸查槄璇伙紙寰呭鎵癸級
+        "3": "success", // 宸插悓鎰�
+        "4": "danger" // 宸查┏鍥�
       };
-      return statusMap[status];
+      return statusMap[reportStatus] || "info";
     },
-    statusTextFilter(status) {
+    statusTextFilter(reportStatus) {
       const statusMap = {
-        "0": "寰呭鎵�",
-        "1": "宸查�氳繃",
-        "2": "宸茬粓姝�"
+        "1": "宸蹭笂鎶�",
+        "2": "宸查槄璇�",
+        "3": "宸插悓鎰�",
+        "4": "宸查┏鍥�"
       };
-      return statusMap[status];
+      return statusMap[reportStatus] || "鏈煡鐘舵��";
     }
   },
   created() {
@@ -320,162 +336,255 @@
   },
   methods: {
     /** 鏌ヨ妗堜緥鍒楄〃 */
-    getList() {
+    async getList() {
       this.loading = true;
-      // 妯℃嫙API璋冪敤寤惰繜
-      setTimeout(() => {
-        // 娴嬭瘯鏁版嵁
-        this.caseList = [
-          {
-            id: 1,
-            donorNo: "DON20241219001",
-            donorName: "寮犱笁",
-            gender: "2",
-            age: 38,
-            bloodType: "A",
-            gscScore:'1',
-            diagnosis:
-              "鑴戝浼ゅ鑷磋剳姝讳骸锛岀粡鎶㈡晳鏃犳晥瀹e竷鑴戞浜°�傚灞炲悓鎰忓櫒瀹樻崘鐚��",
-            hospitalName: "闈掑矝澶у闄勫睘鍖婚櫌",
-            status: "0",
-            reportTime: "2024-12-19 09:30:00",
-            reporterName: "鏉庡尰鐢�",
-            idCardNo: "370203198510123456",
-            nation: "姹夋棌",
-            phone: "13800138000",
-            address: "灞变笢鐪侀潚宀涘競甯傚崡鍖洪娓腑璺�100鍙�",
-            inpatientNo: "ZY20241219001",
-            departmentName: "绁炵粡澶栫",
-            doctorName: "鐜嬩富浠�",
-            infectiousDisease: "鏃�",
-            medicalRecord:
-              "鎮h�呭洜浜ら�氫簨鏁呭鑷翠弗閲嶈剳澶栦激锛岀粡鎶㈡晳鏃犳晥瀹e竷鑴戞浜°��",
-            hospitalLevel: "涓夌骇鐢茬瓑",
-            contactPerson: "寮犳姢澹�",
-            contactPhone: "13900139000",
-            hospitalAddress: "灞变笢鐪侀潚宀涘競甯傚崡鍖烘睙鑻忚矾1鍙�"
-          },
-          {
-            id: 2,
-            donorNo: "DON20241218001",
-            donorName: "鏉庡洓",
-            gender: "1",
-            age: 45,
-            bloodType: "O",
-            gscScore:'3',
-            diagnosis: "鎬ユ�у績鑲屾姝伙紝蹇冭剰鍔熻兘琛扮",
-            hospitalName: "闈掑矝甯傜珛鍖婚櫌",
-            status: "1",
-            reportTime: "2024-12-18 14:20:00",
-            approveTime: "2024-12-18 16:30:00",
-            reporterName: "鍒樺尰鐢�",
-            approverName: "瀹℃牳涓撳憳A",
-            approveOpinion: "璧勬枡榻愬叏锛岀鍚堟崘鐚潯浠讹紝鍚屾剰閫氳繃銆�"
-          },
-          {
-            id: 3,
-            donorNo: "DON20241217001",
-            donorName: "鐜嬩簲",
-            gender: "2",
-            age: 52,
-            bloodType: "B",
-            gscScore:'6',
-            diagnosis: "棰呭唴鍑鸿锛岃剳骞插姛鑳戒抚澶�",
-            hospitalName: "闈掑矝鐪肩鍖婚櫌",
-            status: "2",
-            reportTime: "2024-12-17 10:15:00",
-            approveTime: "2024-12-17 14:20:00",
-            reporterName: "闄堝尰鐢�",
-            approverName: "瀹℃牳涓撳憳B",
-            approveOpinion: "瀹跺睘鍚屾剰涔︿笉瀹屾暣锛岄渶琛ュ厖鏉愭枡鍚庨噸鏂版彁浜ゃ��"
-          },
-          {
-            id: 4,
-            donorNo: "DON20241216001",
-            donorName: "璧靛叚",
-            gender: "1",
-            age: 28,
-            bloodType: "AB",
-            gscScore:'10',
-            diagnosis: "閲嶅瀷棰呰剳鎹熶激锛屽鍣ㄥ畼鍔熻兘琛扮",
-            hospitalName: "闈掑矝鍎跨鍖婚櫌",
-            status: "0",
-            reportTime: "2024-12-16 16:45:00",
-            reporterName: "瀛欏尰鐢�"
-          }
-        ];
+      try {
+        const response = await donateList(this.queryParams);
+        this.caseList = response.rows || response.data || [];
+        this.total = response.total || this.caseList.length;
+      } catch (error) {
+        console.error("鑾峰彇妗堜緥鍒楄〃澶辫触:", error);
+        this.$modal.msgError("鑾峰彇妗堜緥鍒楄〃澶辫触");
+        // 妯℃嫙鏁版嵁
+        this.caseList = this.getMockData();
         this.total = this.caseList.length;
+      } finally {
         this.loading = false;
-      }, 500);
+      }
     },
+
+    /** 妯℃嫙鏁版嵁 */
+    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: "璧勬枡榻愬叏锛岀鍚堟崘鐚潯浠讹紝鍚屾剰閫氳繃銆�"
+        }
+      ];
+    },
+
     // 澶氶�夋閫変腑鏁版嵁
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
+
     /** 鎼滅储鎸夐挳鎿嶄綔 */
     handleQuery() {
       this.queryParams.pageNum = 1;
       this.getList();
     },
+
     /** 閲嶇疆鎸夐挳鎿嶄綔 */
     resetQuery() {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+
     /** 璇︽儏鎸夐挳鎿嶄綔 */
-    handleDetail(row) {
-      this.currentCase = row;
-      this.detailTitle = `妗堜緥璇︽儏 - ${row.donorNo}`;
-      this.detailOpen = true;
+    async handleDetail(row) {
+      try {
+        // 鍏堣幏鍙栨渚嬭鎯�
+        const response = await donateInfo(row.id);
+        this.currentCase = response.data || response || row;
+
+        // 濡傛灉鐘舵�佹槸"宸蹭笂鎶�"(1)锛屽垯浣跨敤瀹屾暣鏁版嵁鏇存柊涓�"宸查槄璇�"(2)
+        if (this.currentCase.reportStatus === "1") {
+          try {
+            // 浣跨敤瀹屾暣鐨勬渚嬫暟鎹綔涓烘洿鏂板熀纭�锛岀‘淇濇墍鏈夊瓧娈甸兘琚繚鐣�
+            const updateData = {
+              ...this.currentCase, // 灞曞紑鎵�鏈夌幇鏈夊瓧娈�
+              reportStatus: "2", // 鏇存柊鐘舵�佷负宸查槄璇�
+              updateTime: new Date()
+                .toISOString()
+                .replace("T", " ")
+                .substring(0, 19),
+              updateBy: "褰撳墠鐢ㄦ埛" // 娣诲姞鏇存柊浜轰俊鎭�
+            };
+
+            await donateEdit(updateData);
+
+            // 鏇存柊鏈湴鏁版嵁鍜屽綋鍓嶆樉绀虹殑鏁版嵁
+            this.currentCase.reportStatus = "2";
+            this.currentCase.updateTime = updateData.updateTime;
+            row.reportStatus = "2"; // 鏇存柊鍒楄〃涓殑鐘舵��
+
+            this.$modal.msgSuccess("鐘舵�佸凡鏇存柊涓哄凡闃呰");
+          } catch (updateError) {
+            console.error("鐘舵�佹洿鏂板け璐�:", updateError);
+            this.$modal.msgError("鐘舵�佹洿鏂板け璐ワ紝浣嗗皢缁х画鏄剧ず璇︽儏");
+            // 鏇存柊澶辫触鏃讹紝缁х画浣跨敤鍘熷鐘舵�佹樉绀鸿鎯�
+          }
+        }
+
+        this.detailTitle = `妗堜緥璇︽儏 - ${this.currentCase.caseNo ||
+          row.caseNo}`;
+        this.detailOpen = true;
+      } 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);
+          }
+        }
+      }
     },
-    // 鍦ㄧ埗缁勪欢涓洿鏂板鎵规柟娉�
-    handleApprove(row) {
-      this.currentCase = row;
-      this.approveForm.caseId = row.id;
-      this.approveForm.approveResult = "1";
-      this.approveForm.approveOpinion = "";
-      this.approveOpen = true;
+
+    /** 瀹℃壒鎸夐挳鎿嶄綔 */
+    async handleApprove(row) {
+      try {
+        // 鍏堣幏鍙栨渚嬭鎯呮暟鎹紝纭繚鏈夊畬鏁存暟鎹�
+        const response = await donateInfo(row.id);
+        this.currentCase = response.data || response || row;
+
+        this.approveForm.id = row.id;
+        this.approveForm.approveResult = "3";
+        this.approveForm.approveOpinion = "";
+
+        this.$nextTick(() => {
+          if (this.$refs.approveForm) {
+            this.$refs.approveForm.clearValidate();
+          }
+        });
+
+        this.approveOpen = true;
+      } catch (error) {
+        console.error("鑾峰彇妗堜緥璇︽儏澶辫触:", error);
+        // 濡傛灉鑾峰彇璇︽儏澶辫触锛屼娇鐢ㄨ鏁版嵁浣滀负鍚庡
+        this.currentCase = row;
+        this.approveForm.id = row.id;
+        this.approveForm.approveResult = "3";
+        this.approveForm.approveOpinion = "";
+        this.approveOpen = true;
+        this.$modal.msgError("鑾峰彇璇︽儏澶辫触锛屼絾宸叉墦寮�瀹℃壒绐楀彛");
+      }
     },
 
     /** 鎻愪氦瀹℃壒 */
-    submitApprove() {
-      this.$refs["approveForm"].validate(valid => {
+    async submitApprove() {
+      try {
+        const valid = await this.$refs.approveForm.validate();
         if (valid) {
-          // 妯℃嫙瀹℃壒鎻愪氦
+          // 浣跨敤瀹屾暣鐨勬渚嬫暟鎹綔涓哄熀纭�锛岀‘淇濇墍鏈夊瓧娈甸兘琚繚鐣�
+          const approveData = {
+            ...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: "褰撳墠鐢ㄦ埛"
+          };
+
+          // 绉婚櫎鍙兘涓嶉渶瑕佺殑瀛楁锛堟牴鎹疄闄匒PI闇�姹傝皟鏁达級
+          delete approveData.createTime; // 鍒涘缓鏃堕棿涓嶅簲琚洿鏂�
+          delete approveData.createBy; // 鍒涘缓浜轰笉搴斿彉
+
+          await donateEdit(approveData);
           this.$modal.msgSuccess("瀹℃壒鎴愬姛");
           this.approveOpen = false;
-          // 鏇存柊妗堜緥鐘舵��
-          const caseItem = this.caseList.find(
-            item => item.id === this.approveForm.caseId
-          );
-          if (caseItem) {
-            caseItem.status = this.approveForm.approveResult;
-            caseItem.approveTime = new Date().toLocaleString();
-            caseItem.approverName = "褰撳墠鐢ㄦ埛";
-            caseItem.approveOpinion = this.approveForm.approveOpinion;
-          }
+          this.getList(); // 閲嶆柊鍔犺浇鍒楄〃
         }
-      });
+      } catch (error) {
+        console.error("瀹℃壒澶辫触:", error);
+        if (error !== "cancel") {
+          this.$modal.msgError("瀹℃壒澶辫触");
+        }
+      }
     },
+
     /** 鏂板鎸夐挳鎿嶄綔 */
     handleAdd() {
       this.$router.push("/case/add");
     },
 
     /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
+    async handleDelete(row) {
       const ids = row.id || this.ids;
-      this.$modal
-        .confirm('鏄惁纭鍒犻櫎浣忛櫌鍙蜂负"' + ids + '"鐨勬暟鎹」锛�')
-        .then(() => {
-          // 妯℃嫙鍒犻櫎鎿嶄綔
-          this.caseList = this.caseList.filter(item => !ids.includes(item.id));
-          this.total = this.caseList.length;
-          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        })
-        .catch(() => {});
+      try {
+        await this.$modal.confirm(
+          '鏄惁纭鍒犻櫎妗堜緥缂栧彿涓�"' + ids + '"鐨勬暟鎹」锛�'
+        );
+        await donateDel(ids);
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        this.getList();
+      } catch (error) {
+        if (error !== "cancel") {
+          console.error("鍒犻櫎澶辫触:", error);
+          this.$modal.msgError("鍒犻櫎澶辫触");
+        }
+      }
     }
   }
 };
diff --git a/src/views/business/maintain/index.vue b/src/views/business/maintain/index.vue
index 3efbb4d..ebd1884 100644
--- a/src/views/business/maintain/index.vue
+++ b/src/views/business/maintain/index.vue
@@ -49,7 +49,7 @@
             <el-option label="鏈畬鎴愭崘鐚�" value="5" />
           </el-select>
         </el-form-item>
-        <el-form-item label="褰曞叆鏃堕棿" prop="recordTimeRange">
+        <el-form-item label="妗f褰曞叆鏃堕棿" prop="recordTimeRange">
           <el-date-picker
             v-model="queryParams.recordTimeRange"
             type="daterange"
@@ -204,7 +204,7 @@
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column
+        <!-- <el-table-column
           label="鎶ょ悊鏍告煡琛ㄥ綍鍏ユ椂闂�"
           align="center"
           prop="lastRecordTime"
@@ -217,7 +217,7 @@
                 : "-"
             }}</span>
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column
           label="鍗忚皟鍛�"
           align="center"
diff --git a/src/views/business/transfer/TransportEdit.vue b/src/views/business/transfer/TransportEdit.vue
index 227f050..a42de59 100644
--- a/src/views/business/transfer/TransportEdit.vue
+++ b/src/views/business/transfer/TransportEdit.vue
@@ -7,7 +7,12 @@
     :close-on-click-modal="false"
     @close="handleClose"
   >
-    <el-form ref="editForm" :model="formData" :rules="formRules" label-width="120px">
+    <el-form
+      ref="editForm"
+      :model="formData"
+      :rules="formRules"
+      label-width="120px"
+    >
       <!-- 鍩虹淇℃伅 -->
       <el-card class="form-section" shadow="never">
         <div slot="header" class="section-header">
@@ -17,28 +22,42 @@
 
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="杞繍鍗曞彿" prop="id">
-              <el-input v-model="formData.id" :disabled="isEdit" placeholder="绯荤粺鑷姩鐢熸垚" />
+            <el-form-item label="杞繍鍗曞彿" prop="reportId">
+              <el-input
+                v-model="formData.reportId"
+                :disabled="isEdit"
+                placeholder="绯荤粺鑷姩鐢熸垚"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="浣忛櫌鍙�" prop="caseNo">
-              <el-input v-model="formData.caseNo" placeholder="璇疯緭鍏ヤ綇闄㈠彿" />
+            <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
+              <el-input
+                v-model="formData.caseNo"
+                placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+              />
             </el-form-item>
           </el-col>
         </el-row>
 
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
-              <el-input v-model="formData.donorName" placeholder="璇疯緭鍏ユ崘鐚�呭鍚�" />
+            <el-form-item label="鎮h�呭鍚�" prop="patName">
+              <el-input
+                v-model="formData.patName"
+                placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鎬у埆" prop="gender">
-              <el-select v-model="formData.gender" placeholder="璇烽�夋嫨鎬у埆" style="width: 100%">
-                <el-option label="鐢�" value="鐢�" />
-                <el-option label="濂�" value="濂�" />
+            <el-form-item label="鎬у埆" prop="sex">
+              <el-select
+                v-model="formData.sex"
+                placeholder="璇烽�夋嫨鎬у埆"
+                style="width: 100%"
+              >
+                <el-option label="鐢�" value="1" />
+                <el-option label="濂�" value="2" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -57,8 +76,38 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鐤剧梾璇婃柇" prop="diagnosis">
-              <el-input v-model="formData.diagnosis" placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂�" />
+            <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname">
+              <el-input
+                v-model="formData.diagnosisname"
+                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-office-building" style="color: #67C23A; 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="formData.treatmentHospitalName"
+                placeholder="璇疯緭鍏ユ不鐤楀尰闄㈠悕绉�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="娌荤枟绉戝" prop="treatmentDeptName">
+              <el-input
+                v-model="formData.treatmentDeptName"
+                placeholder="璇疯緭鍏ユ不鐤楃瀹ゅ悕绉�"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -67,93 +116,228 @@
       <!-- 杞繍淇℃伅 -->
       <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>
+          <i class="el-icon-location-information" style="color: #E6A23C; margin-right: 8px;"></i>
           <span>杞繍淇℃伅</span>
         </div>
 
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鍑哄彂鍖婚櫌" prop="hospitalName">
-              <el-input v-model="formData.hospitalName" placeholder="璇疯緭鍏ュ嚭鍙戝尰闄�" />
+            <el-form-item label="鍑哄彂鍦扮偣" prop="transportStartPlace">
+              <el-input
+                v-model="formData.transportStartPlace"
+                placeholder="璇疯緭鍏ュ嚭鍙戝湴鐐�"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鐩殑鍖婚櫌" prop="destinationHospital">
-              <el-input v-model="formData.destinationHospital" placeholder="璇疯緭鍏ョ洰鐨勫尰闄�" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="璁″垝杞繍鏃堕棿" prop="transportTime">
+            <el-form-item label="鍑哄彂鏃堕棿" prop="transportStartTime">
               <el-date-picker
-                v-model="formData.transportTime"
+                v-model="formData.transportStartTime"
                 type="datetime"
-                placeholder="閫夋嫨杞繍鏃堕棿"
+                placeholder="閫夋嫨鍑哄彂鏃堕棿"
                 value-format="yyyy-MM-dd HH:mm:ss"
                 style="width: 100%"
               />
             </el-form-item>
           </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="璐熻矗鍗忚皟鍛�" prop="coordinator">
-              <el-input v-model="formData.coordinator" placeholder="璇疯緭鍏ュ崗璋冨憳濮撳悕" />
+            <el-form-item label="杞繍鐘舵��" prop="transitStatus">
+              <el-select
+                v-model="formData.transitStatus"
+                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="5" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璐熻矗鍗忚皟鍛�" prop="contactPerson">
+              <el-input
+                v-model="formData.contactPerson"
+                placeholder="璇疯緭鍏ュ崗璋冨憳濮撳悕"
+              />
             </el-form-item>
           </el-col>
         </el-row>
-
-        <el-form-item label="鍑哄彂鍦扮偣" prop="departureLocation">
-          <el-input v-model="formData.departureLocation" placeholder="璇疯緭鍏ヨ缁嗗嚭鍙戝湴鐐�" />
-        </el-form-item>
       </el-card>
 
-      <!-- 鍥㈤槦鎴愬憳 -->
+      <!-- 鍖绘姢浜哄憳淇℃伅 -->
       <el-card class="form-section" shadow="never">
         <div slot="header" class="section-header">
-          <i class="el-icon-user" style="color: #E6A23C; margin-right: 8px;"></i>
-          <span>鍥㈤槦鎴愬憳</span>
+          <i class="el-icon-user" style="color: #F56C6C; margin-right: 8px;"></i>
+          <span>鍖绘姢浜哄憳淇℃伅</span>
         </div>
 
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鎬ヨ瘖绉戝尰鐢�" prop="emergencyDoctor">
-              <el-input v-model="formData.emergencyDoctor" placeholder="璇疯緭鍏ユ�ヨ瘖绉戝尰鐢�" />
+            <el-form-item label="鎬ヨ瘖绉戝尰鐢�" prop="doctor">
+              <el-input
+                v-model="formData.doctor"
+                placeholder="璇疯緭鍏ユ�ヨ瘖绉戝尰鐢�"
+              />
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍖荤敓鐢佃瘽" prop="doctorPhone">
+              <el-input
+                v-model="formData.doctorPhone"
+                placeholder="璇疯緭鍏ュ尰鐢熸墜鏈哄彿"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="鎶ゅ+" prop="nurse">
               <el-input v-model="formData.nurse" placeholder="璇疯緭鍏ユ姢澹鍚�" />
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎶ゅ+鐢佃瘽" prop="nursePhone">
+              <el-input
+                v-model="formData.nursePhone"
+                placeholder="璇疯緭鍏ユ姢澹墜鏈哄彿"
+              />
+            </el-form-item>
+          </el-col>
         </el-row>
 
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鍙告満" prop="driver">
-              <el-input v-model="formData.driver" placeholder="璇疯緭鍏ュ徃鏈哄鍚�" />
+            <el-form-item label="椹鹃┒鍛�" prop="driver">
+              <el-input
+                v-model="formData.driver"
+                placeholder="璇疯緭鍏ラ┚椹跺憳濮撳悕"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
+            <el-form-item label="椹鹃┒鍛樼數璇�" prop="driverPhone">
+              <el-input
+                v-model="formData.driverPhone"
+                placeholder="璇疯緭鍏ラ┚椹跺憳鎵嬫満鍙�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
             <el-form-item label="ICU璇勪及鍖荤敓" prop="icuDoctor">
-              <el-input v-model="formData.icuDoctor" placeholder="璇疯緭鍏CU鍖荤敓" />
+              <el-input
+                v-model="formData.icuDoctor"
+                placeholder="璇疯緭鍏CU璇勪及鍖荤敓"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="ICU鍖荤敓鐢佃瘽" prop="icuDoctorPhone">
+              <el-input
+                v-model="formData.icuDoctorPhone"
+                placeholder="璇疯緭鍏CU鍖荤敓鎵嬫満鍙�"
+              />
             </el-form-item>
           </el-col>
         </el-row>
       </el-card>
 
+      <!-- 闄勪欢淇℃伅 -->
+      <el-card class="form-section" shadow="never">
+        <div slot="header" class="section-header">
+          <i class="el-icon-folder" style="color: #909399; 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="formData.annexfilesList && formData.annexfilesList.length > 0">
+          <div class="list-title">宸蹭笂浼犻檮浠� ({{ formData.annexfilesList.length }})</div>
+          <el-table :data="formData.annexfilesList" style="width: 100%" size="small">
+            <el-table-column label="鏂囦欢鍚�" min-width="200">
+              <template slot-scope="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 slot-scope="scope">
+                <el-tag size="small">{{ getFileType(scope.row.fileName) }}</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="鍒涘缓鏃堕棿" width="160">
+              <template slot-scope="scope">
+                <span>{{ formatDateTime(scope.row.createTime) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鎿嶄綔" width="180">
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  type="primary"
+                  @click="handlePreview(scope.row)"
+                >
+                  棰勮
+                </el-button>
+                <el-button
+                  size="mini"
+                  type="success"
+                  @click="handleDownload(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: #909399; margin-right: 8px;"></i>
+          <i class="el-icon-edit" style="color: #409EFF; margin-right: 8px;"></i>
           <span>澶囨敞淇℃伅</span>
         </div>
-        <el-form-item prop="remarks">
+        <el-form-item prop="remark">
           <el-input
-            v-model="formData.remarks"
+            v-model="formData.remark"
             type="textarea"
             :rows="4"
-            placeholder="璇疯緭鍏ヨ浆杩愬娉ㄤ俊鎭�"
+            placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
             maxlength="500"
             show-word-limit
           />
@@ -165,12 +349,29 @@
       <el-button @click="handleClose">鍙栨秷</el-button>
       <el-button type="primary" :loading="saveLoading" @click="handleSave">淇濆瓨</el-button>
     </div>
+
+    <!-- 鏂囦欢棰勮寮圭獥 -->
+    <FilePreviewDialog
+      :visible="previewVisible"
+      :file="currentPreviewFile"
+      @close="previewVisible = false"
+      @download="handleDownload"
+    />
   </el-dialog>
 </template>
 
 <script>
+import { transportAdd, transportEdit } from "@/api/businessApi/index";
+import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
+import dayjs from "dayjs";
+
 export default {
   name: "TransportEdit",
+  components: {
+    UploadAttachment,
+    FilePreviewDialog
+  },
   props: {
     editOpen: {
       type: Boolean,
@@ -188,34 +389,38 @@
   data() {
     return {
       saveLoading: false,
+      // 棰勮鐩稿叧
+      previewVisible: false,
+      currentPreviewFile: null,
+      // 闄勪欢鐩稿叧閰嶇疆
+      attachmentLimit: 10,
+      attachmentAccept: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx",
+      attachmentFileList: [],
+      // 琛ㄥ崟鏁版嵁
       formData: this.getDefaultFormData(),
       formRules: {
         caseNo: [
-          { required: true, message: '璇疯緭鍏ヤ綇闄㈠彿', trigger: 'blur' }
+          { required: true, message: "璇疯緭鍏ユ渚嬬紪鍙�", trigger: "blur" }
         ],
-        donorName: [
-          { required: true, message: '璇疯緭鍏ユ崘鐚�呭鍚�', trigger: 'blur' }
+        patName: [
+          { required: true, message: "璇疯緭鍏ユ偅鑰呭鍚�", trigger: "blur" }
         ],
-        gender: [
-          { required: true, message: '璇烽�夋嫨鎬у埆', trigger: 'change' }
+        sex: [{ required: true, message: "璇烽�夋嫨鎬у埆", trigger: "change" }],
+        age: [{ required: true, message: "璇疯緭鍏ュ勾榫�", trigger: "blur" }],
+        diagnosisname: [
+          { required: true, message: "璇疯緭鍏ョ柧鐥呰瘖鏂悕绉�", trigger: "blur" }
         ],
-        age: [
-          { required: true, message: '璇疯緭鍏ュ勾榫�', trigger: 'blur' }
+        treatmentHospitalName: [
+          { required: true, message: "璇疯緭鍏ユ不鐤楀尰闄㈠悕绉�", trigger: "blur" }
         ],
-        diagnosis: [
-          { required: true, message: '璇疯緭鍏ョ柧鐥呰瘖鏂�', trigger: 'blur' }
+        transportStartPlace: [
+          { required: true, message: "璇疯緭鍏ュ嚭鍙戝湴鐐�", trigger: "blur" }
         ],
-        hospitalName: [
-          { required: true, message: '璇疯緭鍏ュ嚭鍙戝尰闄�', trigger: 'blur' }
+        transportStartTime: [
+          { required: true, message: "璇烽�夋嫨鍑哄彂鏃堕棿", trigger: "change" }
         ],
-        destinationHospital: [
-          { required: true, message: '璇疯緭鍏ョ洰鐨勫尰闄�', trigger: 'blur' }
-        ],
-        transportTime: [
-          { required: true, message: '璇烽�夋嫨杞繍鏃堕棿', trigger: 'change' }
-        ],
-        coordinator: [
-          { required: true, message: '璇疯緭鍏ヨ礋璐e崗璋冨憳', trigger: 'blur' }
+        contactPerson: [
+          { required: true, message: "璇疯緭鍏ヨ礋璐e崗璋冨憳", trigger: "blur" }
         ]
       }
     };
@@ -223,9 +428,11 @@
   watch: {
     editOpen(val) {
       if (val) {
-        this.formData = this.isEdit ?
-          { ...this.transportData } :
-          this.getDefaultFormData();
+        this.formData = this.isEdit
+          ? { ...this.getDefaultFormData(), ...this.transportData }
+          : this.getDefaultFormData();
+
+        this.initAttachmentList();
 
         this.$nextTick(() => {
           this.$refs.editForm && this.$refs.editForm.clearValidate();
@@ -234,32 +441,179 @@
     }
   },
   methods: {
+    /** 鑾峰彇榛樿琛ㄥ崟鏁版嵁 */
     getDefaultFormData() {
       return {
-        id: '',
-        caseNo: '',
-        donorName: '',
-        gender: '',
-        age: null,
-        diagnosis: '',
-        hospitalName: '',
-        destinationHospital: '',
-        transportTime: '',
-        coordinator: '',
-        departureLocation: '',
-        emergencyDoctor: '',
-        nurse: '',
-        driver: '',
-        icuDoctor: '',
-        remarks: '',
-        status: 'pending',
-        statusText: '寰呭嚭鍙�'
+        id: undefined,
+        reportId: undefined,
+        caseNo: undefined,
+        patName: undefined,
+        sex: undefined,
+        age: undefined,
+        diagnosisname: undefined,
+        treatmentHospitalName: undefined,
+        treatmentDeptName: undefined,
+        transportStartPlace: undefined,
+        transportStartTime: undefined,
+        contactPerson: undefined,
+        transitStatus: 1,
+        doctor: undefined,
+        doctorPhone: undefined,
+        nurse: undefined,
+        nursePhone: undefined,
+        driver: undefined,
+        driverPhone: undefined,
+        icuDoctor: undefined,
+        icuDoctorPhone: undefined,
+        annexfilesList: [],
+        remark: undefined,
+        createBy: undefined,
+        createTime: undefined,
+        updateBy: undefined,
+        updateTime: undefined,
+        delFlag: 0
       };
     },
 
+    /** 鍒濆鍖栭檮浠跺垪琛� */
+    initAttachmentList() {
+      if (this.isEdit && this.transportData.annexfilesList) {
+        this.formData.annexfilesList = [...this.transportData.annexfilesList];
+        this.attachmentFileList = this.transportData.annexfilesList.map(item => ({
+          uid: item.id || Math.random(),
+          name: item.fileName,
+          url: item.path || item.fileUrl,
+          status: 'success'
+        }));
+      } else {
+        this.formData.annexfilesList = [];
+        this.attachmentFileList = [];
+      }
+    },
+
+    /** 闄勪欢鍙樺寲澶勭悊 */
+    handleAttachmentChange(fileList) {
+      this.attachmentFileList = fileList;
+    },
+
+    /** 闄勪欢绉婚櫎澶勭悊 */
+    handleAttachmentRemove(file) {
+      if (file.url) {
+        const index = this.formData.annexfilesList.findIndex(item =>
+          item.path === file.url || item.fileUrl === file.url
+        );
+        if (index > -1) {
+          this.formData.annexfilesList.splice(index, 1);
+        }
+      }
+    },
+
+    /** 鎵嬪姩鍒犻櫎闄勪欢 */
+    handleRemoveAttachment(index) {
+      this.formData.annexfilesList.splice(index, 1);
+      this.attachmentFileList.splice(index, 1);
+      this.$message.success('闄勪欢鍒犻櫎鎴愬姛');
+    },
+
+    /** 涓婁紶鎴愬姛澶勭悊 */
+    handleUploadSuccess({ file, fileList, response }) {
+      if (response.code === 200) {
+        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'),
+          transportId: this.formData.id,
+          delFlag: 0,
+          caseNo:this.formData.caseNo
+        };
+
+        this.formData.annexfilesList.push(attachmentObj);
+        this.$message.success('鏂囦欢涓婁紶鎴愬姛');
+      }
+    },
+
+    /** 涓婁紶閿欒澶勭悊 */
+    handleUploadError({ file, fileList, error }) {
+      console.error('闄勪欢涓婁紶澶辫触:', error);
+      this.$message.error('鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯');
+    },
+
+    /** 鏂囦欢棰勮 */
+    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', 'ppt', 'pptx'];
+
+      if (imageTypes.includes(extension)) return 'image';
+      if (pdfTypes.includes(extension)) return 'pdf';
+      if (officeTypes.includes(extension)) return 'office';
+      return 'other';
+    },
+
+    /** 鑾峰彇鏂囦欢鎵╁睍鍚� */
+    getFileExtension(filename) {
+      return filename.split('.').pop().toLowerCase();
+    },
+
+    /** 鏃ユ湡鏃堕棿鏍煎紡鍖� */
+    formatDateTime(dateTime) {
+      if (!dateTime) return '';
+
+      try {
+        const date = new Date(dateTime);
+        if (isNaN(date.getTime())) return dateTime;
+
+        const year = date.getFullYear();
+        const month = String(date.getMonth() + 1).padStart(2, '0');
+        const day = String(date.getDate()).padStart(2, '0');
+        const hours = String(date.getHours()).padStart(2, '0');
+        const minutes = String(date.getMinutes()).padStart(2, '0');
+        const seconds = String(date.getSeconds()).padStart(2, '0');
+
+        return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+      } catch (error) {
+        return dateTime;
+      }
+    },
+
     handleClose() {
-      this.$emit('update:editOpen', false);
-      this.$emit('close');
+      this.$emit("update:editOpen", false);
+      this.$emit("close");
+      this.previewVisible = false;
     },
 
     async handleSave() {
@@ -267,18 +621,33 @@
         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;
 
-        // 妯℃嫙API璋冪敤
-        await new Promise(resolve => setTimeout(resolve, 1000));
+        const requestData = { ...this.formData };
+        let response;
 
-        this.$message.success(this.isEdit ? '淇敼鎴愬姛' : '鏂板缓鎴愬姛');
-        this.handleClose();
-        this.$emit('save-success');
+        if (this.isEdit) {
+          response = await transportEdit(requestData);
+        } else {
+          response = await transportAdd(requestData);
+        }
 
+        if (response.code === 200) {
+          this.$message.success(this.isEdit ? "淇敼鎴愬姛" : "鏂板缓鎴愬姛");
+          this.handleClose();
+          this.$emit("save-success");
+        } else {
+          this.$message.error(response.msg || "鎿嶄綔澶辫触");
+        }
       } catch (error) {
-        console.error('淇濆瓨澶辫触:', error);
-        this.$message.error('鎿嶄綔澶辫触');
+        console.error("淇濆瓨澶辫触:", error);
+        this.$message.error("鎿嶄綔澶辫触锛岃绋嶅悗閲嶈瘯");
       } finally {
         this.saveLoading = false;
       }
@@ -304,6 +673,47 @@
   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;
+}
+
+.file-path {
+  font-size: 12px;
+  color: #909399;
+}
+
 ::v-deep .el-card__header {
   background: #f5f7fa;
   border-bottom: 1px solid #ebeef5;
diff --git a/src/views/business/transfer/index.vue b/src/views/business/transfer/index.vue
index 0c9a95a..5325b13 100644
--- a/src/views/business/transfer/index.vue
+++ b/src/views/business/transfer/index.vue
@@ -8,45 +8,37 @@
         :inline="true"
         label-width="80px"
       >
-        <el-form-item label="杞繍鍗曞彿" prop="transportNo">
-          <el-input
-            v-model="queryParams.transportNo"
-            placeholder="璇疯緭鍏ヨ浆杩愬崟鍙�"
-            clearable
-            style="width: 200px"
-            @keyup.enter.native="handleQuery"
-          />
-        </el-form-item>
-        <el-form-item label="浣忛櫌鍙�" prop="caseNo">
+        <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
           <el-input
             v-model="queryParams.caseNo"
-            placeholder="璇疯緭鍏ヤ綇闄㈠彿"
+            placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
             clearable
             style="width: 200px"
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
+        <el-form-item label="鎮h�呭鍚�" prop="patName">
           <el-input
-            v-model="queryParams.donorName"
-            placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
+            v-model="queryParams.patName"
+            placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
             clearable
             style="width: 200px"
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="杞繍鐘舵��" prop="status">
+        <el-form-item label="杞繍鐘舵��" prop="transitStatus">
           <el-select
-            v-model="queryParams.status"
+            v-model="queryParams.transitStatus"
             placeholder="杞繍鐘舵��"
             clearable
             style="width: 200px"
           >
             <el-option label="鍏ㄩ儴" value="" />
-            <el-option label="寰呭嚭鍙�" value="pending" />
-            <el-option label="杞繍涓�" value="transporting" />
-            <el-option label="宸插畬鎴�" value="completed" />
-            <el-option label="宸插彇娑�" value="cancelled" />
+            <el-option label="寰呰浆杩�" :value="1" />
+            <el-option label="杞繍涓�" :value="2" />
+            <el-option label="杞繍瀹屾垚" :value="3" />
+            <el-option label="杞繍鍙栨秷" :value="4" />
+            <el-option label="鏆傚瓨" :value="5" />
           </el-select>
         </el-form-item>
         <el-form-item label="鍒涘缓鏃堕棿">
@@ -148,7 +140,7 @@
       ></right-toolbar>
     </el-row>
 
-    <!-- 鏁版嵁琛ㄦ牸 -->
+    <!-- 鏁版嵁琛ㄦ牸 - 鐩存帴浣跨敤鍚庣杩斿洖鐨勬暟鎹粨鏋� -->
     <el-table
       v-loading="loading"
       :data="transportList"
@@ -156,19 +148,28 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="搴忓彿" type="index" width="60" align="center" />
-      <el-table-column label="杞繍鍗曞彿" align="center" prop="id" width="140" />
       <el-table-column
-        label="浣忛櫌鍙�"
+        label="杞繍鍗曞彿"
+        align="center"
+        prop="reportId"
+        width="140"
+      />
+      <el-table-column
+        label="妗堜緥缂栧彿"
         align="center"
         prop="caseNo"
         width="140"
       />
-      <el-table-column label="鎹愮尞鑰呬俊鎭�" align="center" width="180">
+      <el-table-column label="鎮h�呬俊鎭�" align="center" width="260">
         <template slot-scope="scope">
           <div class="donor-info">
-            <div class="donor-name">{{ scope.row.donorName }}</div>
+            <div class="donor-name">{{ scope.row.patName }}</div>
             <div class="donor-details">
-              {{ scope.row.gender }} | {{ scope.row.age }}宀�
+              <dict-tag
+                :options="dict.type.sys_user_sex"
+                :value="parseInt(scope.row.sex)"
+              />
+              | {{ scope.row.age }}宀�
             </div>
           </div>
         </template>
@@ -176,37 +177,37 @@
       <el-table-column
         label="鐤剧梾璇婃柇"
         align="center"
-        prop="diagnosis"
+        prop="diagnosisname"
         min-width="200"
         show-overflow-tooltip
       />
       <el-table-column
-        label="鍖荤枟鏈烘瀯"
+        label="娌荤枟鍖婚櫌"
         align="center"
-        prop="hospitalName"
+        prop="treatmentHospitalName"
         width="150"
       />
       <el-table-column
         label="璁″垝杞繍鏃堕棿"
         align="center"
-        prop="transportTime"
+        prop="transportStartTime"
         width="160"
       />
       <el-table-column
         label="璐熻矗鍗忚皟鍛�"
         align="center"
-        prop="coordinator"
+        prop="contactPerson"
         width="100"
       />
       <el-table-column
         label="杞繍鐘舵��"
         align="center"
-        prop="status"
+        prop="transitStatus"
         width="100"
       >
         <template slot-scope="scope">
-          <el-tag :type="scope.row.status | statusFilter">
-            {{ scope.row.statusText }}
+          <el-tag :type="getStatusTagType(scope.row.transitStatus)">
+            {{ getStatusText(scope.row.transitStatus) }}
           </el-tag>
         </template>
       </el-table-column>
@@ -242,7 +243,7 @@
             type="text"
             icon="el-icon-video-play"
             @click="handleStartTransport(scope.row)"
-            v-if="scope.row.status === 'pending'"
+            v-if="scope.row.transitStatus === 1"
             >寮�濮嬭浆杩�</el-button
           >
           <el-button
@@ -250,7 +251,7 @@
             type="text"
             icon="el-icon-check"
             @click="handleCompleteTransport(scope.row)"
-            v-if="scope.row.status === 'transporting'"
+            v-if="scope.row.transitStatus === 2"
             >瀹屾垚杞繍</el-button
           >
         </template>
@@ -296,7 +297,11 @@
       append-to-body
     >
       <div class="action-confirm">
-        <p>纭畾瑕亄{ actionText }}杞繍鍗� "{{ currentTransport.id }}" 鍚楋紵</p>
+        <p>
+          纭畾瑕亄{ actionText }}杞繍鍗� "{{
+            currentTransport.reportId || currentTransport.id
+          }}" 鍚楋紵
+        </p>
       </div>
       <div slot="footer" class="dialog-footer">
         <el-button @click="actionOpen = false">鍙� 娑�</el-button>
@@ -308,17 +313,19 @@
 
 <script>
 import {
-  listTransport,
-  getTransport,
-  delTransport,
-  updateTransportStatus
-} from "@/api/system/business";
+  transportList,
+  transportAdd,
+  transportEdit,
+  transportDelete,
+  transportInfo
+} from "@/api/businessApi/index";
 import TransportDetail from "./transportDetail";
 import TransportEdit from "./TransportEdit";
 
 export default {
   name: "TransportList",
   components: { TransportDetail, TransportEdit },
+  dicts: ["sys_user_sex", "sys_BloodType"],
   data() {
     return {
       // 閬僵灞�
@@ -333,7 +340,7 @@
       showSearch: true,
       // 鎬绘潯鏁�
       total: 0,
-      // 杞繍鍗曡〃鏍兼暟鎹�
+      // 杞繍鍗曡〃鏍兼暟鎹� - 鐩存帴浣跨敤鍚庣杩斿洖鐨勬暟鎹粨鏋�
       transportList: [],
       // 璇︽儏寮规鏄惁鏄剧ず
       detailOpen: false,
@@ -358,143 +365,101 @@
         pendingTransports: 0,
         completedTransports: 0
       },
-      // 鏌ヨ鍙傛暟
+      // 鏌ヨ鍙傛暟锛堝畬鍏ㄩ�傞厤鍚庣鎺ュ彛锛�
       queryParams: {
         pageNum: 1,
         pageSize: 10,
-        transportNo: undefined,
-        caseNo: undefined,
-        donorName: undefined,
-        status: undefined
+        caseNo: undefined, // 妗堜緥缂栧彿
+        patName: undefined, // 鎮h�呭鍚�
+        transitStatus: undefined, // 杞繍鐘舵�侊細1寰呰浆杩� 2杞繍涓� 3杞繍瀹屾垚 4杞繍鍙栨秷 5鏆傚瓨
+        searchValue: undefined, // 鎼滅储鍊�
+        params: {} // 鍏朵粬鍙傛暟瀵硅薄
       }
     };
-  },
-  filters: {
-    statusFilter(status) {
-      const statusMap = {
-        pending: "warning",
-        transporting: "primary",
-        completed: "success",
-        cancelled: "danger"
-      };
-      return statusMap[status];
-    }
   },
   created() {
     this.getList();
   },
   methods: {
-    /** 鏌ヨ杞繍鍗曞垪琛� */
-    getList() {
+    /** 鏌ヨ杞繍鍗曞垪琛� - 鐩存帴浣跨敤鍚庣鏁版嵁缁撴瀯 */
+    async getList() {
       this.loading = true;
-      // 妯℃嫙API璋冪敤寤惰繜
-      setTimeout(() => {
-        // 娴嬭瘯鏁版嵁
-        this.transportList = [
-          {
-            id: "T20241217001",
-            caseNo: "DON20241216001",
-            donorName: "寮犱笁",
-            gender: "鐢�",
-            age: 38,
-            diagnosis:
-              "鑴戝浼ゅ鑷磋剳姝讳骸锛岀粡鎶㈡晳鏃犳晥瀹e竷鑴戞浜°�傚灞炲悓鎰忓櫒瀹樻崘鐚��",
-            hospitalName: "闈掑矝闀滄箹鍖婚櫌",
-            transportTime: "2024-12-17 14:30:00",
-            coordinator: "寮犲尰鐢�",
-            createTime: "2024-12-16 09:30:00",
-            status: "pending",
-            statusText: "寰呭嚭鍙�",
-            departureLocation: "闈掑矝甯傜珛鍖婚櫌鎬ヨ瘖绉�",
-            destinationHospital: "闈掑矝闀滄箹鍖婚櫌",
-            emergencyDoctor: "鐜嬪尰鐢�",
-            nurse: "鏉庢姢澹�",
-            driver: "鍒樺笀鍌�",
-            icuDoctor: "璧靛尰鐢�",
-            contacts: [
-              { role: "鍗忚皟鍛樼數璇�", phone: "13800138000" },
-              { role: "鎬ヨ瘖鍖荤敓鐢佃瘽", phone: "13800138001" },
-              { role: "鎶ゅ+鐢佃瘽", phone: "13800138002" },
-              { role: "鍙告満鐢佃瘽", phone: "13800138003" },
-              { role: "ICU鍖荤敓鐢佃瘽", phone: "13800138004" }
-            ],
-            remarks: "闇�瑕佸噯澶囧懠鍚告満绛夋�ユ晳璁惧"
-          },
-          {
-            id: "T20241217002",
-            caseNo: "DON20241216002",
-            donorName: "鏉庡洓",
-            gender: "濂�",
-            age: 45,
-            diagnosis: "鑴戞姝伙紝鑴戝共鍔熻兘涓уけ",
-            hospitalName: "闈掑矝澶у闄勫睘鍖婚櫌",
-            transportTime: "2024-12-17 16:00:00",
-            coordinator: "鏉庡尰鐢�",
-            createTime: "2024-12-16 11:20:00",
-            status: "transporting",
-            statusText: "杞繍涓�",
-            departureLocation: "闈掑矝澶у闄勫睘鍖婚櫌ICU",
-            destinationHospital: "闈掑矝鍣ㄥ畼绉绘涓績",
-            currentLocation: "闈掑矝甯傚崡鍖洪娓腑璺�",
-            estimatedTime: "30鍒嗛挓"
-          },
-          {
-            id: "T20241216003",
-            caseNo: "DON20241215001",
-            donorName: "鐜嬩簲",
-            gender: "鐢�",
-            age: 52,
-            diagnosis: "蹇冭剰楠ゅ仠锛屽鍣ㄥ畼鍔熻兘琛扮",
-            hospitalName: "闈掑矝甯傜珛鍖婚櫌",
-            transportTime: "2024-12-16 10:15:00",
-            coordinator: "鐜嬪尰鐢�",
-            createTime: "2024-12-15 14:45:00",
-            status: "completed",
-            statusText: "宸插畬鎴�",
-            departureLocation: "闈掑矝甯傜珛鍖婚櫌蹇冨唴绉�",
-            destinationHospital: "闈掑矝鍣ㄥ畼绉绘涓績",
-            completedTime: "2024-12-16 12:30:00",
-            distance: "15鍏噷",
-            duration: "2灏忔椂15鍒嗛挓"
-          },
-          {
-            id: "T20241216004",
-            caseNo: "DON20241214001",
-            donorName: "璧靛叚",
-            gender: "濂�",
-            age: 29,
-            diagnosis: "鎬ユ�ц倽琛扮",
-            hospitalName: "闈掑矝绉戝ぇ鍖婚櫌",
-            transportTime: "2024-12-16 08:30:00",
-            coordinator: "璧靛尰鐢�",
-            createTime: "2024-12-14 16:20:00",
-            status: "cancelled",
-            statusText: "宸插彇娑�",
-            cancelReason: "瀹跺睘涓存椂鏀瑰彉鍐冲畾"
-          }
-        ];
 
-        // 鏇存柊缁熻鏁版嵁
-        this.updateStats();
-        this.total = this.transportList.length;
+      try {
+        // 鏋勫缓绗﹀悎鍚庣鎺ュ彛鐨勮姹傚弬鏁� [1,2](@ref)
+        const requestParams = {
+          pageNum: this.queryParams.pageNum,
+          pageSize: this.queryParams.pageSize,
+          caseNo: this.queryParams.caseNo,
+          patName: this.queryParams.patName,
+          transitStatus: this.queryParams.transitStatus,
+          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 || "鑾峰彇杞繍鍗曞垪琛ㄥけ璐�");
+        }
+      } catch (error) {
+        console.error("鑾峰彇杞繍鍗曞垪琛ㄥけ璐�:", error);
+        this.$modal.msgError("缃戠粶璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯");
+      } finally {
         this.loading = false;
-      }, 500);
+      }
+    },
+
+    /** 鑾峰彇鐘舵�佹爣绛剧被鍨� */
+    getStatusTagType(transitStatus) {
+      const statusMap = {
+        1: "warning", // 寰呰浆杩�
+        2: "primary", // 杞繍涓�
+        3: "success", // 杞繍瀹屾垚
+        4: "danger", // 杞繍鍙栨秷
+        5: "info" // 鏆傚瓨
+      };
+      return statusMap[transitStatus] || "info";
+    },
+
+    /** 鑾峰彇鐘舵�佹枃鏈� */
+    getStatusText(transitStatus) {
+      const statusMap = {
+        1: "寰呰浆杩�",
+        2: "杞繍涓�",
+        3: "杞繍瀹屾垚",
+        4: "杞繍鍙栨秷",
+        5: "鏆傚瓨"
+      };
+      return statusMap[transitStatus] || "鏈煡鐘舵��";
     },
 
     // 鏇存柊缁熻鏁版嵁
     updateStats() {
       this.stats.totalTransports = this.transportList.length;
       this.stats.pendingTransports = this.transportList.filter(
-        item => item.status === "pending"
+        item => item.transitStatus === 1
       ).length;
       this.stats.completedTransports = this.transportList.filter(
-        item => item.status === "completed"
+        item => item.transitStatus === 3
       ).length;
     },
 
     // 澶氶�夋閫変腑鏁版嵁
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id);
+      this.ids = selection.map(item => item.reportId || item.id);
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
@@ -504,6 +469,28 @@
       this.queryParams.pageNum = 1;
       this.getList();
     },
+
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        caseNo: undefined,
+        patName: undefined,
+        transitStatus: undefined,
+        searchValue: undefined
+      };
+      this.getList();
+    },
+
+    /** 璇︽儏鎸夐挳鎿嶄綔 */
+    handleDetail(row) {
+      this.currentTransport = row;
+      this.detailTitle = `杞繍鍗曡鎯� - ${row.reportId || row.id}`;
+      this.detailOpen = true;
+    },
+
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
       this.currentTransport = row || {};
@@ -528,22 +515,9 @@
     handleSaveSuccess() {
       this.getList(); // 閲嶆柊鍔犺浇鍒楄〃
     },
-    /** 閲嶇疆鎸夐挳鎿嶄綔 */
-    resetQuery() {
-      this.dateRange = [];
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-
-    /** 璇︽儏鎸夐挳鎿嶄綔 */
-    handleDetail(row) {
-      this.currentTransport = row;
-      this.detailTitle = `杞繍鍗曡鎯� - ${row.id}`;
-      this.detailOpen = true;
-    },
 
     /** 寮�濮嬭浆杩愭搷浣� */
-    handleStartTransport(row) {
+    async handleStartTransport(row) {
       this.currentTransport = row;
       this.actionTitle = "寮�濮嬭浆杩�";
       this.actionText = "寮�濮�";
@@ -551,59 +525,70 @@
     },
 
     /** 瀹屾垚杞繍鎿嶄綔 */
-    handleCompleteTransport(row) {
+    async handleCompleteTransport(row) {
       this.currentTransport = row;
       this.actionTitle = "瀹屾垚杞繍";
       this.actionText = "瀹屾垚";
       this.actionOpen = true;
     },
 
-    /** 纭鎿嶄綔 */
-    confirmAction() {
-      const index = this.transportList.findIndex(
-        item => item.id === this.currentTransport.id
-      );
-      if (index !== -1) {
+    /** 纭鎿嶄綔 - 浣跨敤鍚庣鍘熷鏁版嵁缁撴瀯 [4](@ref) */
+    async confirmAction() {
+      try {
+        let requestData = {
+          id: this.currentTransport.id || this.currentTransport.reportId
+        };
+
         if (this.actionText === "寮�濮�") {
-          this.transportList[index].status = "transporting";
-          this.transportList[index].statusText = "杞繍涓�";
+          requestData.transitStatus = 2; // 璁剧疆涓鸿浆杩愪腑
         } else if (this.actionText === "瀹屾垚") {
-          this.transportList[index].status = "completed";
-          this.transportList[index].statusText = "宸插畬鎴�";
-          this.transportList[index].completedTime = new Date().toLocaleString();
+          requestData.transitStatus = 3; // 璁剧疆涓鸿浆杩愬畬鎴�
         }
 
-        // 鏇存柊缁熻鏁版嵁
-        this.updateStats();
+        // 鐩存帴浼犻�掑悗绔渶瑕佺殑鍙傛暟 [8](@ref)
+        const response = await transportEdit(requestData);
 
-        this.$modal.msgSuccess(`${this.actionText}鎴愬姛`);
+        if (response.code === 200) {
+          this.$modal.msgSuccess(`${this.actionText}杞繍鎴愬姛`);
+          this.getList(); // 鍒锋柊鍒楄〃
+        } else {
+          this.$modal.msgError(response.msg || `${this.actionText}杞繍澶辫触`);
+        }
+      } catch (error) {
+        console.error(`${this.actionText}杞繍澶辫触:`, error);
+        this.$modal.msgError("鎿嶄綔澶辫触锛岃绋嶅悗閲嶈瘯");
       }
       this.actionOpen = false;
     },
 
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 - 浣跨敤鍚庣鍘熷ID [1](@ref) */
+    async handleDelete(row) {
+      const ids = row.reportId || row.id || this.ids;
 
+      try {
+        await this.$modal.confirm(
+          '鏄惁纭鍒犻櫎杞繍鍗曠紪鍙蜂负"' + ids + '"鐨勬暟鎹」锛�'
+        );
 
+        const response = await transportDelete(ids);
 
-
-    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$modal
-        .confirm('鏄惁纭鍒犻櫎杞繍鍗曠紪鍙蜂负"' + ids + '"鐨勬暟鎹」锛�')
-        .then(() => {
-          // 妯℃嫙鍒犻櫎鎿嶄綔
-          this.transportList = this.transportList.filter(
-            item => !ids.includes(item.id)
-          );
-          this.total = this.transportList.length;
-          this.updateStats();
+        if (response.code === 200) {
           this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        })
-        .catch(() => {});
+          this.getList(); // 鍒锋柊鍒楄〃
+        } else {
+          this.$modal.msgError(response.msg || "鍒犻櫎澶辫触");
+        }
+      } catch (error) {
+        if (error !== "cancel") {
+          console.error("鍒犻櫎澶辫触:", error);
+          this.$modal.msgError("鍒犻櫎澶辫触锛岃绋嶅悗閲嶈瘯");
+        }
+      }
     },
 
     /** 瀵煎嚭鎸夐挳鎿嶄綔 */
     handleExport() {
+      // 鐩存帴浣跨敤鍚庣鍙傛暟缁撴瀯杩涜瀵煎嚭 [5](@ref)
       this.download(
         "system/transport/export",
         {
@@ -675,7 +660,9 @@
 }
 
 .donor-info {
-  text-align: left;
+  text-align: center;
+  display: flex;
+  justify-content: center
 }
 
 .donor-name {
@@ -684,8 +671,10 @@
 }
 
 .donor-details {
-  font-size: 12px;
-  color: #909399;
+  margin-left: 5px;
+  font-size: 16px;
+  color: #093ca4;
+  display: flex;
 }
 
 .mb8 {
diff --git a/src/views/business/transfer/transportDetail.vue b/src/views/business/transfer/transportDetail.vue
index 1bd298a..db548c7 100644
--- a/src/views/business/transfer/transportDetail.vue
+++ b/src/views/business/transfer/transportDetail.vue
@@ -3,84 +3,145 @@
     <!-- 鍩虹淇℃伅妯″潡 -->
     <el-card class="detail-section">
       <div slot="header" class="section-header">
-        <i class="el-icon-document" style="color: #409EFF; margin-right: 8px;"></i>
+        <i
+          class="el-icon-document"
+          style="color: #409EFF; margin-right: 8px;"
+        ></i>
         <span class="section-title">鍩虹淇℃伅</span>
       </div>
       <el-descriptions :column="2" border>
-        <el-descriptions-item label="杞繍鍗曞彿">{{ transportData.id }}</el-descriptions-item>
-        <el-descriptions-item label="浣忛櫌鍙�">{{ transportData.caseNo }}</el-descriptions-item>
-        <el-descriptions-item label="鎹愮尞鑰呭鍚�">{{ transportData.donorName }}</el-descriptions-item>
-        <el-descriptions-item label="鎬у埆">{{ transportData.gender }}</el-descriptions-item>
-        <el-descriptions-item label="骞撮緞">{{ transportData.age }}宀�</el-descriptions-item>
-        <el-descriptions-item label="鐤剧梾璇婃柇">{{ transportData.diagnosis }}</el-descriptions-item>
-        <el-descriptions-item label="鍑哄彂鍖婚櫌">{{ transportData.hospitalName }}</el-descriptions-item>
-        <el-descriptions-item label="鐩殑鍖婚櫌">{{ transportData.destinationHospital }}</el-descriptions-item>
-        <el-descriptions-item label="璁″垝杞繍鏃堕棿">{{ transportData.transportTime }}</el-descriptions-item>
-        <el-descriptions-item label="璐熻矗鍗忚皟鍛�">{{ transportData.coordinator }}</el-descriptions-item>
+        <el-descriptions-item label="杞繍鍗曞彿">{{
+          transportData.reportId || transportData.id
+        }}</el-descriptions-item>
+        <el-descriptions-item label="妗堜緥缂栧彿">{{
+          transportData.caseNo
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鎮h�呭鍚�">{{
+          transportData.patName
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鎬у埆">
+          <dict-tag
+            :options="dict.type.sys_user_sex"
+            :value="parseInt(transportData.sex)"
+          />
+        </el-descriptions-item>
+        <el-descriptions-item label="骞撮緞"
+          >{{ transportData.age }}宀�</el-descriptions-item
+        >
+        <el-descriptions-item label="鐤剧梾璇婃柇">{{
+          transportData.diagnosisname
+        }}</el-descriptions-item>
+        <el-descriptions-item label="娌荤枟鍖婚櫌">{{
+          transportData.treatmentHospitalName
+        }}</el-descriptions-item>
+        <el-descriptions-item label="娌荤枟绉戝">{{
+          transportData.treatmentDeptName
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鍑哄彂鍦扮偣">{{
+          transportData.transportStartPlace
+        }}</el-descriptions-item>
+        <el-descriptions-item label="璁″垝杞繍鏃堕棿">{{
+          transportData.transportStartTime
+        }}</el-descriptions-item>
+        <el-descriptions-item label="璐熻矗鍗忚皟鍛�">{{
+          transportData.contactPerson
+        }}</el-descriptions-item>
         <el-descriptions-item label="杞繍鐘舵��">
-          <el-tag :type="transportData.status | statusFilter">
-            {{ transportData.statusText }}
+          <el-tag :type="getStatusTagType(transportData.transitStatus)">
+            {{ getStatusText(transportData.transitStatus) }}
           </el-tag>
         </el-descriptions-item>
-        <el-descriptions-item label="鍒涘缓鏃堕棿">{{ transportData.createTime }}</el-descriptions-item>
-        <el-descriptions-item label="瀹屾垚鏃堕棿" v-if="transportData.completedTime">
-          {{ transportData.completedTime }}
-        </el-descriptions-item>
+        <el-descriptions-item label="鍒涘缓鏃堕棿">{{
+          transportData.createTime
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鏇存柊鏃堕棿">{{
+          transportData.updateTime
+        }}</el-descriptions-item>
       </el-descriptions>
     </el-card>
 
     <!-- 杞繍璇︽儏妯″潡 -->
     <el-card class="detail-section">
       <div slot="header" class="section-header">
-        <i class="el-icon-location-information" style="color: #67C23A; margin-right: 8px;"></i>
+        <i
+          class="el-icon-location-information"
+          style="color: #67C23A; margin-right: 8px;"
+        ></i>
         <span class="section-title">杞繍璇︽儏</span>
       </div>
       <el-descriptions :column="2" border>
-        <el-descriptions-item label="鍑哄彂鍦扮偣">{{ transportData.departureLocation }}</el-descriptions-item>
-        <el-descriptions-item label="鐩殑鍦�">{{ transportData.destinationHospital }}</el-descriptions-item>
-        <el-descriptions-item label="褰撳墠浣嶇疆" v-if="transportData.currentLocation">
-          {{ transportData.currentLocation }}
-        </el-descriptions-item>
-        <el-descriptions-item label="棰勮鍒拌揪鏃堕棿" v-if="transportData.estimatedTime">
-          {{ transportData.estimatedTime }}
-        </el-descriptions-item>
-        <el-descriptions-item label="杞繍璺濈" v-if="transportData.distance">
-          {{ transportData.distance }}
-        </el-descriptions-item>
-        <el-descriptions-item label="杞繍鏃堕暱" v-if="transportData.duration">
-          {{ transportData.duration }}
+        <el-descriptions-item label="鍑哄彂鍦扮偣">{{
+          transportData.transportStartPlace
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鐩殑鍖婚櫌">{{
+          transportData.treatmentHospitalName
+        }}</el-descriptions-item>
+        <el-descriptions-item label="娌荤枟绉戝">{{
+          transportData.treatmentDeptName
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鍑哄彂鏃堕棿">{{
+          transportData.transportStartTime
+        }}</el-descriptions-item>
+        <el-descriptions-item label="杞繍鐘舵��">
+          <el-tag :type="getStatusTagType(transportData.transitStatus)">
+            {{ getStatusText(transportData.transitStatus) }}
+          </el-tag>
         </el-descriptions-item>
       </el-descriptions>
     </el-card>
 
-    <!-- 鍥㈤槦鎴愬憳妯″潡 -->
+    <!-- 鍖绘姢浜哄憳淇℃伅妯″潡 -->
     <el-card class="detail-section">
       <div slot="header" class="section-header">
         <i class="el-icon-user" style="color: #E6A23C; margin-right: 8px;"></i>
-        <span class="section-title">鍥㈤槦鎴愬憳</span>
+        <span class="section-title">鍖绘姢浜哄憳淇℃伅</span>
       </div>
       <el-descriptions :column="2" border>
-        <el-descriptions-item label="鍗忚皟鍛�">{{ transportData.coordinator }}</el-descriptions-item>
-        <el-descriptions-item label="鍗忚皟鍛樼數璇�">{{ getContactPhone("鍗忚皟鍛樼數璇�") }}</el-descriptions-item>
-        <el-descriptions-item label="鎬ヨ瘖绉戝尰鐢�" v-if="transportData.emergencyDoctor">
-          {{ transportData.emergencyDoctor }}
-        </el-descriptions-item>
-        <el-descriptions-item label="鎬ヨ瘖鍖荤敓鐢佃瘽">{{ getContactPhone("鎬ヨ瘖鍖荤敓鐢佃瘽") }}</el-descriptions-item>
-        <el-descriptions-item label="鎶ゅ+" v-if="transportData.nurse">{{ transportData.nurse }}</el-descriptions-item>
-        <el-descriptions-item label="鎶ゅ+鐢佃瘽">{{ getContactPhone("鎶ゅ+鐢佃瘽") }}</el-descriptions-item>
-        <el-descriptions-item label="鍙告満" v-if="transportData.driver">{{ transportData.driver }}</el-descriptions-item>
-        <el-descriptions-item label="鍙告満鐢佃瘽">{{ getContactPhone("鍙告満鐢佃瘽") }}</el-descriptions-item>
-        <el-descriptions-item label="ICU璇勪及鍖荤敓" v-if="transportData.icuDoctor">
-          {{ transportData.icuDoctor }}
-        </el-descriptions-item>
-        <el-descriptions-item label="ICU鍖荤敓鐢佃瘽">{{ getContactPhone("ICU鍖荤敓鐢佃瘽") }}</el-descriptions-item>
+        <el-descriptions-item label="鍗忚皟鍛�">{{
+          transportData.contactPerson
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鍗忚皟鍛樼數璇�">{{
+          transportData.contactPhone || "鏈~鍐�"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鎬ヨ瘖绉戝尰鐢�">{{
+          transportData.doctor
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鎬ヨ瘖鍖荤敓鐢佃瘽">{{
+          transportData.doctorPhone
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鎶ゅ+">{{
+          transportData.nurse
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鎶ゅ+鐢佃瘽">{{
+          transportData.nursePhone
+        }}</el-descriptions-item>
+        <el-descriptions-item label="椹鹃┒鍛�">{{
+          transportData.driver
+        }}</el-descriptions-item>
+        <el-descriptions-item label="椹鹃┒鍛樼數璇�">{{
+          transportData.driverPhone
+        }}</el-descriptions-item>
+        <el-descriptions-item label="ICU璇勪及鍖荤敓">{{
+          transportData.icuDoctor
+        }}</el-descriptions-item>
+        <el-descriptions-item label="ICU鍖荤敓鐢佃瘽">{{
+          transportData.icuDoctorPhone
+        }}</el-descriptions-item>
       </el-descriptions>
     </el-card>
 
     <!-- 闄勪欢淇℃伅妯″潡 -->
-    <el-card class="detail-section" v-if="attachmentList.length > 0">
+    <el-card
+      class="detail-section"
+      v-if="
+        transportData.annexfilesList && transportData.annexfilesList.length > 0
+      "
+    >
       <div slot="header" class="section-header">
-        <i class="el-icon-folder" style="color: #F56C6C; margin-right: 8px;"></i>
+        <i
+          class="el-icon-folder"
+          style="color: #F56C6C; margin-right: 8px;"
+        ></i>
         <span class="section-title">闄勪欢淇℃伅</span>
       </div>
       <el-table :data="attachmentList" style="width: 100%">
@@ -92,41 +153,41 @@
         </el-table-column>
         <el-table-column label="鏂囦欢绫诲瀷" width="120">
           <template slot-scope="scope">
-            <el-tag size="small">{{ scope.row.fileType }}</el-tag>
+            <el-tag size="small">{{ scope.row.type }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="澶у皬" width="100">
+        <el-table-column label="鏂囦欢鍦板潃" min-width="200" show-overflow-tooltip>
           <template slot-scope="scope">
-            <span>{{ formatFileSize(scope.row.fileSize) }}</span>
+            <span>{{ scope.row.path }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="涓婁紶鏃堕棿" width="180">
+        <el-table-column label="鎿嶄綔" width="200">
           <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>
-            <el-button size="mini" type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
+            <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>
     </el-card>
 
     <!-- 澶囨敞淇℃伅妯″潡 -->
-    <el-card class="detail-section" v-if="transportData.remarks">
+    <el-card class="detail-section" v-if="transportData.remark">
       <div slot="header" class="section-header">
         <i class="el-icon-edit" style="color: #909399; margin-right: 8px;"></i>
         <span class="section-title">澶囨敞淇℃伅</span>
       </div>
       <div class="remarks-content">
-        {{ transportData.remarks }}
+        {{ transportData.remark }}
       </div>
     </el-card>
 
-    <!-- 棰勮寮圭獥锛堜繚鎸佷笉鍙橈級 -->
     <!-- PDF棰勮寮圭獥 -->
     <el-dialog
       :title="previewTitle"
@@ -139,7 +200,6 @@
       @close="handlePdfDialogClose"
     >
       <div class="pdf-preview-container" v-loading="pdfLoading">
-        <!-- PDF鎺у埗宸ュ叿鏍� -->
         <div class="pdf-toolbar">
           <el-button-group>
             <el-button
@@ -186,7 +246,6 @@
           </el-button>
         </div>
 
-        <!-- PDF娓叉煋鍖哄煙 -->
         <div class="pdf-viewport">
           <pdf
             ref="pdf"
@@ -251,58 +310,27 @@
 
 <script>
 import pdf from "vue-pdf";
+import UploadAttachment from "@/components/UploadAttachment";
 
 export default {
   name: "TransportDetail",
   components: {
     pdf
   },
+  components: {
+    UploadAttachment
+  },
+  dicts: ["sys_user_sex"],
   props: {
     transportData: {
       type: Object,
       default: () => ({})
     }
   },
-  filters: {
-    statusFilter(status) {
-      const statusMap = {
-        pending: "warning",
-        transporting: "primary",
-        completed: "success",
-        cancelled: "danger"
-      };
-      return statusMap[status];
-    }
-  },
   data() {
     return {
       // 闄勪欢鐩稿叧鏁版嵁
-      attachmentList: [
-        {
-          id: 1,
-          fileName: "杞繍浜ゆ帴鍗�.jpg",
-          fileType: "docx",
-          fileSize: 102400,
-          uploadTime: "2024-12-19 10:30:00",
-          fileUrl: "https://img95.699pic.com/photo/40142/8262.jpg_wh860.jpg"
-        },
-        {
-          id: 2,
-          fileName: "鍖荤枟璁板綍.pdf",
-          fileType: "pdf",
-          fileSize: 2048000,
-          uploadTime: "2024-12-19 11:20:00",
-          fileUrl: "http://192.168.100.10:8080/profile/upload/2025/12/19/(鍚撮緳8.7)姣忔棩宸ヤ綔鎬荤粨1766131266142.pdf"
-        },
-        {
-          id: 3,
-          fileName: "鎮h�呯収鐗�.jpg",
-          fileType: "jpg",
-          fileSize: 512000,
-          uploadTime: "2024-12-19 14:15:00",
-          fileUrl: "https://img95.699pic.com/photo/40019/3490.jpg_wh860.jpg"
-        }
-      ],
+      attachmentList: [],
       // PDF棰勮鐩稿叧鏁版嵁
       pdfPreviewVisible: false,
       pdfLoading: false,
@@ -311,34 +339,80 @@
       pageCount: 0,
       scale: 100,
       pageRotate: 0,
-
       // 鍥剧墖棰勮鐩稿叧
       imagePreviewVisible: false,
-
       // 涓嶆敮鎸侀瑙堢浉鍏�
       unsupportedPreviewVisible: false,
-
       // 閫氱敤棰勮鏁版嵁
       previewTitle: "",
       previewUrl: "",
       currentFile: null
     };
   },
+  watch: {
+    transportData: {
+      handler(newVal) {
+        this.transformAttachmentData(newVal.annexfilesList);
+      },
+      immediate: true,
+      deep: true
+    }
+  },
   methods: {
-    // 鑾峰彇鑱旂郴鏂瑰紡
-    getContactPhone(role) {
-      if (this.transportData.contacts) {
-        const contact = this.transportData.contacts.find(
-          item => item.role === role
-        );
-        return contact ? contact.phone : "鏈~鍐�";
+    /** 杞崲闄勪欢鏁版嵁 */
+    transformAttachmentData(annexfilesList) {
+      if (!annexfilesList || !Array.isArray(annexfilesList)) {
+        this.attachmentList = [];
+        return;
       }
-      return "鏈~鍐�";
+
+      this.attachmentList = annexfilesList;
+      // this.attachmentList = annexfilesList.map((fileUrl, index) => {
+      //   const fileName = this.getFileNameFromUrl(fileUrl);
+      //   return {
+      //     id: index + 1,
+      //     fileName: fileName,
+      //     fileType: this.getFileType(fileName),
+      //     fileUrl: fileUrl
+      //   };
+      // });
     },
+
+    /** 浠嶶RL涓彁鍙栨枃浠跺悕 */
+    getFileNameFromUrl(url) {
+      if (!url) return "鏈煡鏂囦欢";
+      return url.split("/").pop() || "鏈煡鏂囦欢";
+    },
+
+    /** 鑾峰彇鐘舵�佹爣绛剧被鍨� */
+    getStatusTagType(transitStatus) {
+      const statusMap = {
+        1: "warning", // 寰呰浆杩�
+        2: "primary", // 杞繍涓�
+        3: "success", // 杞繍瀹屾垚
+        4: "danger", // 杞繍鍙栨秷
+        5: "info" // 鏆傚瓨
+      };
+      return statusMap[transitStatus] || "info";
+    },
+
+    /** 鑾峰彇鐘舵�佹枃鏈� */
+    getStatusText(transitStatus) {
+      const statusMap = {
+        1: "寰呰浆杩�",
+        2: "杞繍涓�",
+        3: "杞繍瀹屾垚",
+        4: "杞繍鍙栨秷",
+        5: "鏆傚瓨"
+      };
+      return statusMap[transitStatus] || "鏈煡鐘舵��";
+    },
+
     // 鍏抽棴寮规
     handleClose() {
       this.$emit("close");
     },
+
     // 鑾峰彇鏂囦欢绫诲瀷
     getFileType(fileName) {
       const extension = fileName
@@ -357,8 +431,9 @@
     handlePreview(file) {
       this.currentFile = file;
       this.previewTitle = `棰勮 - ${file.fileName}`;
-      this.previewUrl = file.fileUrl;
+      this.previewUrl = file.path;
       const fileType = this.getFileType(file.fileName);
+      console.log(this.previewUrl, "this.previewUrl");
 
       switch (fileType) {
         case "pdf":
@@ -380,7 +455,7 @@
       this.currentPage = 1;
       this.scale = 100;
       this.pageRotate = 0;
-      this.pdfUrl = file.fileUrl;
+      this.pdfUrl = file.path;
     },
 
     // PDF鍔犺浇瀹屾垚鍥炶皟
@@ -444,7 +519,7 @@
     // 鏂囦欢涓嬭浇
     handleDownload(file) {
       const link = document.createElement("a");
-      link.href = file.fileUrl;
+      link.href = file.path;
       link.download = file.fileName;
       link.style.display = "none";
       document.body.appendChild(link);
@@ -458,21 +533,8 @@
       this.handleDownload(file);
     },
 
-    // 鏂囦欢鍒犻櫎
-    handleDelete(file) {
-      this.$confirm("纭畾瑕佸垹闄よ繖涓檮浠跺悧锛�", "鎻愮ず", {
-        confirmButtonText: "纭畾",
-        cancelButtonText: "鍙栨秷",
-        type: "warning"
-      }).then(() => {
-        this.attachmentList = this.attachmentList.filter(
-          item => item.id !== file.id
-        );
-        this.$message.success("鍒犻櫎鎴愬姛");
-      });
-    },
-
     formatFileSize(bytes) {
+      if (!bytes) return "鏈煡澶у皬";
       if (bytes === 0) return "0 B";
       const k = 1024;
       const sizes = ["B", "KB", "MB", "GB"];
@@ -512,7 +574,7 @@
   white-space: pre-line;
 }
 
-/* PDF棰勮鐩稿叧鏍峰紡淇濇寔涓嶅彉 */
+/* PDF棰勮鐩稿叧鏍峰紡 */
 .pdf-preview-dialog {
   margin-top: 5vh !important;
 }
diff --git a/src/views/project/donatebaseinfo/index.vue b/src/views/project/donatebaseinfo/index.vue
index dcb6370..2378891 100644
--- a/src/views/project/donatebaseinfo/index.vue
+++ b/src/views/project/donatebaseinfo/index.vue
@@ -203,9 +203,9 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="浣忛櫌鍙�"
+        label="妗堜緥缂栧彿"
         align="center"
-        prop="donorno"
+        prop="caseNo"
         width="200"
       />
       <el-table-column label="濮撳悕" align="center" prop="name" width="100" />
@@ -234,6 +234,11 @@
         label="鍖荤枟鏈烘瀯"
         align="center"
         prop="treatmenthospitalname"
+      />
+      <el-table-column
+        label="GSC璇勫垎"
+        align="center"
+        prop="gcsScore"
       />
       <el-table-column label="琛�鍨�" align="center" prop="bloodtype" width="100">
         <template slot-scope="scope">
@@ -373,8 +378,8 @@
         >
           <el-row style="margin-top: 40px">
             <el-col :span="8">
-              <el-form-item label="浣忛櫌鍙�" prop="donorno">
-                <el-input v-model="form.donorno" disabled />
+              <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
+                <el-input v-model="form.caseNo" disabled />
               </el-form-item>
             </el-col>
             <el-col :span="8">
@@ -609,8 +614,8 @@
         >
           <el-row>
             <el-col :span="8">
-              <el-form-item label="浣忛櫌鍙�" prop="inpatientno">
-                <el-input v-model="form.inpatientno" placeholder="浣忛櫌鍙�" />
+              <el-form-item label="妗堜緥缂栧彿" prop="inpatientno">
+                <el-input v-model="form.inpatientno" placeholder="妗堜緥缂栧彿" />
               </el-form-item>
             </el-col>
             <el-col :span="16">
@@ -931,7 +936,7 @@
         <!-- <div style="padding-right: 60px; margin-top: 20px">
           <el-row>
             <el-form-item label="闄勪欢" align="left" prop="annexfile">
-              <annex-upload ref="annex" :infoid="form.id" :donorno="form.donorno" :flowname="flowname"
+              <annex-upload ref="annex" :infoid="form.id" :caseNo="form.caseNo" :flowname="flowname"
                 :annexno="annexno" />
             </el-form-item>
           </el-row>
@@ -1073,7 +1078,7 @@
       queryParams: {
         pageNum: 1,
         pageSize: 10,
-        donorno: null,
+        caseNo: null,
         recordstate: null,
         // treatmenthospitalno: null,
         treatmenthospitalname: null,
@@ -1142,7 +1147,7 @@
         bloodtype: "0",
         inpatientno: null,
         rhyin: "0",
-        donorno: null,
+        caseNo: null,
         donationcategory: null,
         illnessoverview: null,
         diseasetype: [],
@@ -1256,7 +1261,7 @@
         ],
 
         inpatientno: [
-          { required: true, message: "杈撳叆浣忛櫌鍙�", trigger: "blur" }
+          { required: true, message: "杈撳叆妗堜緥缂栧彿", trigger: "blur" }
         ],
         diagnosisname: [
           { required: true, message: "鐤剧梾璇婃柇涓嶈兘涓虹┖", trigger: "blur" }
@@ -1737,7 +1742,7 @@
         bloodtype: "0",
         inpatientno: null,
         rhyin: 0,
-        donorno: null,
+        caseNo: null,
         donationcategory: null,
         illnessoverview: null,
         diseasetype: [],
@@ -1797,7 +1802,7 @@
         // "2"
         recordstate: null,
         treatmenthospitalname: null,
-        donorno: null,
+        caseNo: null,
         acquisitiontissueno: null,
         reportername: null,
         reporttime: null,
diff --git a/vue.config.js b/vue.config.js
index 40c759e..d2914fb 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -33,8 +33,8 @@
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target:`http://localhost:8080`,
-        // target:`http://192.168.100.10:8080`,
+        // target:`http://localhost:8080`,
+        target:`http://192.168.100.10:8080`,
         // target:`http://192.168.100.137:8080`,
         // target: `https://slb.hospitalstar.com:9093`,
         changeOrigin: true,

--
Gitblit v1.9.3