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 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 194 insertions(+), 132 deletions(-)

diff --git a/src/views/business/transfer/transportDetail.vue b/src/views/business/transfer/transportDetail.vue
index b153e90..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;
 }

--
Gitblit v1.9.3