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

---
 src/views/business/appear/index.vue | 1846 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 1,630 insertions(+), 216 deletions(-)

diff --git a/src/views/business/appear/index.vue b/src/views/business/appear/index.vue
index 3e975a0..4c578c3 100644
--- a/src/views/business/appear/index.vue
+++ b/src/views/business/appear/index.vue
@@ -2,23 +2,45 @@
   <div class="app-container">
     <!-- 鎼滅储绛涢�夊尯鍩� -->
     <el-card class="filter-card">
-      <el-form :model="queryParams" ref="queryForm" :inline="true" class="demo-form-inline">
-        <el-form-item label="鎹愮尞缂栧彿" prop="donorNo">
-          <el-input v-model="queryParams.donorNo" placeholder="璇疯緭鍏ユ崘鐚紪鍙�" clearable style="width: 200px"/>
+      <el-form
+        :model="queryParams"
+        ref="queryForm"
+        :inline="true"
+        class="demo-form-inline"
+      >
+        <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
+          <el-input
+            v-model="queryParams.caseNo"
+            placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+            clearable
+            style="width: 200px"
+          />
         </el-form-item>
-        <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
-          <el-input v-model="queryParams.donorName" placeholder="璇疯緭鍏ユ崘鐚�呭鍚�" clearable style="width: 200px"/>
+        <el-form-item label="鎹愮尞鑰呭鍚�" prop="name">
+          <el-input
+            v-model="queryParams.name"
+            placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
+            clearable
+            style="width: 200px"
+          />
         </el-form-item>
-        <el-form-item label="妗堜緥鐘舵��" prop="status">
-          <el-select v-model="queryParams.status" 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-form-item label="妗堜緥鐘舵��" prop="reportStatus">
+          <el-select
+            v-model="queryParams.reportStatus"
+            placeholder="璇烽�夋嫨鐘舵��"
+            clearable
+            style="width: 200px"
+          >
+            <el-option label="鍏ㄩ儴" value="" />
+            <el-option label="宸查槄璇�" value="2" />
+            <el-option label="宸插悓鎰�" value="3" />
+            <el-option label="宸查┏鍥�" value="4" />
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" icon="el-icon-search" @click="handleQuery">鎼滅储</el-button>
+          <el-button type="primary" icon="el-icon-search" @click="handleQuery"
+            >鎼滅储</el-button
+          >
           <el-button icon="el-icon-refresh" @click="resetQuery">閲嶇疆</el-button>
         </el-form-item>
       </el-form>
@@ -26,62 +48,157 @@
 
     <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
     <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" @click="handleAdd"
+          >鏂板妗堜緥</el-button
+        >
+      </el-col> -->
+
       <el-col :span="1.5">
-        <el-button type="primary" plain icon="el-icon-plus" @click="handleAdd">鏂板妗堜緥</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="success" plain icon="el-icon-edit" :disabled="single" @click="handleUpdate">淇敼</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="danger" plain icon="el-icon-delete" :disabled="multiple" @click="handleDelete">鍒犻櫎</el-button>
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          >鍒犻櫎</el-button
+        >
       </el-col>
     </el-row>
 
     <!-- 鏁版嵁琛ㄦ牸 -->
-    <el-table v-loading="loading" :data="caseList" @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="donorName" width="100"/>
-      <el-table-column label="鎬у埆" align="center" prop="gender" width="80">
-        <template slot-scope="scope">
-          <dict-tag :options="genderOptions" :value="scope.row.gender"/>
+    <!-- 鏁版嵁琛ㄦ牸 -->
+    <el-table
+      v-loading="loading"
+      :data="caseList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column
+        label="妗堜緥缂栧彿"
+        align="center"
+        prop="caseNo"
+        width="150"
+        fixed
+      />
+      <el-table-column
+        label="涓婃姤鏃堕棿"
+        align="center"
+        prop="reporttime"
+        width="160"
+      />
+      <el-table-column
+        label="鎹愮尞鑰呭鍚�"
+        align="center"
+        prop="name"
+        width="100"
+      />
+      <el-table-column label="鎬у埆" align="center" prop="sex" width="80">
+        <template #default="scope">
+          <dict-tag :options="dict.type.sys_user_sex" :value="scope.row.sex" />
         </template>
       </el-table-column>
-      <el-table-column label="骞撮緞" align="center" prop="age" width="80"/>
+      <el-table-column label="骞撮緞" align="center" prop="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"/>
+        <template #default="scope">
+          <dict-tag
+            :options="dict.type.sys_BloodType"
+            :value="scope.row.bloodType"
+          />
         </template>
       </el-table-column>
-      <el-table-column label="鐤剧梾璇婃柇" align="center" prop="diagnosis" min-width="200" show-overflow-tooltip/>
-      <el-table-column label="鍖婚櫌鍚嶇О" align="center" prop="hospitalName" width="150"/>
-      <el-table-column label="妗堜緥鐘舵��" align="center" prop="status" width="100">
-        <template slot-scope="scope">
-          <el-tag :type="scope.row.status | statusFilter">
-            {{ scope.row.status | statusTextFilter }}
+      <el-table-column
+        label="GCS璇勫垎"
+        align="center"
+        prop="gcsScore"
+        width="80"
+        show-overflow-tooltip
+      />
+      <el-table-column
+        label="鐤剧梾璇婃柇"
+        align="center"
+        prop="diagnosisname"
+        min-width="200"
+        show-overflow-tooltip
+      />
+      <el-table-column
+        label="娌荤枟鍖婚櫌"
+        align="center"
+        prop="treatmenthospitalname"
+        width="150"
+      />
+      <el-table-column
+        label="鐘舵��"
+        align="center"
+        prop="reportStatus"
+        width="100"
+      >
+        <template #default="scope">
+          <el-tag :type="scope.row.reportStatus | statusFilter">
+            {{ scope.row.reportStatus | statusTextFilter }}
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="涓婃姤鏃堕棿" align="center" prop="reportTime" width="160"/>
-      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="200">
-        <template slot-scope="scope">
-          <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)">璇︽儏</el-button>
-          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">淇敼</el-button>
+      <el-table-column label="杞繍鐘舵��" align="center" width="100">
+        <template #default="scope">
+          <el-tag :type="getTransportStatusTag(scope.row)">
+            {{ getTransportStatusText(scope.row) }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="鎿嶄綔"
+        align="center"
+        fixed="right"
+        class-name="small-padding fixed-width"
+        width="350"
+      >
+        <template #default="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-view"
+            @click="handleDetail(scope.row)"
+            >璇︽儏</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleEdit(scope.row)"
+            v-if="
+              scope.row.reportStatus !== '3' &&
+                scope.row.reportStatus !== '4' &&
+                scope.row.delFlag === 0
+            "
+            >缂栬緫</el-button
+          >
           <el-button
             size="mini"
             type="text"
             icon="el-icon-check"
             @click="handleApprove(scope.row)"
-            v-if="scope.row.status === '0'"
-          >瀹℃壒</el-button>
+            v-if="scope.row.reportStatus === '2' && scope.row.delFlag === 0"
+            >瀹℃壒</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-truck"
+            :type="shouldShowTransportButton(scope.row) ? 'primary' : 'text'"
+            @click="handleTransport(scope.row)"
+            v-if="shouldShowTransportButton(scope.row)"
+            :disabled="!canGoToTransport(scope.row)"
+          >
+            {{ getTransportButtonText(scope.row) }}
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
 
     <!-- 鍒嗛〉 -->
     <pagination
-      v-show="total>0"
+      v-show="total > 0"
       :total="total"
       :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize"
@@ -96,51 +213,765 @@
       append-to-body
       :close-on-click-modal="false"
     >
-      <case-detail :caseData="currentCase" @close="detailOpen = false"/>
+      <case-detail :caseData="currentCase" @close="detailOpen = false" />
     </el-dialog>
 
     <!-- 瀹℃壒寮规 -->
     <el-dialog
       title="妗堜緥瀹℃壒"
       :visible.sync="approveOpen"
-      width="500px"
+      width="80vw"
       append-to-body
+      class="approve-dialog"
     >
-      <el-form ref="approveForm" :model="approveForm" :rules="approveRules" label-width="80px">
-        <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-group>
-        </el-form-item>
-        <el-form-item label="瀹℃壒鎰忚" prop="approveOpinion">
-          <el-input
-            type="textarea"
-            v-model="approveForm.approveOpinion"
-            placeholder="璇疯緭鍏ュ鎵规剰瑙�"
-            :rows="4"
-            maxlength="500"
-          />
-        </el-form-item>
-      </el-form>
+      <el-container style="height: 800px;">
+        <!-- 宸︿晶锛氭渚嬭鎯� -->
+        <el-aside
+          width="50vw"
+          style="background: #f8f9fa; padding: 20px; overflow-y: auto;"
+        >
+          <div class="approve-detail-preview">
+            <h3 style="margin-bottom: 15px; color: #303133;">妗堜緥璇︽儏棰勮</h3>
+            <case-detail :caseData="currentCase" :showtitle="false" />
+          </div>
+        </el-aside>
+
+        <!-- 鍙充晶锛氬鎵硅〃鍗� -->
+        <el-main style="padding: 20px;">
+          <el-form
+            ref="approveForm"
+            :model="approveForm"
+            :rules="approveRules"
+            label-width="100px"
+          >
+            <el-form-item label="瀹℃壒缁撴灉" prop="approveResult">
+              <el-radio-group v-model="approveForm.approveResult">
+                <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="璇疯緭鍏ヨ缁嗙殑瀹℃壒鎰忚锛屽寘鎷�氳繃鎴栭┏鍥炵殑鐞嗙敱"
+                :rows="6"
+                maxlength="500"
+                show-word-limit
+              />
+            </el-form-item>
+          </el-form>
+        </el-main>
+      </el-container>
+
       <div slot="footer" class="dialog-footer">
-        <el-button @click="approveOpen = false">鍙� 娑�</el-button>
-        <el-button type="primary" @click="submitApprove">纭� 瀹�</el-button>
+        <el-button @click="approveOpen = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="submitApprove">纭畾</el-button>
       </div>
     </el-dialog>
+
+    <!-- 鏂板/缂栬緫妗堜緥寮规 -->
+    <el-dialog
+      :title="`${isEditing ? '缂栬緫' : '鏂板'}妗堜緥`"
+      :visible.sync="editOpen"
+      width="68%"
+      append-to-body
+      :close-on-click-modal="false"
+      @close="handleEditClose"
+    >
+      <el-form
+        ref="editForm"
+        :model="editForm"
+        :rules="editRules"
+        label-width="120px"
+      >
+        <!-- 鍩烘湰淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-user"
+              style="color: #409EFF; margin-right: 8px;"
+            ></i>
+            <span>鍩烘湰淇℃伅</span>
+          </div>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
+                <el-input
+                  v-model="editForm.caseNo"
+                  placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鎹愮尞鑰呭鍚�" prop="name">
+                <el-input
+                  v-model="editForm.name"
+                  placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎬у埆" prop="sex">
+                <el-select
+                  v-model="editForm.sex"
+                  placeholder="璇烽�夋嫨鎬у埆"
+                  style="width: 100%"
+                >
+                  <el-option label="鐢�" value="0" />
+                  <el-option label="濂�" value="1" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="骞撮緞" prop="age">
+                <el-input-number
+                  v-model="editForm.age"
+                  :min="0"
+                  :max="120"
+                  placeholder="璇疯緭鍏ュ勾榫�"
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="骞撮緞鍗曚綅" prop="ageunit">
+                <el-select
+                  v-model="editForm.ageunit"
+                  placeholder="璇烽�夋嫨骞撮緞鍗曚綅"
+                  style="width: 100%"
+                >
+                  <el-option label="宀�" value="year" />
+                  <el-option label="鏈�" value="month" />
+                  <el-option label="澶�" value="day" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="琛�鍨�" prop="bloodType">
+                <el-select
+                  v-model="editForm.bloodType"
+                  placeholder="璇烽�夋嫨琛�鍨�"
+                  style="width: 100%"
+                >
+                  <el-option label="A鍨�" value="A" />
+                  <el-option label="B鍨�" value="B" />
+                  <el-option label="O鍨�" value="O" />
+                  <el-option label="AB鍨�" value="AB" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="Rh闃存��" prop="rhYin">
+                <el-radio-group v-model="editForm.rhYin">
+                  <el-radio label="0">鍚�</el-radio>
+                  <el-radio label="1">鏄�</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍑虹敓鏃ユ湡" prop="birthday">
+                <el-date-picker
+                  v-model="editForm.birthday"
+                  type="date"
+                  placeholder="閫夋嫨鍑虹敓鏃ユ湡"
+                  value-format="yyyy-MM-dd"
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="璇佷欢绫诲瀷" prop="idcardtype">
+                <el-select
+                  v-model="editForm.idcardtype"
+                  placeholder="璇烽�夋嫨璇佷欢绫诲瀷"
+                  style="width: 100%"
+                >
+                  <el-option label="韬唤璇�" value="1" />
+                  <el-option label="鎶ょ収" value="2" />
+                  <el-option label="鍐涘畼璇�" value="3" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="璇佷欢鍙风爜" prop="idcardno">
+                <el-input
+                  v-model="editForm.idcardno"
+                  placeholder="璇疯緭鍏ヨ瘉浠跺彿鐮�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="姘戞棌" prop="nation">
+                <el-input v-model="editForm.nation" placeholder="璇疯緭鍏ユ皯鏃�" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍥界睄" prop="nationality">
+                <el-input
+                  v-model="editForm.nationality"
+                  placeholder="璇疯緭鍏ュ浗绫�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="绫嶈疮" prop="nativeplace">
+                <el-input
+                  v-model="editForm.nativeplace"
+                  placeholder="璇疯緭鍏ョ睄璐�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="瀛﹀巻" prop="education">
+                <el-input
+                  v-model="editForm.education"
+                  placeholder="璇疯緭鍏ュ鍘�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鑱屼笟" prop="occupation">
+                <el-input
+                  v-model="editForm.occupation"
+                  placeholder="璇疯緭鍏ヨ亴涓�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
+                <el-input
+                  v-model="editForm.phone"
+                  placeholder="璇疯緭鍏ヨ仈绯荤數璇�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-card>
+
+        <!-- 鍦板潃淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-location-information"
+              style="color: #67C23A; margin-right: 8px;"
+            ></i>
+            <span>鍦板潃淇℃伅</span>
+          </div>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎴风睄鍦板潃鐪�">
+                <el-input
+                  v-model="editForm.registerprovincename"
+                  placeholder="璇疯緭鍏ユ埛绫嶅湴鍧�鐪�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鎴风睄鍦板潃甯�">
+                <el-input
+                  v-model="editForm.registercityname"
+                  placeholder="璇疯緭鍏ユ埛绫嶅湴鍧�甯�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎴风睄琛楅亾">
+                <el-input
+                  v-model="editForm.registertownname"
+                  placeholder="璇疯緭鍏ユ埛绫嶈閬�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鎴风睄绀惧尯">
+                <el-input
+                  v-model="editForm.registercommunityname"
+                  placeholder="璇疯緭鍏ユ埛绫嶇ぞ鍖�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="鎴风睄璇︾粏鍦板潃" prop="registeraddress">
+            <el-input
+              v-model="editForm.registeraddress"
+              type="textarea"
+              :rows="2"
+              placeholder="璇疯緭鍏ヨ缁嗙殑鎴风睄鍦板潃"
+            />
+          </el-form-item>
+
+          <el-divider>鐜颁綇鍦板潃</el-divider>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鐜颁綇鍦板潃鐪�">
+                <el-input
+                  v-model="editForm.residenceprovincename"
+                  placeholder="璇疯緭鍏ョ幇浣忓湴鍧�鐪�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鐜颁綇鍦板潃甯�/鍖�">
+                <el-input
+                  v-model="editForm.residencecountyname"
+                  placeholder="璇疯緭鍏ョ幇浣忓湴鍧�甯�/鍖�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鐜颁綇鍦板潃琛楅亾">
+                <el-input
+                  v-model="editForm.residencetownname"
+                  placeholder="璇疯緭鍏ョ幇浣忓湴鍧�琛楅亾"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鐜颁綇鍦板潃绀惧尯">
+                <el-input
+                  v-model="editForm.residencecommunityname"
+                  placeholder="璇疯緭鍏ョ幇浣忓湴鍧�绀惧尯"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="鐜颁綇璇︾粏鍦板潃" prop="residenceaddress">
+            <el-input
+              v-model="editForm.residenceaddress"
+              type="textarea"
+              :rows="2"
+              placeholder="璇疯緭鍏ヨ缁嗙殑鐜颁綇鍦板潃"
+            />
+          </el-form-item>
+        </el-card>
+
+        <!-- 鍖荤枟淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-first-aid-kit"
+              style="color: #E6A23C; margin-right: 8px;"
+            ></i>
+            <span>鍖荤枟淇℃伅</span>
+          </div>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鐤剧梾璇婃柇" prop="diagnosisname">
+                <el-input
+                  v-model="editForm.diagnosisname"
+                  placeholder="璇疯緭鍏ョ柧鐥呰瘖鏂悕绉�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="GCS璇勫垎" prop="gcsScore">
+                <el-input
+                  v-model="editForm.gcsScore"
+                  placeholder="璇疯緭鍏CS璇勫垎"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="鐥呮儏姒傚喌" prop="illnessoverview">
+            <el-input
+              v-model="editForm.illnessoverview"
+              type="textarea"
+              :rows="3"
+              placeholder="璇疯緭鍏ョ梾鎯呮鍐�"
+              maxlength="500"
+              show-word-limit
+            />
+          </el-form-item>
+
+          <el-form-item label="鐥呬汉鐘跺喌" prop="patientstate">
+            <el-input
+              v-model="editForm.patientstate"
+              type="textarea"
+              :rows="2"
+              placeholder="璇疯緭鍏ョ梾浜虹姸鍐�"
+              maxlength="200"
+              show-word-limit
+            />
+          </el-form-item>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="浼犳煋鐥呮儏鍐�" prop="infectious">
+                <el-input
+                  v-model="editForm.infectious"
+                  placeholder="璇疯緭鍏ヤ紶鏌撶梾鎯呭喌"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="浼犳煋鐥呭叾浠栬鏄�">
+                <el-input
+                  v-model="editForm.infectiousOther"
+                  placeholder="璇疯緭鍏ヤ紶鏌撶梾鍏朵粬璇存槑"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="鏄惁闇�瑕佽浆杩�" prop="isTransport">
+            <el-radio-group v-model="editForm.isTransport">
+              <el-radio label="1">涓嶉渶瑕�</el-radio>
+              <el-radio label="2">闇�瑕�</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-card>
+
+        <!-- 鍖婚櫌淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-office-building"
+              style="color: #909399; margin-right: 8px;"
+            ></i>
+            <span>鍖婚櫌淇℃伅</span>
+          </div>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="娌荤枟鍖婚櫌" prop="treatmenthospitalname">
+                <el-input
+                  v-model="editForm.treatmenthospitalname"
+                  placeholder="璇疯緭鍏ユ不鐤楀尰闄㈠悕绉�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="娌荤枟绉戝" prop="treatmentdeptname">
+                <el-input
+                  v-model="editForm.treatmentdeptname"
+                  placeholder="璇疯緭鍏ユ不鐤楃瀹ゅ悕绉�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="浣忛櫌鍙�" prop="inpatientno">
+                <el-input
+                  v-model="editForm.inpatientno"
+                  placeholder="璇疯緭鍏ヤ綇闄㈠彿"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
+                <el-input
+                  v-model="editForm.deptName"
+                  placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="閮ㄩ棬缂栧彿" prop="deptNo">
+                <el-input
+                  v-model="editForm.deptNo"
+                  placeholder="璇疯緭鍏ラ儴闂ㄧ紪鍙�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓婃姤鍖婚櫌" prop="toHospital">
+                <el-input
+                  v-model="editForm.toHospital"
+                  placeholder="璇疯緭鍏ヤ笂鎶ョ殑鍖婚櫌"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-card>
+
+        <!-- 涓婃姤淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-s-data"
+              style="color: #F56C6C; margin-right: 8px;"
+            ></i>
+            <span>涓婃姤淇℃伅</span>
+          </div>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎶ュ憡鑰呭鍚�" prop="infoName">
+                <el-input
+                  v-model="editForm.infoName"
+                  placeholder="璇疯緭鍏ユ姤鍛婅�呭鍚�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鎶ュ憡鑰呯紪鍙�" prop="infoNo">
+                <el-input
+                  v-model="editForm.infoNo"
+                  placeholder="璇疯緭鍏ユ姤鍛婅�呯紪鍙�"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎶ュ憡鑰呯數璇�" prop="reporterphone">
+                <el-input
+                  v-model="editForm.reporterphone"
+                  placeholder="璇疯緭鍏ユ姤鍛婅�呰仈绯荤數璇�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍗忚皟鍛樺鍚�" prop="coordinatorName">
+                <el-input
+                  v-model="editForm.coordinatorName"
+                  placeholder="璇疯緭鍏ュ崗璋冨憳濮撳悕"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鍗忚皟鍛樼紪鍙�" prop="coordinatorNo">
+                <el-input
+                  v-model="editForm.coordinatorNo"
+                  placeholder="璇疯緭鍏ュ崗璋冨憳缂栧彿"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鏄惁缁堟妗堜緥" prop="terminationCase">
+                <el-radio-group v-model="editForm.terminationCase">
+                  <el-radio label="0">杩涜涓�</el-radio>
+                  <el-radio label="1">宸茬粓姝�</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="涓婃姤鐘舵��" prop="reportStatus">
+            <el-select
+              v-model="editForm.reportStatus"
+              placeholder="璇烽�夋嫨涓婃姤鐘舵��"
+              style="width: 100%"
+              :disabled="isEditing"
+            >
+              <el-option label="宸蹭笂鎶�" value="1" />
+              <el-option label="宸查槄璇�" value="2" />
+              <el-option label="宸插悓鎰�" value="3" />
+              <el-option label="宸查┏鍥�" value="4" />
+            </el-select>
+          </el-form-item>
+        </el-card>
+
+        <!-- 闄勪欢淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-folder"
+              style="color: #409EFF; margin-right: 8px;"
+            ></i>
+            <span>闄勪欢淇℃伅</span>
+          </div>
+
+          <div class="attachment-section">
+            <div class="attachment-header">
+              <i class="el-icon-paperclip"></i>
+              <span class="attachment-title">闄勪欢涓婁紶</span>
+              <span class="attachment-tip"
+                >鏀寔涓婁紶鐥呭巻銆佹楠屾姤鍛婄瓑鏂囦欢 (鏈�澶歿{
+                  attachmentLimit
+                }}涓�)</span
+              >
+            </div>
+
+            <!-- 浣跨敤 UploadAttachment 缁勪欢 -->
+            <UploadAttachment
+              ref="uploadAttachment"
+              :file-list="attachmentFileList"
+              :limit="attachmentLimit"
+              :accept="attachmentAccept"
+              @change="handleAttachmentChange"
+              @upload-success="handleUploadSuccess"
+              @upload-error="handleUploadError"
+              @remove="handleAttachmentRemove"
+            />
+          </div>
+
+          <!-- 闄勪欢鍒楄〃 -->
+          <div
+            class="attachment-list"
+            v-if="editForm.annexfilesList && editForm.annexfilesList.length > 0"
+          >
+            <div class="list-title">
+              宸蹭笂浼犻檮浠� ({{ editForm.annexfilesList.length }})
+            </div>
+            <el-table
+              :data="editForm.annexfilesList"
+              style="width: 100%"
+              size="small"
+              border
+            >
+              <el-table-column label="鏂囦欢鍚�" min-width="200">
+                <template #default="scope">
+                  <i
+                    class="el-icon-document"
+                    style="margin-right: 8px; color: #409EFF;"
+                  ></i>
+                  <span class="file-name">{{ scope.row.fileName }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鏂囦欢绫诲瀷" width="100">
+                <template #default="scope">
+                  <el-tag size="small">{{
+                    getFileType(scope.row.fileName)
+                  }}</el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="鍒涘缓鏃堕棿" width="160">
+                <template #default="scope">
+                  <span>{{ formatDateTime(scope.row.createTime) }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="澶囨敞"
+                min-width="150"
+                show-overflow-tooltip
+              >
+                <template #default="scope">
+                  <span>{{ scope.row.remart || "鏃�" }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎿嶄綔" width="200" fixed="right">
+                <template #default="scope">
+                  <el-button
+                    size="mini"
+                    type="primary"
+                    @click="handlePreview(scope.row)"
+                  >
+                    棰勮
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    @click="handleRemoveAttachment(scope.$index)"
+                  >
+                    鍒犻櫎
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </el-card>
+
+        <!-- 澶囨敞淇℃伅 -->
+        <el-card class="form-section" shadow="never">
+          <div slot="header" class="section-header">
+            <i
+              class="el-icon-edit"
+              style="color: #67C23A; margin-right: 8px;"
+            ></i>
+            <span>澶囨敞淇℃伅</span>
+          </div>
+          <el-form-item prop="remark">
+            <el-input
+              v-model="editForm.remark"
+              type="textarea"
+              :rows="4"
+              placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+              maxlength="500"
+              show-word-limit
+            />
+          </el-form-item>
+        </el-card>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="handleEditClose">鍙栨秷</el-button>
+        <el-button type="primary" :loading="saveLoading" @click="handleSave"
+          >淇濆瓨</el-button
+        >
+      </div>
+    </el-dialog>
+
+    <!-- 鏂囦欢棰勮寮圭獥 -->
+    <FilePreviewDialog
+      :visible="previewVisible"
+      :file="currentPreviewFile"
+      @close="previewVisible = false"
+      @download="handleDownload"
+    />
   </div>
 </template>
 
 <script>
-  import CaseDetail from './caseDetail';
+import CaseDetail from "./caseDetail";
+import UploadAttachment from "@/components/UploadAttachment";
+import FilePreviewDialog from "@/components/FilePreviewDialog";
+import {
+  donateList,
+  donateInfo,
+  donateDel,
+  donateEdit,
+  donateAdd
+} from "@/api/businessApi/index";
+import dayjs from "dayjs";
+
 export default {
   name: "CaseList",
-    components: { CaseDetail },
-
+  components: {
+    CaseDetail,
+    UploadAttachment,
+    FilePreviewDialog
+  },
+  dicts: ["sys_user_sex", "sys_BloodType"],
   data() {
     return {
       // 閬僵灞�
       loading: false,
+      saveLoading: false,
       // 閫変腑鏁扮粍
       ids: [],
       // 闈炲崟涓鐢�
@@ -155,34 +986,26 @@
       detailOpen: false,
       // 瀹℃壒寮规鏄惁鏄剧ず
       approveOpen: false,
+      // 缂栬緫寮规鏄惁鏄剧ず
+      editOpen: false,
+      // 缂栬緫鐘舵��
+      isEditing: false,
       // 璇︽儏寮规鏍囬
       detailTitle: "",
       // 褰撳墠鎿嶄綔鐨勬渚�
       currentCase: {},
-      // 鎬у埆閫夐」
-      genderOptions: [
-        { value: "0", label: "鐢�" },
-        { value: "1", label: "濂�" }
-      ],
-      // 琛�鍨嬮�夐」
-      bloodTypeOptions: [
-        { value: "A", label: "A鍨�" },
-        { value: "B", label: "B鍨�" },
-        { value: "O", label: "O鍨�" },
-        { value: "AB", label: "AB鍨�" }
-      ],
       // 鏌ヨ鍙傛暟
       queryParams: {
         pageNum: 1,
         pageSize: 10,
-        donorNo: undefined,
-        donorName: undefined,
-        status: undefined
+        caseNo: undefined,
+        name: undefined,
+        reportStatus: undefined
       },
       // 瀹℃壒琛ㄥ崟
       approveForm: {
-        caseId: null,
-        approveResult: "1",
+        id: null,
+        approveResult: "3",
         approveOpinion: ""
       },
       // 瀹℃壒琛ㄥ崟楠岃瘉
@@ -193,25 +1016,56 @@
         approveOpinion: [
           { required: true, message: "璇疯緭鍏ュ鎵规剰瑙�", trigger: "blur" }
         ]
-      }
+      },
+      // 缂栬緫琛ㄥ崟
+      editForm: this.getDefaultFormData(),
+      // 琛ㄥ崟楠岃瘉瑙勫垯
+      editRules: {
+        caseNo: [
+          { required: true, message: "璇疯緭鍏ユ渚嬬紪鍙�", trigger: "blur" }
+        ],
+        name: [
+          { required: true, message: "璇疯緭鍏ユ崘鐚�呭鍚�", trigger: "blur" }
+        ],
+        sex: [{ required: true, message: "璇烽�夋嫨鎬у埆", trigger: "change" }],
+        age: [{ required: true, message: "璇疯緭鍏ュ勾榫�", trigger: "blur" }],
+        diagnosisname: [
+          { required: true, message: "璇疯緭鍏ョ柧鐥呰瘖鏂�", trigger: "blur" }
+        ],
+        treatmenthospitalname: [
+          { required: true, message: "璇疯緭鍏ユ不鐤楀尰闄�", trigger: "blur" }
+        ],
+        reportStatus: [
+          { required: true, message: "璇烽�夋嫨涓婃姤鐘舵��", trigger: "change" }
+        ]
+      },
+      // 闄勪欢鐩稿叧閰嶇疆
+      attachmentLimit: 10,
+      attachmentAccept: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx",
+      attachmentFileList: [],
+      // 棰勮鐩稿叧
+      previewVisible: false,
+      currentPreviewFile: null
     };
   },
   filters: {
-    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() {
@@ -219,164 +1073,724 @@
   },
   methods: {
     /** 鏌ヨ妗堜緥鍒楄〃 */
-    getList() {
+    async getList() {
       this.loading = true;
-      // 妯℃嫙API璋冪敤寤惰繜
-      setTimeout(() => {
-        // 娴嬭瘯鏁版嵁
-        this.caseList = [
-          {
-            id: 1,
-            donorNo: 'DON20241219001',
-            donorName: '寮犱笁',
-            gender: '0',
-            age: 38,
-            bloodType: 'A',
-            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',
-            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: '0',
-            age: 52,
-            bloodType: 'B',
-            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',
-            diagnosis: '閲嶅瀷棰呰剳鎹熶激锛屽鍣ㄥ畼鍔熻兘琛扮',
-            hospitalName: '闈掑矝鍎跨鍖婚櫌',
-            status: '0',
-            reportTime: '2024-12-16 16:45:00',
-            reporterName: '瀛欏尰鐢�'
-          }
-        ];
-        this.total = this.caseList.length;
+      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.total = 0;
+      } finally {
         this.loading = false;
-      }, 500);
+      }
     },
+    // 杞繍------------------
+    /** 鍒ゆ柇鏄惁闇�瑕佹樉绀鸿浆杩愭寜閽� */
+    shouldShowTransportButton(row) {
+      // 鍙湁宸插悓鎰忕殑妗堜緥鎵嶈兘杩涜杞繍鎿嶄綔
+      // return row.reportStatus == "3" && row.delFlag == 0;
+      return row.reportStatus != "4";
+    },
+
+    /** 鍒ゆ柇鏄惁鍙互璺宠浆鍒拌浆杩愬崟 */
+    canGoToTransport(row) {
+      // 闇�瑕佽浆杩愶紙isTransport === "2"锛変笖娌℃湁杞繍淇℃伅锛坰erviceTransport涓嶅瓨鍦ㄦ垨涓虹┖鏁扮粍锛�
+      return row.isTransport == "2" && row.serviceTransport;
+    },
+
+    /** 鑾峰彇杞繍鎸夐挳鏂囨湰 */
+    getTransportButtonText(row) {
+      if (row.isTransport == "2") {
+        if (
+          row.serviceTransport &&
+          Array.isArray(row.serviceTransport) &&
+          row.serviceTransport.length > 0
+        ) {
+          return "鏌ョ湅杞繍鍗�";
+        } else {
+          return "鍓嶅線杞繍鍗�";
+        }
+      }
+      return "杞繍";
+    },
+
+    /** 鑾峰彇杞繍鐘舵�佹爣绛炬牱寮� */
+    getTransportStatusTag(row) {
+      if (row.isTransport === "1") {
+        return "info"; // 涓嶉渶瑕佽浆杩�
+      }
+      if (
+        row.serviceTransport &&
+        Array.isArray(row.serviceTransport) &&
+        row.serviceTransport.length > 0
+      ) {
+        // 鏍规嵁杞繍鍗曠姸鎬佹樉绀轰笉鍚岄鑹�
+        const transport = row.serviceTransport[0];
+        if (transport.transitStatus) {
+          switch (transport.transitStatus.toString()) {
+            case "1":
+              return "warning"; // 寰呰浆杩�
+            case "2":
+              return "primary"; // 杞繍涓�
+            case "3":
+              return "success"; // 杞繍瀹屾垚
+            case "4":
+              return "danger"; // 杞繍鍙栨秷
+            case "5":
+              return "info"; // 鏆傚瓨
+            default:
+              return "info";
+          }
+        }
+        return "primary"; // 鏈夎浆杩愪俊鎭絾鏃犵姸鎬�
+      }
+      return "danger"; // 闇�瑕佽浆杩愪絾鏃犺浆杩愪俊鎭�
+    },
+
+    /** 鑾峰彇杞繍鐘舵�佹枃鏈� */
+    getTransportStatusText(row) {
+      if (row.isTransport === "1") {
+        return "鏃犻渶杞繍";
+      }
+      if (
+        row.serviceTransport &&
+        Array.isArray(row.serviceTransport) &&
+        row.serviceTransport.length > 0
+      ) {
+        const transport = row.serviceTransport[0];
+        if (transport.transitStatus) {
+          switch (transport.transitStatus.toString()) {
+            case "1":
+              return "寰呰浆杩�";
+            case "2":
+              return "杞繍涓�";
+            case "3":
+              return "杞繍瀹屾垚";
+            case "4":
+              return "杞繍鍙栨秷";
+            case "5":
+              return "鏆傚瓨";
+            default:
+              return "鏈夎浆杩愬崟";
+          }
+        }
+        return "鏈夎浆杩愬崟";
+      }
+      return "闇�杞繍";
+    },
+
+    /** 澶勭悊杞繍鎿嶄綔 */
+    async handleTransport(row) {
+      try {
+        // 鍏堣幏鍙栨渶鏂扮殑妗堜緥淇℃伅
+        const caseData = row;
+
+        if (caseData.isTransport == "2") {
+          if (
+            caseData.serviceTransport &&
+            Array.isArray(caseData.serviceTransport) &&
+            caseData.serviceTransport.length > 0
+          ) {
+            // 宸叉湁杞繍鍗曪紝璺宠浆鍒拌浆杩愬崟璇︽儏椤�
+            const transport = caseData.serviceTransport[0];
+            this.goToTransportDetail(transport.id, row.caseNo);
+          } else {
+            // 娌℃湁杞繍鍗曪紝璺宠浆鍒板垱寤鸿浆杩愬崟椤甸潰
+            this.goToCreateTransport(row);
+          }
+        } else {
+          this.$message.warning("璇ユ渚嬩笉闇�瑕佽浆杩�");
+        }
+      } catch (error) {
+        console.error("鑾峰彇妗堜緥淇℃伅澶辫触:", error);
+        this.$message.error("鑾峰彇妗堜緥淇℃伅澶辫触");
+      }
+    },
+
+    /** 璺宠浆鍒板垱寤鸿浆杩愬崟椤甸潰 */
+    goToCreateTransport(caseData) {
+      // 杩欓噷鍙互璺宠浆鍒板垱寤鸿浆杩愬崟鐨勯〉闈�
+      // 鏂瑰紡1锛氬湪鏂伴〉闈㈡墦寮�
+      this.$router.push({
+        path: "/report/transfer",
+        query: {
+          autoCreate: "true",
+          caseId: caseData.id,
+          caseNo: caseData.caseNo,
+          patName: caseData.name,
+          age: caseData.age,
+          sex: caseData.sex,
+          diagnosisname: caseData.diagnosisname,
+          treatmentHospitalName: caseData.treatmenthospitalname
+        }
+      });
+
+      // 鏂瑰紡2锛氬湪褰撳墠椤甸潰鎵撳紑寮规锛堟帹鑽愶級
+      // this.openTransportDialog(caseData);
+    },
+
+    /** 鎵撳紑杞繍鍗曞脊妗� */
+    openTransportDialog(caseData) {
+      this.$modal.confirm({
+        title: "鍒涘缓杞繍鍗�",
+        message: `鎮ㄥ皢鍒涘缓妗堜緥銆�${caseData.caseNo} - ${caseData.name}銆戠殑杞繍鍗曪紝鏄惁缁х画锛焋,
+        confirmButtonText: "鍓嶅線鍒涘缓",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+        beforeClose: (action, instance, done) => {
+          if (action === "confirm") {
+            // 璺宠浆鍒拌浆杩愬崟鍒涘缓椤甸潰
+            this.$router.push({
+              path: "/report/transfer",
+              query: {
+                caseId: caseData.id,
+                caseNo: caseData.caseNo,
+                patName: caseData.name,
+                age: caseData.age,
+                sex: caseData.sex,
+                diagnosisname: caseData.diagnosisname,
+                treatmentHospitalName: caseData.treatmenthospitalname
+              }
+            });
+            done();
+          } else {
+            done();
+          }
+        }
+      });
+    },
+
+    /** 璺宠浆鍒拌浆杩愬崟璇︽儏椤� */
+    goToTransportDetail(transportId, caseNo) {
+      this.$router.push({
+        path: "/report/transfer",
+        query: {
+          id: transportId,
+          caseNo: caseNo
+        }
+      });
+    },
+    // ---------------------------------end
     // 澶氶�夋閫変腑鏁版嵁
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id);
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
+
     /** 鎼滅储鎸夐挳鎿嶄綔 */
     handleQuery() {
       this.queryParams.pageNum = 1;
       this.getList();
     },
+
     /** 閲嶇疆鎸夐挳鎿嶄綔 */
     resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        caseNo: undefined,
+        name: undefined,
+        reportStatus: undefined
+      };
+      this.getList();
     },
+
     /** 璇︽儏鎸夐挳鎿嶄綔 */
-    handleDetail(row) {
-      this.currentCase = row;
-      this.detailTitle = `妗堜緥璇︽儏 - ${row.donorNo}`;
-      this.detailOpen = true;
-    },
-    /** 瀹℃壒鎸夐挳鎿嶄綔 */
-    handleApprove(row) {
-      this.currentCase = row;
-      this.approveForm.caseId = row.id;
-      this.approveForm.approveResult = "1";
-      this.approveForm.approveOpinion = "";
-      this.approveOpen = true;
-    },
-    /** 鎻愪氦瀹℃壒 */
-    submitApprove() {
-      this.$refs["approveForm"].validate(valid => {
-        if (valid) {
-          // 妯℃嫙瀹℃壒鎻愪氦
-          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;
+    async handleDetail(row) {
+      try {
+        this.currentCase = row;
+
+        // 濡傛灉鐘舵�佹槸"宸蹭笂鎶�"(1)锛屽垯鏇存柊涓�"宸查槄璇�"(2)
+        if (this.currentCase.reportStatus === "1") {
+          try {
+            const updateData = {
+              ...this.currentCase,
+              reportStatus: "2",
+              updateTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+              updateBy: this.$store.state.user?.name || "褰撳墠鐢ㄦ埛"
+            };
+
+            await donateEdit(updateData);
+            this.currentCase.reportStatus = "2";
+            this.currentCase.updateTime = updateData.updateTime;
+            row.reportStatus = "2";
+            this.$modal.msgSuccess("鐘舵�佸凡鏇存柊涓哄凡闃呰");
+          } catch (updateError) {
+            console.error("鐘舵�佹洿鏂板け璐�:", updateError);
           }
         }
-      });
+
+        this.detailTitle = `妗堜緥璇︽儏 - ${this.currentCase.caseNo ||
+          row.caseNo}`;
+        this.detailOpen = true;
+        console.log(this.currentCase, "this.currentCase");
+      } catch (error) {
+        console.error("鑾峰彇妗堜緥璇︽儏澶辫触:", error);
+        this.currentCase = row;
+        this.detailTitle = `妗堜緥璇︽儏 - ${row.caseNo}`;
+        this.detailOpen = true;
+      }
     },
+
+    /** 缂栬緫鎸夐挳鎿嶄綔 */
+    async handleEdit(row) {
+      try {
+        const response = await donateInfo(row.id);
+        if (response.code === 200 || response.data) {
+          this.isEditing = true;
+          const data = response.data || response;
+
+          // 澶勭悊闄勪欢
+          if (data.annexfilesList) {
+            this.attachmentFileList = this.parseAttachmentToFileList(
+              data.annexfilesList
+            );
+          } else {
+            this.attachmentFileList = [];
+          }
+
+          this.currentCase = data;
+          this.editForm = { ...data };
+          this.editOpen = true;
+          this.$nextTick(() => {
+            this.$refs.editForm && this.$refs.editForm.clearValidate();
+          });
+        } else {
+          this.$message.error(response.msg || "鑾峰彇璁板綍澶辫触");
+        }
+      } catch (error) {
+        console.error("鑾峰彇璁板綍澶辫触:", error);
+        this.$modal.msgError("鑾峰彇璁板綍澶辫触");
+      }
+    },
+
     /** 鏂板鎸夐挳鎿嶄綔 */
     handleAdd() {
-      this.$router.push('/case/add');
+      this.isEditing = false;
+      this.editForm = this.getDefaultFormData();
+      this.attachmentFileList = [];
+      this.editOpen = true;
+      this.$nextTick(() => {
+        this.$refs.editForm && this.$refs.editForm.clearValidate();
+      });
     },
-    /** 淇敼鎸夐挳鎿嶄綔 */
-    handleUpdate(row) {
-      const id = row.id || this.ids[0];
-      this.$router.push('/case/edit/' + id);
+
+    /** 瀹℃壒鎸夐挳鎿嶄綔 */
+    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("鑾峰彇璇︽儏澶辫触锛屼絾宸叉墦寮�瀹℃壒绐楀彛");
+      }
     },
+
+    /** 鎻愪氦瀹℃壒 */
+    async submitApprove() {
+      try {
+        const valid = await this.$refs.approveForm.validate();
+        if (valid) {
+          const approveData = {
+            ...this.currentCase,
+            reportStatus: this.approveForm.approveResult,
+            remark: this.approveForm.approveOpinion,
+            approvername: this.$store.state.user?.name || "褰撳墠鐢ㄦ埛",
+            approvetime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+            updateTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+            updateBy: this.$store.state.user?.name || "褰撳墠鐢ㄦ埛"
+          };
+
+          await donateEdit(approveData);
+          this.$modal.msgSuccess("瀹℃壒鎴愬姛");
+          this.approveOpen = false;
+          this.getList();
+        }
+      } catch (error) {
+        console.error("瀹℃壒澶辫触:", error);
+        if (error !== "cancel") {
+          this.$modal.msgError("瀹℃壒澶辫触");
+        }
+      }
+    },
+
     /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    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;
+      try {
+        await this.$modal.confirm(
+          '鏄惁纭鍒犻櫎妗堜緥缂栧彿涓�"' + ids + '"鐨勬暟鎹」锛�'
+        );
+        await donateDel(ids);
         this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-      }).catch(() => {});
+        this.getList();
+      } catch (error) {
+        if (error !== "cancel") {
+          console.error("鍒犻櫎澶辫触:", error);
+          this.$modal.msgError("鍒犻櫎澶辫触");
+        }
+      }
+    },
+
+    /** 鑾峰彇榛樿琛ㄥ崟鏁版嵁 */
+    getDefaultFormData() {
+      return {
+        id: undefined,
+        caseNo: undefined,
+        name: undefined,
+        sex: undefined,
+        age: undefined,
+        ageunit: "year",
+        bloodType: undefined,
+        rhYin: "0",
+        birthday: undefined,
+        idcardtype: "1",
+        idcardno: undefined,
+        nation: undefined,
+        nationality: undefined,
+        nativeplace: undefined,
+        education: undefined,
+        occupation: undefined,
+        phone: undefined,
+        // 鎴风睄鍦板潃
+        registerprovincename: undefined,
+        registercityname: undefined,
+        registertownname: undefined,
+        registercommunityname: undefined,
+        registeraddress: undefined,
+        // 鐜颁綇鍦板潃
+        residenceprovincename: undefined,
+        residencecountyname: undefined,
+        residencetownname: undefined,
+        residencecommunityname: undefined,
+        residenceaddress: undefined,
+        // 鍖荤枟淇℃伅
+        diagnosisname: undefined,
+        illnessoverview: undefined,
+        patientstate: undefined,
+        gcsScore: undefined,
+        infectious: undefined,
+        infectiousOther: undefined,
+        isTransport: "1",
+        // 鍖婚櫌淇℃伅
+        treatmenthospitalname: undefined,
+        treatmentdeptname: undefined,
+        inpatientno: undefined,
+        deptName: undefined,
+        deptNo: undefined,
+        toHospital: undefined,
+        // 涓婃姤淇℃伅
+        infoName: undefined,
+        infoNo: undefined,
+        reporterphone: undefined,
+        coordinatorName: undefined,
+        coordinatorNo: undefined,
+        terminationCase: "0",
+        reportStatus: "1", // 榛樿宸蹭笂鎶�
+        // 闄勪欢
+        annexfilesList: [],
+        // 鍏朵粬
+        remark: undefined,
+        createBy: undefined,
+        createTime: undefined,
+        updateBy: undefined,
+        updateTime: undefined,
+        delFlag: 0
+      };
+    },
+
+    /** 闄勪欢杞崲 */
+    parseAttachmentToFileList(attachments) {
+      if (!attachments || !Array.isArray(attachments)) return [];
+      return attachments.map((item, index) => ({
+        uid: item.id || `attachment-${index}-${Date.now()}`,
+        name: item.fileName,
+        url: item.path || item.fileUrl,
+        status: "success",
+        raw: item
+      }));
+    },
+
+    /** 闄勪欢鍙樺寲澶勭悊 */
+    handleAttachmentChange(fileList) {
+      this.attachmentFileList = fileList;
+    },
+
+    /** 闄勪欢涓婁紶鎴愬姛澶勭悊 */
+    handleUploadSuccess({ file, fileList, response }) {
+      if (response && response.code === 200) {
+        if (!this.editForm.annexfilesList) {
+          this.editForm.annexfilesList = [];
+        }
+        const attachmentObj = {
+          fileName: file.name,
+          path: response.data || file.url,
+          fileUrl: response.data || file.url,
+          type: this.getFileExtension(file.name),
+          createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+          remart: file.raw?.remart || "",
+          caseNo: this.editForm.caseNo
+        };
+
+        this.editForm.annexfilesList.push(attachmentObj);
+        this.$message.success("鏂囦欢涓婁紶鎴愬姛");
+      }
+    },
+
+    /** 闄勪欢涓婁紶閿欒澶勭悊 */
+    handleUploadError({ file, fileList, error }) {
+      console.error("闄勪欢涓婁紶澶辫触:", error);
+      this.$message.error("鏂囦欢涓婁紶澶辫触锛岃閲嶈瘯");
+    },
+
+    /** 闄勪欢绉婚櫎澶勭悊 */
+    handleAttachmentRemove(file) {
+      if (file.url && this.editForm.annexfilesList) {
+        const index = this.editForm.annexfilesList.findIndex(
+          item => item.path === file.url || item.fileUrl === file.url
+        );
+        if (index > -1) {
+          this.editForm.annexfilesList.splice(index, 1);
+        }
+      }
+    },
+
+    /** 鎵嬪姩鍒犻櫎闄勪欢 */
+    handleRemoveAttachment(index) {
+      this.editForm.annexfilesList.splice(index, 1);
+      this.attachmentFileList.splice(index, 1);
+      this.$message.success("闄勪欢鍒犻櫎鎴愬姛");
+    },
+
+    /** 鏂囦欢棰勮 */
+    handlePreview(file) {
+      this.currentPreviewFile = {
+        fileName: file.fileName,
+        fileUrl: file.path || file.fileUrl,
+        fileType: this.getFileType(file.fileName)
+      };
+      this.previewVisible = true;
+    },
+
+    /** 鏂囦欢涓嬭浇 */
+    handleDownload(file) {
+      const fileUrl = file.path || file.fileUrl;
+      const fileName = file.fileName;
+
+      if (fileUrl) {
+        const link = document.createElement("a");
+        link.href = fileUrl;
+        link.download = fileName;
+        link.style.display = "none";
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+        this.$message.success("寮�濮嬩笅杞芥枃浠�");
+      } else {
+        this.$message.warning("鏂囦欢璺緞涓嶅瓨鍦紝鏃犳硶涓嬭浇");
+      }
+    },
+
+    /** 鑾峰彇鏂囦欢绫诲瀷 */
+    getFileType(fileName) {
+      if (!fileName) return "other";
+      const extension = fileName
+        .split(".")
+        .pop()
+        .toLowerCase();
+      const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"];
+      const pdfTypes = ["pdf"];
+      const officeTypes = ["doc", "docx", "xls", "xlsx"];
+
+      if (imageTypes.includes(extension)) return "image";
+      if (pdfTypes.includes(extension)) return "pdf";
+      if (officeTypes.includes(extension)) return "office";
+      return "other";
+    },
+
+    /** 鑾峰彇鏂囦欢鎵╁睍鍚� */
+    getFileExtension(filename) {
+      if (!filename) return "";
+      return filename
+        .split(".")
+        .pop()
+        .toLowerCase();
+    },
+
+    /** 鏃ユ湡鏃堕棿鏍煎紡鍖� */
+    formatDateTime(dateTime) {
+      if (!dateTime) return "";
+      return dayjs(dateTime).format("YYYY-MM-DD HH:mm:ss");
+    },
+
+    /** 鍏抽棴缂栬緫瀵硅瘽妗� */
+    handleEditClose() {
+      this.editOpen = false;
+      this.currentCase = {};
+      this.editForm = this.getDefaultFormData();
+      this.attachmentFileList = [];
+      this.$nextTick(() => {
+        this.$refs.editForm && this.$refs.editForm.clearValidate();
+      });
+    },
+
+    /** 淇濆瓨琛ㄥ崟 */
+    async handleSave() {
+      try {
+        const valid = await this.$refs.editForm.validate();
+        if (!valid) return;
+
+        const pendingFiles = this.attachmentFileList.filter(
+          item => item.status !== "success"
+        );
+        if (pendingFiles.length > 0) {
+          this.$message.warning(
+            "杩樻湁鏂囦欢鏈笂浼犲畬鎴愶紝璇峰厛涓婁紶鎵�鏈夋枃浠舵垨绉婚櫎鏈笂浼犵殑鏂囦欢"
+          );
+          return;
+        }
+
+        this.saveLoading = true;
+
+        const requestData = { ...this.editForm };
+        let response;
+
+        if (this.isEditing) {
+          response = await donateEdit(requestData);
+        } else {
+          // 鏂板鏃惰缃垱寤轰俊鎭�
+          requestData.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
+          requestData.createBy = this.$store.state.user?.name || "褰撳墠鐢ㄦ埛";
+          response = await donateAdd(requestData);
+        }
+
+        if (response.code === 200) {
+          this.$message.success(this.isEditing ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
+          this.handleEditClose();
+          this.getList();
+        } else {
+          this.$message.error(response.msg || "鎿嶄綔澶辫触");
+        }
+      } catch (error) {
+        console.error("淇濆瓨澶辫触:", error);
+        this.$message.error("鎿嶄綔澶辫触锛岃绋嶅悗閲嶈瘯");
+      } finally {
+        this.saveLoading = false;
+      }
     }
   }
 };
 </script>
 
 <style scoped>
+.app-container {
+  padding: 20px;
+}
+
 .filter-card {
   margin-bottom: 20px;
 }
+
 .mb8 {
   margin-bottom: 8px;
 }
+
+/* 琛ㄥ崟鍖哄煙鏍峰紡 */
+.form-section {
+  margin-bottom: 16px;
+}
+
+.section-header {
+  display: flex;
+  align-items: center;
+  font-weight: bold;
+  color: #303133;
+}
+
+.dialog-footer {
+  text-align: right;
+  padding: 20px 0 0;
+}
+
+/* 闄勪欢鏍峰紡 */
+.attachment-section {
+  margin-bottom: 16px;
+}
+
+.attachment-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16px;
+  padding: 8px 0;
+  border-bottom: 1px solid #ebeef5;
+}
+
+.attachment-title {
+  font-weight: bold;
+  margin: 0 8px;
+}
+
+.attachment-tip {
+  font-size: 12px;
+  color: #909399;
+}
+
+.attachment-list {
+  margin-top: 16px;
+}
+
+.list-title {
+  font-weight: bold;
+  margin-bottom: 12px;
+  color: #303133;
+}
+
+.file-name {
+  font-size: 13px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+/* 瀹℃壒寮规鏍峰紡 */
+.approve-dialog >>> .el-dialog__body {
+  padding: 0;
+}
+
+.approve-detail-preview {
+  height: 100%;
+}
+
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 1200px) {
+  .approve-dialog {
+    width: 95% !important;
+  }
+
+  .el-aside {
+    width: 50% !important;
+  }
+}
 </style>

--
Gitblit v1.9.3