From c80bc467a41daa6cbae4e5515a300a8ca98cfeaa Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期二, 21 七月 2026 15:44:01 +0800
Subject: [PATCH] 维护

---
 pagesSub/case/transfer.vue |  454 +++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 283 insertions(+), 171 deletions(-)

diff --git a/pagesSub/case/transfer.vue b/pagesSub/case/transfer.vue
index 6e13f37..22b7268 100644
--- a/pagesSub/case/transfer.vue
+++ b/pagesSub/case/transfer.vue
@@ -72,7 +72,7 @@
             <view class="info">
               <text class="case-no">{{ item.caseNo || item.reportId }}</text>
               <text class="patient"
-                >{{ item.patName }} | {{ getGenderText(item.sex) }} |
+                >{{ item.patName }} | {{ item.sex == 1 ? "鐢�" : "濂�" }} |
                 {{ item.age }}宀�</text
               >
             </view>
@@ -115,27 +115,41 @@
             }}</text>
           </view>
           <view class="actions">
+            <!-- 寰呰浆杩�(1)锛氬彲浠ュ紑濮嬭浆杩� -->
             <button
-              class="action-btn"
-              v-if="item.transitStatus === 1"
-              @tap.stop="startTransport(item)"
+              class="action-btn primary"
+              v-if="item.transitStatus == 1"
+              @tap.stop="handleStartTransport(item)"
             >
               寮�濮嬭浆杩�
             </button>
+
+            <!-- 杞繍涓�(2)锛氬彲浠ュ畬鎴愭垨鍙栨秷 -->
             <button
-              class="action-btn"
-              v-if="item.transitStatus === 2"
-              @tap.stop="completeTransport(item)"
+              class="action-btn success"
+              v-if="item.transitStatus == 2"
+              @tap.stop="handleCompleteTransport(item)"
             >
               瀹屾垚杞繍
             </button>
             <button
-              class="action-btn secondary"
-              v-if="item.transitStatus != 3"
-              @tap.stop="editTransport(item)"
+              class="action-btn danger"
+              v-if="item.transitStatus == 2"
+              @tap.stop="handleCancelTransport(item)"
             >
-              缂栬緫
+              鍙栨秷杞繍
             </button>
+
+            <!-- 宸插彇娑�(4)锛氬彲浠ユ仮澶� -->
+            <button
+              class="action-btn warning"
+              v-if="item.transitStatus == 4"
+              @tap.stop="handleRecoverTransport(item)"
+            >
+              鎭㈠杞繍
+            </button>
+
+            <!-- 閫氱敤鎸夐挳 -->
             <button class="action-btn secondary" @tap.stop="viewDetails(item)">
               鏌ョ湅璇︽儏
             </button>
@@ -156,7 +170,7 @@
       <!-- 绌虹姸鎬� -->
       <view
         class="empty-state"
-        v-if="!loading && filteredTransports.length === 0"
+        v-if="!loading && filteredTransports.length == 0"
       >
         <image src="/static/empty/no-transport.png" mode="aspectFit" />
         <text>鏆傛棤杞繍鍗曡褰�</text>
@@ -164,31 +178,37 @@
     </scroll-view>
 
     <!-- 鎿嶄綔纭寮圭獥 -->
-    <view class="modal-mask" v-if="showActionModal">
-      <view class="modal-content">
+    <view class="modal-mask" v-if="showActionModal" @tap="cancelAction">
+      <view class="modal-content" @tap.stop>
         <view class="modal-header">
           <text class="modal-title">{{ modalTitle }}</text>
         </view>
         <view class="modal-body">
-          <text
-            >纭畾瑕亄{ modalAction }}杞繍鍗� "{{ currentTransport.caseNo }}"
-            鍚楋紵</text
-          >
+          <text class="modal-desc">
+            纭畾瑕亄{ modalAction }}杞繍鍗� "{{ currentTransport.caseNo }}" 鍚楋紵
+          </text>
+          <view class="modal-summary" v-if="currentTransport.patName">
+            <text class="summary-item"
+              >鎮h�咃細{{ currentTransport.patName }}</text
+            >
+            <text class="summary-item"
+              >褰撳墠鐘舵�侊細{{
+                getStatusText(currentTransport.transitStatus)
+              }}</text
+            >
+          </view>
         </view>
         <view class="modal-footer">
           <button class="modal-btn cancel" @tap="cancelAction">鍙栨秷</button>
-          <button class="modal-btn confirm" @tap="confirmAction">纭</button>
+          <button class="modal-btn confirm" @tap="confirmAction">
+            纭{{ modalAction }}
+          </button>
         </view>
       </view>
     </view>
 
     <!-- 鍔犺浇鐘舵�� -->
     <u-loading-page v-if="initLoading" :loading="true" text="鏁版嵁鍔犺浇涓�..." />
-    
-    <!-- 娴姩鎸夐挳 -->
-    <!-- <view class="float-button" @tap="createTransport">
-      <u-icon name="plus" color="#fff" size="24"></u-icon>
-    </view> -->
   </view>
 </template>
 
@@ -222,6 +242,7 @@
 const currentTransport = ref({});
 const modalTitle = ref("");
 const modalAction = ref("");
+const modalTargetStatus = ref(null);
 
 // 绛涢�夌浉鍏�
 const transportTypes = [
@@ -280,18 +301,19 @@
     // 鍏朵粬瀛楁
     transportStartPlace: apiData.transportStartPlace,
     remark: apiData.remark,
+    annexfilesList: apiData.annexfilesList || [],
   };
 };
 
 // 璁$畻灞炴�э細绛涢�夎褰�
 const filteredTransports = computed(() => {
   let result = transports.value;
-  
+
   // 鍓嶇鐘舵�佺瓫閫�
   if (currentType.value !== "") {
-    result = result.filter((item) => item.transitStatus === currentType.value);
+    result = result.filter((item) => item.transitStatus == currentType.value);
   }
-  
+
   return result;
 });
 
@@ -324,7 +346,7 @@
   if (!gender) return "寰呰浆杩�";
   if (!dict.value.sys_user_sex) return gender;
   const genderItem = dict.value.sys_user_sex.find(
-    (item) => item.dictValue === gender,
+    (item) => item.dictValue == gender,
   );
   return genderItem ? genderItem.dictLabel : gender;
 };
@@ -362,6 +384,134 @@
   }
 };
 
+// ============== 杞繍鐘舵�佸彉鏇存搷浣� ==============
+
+/** 寮�濮嬭浆杩� */
+const handleStartTransport = (item) => {
+  currentTransport.value = { ...item };
+  modalTitle.value = "寮�濮嬭浆杩�";
+  modalAction.value = "寮�濮�";
+  modalTargetStatus.value = 2; // 璁剧疆涓鸿浆杩愪腑
+  showActionModal.value = true;
+};
+
+/** 瀹屾垚杞繍 */
+const handleCompleteTransport = (item) => {
+  currentTransport.value = { ...item };
+  modalTitle.value = "瀹屾垚杞繍";
+  modalAction.value = "瀹屾垚";
+  modalTargetStatus.value = 3; // 璁剧疆涓鸿浆杩愬畬鎴�
+  showActionModal.value = true;
+};
+
+/** 鍙栨秷杞繍 */
+const handleCancelTransport = (item) => {
+  currentTransport.value = { ...item };
+  modalTitle.value = "鍙栨秷杞繍";
+  modalAction.value = "鍙栨秷";
+  modalTargetStatus.value = 4; // 璁剧疆涓鸿浆杩愬彇娑�
+  showActionModal.value = true;
+};
+
+/** 鎭㈠杞繍 */
+const handleRecoverTransport = (item) => {
+  currentTransport.value = { ...item };
+  modalTitle.value = "鎭㈠杞繍";
+  modalAction.value = "鎭㈠";
+  modalTargetStatus.value = 2; // 璁剧疆涓鸿浆杩愪腑
+  showActionModal.value = true;
+};
+
+// 鍙栨秷鎿嶄綔
+const cancelAction = () => {
+  showActionModal.value = false;
+};
+
+// 纭鎿嶄綔
+const confirmAction = async () => {
+  try {
+    const requestData = {
+      ...currentTransport.value,
+      transitStatus: modalTargetStatus.value,
+    };
+
+    // 娓呯┖闄勪欢ID锛堝弬鐓C绔�昏緫锛�
+    if (requestData.annexfilesList && requestData.annexfilesList.length > 0) {
+      requestData.annexfilesList.forEach((item) => {
+        item.id = null;
+      });
+    }
+
+    const res = await uni.$uapi.post("/project/transport/edit", requestData);
+
+    if (res && res.code == 200) {
+      uni.showToast({
+        title: `${modalAction.value}杞繍鎴愬姛`,
+        icon: "success",
+      });
+
+      // 濡傛灉鏄畬鎴愯浆杩愶紙鐘舵�佸彉涓�3锛夛紝鍚屾鏇存柊妗堜緥鐘舵��
+      if (modalTargetStatus.value == 3) {
+        try {
+          // 鑾峰彇妗堜緥璇︽儏
+          const caseRes = await uni.$uapi.get(
+            `/project/donatebaseinforeport/getInfo/${requestData.reportId}`,
+          );
+
+          if (caseRes && caseRes.data) {
+            const caseData = caseRes.data;
+            caseData.isDonate = 1; // 鏍囪涓哄凡鎹愮尞
+
+            const editRes = await uni.$uapi.post(
+              "/project/donatebaseinforeport/edit",
+              caseData,
+            );
+
+            if (editRes && editRes.code == 200) {
+              uni.showToast({
+                title: "瀵瑰簲涓婃姤妗堜緥宸茶繘鍏ユ寮忔渚嬫祦绋�",
+                icon: "success",
+              });
+            }
+          }
+        } catch (caseError) {
+          console.error("鏇存柊妗堜緥鐘舵�佸け璐�:", caseError);
+          // 涓嶉樆鏂富娴佺▼锛屽彧鎻愮ず
+          uni.showToast({
+            title: "妗堜緥鐘舵�佹洿鏂板け璐ワ紝璇疯仈绯荤鐞嗗憳",
+            icon: "none",
+          });
+        }
+      }
+
+      // 鏇存柊鏈湴鏁版嵁
+      const index = transports.value.findIndex(
+        (item) => item.id == currentTransport.value.id,
+      );
+      if (index !== -1) {
+        transports.value[index].transitStatus = modalTargetStatus.value;
+      }
+
+      // 鍒锋柊缁熻鏁版嵁
+      await loadStats();
+
+      // 鍏抽棴寮圭獥
+      showActionModal.value = false;
+    } else {
+      uni.showToast({
+        title: res?.msg || `${modalAction.value}杞繍澶辫触`,
+        icon: "none",
+      });
+    }
+  } catch (error) {
+    console.error(`${modalAction.value}杞繍澶辫触:`, error);
+    uni.showToast({
+      title: "鎿嶄綔澶辫触锛岃绋嶅悗閲嶈瘯",
+      icon: "none",
+    });
+  }
+};
+
 // 鏌ョ湅璇︽儏
 const viewDetail = (item) => {
   viewDetails(item);
@@ -384,53 +534,8 @@
 // 鍒涘缓杞繍鍗�
 const createTransport = () => {
   uni.navigateTo({
-    url: '/pages/transport/create'
+    url: "/pages/transport/create",
   });
-};
-
-// 寮�濮嬭浆杩�
-const startTransport = (item) => {
-  currentTransport.value = item;
-  modalTitle.value = "寮�濮嬭浆杩�";
-  modalAction.value = "寮�濮�";
-  showActionModal.value = true;
-};
-
-// 瀹屾垚杞繍
-const completeTransport = (item) => {
-  currentTransport.value = item;
-  modalTitle.value = "瀹屾垚杞繍";
-  modalAction.value = "瀹屾垚";
-  showActionModal.value = true;
-};
-
-// 纭鎿嶄綔
-const confirmAction = async () => {
-  try {
-    if (modalAction.value === "寮�濮�") {
-      await updateTransportStatus(2, "寮�濮嬭浆杩�");
-    } else if (modalAction.value === "瀹屾垚") {
-      await updateTransportStatus(3, "瀹屾垚杞繍");
-    }
-
-    uni.showToast({
-      title: `${modalAction.value}鎴愬姛`,
-      icon: "success",
-    });
-  } catch (error) {
-    console.error(`${modalAction.value}澶辫触:`, error);
-    uni.showToast({
-      title: `${modalAction.value}澶辫触锛岃閲嶈瘯`,
-      icon: "none",
-    });
-  } finally {
-    showActionModal.value = false;
-  }
-};
-
-// 鍙栨秷鎿嶄綔
-const cancelAction = () => {
-  showActionModal.value = false;
 };
 
 // 鏁版嵁鍔犺浇鍑芥暟
@@ -468,42 +573,42 @@
     pageNum.value = 1;
     hasMore.value = true;
   }
-  
+
   if (loading.value || loadingMore.value || !hasMore.value) return;
-  
+
   if (reset) {
     loading.value = true;
   } else {
     loadingMore.value = true;
   }
-  
+
   try {
     const params = {
       pageNum: pageNum.value,
       pageSize: pageSize.value,
     };
-    
+
     // 绛涢�夋潯浠�
     if (currentType.value !== "") {
       params.transitStatus = currentType.value;
     }
-    
+
     // 鏃堕棿绛涢�夋潯浠�
     if (startDate.value && endDate.value) {
       params.startDate = startDate.value;
       params.endDate = endDate.value;
     }
-    
+
     console.log("璇锋眰鍙傛暟:", params);
-    
+
     const res = await uni.$uapi.post("/project/transport/list", params);
-    
+
     console.log("鎺ュ彛杩斿洖鏁版嵁:", res);
-  
-    if (res && res.code === 200) {
+
+    if (res && res.code == 200) {
       // 澶勭悊涓嶅悓鐨勬暟鎹粨鏋�
       let data = [];
-      
+
       if (res.rows && Array.isArray(res.rows)) {
         data = res.rows;
       } else if (res.data && Array.isArray(res.data)) {
@@ -514,18 +619,18 @@
         console.error("鎺ュ彛杩斿洖鏍煎紡涓嶆纭�:", res);
         throw new Error("鎺ュ彛杩斿洖鏍煎紡涓嶆纭�");
       }
-      
+
       const mappedData = data.map((item) => mapApiDataToTransportItem(item));
-      
-      if (reset || pageNum.value === 1) {
+
+      if (reset || pageNum.value == 1) {
         transports.value = mappedData;
       } else {
         transports.value = [...transports.value, ...mappedData];
       }
-      
+
       // 鍒ゆ柇鏄惁杩樻湁鏇村鏁版嵁
       hasMore.value = data.length >= pageSize.value;
-      
+
       // 濡傛灉鏈夋暟鎹姞杞芥垚鍔燂紝澧炲姞椤电爜
       if (data.length > 0) {
         pageNum.value++;
@@ -548,62 +653,50 @@
 // 鍔犺浇缁熻鏁版嵁
 const loadStats = async () => {
   try {
-    const res = await uni.$uapi.post("/api/totalServiceTransportState");
-    if (res.data) {
+    const res = await uni.$uapi.post(
+      "/project/transport/totalServiceTransportState",
+    );
+    console.log(222);
+    console.log(res,'11');
+
+    if (res.data && Array.isArray(res.data)) {
+      // 浣跨敤 find 鏌ユ壘鍚勭姸鎬佺殑鏁伴噺锛岄伩鍏嶇‖缂栫爜绱㈠紩
+      const totalTransports =
+        res.data.reduce((sum, item) => sum + item.count, 0) || 0;
+      const pendingTransports =
+        res.data.find((item) => item.transit_status == 1)?.count || 0;
+      const completedTransports =
+        res.data.find((item) => item.transit_status == 3)?.count || 0;
+
       stats.value = {
-        totalTransports:
-          res.data.reduce((sum, item) => sum + item.count, 0) || 0,
-        pendingTransports: res.data[0].count || 0,
-        completedTransports: res.data[3].count || 0,
+        totalTransports,
+        pendingTransports,
+        completedTransports,
       };
+    } else {
+      // 鏁版嵁鏍煎紡寮傚父鏃惰缃粯璁ゅ��
+      stats.value = {
+        totalTransports: 0,
+        pendingTransports: 0,
+        completedTransports: 0,
+      };
+      console.error("缁熻鏁版嵁鏍煎紡寮傚父:", res.data);
     }
   } catch (error) {
     console.error("鍔犺浇缁熻澶辫触:", error);
-  }
-};
-
-// 鏇存柊杞繍鐘舵��
-const updateTransportStatus = async (newStatus, actionName) => {
-  try {
-    const updateData = {
-      id: currentTransport.value.id,
-      transitStatus: newStatus,
+    // 鍑洪敊鏃朵篃璁剧疆榛樿鍊硷紝閬垮厤椤甸潰鏄剧ず寮傚父
+    stats.value = {
+      totalTransports: 0,
+      pendingTransports: 0,
+      completedTransports: 0,
     };
-    
-    const res = await uni.$uapi.post("/project/transport/edit", updateData);
-    
-    if (res && res.code === 200) {
-      // 鏇存柊鏈湴鏁版嵁
-      const index = transports.value.findIndex(
-        (item) => item.id === currentTransport.value.id,
-      );
-      if (index !== -1) {
-        transports.value[index].transitStatus = newStatus;
-      }
-      
-      // 鏇存柊缁熻鏁版嵁
-      await loadStats();
-      
-      // 瀛樺偍鐘舵�佹洿鏂�
-      uni.setStorageSync("transportStatusUpdate", {
-        orderId: currentTransport.value.id,
-        status: newStatus,
-      });
-      
-      return true;
-    } else {
-      throw new Error(res?.msg || `${actionName}澶辫触`);
-    }
-  } catch (error) {
-    console.error(`${actionName}澶辫触:`, error);
-    throw error;
   }
 };
 
 // 澶勭悊鐘舵�佹洿鏂�
 const handleStatusUpdate = (update) => {
   const index = transports.value.findIndex(
-    (item) => item.id === update.orderId,
+    (item) => item.id == update.orderId,
   );
   if (index !== -1) {
     transports.value[index].transitStatus = update.status;
@@ -736,8 +829,7 @@
   }
 
   .transport-list {
-    height: calc(100vh - 400rpx);
-    // padding: 0 20rpx;
+    height: calc(100vh - 420rpx);
 
     .transport-item {
       margin: 20rpx;
@@ -860,18 +952,39 @@
 
         .actions {
           display: flex;
-          gap: 16rpx;
+          flex-wrap: wrap;
+          gap: 12rpx;
+          justify-content: flex-end;
 
           .action-btn {
-            height: 60rpx;
-            line-height: 60rpx;
-            padding: 0 24rpx;
-            font-size: 24rpx;
-            color: #0071e3;
-            background: rgba(0, 113, 227, 0.1);
-            border-radius: 30rpx;
+            height: 58rpx;
+            line-height: 58rpx;
+            padding: 0 20rpx;
+            font-size: 22rpx;
+            border-radius: 29rpx;
             font-weight: 500;
             transition: all 0.3s ease;
+            border: none;
+
+            &.primary {
+              color: #0071e3;
+              background: rgba(0, 113, 227, 0.1);
+            }
+
+            &.success {
+              color: #34c759;
+              background: rgba(52, 199, 89, 0.1);
+            }
+
+            &.danger {
+              color: #ff3b30;
+              background: rgba(255, 59, 48, 0.1);
+            }
+
+            &.warning {
+              color: #ff9500;
+              background: rgba(255, 149, 0, 0.1);
+            }
 
             &.secondary {
               color: #515154;
@@ -880,13 +993,15 @@
 
             &:active {
               transform: scale(0.95);
+              opacity: 0.8;
             }
           }
         }
       }
     }
 
-    .load-more, .no-more {
+    .load-more,
+    .no-more {
       text-align: center;
       padding: 40rpx 0;
       color: #86868b;
@@ -928,7 +1043,7 @@
   .modal-content {
     background: #fff;
     border-radius: 32rpx;
-    width: 600rpx;
+    width: 620rpx;
     overflow: hidden;
     box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.2);
   }
@@ -939,17 +1054,36 @@
   }
 
   .modal-title {
-    font-size: 32rpx;
-    font-weight: 600;
+    font-size: 34rpx;
+    font-weight: 700;
     color: #1d1d1f;
   }
 
   .modal-body {
     padding: 20rpx 40rpx 40rpx;
     text-align: center;
+  }
+
+  .modal-desc {
     font-size: 28rpx;
     color: #515154;
     line-height: 1.6;
+    display: block;
+  }
+
+  .modal-summary {
+    margin-top: 24rpx;
+    background: #f8f9fc;
+    border-radius: 16rpx;
+    padding: 20rpx;
+    text-align: left;
+
+    .summary-item {
+      display: block;
+      font-size: 24rpx;
+      color: #86868b;
+      line-height: 1.8;
+    }
   }
 
   .modal-footer {
@@ -985,27 +1119,5 @@
       }
     }
   }
-  
-  /* 娴姩鎸夐挳 */
-  .float-button {
-    position: fixed;
-    bottom: 100rpx;
-    right: 40rpx;
-    width: 100rpx;
-    height: 100rpx;
-    background: #0071e3;
-    border-radius: 50%;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    box-shadow: 0 8rpx 20rpx rgba(0, 113, 227, 0.3);
-    z-index: 100;
-    transition: all 0.3s ease;
-    
-    &:active {
-      opacity: 0.8;
-      transform: scale(0.95);
-    }
-  }
 }
-</style>
\ No newline at end of file
+</style>

--
Gitblit v1.9.3