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/transfer/index.vue |  836 +++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 608 insertions(+), 228 deletions(-)

diff --git a/src/views/business/transfer/index.vue b/src/views/business/transfer/index.vue
index c4d14c4..39faefb 100644
--- a/src/views/business/transfer/index.vue
+++ b/src/views/business/transfer/index.vue
@@ -2,16 +2,12 @@
   <div class="app-container">
     <!-- 鎼滅储绛涢�夊尯鍩� -->
     <el-card class="filter-card">
-      <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="80px">
-        <el-form-item label="杞繍鍗曞彿" prop="transportNo">
-          <el-input
-            v-model="queryParams.transportNo"
-            placeholder="璇疯緭鍏ヨ浆杩愬崟鍙�"
-            clearable
-            style="width: 200px"
-            @keyup.enter.native="handleQuery"
-          />
-        </el-form-item>
+      <el-form
+        :model="queryParams"
+        ref="queryForm"
+        :inline="true"
+        label-width="80px"
+      >
         <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
           <el-input
             v-model="queryParams.caseNo"
@@ -21,22 +17,28 @@
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
+        <el-form-item label="鎮h�呭鍚�" prop="patName">
           <el-input
-            v-model="queryParams.donorName"
-            placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
+            v-model="queryParams.patName"
+            placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
             clearable
             style="width: 200px"
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="杞繍鐘舵��" prop="status">
-          <el-select v-model="queryParams.status" placeholder="杞繍鐘舵��" clearable style="width: 200px">
-            <el-option label="鍏ㄩ儴" value=""/>
-            <el-option label="寰呭嚭鍙�" value="pending"/>
-            <el-option label="杞繍涓�" value="transporting"/>
-            <el-option label="宸插畬鎴�" value="completed"/>
-            <el-option label="宸插彇娑�" value="cancelled"/>
+        <el-form-item label="杞繍鐘舵��" prop="transitStatus">
+          <el-select
+            v-model="queryParams.transitStatus"
+            placeholder="杞繍鐘舵��"
+            clearable
+            style="width: 200px"
+          >
+            <el-option label="鍏ㄩ儴" value="" />
+            <el-option label="寰呰浆杩�" :value="1" />
+            <el-option label="杞繍涓�" :value="2" />
+            <el-option label="杞繍瀹屾垚" :value="3" />
+            <el-option label="杞繍鍙栨秷" :value="4" />
+            <el-option label="鏆傚瓨" :value="5" />
           </el-select>
         </el-form-item>
         <el-form-item label="鍒涘缓鏃堕棿">
@@ -51,7 +53,9 @@
           ></el-date-picker>
         </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>
@@ -97,71 +101,167 @@
     <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
     <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-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-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-col :span="1.5">
-        <el-button type="warning" plain icon="el-icon-download" @click="handleExport">瀵煎嚭</el-button>
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          @click="handleExport"
+          >瀵煎嚭</el-button
+        >
       </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
     </el-row>
 
-    <!-- 鏁版嵁琛ㄦ牸 -->
-    <el-table v-loading="loading" :data="transportList" @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="id" width="140"/>
-      <el-table-column label="妗堜緥缂栧彿" align="center" prop="caseNo" width="140"/>
-      <el-table-column label="鎹愮尞鑰呬俊鎭�" align="center" width="180">
+    <!-- 鏁版嵁琛ㄦ牸 - 鐩存帴浣跨敤鍚庣杩斿洖鐨勬暟鎹粨鏋� -->
+    <el-table
+      v-loading="loading"
+      :data="transportList"
+      @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="reportId"
+        width="140"
+      />
+      <el-table-column
+        label="妗堜緥缂栧彿"
+        align="center"
+        prop="caseNo"
+        width="140"
+      />
+      <el-table-column label="鎮h�呬俊鎭�" align="center" width="260">
         <template slot-scope="scope">
           <div class="donor-info">
-            <div class="donor-name">{{ scope.row.donorName }}</div>
-            <div class="donor-details">{{ scope.row.gender }} | {{ scope.row.age }}宀�</div>
+            <div class="donor-name">{{ scope.row.patName }}</div>
+            <div class="donor-details">
+              <dict-tag
+                :options="dict.type.sys_user_sex"
+                :value="parseInt(scope.row.sex)"
+              />
+              | {{ scope.row.age }}宀�
+            </div>
           </div>
         </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="transportTime" width="160"/>
-      <el-table-column label="璐熻矗鍗忚皟鍛�" align="center" prop="coordinator" width="100"/>
-      <el-table-column label="杞繍鐘舵��" align="center" prop="status" width="100">
+      <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="transportStartTime"
+        width="160"
+      />
+      <el-table-column
+        label="璐熻矗鍗忚皟鍛�"
+        align="center"
+        prop="contactPerson"
+        width="100"
+      />
+      <el-table-column
+        label="杞繍鐘舵��"
+        align="center"
+        prop="transitStatus"
+        width="100"
+      >
         <template slot-scope="scope">
-          <el-tag :type="scope.row.status | statusFilter">
-            {{ scope.row.statusText }}
+          <el-tag :type="getStatusTagType(scope.row.transitStatus)">
+            {{ getStatusText(scope.row.transitStatus) }}
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="160"/>
-      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="220">
+      <el-table-column
+        label="鍒涘缓鏃堕棿"
+        align="center"
+        prop="createTime"
+        width="160"
+      />
+      <el-table-column
+        label="鎿嶄綔"
+        align="center"
+        fixed="right"
+        class-name="small-padding fixed-width"
+        width="220"
+      >
         <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-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-button
             size="mini"
             type="text"
             icon="el-icon-video-play"
             @click="handleStartTransport(scope.row)"
-            v-if="scope.row.status === 'pending'"
-          >寮�濮嬭浆杩�</el-button>
+            v-if="scope.row.transitStatus === 1"
+            >寮�濮嬭浆杩�</el-button
+          >
           <el-button
             size="mini"
             type="text"
             icon="el-icon-check"
             @click="handleCompleteTransport(scope.row)"
-            v-if="scope.row.status === 'transporting'"
-          >瀹屾垚杞繍</el-button>
+            v-if="scope.row.transitStatus === 2"
+            >瀹屾垚杞繍</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"
@@ -176,9 +276,129 @@
       append-to-body
       :close-on-click-modal="false"
     >
-      <transport-detail :transportData="currentTransport" @close="detailOpen = false"/>
+      <transport-detail
+        :transportData="currentTransport"
+        @close="detailOpen = false"
+      />
     </el-dialog>
 
+    <!-- 妗堜緥閫夋嫨瀵硅瘽妗� -->
+    <el-dialog
+      title="閫夋嫨杞繍妗堜緥"
+      :visible.sync="selectCaseOpen"
+      width="900px"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <div class="case-select-container">
+        <el-card class="search-card">
+          <el-form :model="caseQueryParams" inline>
+            <el-form-item label="妗堜緥缂栧彿">
+              <el-input
+                v-model="caseQueryParams.caseNo"
+                placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
+                clearable
+                style="width: 180px"
+              />
+            </el-form-item>
+            <el-form-item label="鎮h�呭鍚�">
+              <el-input
+                v-model="caseQueryParams.patName"
+                placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
+                clearable
+                style="width: 150px"
+              />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="el-icon-search" @click="searchCaseList"
+                >鎼滅储</el-button
+              >
+              <el-button icon="el-icon-refresh" @click="resetCaseSearch"
+                >閲嶇疆</el-button
+              >
+            </el-form-item>
+          </el-form>
+        </el-card>
+
+        <el-card>
+          <el-table
+            v-loading="caseLoading"
+            :data="availableCaseList"
+            @row-click="handleCaseSelect"
+            highlight-current-row
+            style="width: 100%"
+          >
+            <el-table-column label="妗堜緥缂栧彿" prop="caseNo" width="150" align="center" />
+            <el-table-column label="鎮h�呭鍚�" prop="name" width="120" align="center" />
+            <el-table-column label="鎬у埆" width="80" align="center">
+              <template slot-scope="scope">
+                <dict-tag
+                  :options="dict.type.sys_user_sex"
+                  :value="scope.row.sex"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column label="骞撮緞" prop="age" width="80" align="center" />
+            <el-table-column label="琛�鍨�" width="80" align="center">
+              <template slot-scope="scope">
+                <dict-tag
+                  :options="dict.type.sys_BloodType"
+                  :value="scope.row.bloodType"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column label="鐤剧梾璇婃柇" prop="diagnosisname" min-width="200" show-overflow-tooltip />
+            <el-table-column label="娌荤枟鍖婚櫌" prop="treatmenthospitalname" width="150" />
+            <el-table-column label="鏄惁宸茶浆杩�" width="100" align="center">
+              <template slot-scope="scope">
+                <el-tag
+                  :type="hasTransport(scope.row) ? 'danger' : 'success'"
+                  size="small"
+                >
+                  {{ hasTransport(scope.row) ? '宸茶浆杩�' : '鍙浆杩�' }}
+                </el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="鎿嶄綔" width="80" align="center">
+              <template slot-scope="scope">
+                <el-button
+                  type="text"
+                  size="mini"
+                  @click="selectCase(scope.row)"
+                  :disabled="hasTransport(scope.row)"
+                >
+                  閫夋嫨
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+
+          <!-- 鍒嗛〉 -->
+          <pagination
+            v-show="caseTotal > 0"
+            :total="caseTotal"
+            :page.sync="caseQueryParams.pageNum"
+            :limit.sync="caseQueryParams.pageSize"
+            @pagination="searchCaseList"
+          />
+        </el-card>
+      </div>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="selectCaseOpen = false">鍙栨秷</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 鏂板锛氫慨鏀瑰脊妗� -->
+    <transport-edit
+      :edit-open="editOpen"
+      :transport-data="currentTransport"
+      :is-edit="isEditing"
+      :selected-case="selectedCase"
+      @update:edit-open="editOpen = $event"
+      @close="handleEditClose"
+      @save-success="handleSaveSuccess"
+    />
     <!-- 鎿嶄綔纭寮规 -->
     <el-dialog
       :title="actionTitle"
@@ -187,7 +407,11 @@
       append-to-body
     >
       <div class="action-confirm">
-        <p>纭畾瑕亄{ actionText }}杞繍鍗� "{{ currentTransport.id }}" 鍚楋紵</p>
+        <p>
+          纭畾瑕亄{ actionText }}杞繍鍗� "{{
+            currentTransport.reportId || currentTransport.id
+          }}" 鍚楋紵
+        </p>
       </div>
       <div slot="footer" class="dialog-footer">
         <el-button @click="actionOpen = false">鍙� 娑�</el-button>
@@ -198,14 +422,24 @@
 </template>
 
 <script>
-import { listTransport, getTransport, delTransport, updateTransportStatus } from "@/api/system/business";
-import TransportDetail from './transportDetail';
+import {
+  transportList,
+  transportAdd,
+  transportEdit,
+  transportDelete,
+  transportInfo,
+  donateList
+} from "@/api/businessApi/index";
+import TransportDetail from "./transportDetail";
+import TransportEdit from "./TransportEdit";
 
 export default {
   name: "TransportList",
-  components: { TransportDetail },
+  components: { TransportDetail, TransportEdit },
+  dicts: ["sys_user_sex", "sys_BloodType"],
   data() {
     return {
+
       // 閬僵灞�
       loading: false,
       // 閫変腑鏁扮粍
@@ -222,8 +456,13 @@
       transportList: [],
       // 璇︽儏寮规鏄惁鏄剧ず
       detailOpen: false,
+      // 妗堜緥閫夋嫨寮规鏄惁鏄剧ず
+      selectCaseOpen: false,
       // 鎿嶄綔纭寮规鏄惁鏄剧ず
       actionOpen: false,
+      // 鏂板锛氫慨鏀瑰脊妗嗙浉鍏虫暟鎹�
+      editOpen: false,
+      isEditing: false,
       // 璇︽儏寮规鏍囬
       detailTitle: "",
       // 鎿嶄綔纭鏍囬
@@ -244,134 +483,209 @@
       queryParams: {
         pageNum: 1,
         pageSize: 10,
-        transportNo: undefined,
         caseNo: undefined,
-        donorName: undefined,
-        status: undefined
+        patName: undefined,
+        transitStatus: undefined,
+        searchValue: undefined,
+        params: {}
+      },
+      // 妗堜緥閫夋嫨鐩稿叧
+      caseLoading: false,
+      availableCaseList: [],
+      caseTotal: 0,
+      selectedCase: null,
+      caseQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        caseNo: undefined,
+        patName: undefined,
+        // 鍙煡璇㈠凡鍚屾剰涓旈渶瑕佽浆杩愮殑妗堜緥
+        // reportStatus: "3", // 宸插悓鎰�
+        isTransport: "2"   // 闇�瑕佽浆杩�
       }
     };
   },
-  filters: {
-    statusFilter(status) {
-      const statusMap = {
-        'pending': 'warning',
-        'transporting': 'primary',
-        'completed': 'success',
-        'cancelled': 'danger'
-      };
-      return statusMap[status];
-    }
-  },
   created() {
     this.getList();
+     this.checkAutoCreate();
   },
   methods: {
     /** 鏌ヨ杞繍鍗曞垪琛� */
-    getList() {
+    async getList() {
       this.loading = true;
-      // 妯℃嫙API璋冪敤寤惰繜
-      setTimeout(() => {
-        // 娴嬭瘯鏁版嵁
-        this.transportList = [
-          {
-            id: 'T20241217001',
-            caseNo: 'DON20241216001',
-            donorName: '寮犱笁',
-            gender: '鐢�',
-            age: 38,
-            diagnosis: '鑴戝浼ゅ鑷磋剳姝讳骸锛岀粡鎶㈡晳鏃犳晥瀹e竷鑴戞浜°�傚灞炲悓鎰忓櫒瀹樻崘鐚��',
-            hospitalName: '闈掑矝闀滄箹鍖婚櫌',
-            transportTime: '2024-12-17 14:30:00',
-            coordinator: '寮犲尰鐢�',
-            createTime: '2024-12-16 09:30:00',
-            status: 'pending',
-            statusText: '寰呭嚭鍙�',
-            departureLocation: '闈掑矝甯傜珛鍖婚櫌鎬ヨ瘖绉�',
-            destinationHospital: '闈掑矝闀滄箹鍖婚櫌',
-            emergencyDoctor: '鐜嬪尰鐢�',
-            nurse: '鏉庢姢澹�',
-            driver: '鍒樺笀鍌�',
-            icuDoctor: '璧靛尰鐢�',
-            contacts: [
-              { role: '鍗忚皟鍛樼數璇�', phone: '13800138000' },
-              { role: '鎬ヨ瘖鍖荤敓鐢佃瘽', phone: '13800138001' },
-              { role: '鎶ゅ+鐢佃瘽', phone: '13800138002' },
-              { role: '鍙告満鐢佃瘽', phone: '13800138003' },
-              { role: 'ICU鍖荤敓鐢佃瘽', phone: '13800138004' }
-            ],
-            remarks: '闇�瑕佸噯澶囧懠鍚告満绛夋�ユ晳璁惧'
-          },
-          {
-            id: 'T20241217002',
-            caseNo: 'DON20241216002',
-            donorName: '鏉庡洓',
-            gender: '濂�',
-            age: 45,
-            diagnosis: '鑴戞姝伙紝鑴戝共鍔熻兘涓уけ',
-            hospitalName: '闈掑矝澶у闄勫睘鍖婚櫌',
-            transportTime: '2024-12-17 16:00:00',
-            coordinator: '鏉庡尰鐢�',
-            createTime: '2024-12-16 11:20:00',
-            status: 'transporting',
-            statusText: '杞繍涓�',
-            departureLocation: '闈掑矝澶у闄勫睘鍖婚櫌ICU',
-            destinationHospital: '闈掑矝鍣ㄥ畼绉绘涓績',
-            currentLocation: '闈掑矝甯傚崡鍖洪娓腑璺�',
-            estimatedTime: '30鍒嗛挓'
-          },
-          {
-            id: 'T20241216003',
-            caseNo: 'DON20241215001',
-            donorName: '鐜嬩簲',
-            gender: '鐢�',
-            age: 52,
-            diagnosis: '蹇冭剰楠ゅ仠锛屽鍣ㄥ畼鍔熻兘琛扮',
-            hospitalName: '闈掑矝甯傜珛鍖婚櫌',
-            transportTime: '2024-12-16 10:15:00',
-            coordinator: '鐜嬪尰鐢�',
-            createTime: '2024-12-15 14:45:00',
-            status: 'completed',
-            statusText: '宸插畬鎴�',
-            departureLocation: '闈掑矝甯傜珛鍖婚櫌蹇冨唴绉�',
-            destinationHospital: '闈掑矝鍣ㄥ畼绉绘涓績',
-            completedTime: '2024-12-16 12:30:00',
-            distance: '15鍏噷',
-            duration: '2灏忔椂15鍒嗛挓'
-          },
-          {
-            id: 'T20241216004',
-            caseNo: 'DON20241214001',
-            donorName: '璧靛叚',
-            gender: '濂�',
-            age: 29,
-            diagnosis: '鎬ユ�ц倽琛扮',
-            hospitalName: '闈掑矝绉戝ぇ鍖婚櫌',
-            transportTime: '2024-12-16 08:30:00',
-            coordinator: '璧靛尰鐢�',
-            createTime: '2024-12-14 16:20:00',
-            status: 'cancelled',
-            statusText: '宸插彇娑�',
-            cancelReason: '瀹跺睘涓存椂鏀瑰彉鍐冲畾'
-          }
-        ];
 
-        // 鏇存柊缁熻鏁版嵁
-        this.updateStats();
-        this.total = this.transportList.length;
+      try {
+        const requestParams = {
+          pageNum: this.queryParams.pageNum,
+          pageSize: this.queryParams.pageSize,
+          caseNo: this.queryParams.caseNo,
+          patName: this.queryParams.patName,
+          transitStatus: this.queryParams.transitStatus,
+          searchValue: this.queryParams.searchValue
+        };
+
+        if (this.dateRange && this.dateRange.length === 2) {
+          requestParams.transportStartTime = this.dateRange.join(",");
+        }
+
+        const response = await transportList(requestParams);
+
+        if (response.code === 200) {
+          this.transportList = response.rows || response.data || [];
+          this.total = response.total || 0;
+          this.updateStats();
+        } else {
+          this.$modal.msgError(response.msg || "鑾峰彇杞繍鍗曞垪琛ㄥけ璐�");
+        }
+      } catch (error) {
+        console.error("鑾峰彇杞繍鍗曞垪琛ㄥけ璐�:", error);
+        this.$modal.msgError("缃戠粶璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯");
+      } finally {
         this.loading = false;
-      }, 500);
+      }
+    },
+  checkAutoCreate() {
+    const query = this.$route.query;
+    if (query.autoCreate === 'true') {
+      // 鑷姩鎵撳紑妗堜緥閫夋嫨寮规
+      this.selectCaseOpen = true;
+      this.resetCaseSearch();
+
+      // 濡傛灉鏈夌壒瀹氱殑妗堜緥缂栧彿锛屽彲浠ラ鍏堟悳绱�
+      if (query.caseNo) {
+        this.caseQueryParams.caseNo = query.caseNo;
+        this.searchCaseList();
+      }
+    }
+  },
+    /** 鎼滅储鍙敤妗堜緥 */
+    async searchCaseList() {
+      this.caseLoading = true;
+      try {
+        const response = await donateList(this.caseQueryParams);
+        if (response.code === 200) {
+          this.availableCaseList = response.rows || response.data || [];
+          this.caseTotal = response.total || 0;
+        } else {
+          this.$modal.msgError(response.msg || "鑾峰彇妗堜緥鍒楄〃澶辫触");
+        }
+      } catch (error) {
+        console.error("鑾峰彇妗堜緥鍒楄〃澶辫触:", error);
+        this.$modal.msgError("鑾峰彇妗堜緥鍒楄〃澶辫触");
+      } finally {
+        this.caseLoading = false;
+      }
+    },
+
+    /** 閲嶇疆妗堜緥鎼滅储 */
+    resetCaseSearch() {
+      this.caseQueryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        caseNo: undefined,
+        patName: undefined,
+        // reportStatus: "3",
+        isTransport: "2"
+      };
+      this.searchCaseList();
+    },
+
+    /** 鍒ゆ柇妗堜緥鏄惁宸叉湁杞繍鍗� */
+    hasTransport(caseData) {
+      // 妫�鏌ユ渚嬫槸鍚︽湁杞繍淇℃伅
+      if (caseData.serviceTransport &&
+          Array.isArray(caseData.serviceTransport) &&
+          caseData.serviceTransport.length > 0) {
+        return true;
+      }
+      return false;
+    },
+
+    /** 閫夋嫨妗堜緥 */
+    selectCase(caseData) {
+      if (this.hasTransport(caseData)) {
+        this.$message.warning("璇ユ渚嬪凡鏈夎浆杩愬崟锛岃閫夋嫨鍏朵粬妗堜緥");
+        return;
+      }
+
+      this.selectedCase = caseData;
+      this.selectCaseOpen = false;
+
+      // 鎵撳紑杞繍鍗曠紪杈戦〉闈紝骞朵紶鍏ラ�変腑鐨勬渚�
+      this.currentTransport = this.convertCaseToTransport(caseData);
+      this.isEditing = false;
+      this.editOpen = true;
+    },
+
+    /** 灏嗘渚嬩俊鎭浆鎹负杞繍鍗曟牸寮� */
+    convertCaseToTransport(caseData) {
+      return {
+        caseNo: caseData.caseNo,
+        patName: caseData.name,
+        sex: caseData.sex,
+        age: caseData.age,
+        diagnosisname: caseData.diagnosisname,
+        treatmentHospitalName: caseData.treatmenthospitalname,
+        treatmentDeptName: caseData.treatmentdeptname,
+        // 鍏朵粬瀛楁鍙互鏍规嵁闇�瑕佷粠妗堜緥涓幏鍙�
+        transportStartPlace: caseData.treatmenthospitalname || '',
+        contactPerson: caseData.coordinatorName || '',
+        transitStatus: 1, // 榛樿寰呰浆杩�
+        // 娓呯┖鍏朵粬瀛楁
+        id: undefined,
+        reportId: undefined,
+        transportStartTime: undefined,
+        doctor: undefined,
+        doctorPhone: undefined,
+        nurse: undefined,
+        nursePhone: undefined,
+        driver: undefined,
+        driverPhone: undefined,
+        icuDoctor: undefined,
+        icuDoctorPhone: undefined,
+        annexfilesList: [],
+        remark: undefined
+      };
+    },
+
+    /** 鑾峰彇鐘舵�佹爣绛剧被鍨� */
+    getStatusTagType(transitStatus) {
+      const statusMap = {
+        1: "warning", // 寰呰浆杩�
+        2: "primary", // 杞繍涓�
+        3: "success", // 杞繍瀹屾垚
+        4: "danger", // 杞繍鍙栨秷
+        5: "info" // 鏆傚瓨
+      };
+      return statusMap[transitStatus] || "info";
+    },
+
+    /** 鑾峰彇鐘舵�佹枃鏈� */
+    getStatusText(transitStatus) {
+      const statusMap = {
+        1: "寰呰浆杩�",
+        2: "杞繍涓�",
+        3: "杞繍瀹屾垚",
+        4: "杞繍鍙栨秷",
+        5: "鏆傚瓨"
+      };
+      return statusMap[transitStatus] || "鏈煡鐘舵��";
     },
 
     // 鏇存柊缁熻鏁版嵁
     updateStats() {
       this.stats.totalTransports = this.transportList.length;
-      this.stats.pendingTransports = this.transportList.filter(item => item.status === 'pending').length;
-      this.stats.completedTransports = this.transportList.filter(item => item.status === 'completed').length;
+      this.stats.pendingTransports = this.transportList.filter(
+        item => item.transitStatus === 1
+      ).length;
+      this.stats.completedTransports = this.transportList.filter(
+        item => item.transitStatus === 3
+      ).length;
     },
 
     // 澶氶�夋閫変腑鏁版嵁
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id);
+      this.ids = selection.map(item => item.reportId || item.id);
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
@@ -385,88 +699,150 @@
     /** 閲嶇疆鎸夐挳鎿嶄綔 */
     resetQuery() {
       this.dateRange = [];
-      this.resetForm("queryForm");
-      this.handleQuery();
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        caseNo: undefined,
+        patName: undefined,
+        transitStatus: undefined,
+        searchValue: undefined
+      };
+      this.getList();
     },
 
     /** 璇︽儏鎸夐挳鎿嶄綔 */
     handleDetail(row) {
       this.currentTransport = row;
-      this.detailTitle = `杞繍鍗曡鎯� - ${row.id}`;
+      this.detailTitle = `杞繍鍗曡鎯� - ${row.reportId || row.id}`;
       this.detailOpen = true;
-    },
-
-    /** 寮�濮嬭浆杩愭搷浣� */
-    handleStartTransport(row) {
-      this.currentTransport = row;
-      this.actionTitle = '寮�濮嬭浆杩�';
-      this.actionText = '寮�濮�';
-      this.actionOpen = true;
-    },
-
-    /** 瀹屾垚杞繍鎿嶄綔 */
-    handleCompleteTransport(row) {
-      this.currentTransport = row;
-      this.actionTitle = '瀹屾垚杞繍';
-      this.actionText = '瀹屾垚';
-      this.actionOpen = true;
-    },
-
-    /** 纭鎿嶄綔 */
-    confirmAction() {
-      const index = this.transportList.findIndex(item => item.id === this.currentTransport.id);
-      if (index !== -1) {
-        if (this.actionText === '寮�濮�') {
-          this.transportList[index].status = 'transporting';
-          this.transportList[index].statusText = '杞繍涓�';
-        } else if (this.actionText === '瀹屾垚') {
-          this.transportList[index].status = 'completed';
-          this.transportList[index].statusText = '宸插畬鎴�';
-          this.transportList[index].completedTime = new Date().toLocaleString();
-        }
-
-        // 鏇存柊缁熻鏁版嵁
-        this.updateStats();
-
-        this.$modal.msgSuccess(`${this.actionText}鎴愬姛`);
-      }
-      this.actionOpen = false;
-    },
-
-    /** 鏂板鎸夐挳鎿嶄綔 */
-    handleAdd() {
-      this.$router.push('/transport/add');
     },
 
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
-      const id = row.id || this.ids[0];
-      this.$router.push('/transport/edit/' + id);
+      this.currentTransport = row || {};
+      this.isEditing = true;
+      this.selectedCase = null; // 缂栬緫鏃朵笉浼犲叆妗堜緥淇℃伅
+      this.editOpen = true;
+    },
+
+    /** 鏂板缓杞繍鍗� */
+    handleAdd() {
+      // 鎵撳紑妗堜緥閫夋嫨寮规
+      this.selectCaseOpen = true;
+      this.selectedCase = null;
+      this.currentTransport = {};
+      this.resetCaseSearch(); // 閲嶇疆骞舵悳绱㈡渚�
+    },
+
+    /** 淇敼寮规鍏抽棴澶勭悊 */
+    handleEditClose() {
+      this.editOpen = false;
+      this.currentTransport = {};
+      this.selectedCase = null;
+    },
+
+    /** 淇濆瓨鎴愬姛澶勭悊 */
+    handleSaveSuccess() {
+      this.getList(); // 閲嶆柊鍔犺浇鍒楄〃
+    },
+
+    /** 寮�濮嬭浆杩愭搷浣� */
+    async handleStartTransport(row) {
+      this.currentTransport = row;
+      this.actionTitle = "寮�濮嬭浆杩�";
+      this.actionText = "寮�濮�";
+      this.actionOpen = true;
+    },
+
+    /** 瀹屾垚杞繍鎿嶄綔 */
+    async handleCompleteTransport(row) {
+      this.currentTransport = row;
+      this.actionTitle = "瀹屾垚杞繍";
+      this.actionText = "瀹屾垚";
+      this.actionOpen = true;
+    },
+
+    /** 纭鎿嶄綔 */
+    async confirmAction() {
+      try {
+        let requestData = {
+          id: this.currentTransport.id || this.currentTransport.reportId
+        };
+
+        if (this.actionText === "寮�濮�") {
+          requestData.transitStatus = 2; // 璁剧疆涓鸿浆杩愪腑
+        } else if (this.actionText === "瀹屾垚") {
+          requestData.transitStatus = 3; // 璁剧疆涓鸿浆杩愬畬鎴�
+        }
+
+        const response = await transportEdit(requestData);
+
+        if (response.code === 200) {
+          this.$modal.msgSuccess(`${this.actionText}杞繍鎴愬姛`);
+          this.getList();
+        } else {
+          this.$modal.msgError(response.msg || `${this.actionText}杞繍澶辫触`);
+        }
+      } catch (error) {
+        console.error(`${this.actionText}杞繍澶辫触:`, error);
+        this.$modal.msgError("鎿嶄綔澶辫触锛岃绋嶅悗閲嶈瘯");
+      }
+      this.actionOpen = false;
     },
 
     /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$modal.confirm('鏄惁纭鍒犻櫎杞繍鍗曠紪鍙蜂负"' + ids + '"鐨勬暟鎹」锛�').then(() => {
-        // 妯℃嫙鍒犻櫎鎿嶄綔
-        this.transportList = this.transportList.filter(item => !ids.includes(item.id));
-        this.total = this.transportList.length;
-        this.updateStats();
-        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-      }).catch(() => {});
+    async handleDelete(row) {
+      const ids = row.reportId || row.id || this.ids;
+
+      try {
+        await this.$modal.confirm(
+          '鏄惁纭鍒犻櫎杞繍鍗曠紪鍙蜂负"' + ids + '"鐨勬暟鎹」锛�'
+        );
+
+        const response = await transportDelete(ids);
+
+        if (response.code === 200) {
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          this.getList();
+        } else {
+          this.$modal.msgError(response.msg || "鍒犻櫎澶辫触");
+        }
+      } catch (error) {
+        if (error !== "cancel") {
+          console.error("鍒犻櫎澶辫触:", error);
+          this.$modal.msgError("鍒犻櫎澶辫触锛岃绋嶅悗閲嶈瘯");
+        }
+      }
     },
 
     /** 瀵煎嚭鎸夐挳鎿嶄綔 */
     handleExport() {
-      this.download('system/transport/export', {
-        ...this.queryParams
-      }, `transport_${new Date().getTime()}.xlsx`)
+      this.download(
+        "system/transport/export",
+        {
+          ...this.queryParams
+        },
+        `transport_${new Date().getTime()}.xlsx`
+      );
+    },
+
+    // 鐐瑰嚮琛岄�夋嫨妗堜緥
+    handleCaseSelect(row) {
+      this.selectCase(row);
     }
   }
 };
 </script>
 
 <style scoped>
+.case-select-container {
+  max-height: 600px;
+  overflow: auto;
+}
+
+.search-card {
+  margin-bottom: 20px;
+}
 .filter-card {
   margin-bottom: 20px;
 }
@@ -486,15 +862,15 @@
 }
 
 .stats-card.total {
-  border-left: 4px solid #409EFF;
+  border-left: 4px solid #409eff;
 }
 
 .stats-card.pending {
-  border-left: 4px solid #E6A23C;
+  border-left: 4px solid #e6a23c;
 }
 
 .stats-card.completed {
-  border-left: 4px solid #67C23A;
+  border-left: 4px solid #67c23a;
 }
 
 .stat-content {
@@ -525,7 +901,9 @@
 }
 
 .donor-info {
-  text-align: left;
+  text-align: center;
+  display: flex;
+  justify-content: center
 }
 
 .donor-name {
@@ -534,8 +912,10 @@
 }
 
 .donor-details {
-  font-size: 12px;
-  color: #909399;
+  margin-left: 5px;
+  font-size: 16px;
+  color: #093ca4;
+  display: flex;
 }
 
 .mb8 {

--
Gitblit v1.9.3