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/TransportEdit.vue |  596 ++++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 503 insertions(+), 93 deletions(-)

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

--
Gitblit v1.9.3