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

---
 src/views/business/transfer/index.vue |  391 +++++++++++++++++++++++++++----------------------------
 1 files changed, 190 insertions(+), 201 deletions(-)

diff --git a/src/views/business/transfer/index.vue b/src/views/business/transfer/index.vue
index 0c9a95a..5325b13 100644
--- a/src/views/business/transfer/index.vue
+++ b/src/views/business/transfer/index.vue
@@ -8,45 +8,37 @@
         :inline="true"
         label-width="80px"
       >
-        <el-form-item label="杞繍鍗曞彿" prop="transportNo">
-          <el-input
-            v-model="queryParams.transportNo"
-            placeholder="璇疯緭鍏ヨ浆杩愬崟鍙�"
-            clearable
-            style="width: 200px"
-            @keyup.enter.native="handleQuery"
-          />
-        </el-form-item>
-        <el-form-item label="浣忛櫌鍙�" prop="caseNo">
+        <el-form-item label="妗堜緥缂栧彿" prop="caseNo">
           <el-input
             v-model="queryParams.caseNo"
-            placeholder="璇疯緭鍏ヤ綇闄㈠彿"
+            placeholder="璇疯緭鍏ユ渚嬬紪鍙�"
             clearable
             style="width: 200px"
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="鎹愮尞鑰呭鍚�" prop="donorName">
+        <el-form-item label="鎮h�呭鍚�" prop="patName">
           <el-input
-            v-model="queryParams.donorName"
-            placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
+            v-model="queryParams.patName"
+            placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
             clearable
             style="width: 200px"
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="杞繍鐘舵��" prop="status">
+        <el-form-item label="杞繍鐘舵��" prop="transitStatus">
           <el-select
-            v-model="queryParams.status"
+            v-model="queryParams.transitStatus"
             placeholder="杞繍鐘舵��"
             clearable
             style="width: 200px"
           >
             <el-option label="鍏ㄩ儴" value="" />
-            <el-option label="寰呭嚭鍙�" value="pending" />
-            <el-option label="杞繍涓�" value="transporting" />
-            <el-option label="宸插畬鎴�" value="completed" />
-            <el-option label="宸插彇娑�" value="cancelled" />
+            <el-option label="寰呰浆杩�" :value="1" />
+            <el-option label="杞繍涓�" :value="2" />
+            <el-option label="杞繍瀹屾垚" :value="3" />
+            <el-option label="杞繍鍙栨秷" :value="4" />
+            <el-option label="鏆傚瓨" :value="5" />
           </el-select>
         </el-form-item>
         <el-form-item label="鍒涘缓鏃堕棿">
@@ -148,7 +140,7 @@
       ></right-toolbar>
     </el-row>
 
-    <!-- 鏁版嵁琛ㄦ牸 -->
+    <!-- 鏁版嵁琛ㄦ牸 - 鐩存帴浣跨敤鍚庣杩斿洖鐨勬暟鎹粨鏋� -->
     <el-table
       v-loading="loading"
       :data="transportList"
@@ -156,19 +148,28 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="搴忓彿" type="index" width="60" align="center" />
-      <el-table-column label="杞繍鍗曞彿" align="center" prop="id" width="140" />
       <el-table-column
-        label="浣忛櫌鍙�"
+        label="杞繍鍗曞彿"
+        align="center"
+        prop="reportId"
+        width="140"
+      />
+      <el-table-column
+        label="妗堜緥缂栧彿"
         align="center"
         prop="caseNo"
         width="140"
       />
-      <el-table-column label="鎹愮尞鑰呬俊鎭�" align="center" width="180">
+      <el-table-column label="鎮h�呬俊鎭�" align="center" width="260">
         <template slot-scope="scope">
           <div class="donor-info">
-            <div class="donor-name">{{ scope.row.donorName }}</div>
+            <div class="donor-name">{{ scope.row.patName }}</div>
             <div class="donor-details">
-              {{ scope.row.gender }} | {{ scope.row.age }}宀�
+              <dict-tag
+                :options="dict.type.sys_user_sex"
+                :value="parseInt(scope.row.sex)"
+              />
+              | {{ scope.row.age }}宀�
             </div>
           </div>
         </template>
@@ -176,37 +177,37 @@
       <el-table-column
         label="鐤剧梾璇婃柇"
         align="center"
-        prop="diagnosis"
+        prop="diagnosisname"
         min-width="200"
         show-overflow-tooltip
       />
       <el-table-column
-        label="鍖荤枟鏈烘瀯"
+        label="娌荤枟鍖婚櫌"
         align="center"
-        prop="hospitalName"
+        prop="treatmentHospitalName"
         width="150"
       />
       <el-table-column
         label="璁″垝杞繍鏃堕棿"
         align="center"
-        prop="transportTime"
+        prop="transportStartTime"
         width="160"
       />
       <el-table-column
         label="璐熻矗鍗忚皟鍛�"
         align="center"
-        prop="coordinator"
+        prop="contactPerson"
         width="100"
       />
       <el-table-column
         label="杞繍鐘舵��"
         align="center"
-        prop="status"
+        prop="transitStatus"
         width="100"
       >
         <template slot-scope="scope">
-          <el-tag :type="scope.row.status | statusFilter">
-            {{ scope.row.statusText }}
+          <el-tag :type="getStatusTagType(scope.row.transitStatus)">
+            {{ getStatusText(scope.row.transitStatus) }}
           </el-tag>
         </template>
       </el-table-column>
@@ -242,7 +243,7 @@
             type="text"
             icon="el-icon-video-play"
             @click="handleStartTransport(scope.row)"
-            v-if="scope.row.status === 'pending'"
+            v-if="scope.row.transitStatus === 1"
             >寮�濮嬭浆杩�</el-button
           >
           <el-button
@@ -250,7 +251,7 @@
             type="text"
             icon="el-icon-check"
             @click="handleCompleteTransport(scope.row)"
-            v-if="scope.row.status === 'transporting'"
+            v-if="scope.row.transitStatus === 2"
             >瀹屾垚杞繍</el-button
           >
         </template>
@@ -296,7 +297,11 @@
       append-to-body
     >
       <div class="action-confirm">
-        <p>纭畾瑕亄{ actionText }}杞繍鍗� "{{ currentTransport.id }}" 鍚楋紵</p>
+        <p>
+          纭畾瑕亄{ actionText }}杞繍鍗� "{{
+            currentTransport.reportId || currentTransport.id
+          }}" 鍚楋紵
+        </p>
       </div>
       <div slot="footer" class="dialog-footer">
         <el-button @click="actionOpen = false">鍙� 娑�</el-button>
@@ -308,17 +313,19 @@
 
 <script>
 import {
-  listTransport,
-  getTransport,
-  delTransport,
-  updateTransportStatus
-} from "@/api/system/business";
+  transportList,
+  transportAdd,
+  transportEdit,
+  transportDelete,
+  transportInfo
+} from "@/api/businessApi/index";
 import TransportDetail from "./transportDetail";
 import TransportEdit from "./TransportEdit";
 
 export default {
   name: "TransportList",
   components: { TransportDetail, TransportEdit },
+  dicts: ["sys_user_sex", "sys_BloodType"],
   data() {
     return {
       // 閬僵灞�
@@ -333,7 +340,7 @@
       showSearch: true,
       // 鎬绘潯鏁�
       total: 0,
-      // 杞繍鍗曡〃鏍兼暟鎹�
+      // 杞繍鍗曡〃鏍兼暟鎹� - 鐩存帴浣跨敤鍚庣杩斿洖鐨勬暟鎹粨鏋�
       transportList: [],
       // 璇︽儏寮规鏄惁鏄剧ず
       detailOpen: false,
@@ -358,143 +365,101 @@
         pendingTransports: 0,
         completedTransports: 0
       },
-      // 鏌ヨ鍙傛暟
+      // 鏌ヨ鍙傛暟锛堝畬鍏ㄩ�傞厤鍚庣鎺ュ彛锛�
       queryParams: {
         pageNum: 1,
         pageSize: 10,
-        transportNo: undefined,
-        caseNo: undefined,
-        donorName: undefined,
-        status: undefined
+        caseNo: undefined, // 妗堜緥缂栧彿
+        patName: undefined, // 鎮h�呭鍚�
+        transitStatus: undefined, // 杞繍鐘舵�侊細1寰呰浆杩� 2杞繍涓� 3杞繍瀹屾垚 4杞繍鍙栨秷 5鏆傚瓨
+        searchValue: undefined, // 鎼滅储鍊�
+        params: {} // 鍏朵粬鍙傛暟瀵硅薄
       }
     };
-  },
-  filters: {
-    statusFilter(status) {
-      const statusMap = {
-        pending: "warning",
-        transporting: "primary",
-        completed: "success",
-        cancelled: "danger"
-      };
-      return statusMap[status];
-    }
   },
   created() {
     this.getList();
   },
   methods: {
-    /** 鏌ヨ杞繍鍗曞垪琛� */
-    getList() {
+    /** 鏌ヨ杞繍鍗曞垪琛� - 鐩存帴浣跨敤鍚庣鏁版嵁缁撴瀯 */
+    async getList() {
       this.loading = true;
-      // 妯℃嫙API璋冪敤寤惰繜
-      setTimeout(() => {
-        // 娴嬭瘯鏁版嵁
-        this.transportList = [
-          {
-            id: "T20241217001",
-            caseNo: "DON20241216001",
-            donorName: "寮犱笁",
-            gender: "鐢�",
-            age: 38,
-            diagnosis:
-              "鑴戝浼ゅ鑷磋剳姝讳骸锛岀粡鎶㈡晳鏃犳晥瀹e竷鑴戞浜°�傚灞炲悓鎰忓櫒瀹樻崘鐚��",
-            hospitalName: "闈掑矝闀滄箹鍖婚櫌",
-            transportTime: "2024-12-17 14:30:00",
-            coordinator: "寮犲尰鐢�",
-            createTime: "2024-12-16 09:30:00",
-            status: "pending",
-            statusText: "寰呭嚭鍙�",
-            departureLocation: "闈掑矝甯傜珛鍖婚櫌鎬ヨ瘖绉�",
-            destinationHospital: "闈掑矝闀滄箹鍖婚櫌",
-            emergencyDoctor: "鐜嬪尰鐢�",
-            nurse: "鏉庢姢澹�",
-            driver: "鍒樺笀鍌�",
-            icuDoctor: "璧靛尰鐢�",
-            contacts: [
-              { role: "鍗忚皟鍛樼數璇�", phone: "13800138000" },
-              { role: "鎬ヨ瘖鍖荤敓鐢佃瘽", phone: "13800138001" },
-              { role: "鎶ゅ+鐢佃瘽", phone: "13800138002" },
-              { role: "鍙告満鐢佃瘽", phone: "13800138003" },
-              { role: "ICU鍖荤敓鐢佃瘽", phone: "13800138004" }
-            ],
-            remarks: "闇�瑕佸噯澶囧懠鍚告満绛夋�ユ晳璁惧"
-          },
-          {
-            id: "T20241217002",
-            caseNo: "DON20241216002",
-            donorName: "鏉庡洓",
-            gender: "濂�",
-            age: 45,
-            diagnosis: "鑴戞姝伙紝鑴戝共鍔熻兘涓уけ",
-            hospitalName: "闈掑矝澶у闄勫睘鍖婚櫌",
-            transportTime: "2024-12-17 16:00:00",
-            coordinator: "鏉庡尰鐢�",
-            createTime: "2024-12-16 11:20:00",
-            status: "transporting",
-            statusText: "杞繍涓�",
-            departureLocation: "闈掑矝澶у闄勫睘鍖婚櫌ICU",
-            destinationHospital: "闈掑矝鍣ㄥ畼绉绘涓績",
-            currentLocation: "闈掑矝甯傚崡鍖洪娓腑璺�",
-            estimatedTime: "30鍒嗛挓"
-          },
-          {
-            id: "T20241216003",
-            caseNo: "DON20241215001",
-            donorName: "鐜嬩簲",
-            gender: "鐢�",
-            age: 52,
-            diagnosis: "蹇冭剰楠ゅ仠锛屽鍣ㄥ畼鍔熻兘琛扮",
-            hospitalName: "闈掑矝甯傜珛鍖婚櫌",
-            transportTime: "2024-12-16 10:15:00",
-            coordinator: "鐜嬪尰鐢�",
-            createTime: "2024-12-15 14:45:00",
-            status: "completed",
-            statusText: "宸插畬鎴�",
-            departureLocation: "闈掑矝甯傜珛鍖婚櫌蹇冨唴绉�",
-            destinationHospital: "闈掑矝鍣ㄥ畼绉绘涓績",
-            completedTime: "2024-12-16 12:30:00",
-            distance: "15鍏噷",
-            duration: "2灏忔椂15鍒嗛挓"
-          },
-          {
-            id: "T20241216004",
-            caseNo: "DON20241214001",
-            donorName: "璧靛叚",
-            gender: "濂�",
-            age: 29,
-            diagnosis: "鎬ユ�ц倽琛扮",
-            hospitalName: "闈掑矝绉戝ぇ鍖婚櫌",
-            transportTime: "2024-12-16 08:30:00",
-            coordinator: "璧靛尰鐢�",
-            createTime: "2024-12-14 16:20:00",
-            status: "cancelled",
-            statusText: "宸插彇娑�",
-            cancelReason: "瀹跺睘涓存椂鏀瑰彉鍐冲畾"
-          }
-        ];
 
-        // 鏇存柊缁熻鏁版嵁
-        this.updateStats();
-        this.total = this.transportList.length;
+      try {
+        // 鏋勫缓绗﹀悎鍚庣鎺ュ彛鐨勮姹傚弬鏁� [1,2](@ref)
+        const requestParams = {
+          pageNum: this.queryParams.pageNum,
+          pageSize: this.queryParams.pageSize,
+          caseNo: this.queryParams.caseNo,
+          patName: this.queryParams.patName,
+          transitStatus: this.queryParams.transitStatus,
+          searchValue: this.queryParams.searchValue
+        };
+
+        // 澶勭悊鏃堕棿鑼冨洿鍙傛暟 [5](@ref)
+        if (this.dateRange && this.dateRange.length === 2) {
+          requestParams.transportStartTime = this.dateRange.join(",");
+        }
+
+        // 璋冪敤姝e紡鎺ュ彛 [3](@ref)
+        const response = await transportList(requestParams);
+
+        if (response.code === 200) {
+          // 鐩存帴浣跨敤鍚庣杩斿洖鐨勬暟鎹粨鏋勶紝涓嶈繘琛岃浆鎹� [8](@ref)
+          this.transportList = response.rows || response.data || [];
+          this.total = response.total || 0;
+
+          // 鏇存柊缁熻鏁版嵁
+          this.updateStats();
+        } else {
+          this.$modal.msgError(response.msg || "鑾峰彇杞繍鍗曞垪琛ㄥけ璐�");
+        }
+      } catch (error) {
+        console.error("鑾峰彇杞繍鍗曞垪琛ㄥけ璐�:", error);
+        this.$modal.msgError("缃戠粶璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯");
+      } finally {
         this.loading = false;
-      }, 500);
+      }
+    },
+
+    /** 鑾峰彇鐘舵�佹爣绛剧被鍨� */
+    getStatusTagType(transitStatus) {
+      const statusMap = {
+        1: "warning", // 寰呰浆杩�
+        2: "primary", // 杞繍涓�
+        3: "success", // 杞繍瀹屾垚
+        4: "danger", // 杞繍鍙栨秷
+        5: "info" // 鏆傚瓨
+      };
+      return statusMap[transitStatus] || "info";
+    },
+
+    /** 鑾峰彇鐘舵�佹枃鏈� */
+    getStatusText(transitStatus) {
+      const statusMap = {
+        1: "寰呰浆杩�",
+        2: "杞繍涓�",
+        3: "杞繍瀹屾垚",
+        4: "杞繍鍙栨秷",
+        5: "鏆傚瓨"
+      };
+      return statusMap[transitStatus] || "鏈煡鐘舵��";
     },
 
     // 鏇存柊缁熻鏁版嵁
     updateStats() {
       this.stats.totalTransports = this.transportList.length;
       this.stats.pendingTransports = this.transportList.filter(
-        item => item.status === "pending"
+        item => item.transitStatus === 1
       ).length;
       this.stats.completedTransports = this.transportList.filter(
-        item => item.status === "completed"
+        item => item.transitStatus === 3
       ).length;
     },
 
     // 澶氶�夋閫変腑鏁版嵁
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id);
+      this.ids = selection.map(item => item.reportId || item.id);
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
@@ -504,6 +469,28 @@
       this.queryParams.pageNum = 1;
       this.getList();
     },
+
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        caseNo: undefined,
+        patName: undefined,
+        transitStatus: undefined,
+        searchValue: undefined
+      };
+      this.getList();
+    },
+
+    /** 璇︽儏鎸夐挳鎿嶄綔 */
+    handleDetail(row) {
+      this.currentTransport = row;
+      this.detailTitle = `杞繍鍗曡鎯� - ${row.reportId || row.id}`;
+      this.detailOpen = true;
+    },
+
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
       this.currentTransport = row || {};
@@ -528,22 +515,9 @@
     handleSaveSuccess() {
       this.getList(); // 閲嶆柊鍔犺浇鍒楄〃
     },
-    /** 閲嶇疆鎸夐挳鎿嶄綔 */
-    resetQuery() {
-      this.dateRange = [];
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-
-    /** 璇︽儏鎸夐挳鎿嶄綔 */
-    handleDetail(row) {
-      this.currentTransport = row;
-      this.detailTitle = `杞繍鍗曡鎯� - ${row.id}`;
-      this.detailOpen = true;
-    },
 
     /** 寮�濮嬭浆杩愭搷浣� */
-    handleStartTransport(row) {
+    async handleStartTransport(row) {
       this.currentTransport = row;
       this.actionTitle = "寮�濮嬭浆杩�";
       this.actionText = "寮�濮�";
@@ -551,59 +525,70 @@
     },
 
     /** 瀹屾垚杞繍鎿嶄綔 */
-    handleCompleteTransport(row) {
+    async handleCompleteTransport(row) {
       this.currentTransport = row;
       this.actionTitle = "瀹屾垚杞繍";
       this.actionText = "瀹屾垚";
       this.actionOpen = true;
     },
 
-    /** 纭鎿嶄綔 */
-    confirmAction() {
-      const index = this.transportList.findIndex(
-        item => item.id === this.currentTransport.id
-      );
-      if (index !== -1) {
+    /** 纭鎿嶄綔 - 浣跨敤鍚庣鍘熷鏁版嵁缁撴瀯 [4](@ref) */
+    async confirmAction() {
+      try {
+        let requestData = {
+          id: this.currentTransport.id || this.currentTransport.reportId
+        };
+
         if (this.actionText === "寮�濮�") {
-          this.transportList[index].status = "transporting";
-          this.transportList[index].statusText = "杞繍涓�";
+          requestData.transitStatus = 2; // 璁剧疆涓鸿浆杩愪腑
         } else if (this.actionText === "瀹屾垚") {
-          this.transportList[index].status = "completed";
-          this.transportList[index].statusText = "宸插畬鎴�";
-          this.transportList[index].completedTime = new Date().toLocaleString();
+          requestData.transitStatus = 3; // 璁剧疆涓鸿浆杩愬畬鎴�
         }
 
-        // 鏇存柊缁熻鏁版嵁
-        this.updateStats();
+        // 鐩存帴浼犻�掑悗绔渶瑕佺殑鍙傛暟 [8](@ref)
+        const response = await transportEdit(requestData);
 
-        this.$modal.msgSuccess(`${this.actionText}鎴愬姛`);
+        if (response.code === 200) {
+          this.$modal.msgSuccess(`${this.actionText}杞繍鎴愬姛`);
+          this.getList(); // 鍒锋柊鍒楄〃
+        } else {
+          this.$modal.msgError(response.msg || `${this.actionText}杞繍澶辫触`);
+        }
+      } catch (error) {
+        console.error(`${this.actionText}杞繍澶辫触:`, error);
+        this.$modal.msgError("鎿嶄綔澶辫触锛岃绋嶅悗閲嶈瘯");
       }
       this.actionOpen = false;
     },
 
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 - 浣跨敤鍚庣鍘熷ID [1](@ref) */
+    async handleDelete(row) {
+      const ids = row.reportId || row.id || this.ids;
 
+      try {
+        await this.$modal.confirm(
+          '鏄惁纭鍒犻櫎杞繍鍗曠紪鍙蜂负"' + ids + '"鐨勬暟鎹」锛�'
+        );
 
+        const response = await transportDelete(ids);
 
-
-    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$modal
-        .confirm('鏄惁纭鍒犻櫎杞繍鍗曠紪鍙蜂负"' + ids + '"鐨勬暟鎹」锛�')
-        .then(() => {
-          // 妯℃嫙鍒犻櫎鎿嶄綔
-          this.transportList = this.transportList.filter(
-            item => !ids.includes(item.id)
-          );
-          this.total = this.transportList.length;
-          this.updateStats();
+        if (response.code === 200) {
           this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        })
-        .catch(() => {});
+          this.getList(); // 鍒锋柊鍒楄〃
+        } else {
+          this.$modal.msgError(response.msg || "鍒犻櫎澶辫触");
+        }
+      } catch (error) {
+        if (error !== "cancel") {
+          console.error("鍒犻櫎澶辫触:", error);
+          this.$modal.msgError("鍒犻櫎澶辫触锛岃绋嶅悗閲嶈瘯");
+        }
+      }
     },
 
     /** 瀵煎嚭鎸夐挳鎿嶄綔 */
     handleExport() {
+      // 鐩存帴浣跨敤鍚庣鍙傛暟缁撴瀯杩涜瀵煎嚭 [5](@ref)
       this.download(
         "system/transport/export",
         {
@@ -675,7 +660,9 @@
 }
 
 .donor-info {
-  text-align: left;
+  text-align: center;
+  display: flex;
+  justify-content: center
 }
 
 .donor-name {
@@ -684,8 +671,10 @@
 }
 
 .donor-details {
-  font-size: 12px;
-  color: #909399;
+  margin-left: 5px;
+  font-size: 16px;
+  color: #093ca4;
+  display: flex;
 }
 
 .mb8 {

--
Gitblit v1.9.3