From 9bce51f651aad297ef9eb6df832bfdaf1de05d84 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期三, 22 四月 2026 14:27:54 +0800
Subject: [PATCH] 青岛推送

---
 pages/case/CaseInfo.vue |  731 +++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 595 insertions(+), 136 deletions(-)

diff --git a/pages/case/CaseInfo.vue b/pages/case/CaseInfo.vue
index f817e16..71f1daf 100644
--- a/pages/case/CaseInfo.vue
+++ b/pages/case/CaseInfo.vue
@@ -6,24 +6,24 @@
         <view class="hospital-info">
           <image :src="caseDetail.hospitalLogo" mode="aspectFit" class="hospital-logo" />
           <view class="hospital-details">
-            <text class="hospital-name">{{ caseDetail.hospitalName }}</text>
-            <text class="case-type">{{ caseDetail.caseType }}</text>
+            <text class="hospital-name">{{ caseDetail.treatmenthospitalname || '鏈~鍐欐不鐤楀尰闄�' }}</text>
+            <text class="case-type">{{ caseDetail.donorNo ? '鍣ㄥ畼鎹愮尞妗堜緥' : '妗堜緥璇︽儏' }}</text>
           </view>
         </view>
-        <view class="case-status" :class="caseDetail.status">
-          {{ caseDetail.statusText }}
+        <view class="case-status" :class="getStatusClass(caseDetail.reportStatus)">
+          {{ getStatusText(caseDetail.reportStatus) }}
         </view>
       </view>
       
       <view class="case-basic-info">
         <view class="info-row">
           <view class="info-item">
-            <text class="label">鎹愮尞缂栧彿</text>
-            <text class="value">{{ caseDetail.donorNo }}</text>
+            <text class="label">妗堜緥缂栧彿</text>
+            <text class="value">{{ caseDetail.caseNo || '鏈敓鎴�' }}</text>
           </view>
           <view class="info-item">
             <text class="label">涓婃姤鏃堕棿</text>
-            <text class="value">{{ caseDetail.reportTime }}</text>
+            <text class="value">{{ formatDateTime(caseDetail.reporttime) }}</text>
           </view>
         </view>
       </view>
@@ -51,31 +51,51 @@
         <view class="info-grid">
           <view class="info-item">
             <text class="label">濮撳悕</text>
-            <text class="value">{{ caseDetail.donorName }}</text>
+            <text class="value">{{ caseDetail.name || '鏈~鍐�' }}</text>
           </view>
           <view class="info-item">
             <text class="label">鎬у埆</text>
-            <text class="value">{{ caseDetail.gender }}</text>
+            <text class="value">{{ getGenderText(caseDetail.sex) }}</text>
           </view>
           <view class="info-item">
             <text class="label">骞撮緞</text>
-            <text class="value">{{ caseDetail.age }}宀�</text>
+            <text class="value">{{ caseDetail.age || '0' }} {{ getAgeUnitText(caseDetail.ageunit) }}</text>
           </view>
           <view class="info-item">
             <text class="label">璇佷欢鍙风爜</text>
-            <text class="value">{{ caseDetail.idCardNo }}</text>
+            <text class="value">{{ caseDetail.idcardno || '鏈~鍐�' }}</text>
           </view>
           <view class="info-item">
             <text class="label">琛�鍨�</text>
-            <text class="value">{{ caseDetail.bloodType }}</text>
+            <text class="value">{{ getBloodTypeText(caseDetail.bloodType) }}</text>
           </view>
           <view class="info-item">
             <text class="label">姘戞棌</text>
-            <text class="value">{{ caseDetail.nation }}</text>
+            <text class="value">{{ caseDetail.nation || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">鍥界睄</text>
+            <text class="value">{{ caseDetail.nationality || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">绫嶈疮</text>
+            <text class="value">{{ caseDetail.nativeplace || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">瀛﹀巻</text>
+            <text class="value">{{ caseDetail.education || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">鑱屼笟</text>
+            <text class="value">{{ caseDetail.occupation || '鏈~鍐�' }}</text>
           </view>
           <view class="info-item full-width">
-            <text class="label">浣忓潃</text>
-            <text class="value">{{ caseDetail.address }}</text>
+            <text class="label">鎴风睄鍦板潃</text>
+            <text class="value">{{ getFullRegisterAddress() || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item full-width">
+            <text class="label">鐜颁綇鍦板潃</text>
+            <text class="value">{{ getFullResidenceAddress() || '鏈~鍐�' }}</text>
           </view>
         </view>
       </view>
@@ -90,135 +110,484 @@
         <view class="info-content">
           <view class="info-group">
             <text class="group-title">鐤剧梾璇婃柇</text>
-            <text class="group-content">{{ caseDetail.diagnosis }}</text>
+            <text class="group-content">{{ caseDetail.diagnosisname || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-group">
+            <text class="group-title">鐥呮儏姒傚喌</text>
+            <text class="group-content">{{ caseDetail.illnessoverview || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-group">
+            <text class="group-title">鐥呬汉鐘跺喌</text>
+            <text class="group-content">{{ caseDetail.patientstate || '鏈~鍐�' }}</text>
           </view>
           <view class="info-group">
             <text class="group-title">浣忛櫌鍙�</text>
-            <text class="group-content">{{ caseDetail.inpatientNo }}</text>
+            <text class="group-content">{{ caseDetail.inpatientno || '鏈~鍐�' }}</text>
           </view>
           <view class="info-group">
-            <text class="group-title">鎵�鍦ㄧ瀹�</text>
-            <text class="group-content">{{ caseDetail.departmentName }}</text>
+            <text class="group-title">GCS璇勫垎</text>
+            <text class="group-content">{{ caseDetail.gcsScore || '鏈瘎浼�' }}</text>
           </view>
           <view class="info-group">
             <text class="group-title">浼犳煋鐥呮儏鍐�</text>
-            <text class="group-content">{{ caseDetail.infectiousDisease || '鏃�' }}</text>
+            <text class="group-content">{{ caseDetail.infectious || '鏃�' }}{{ caseDetail.infectiousOther ? `(${caseDetail.infectiousOther})` : '' }}</text>
+          </view>
+          <view class="info-group">
+            <text class="group-title">Rh闃存��</text>
+            <text class="group-content">{{ caseDetail.rhYin === '1' ? '鏄�' : '鍚�' }}</text>
           </view>
         </view>
       </view>
     </view>
 
-    <!-- 鎹愮尞娴佺▼淇℃伅 -->
-    <view v-if="activeTab === 'process'" class="info-section fade-in-up">
+    <!-- 鍖婚櫌涓庤仈绯讳俊鎭� -->
+    <view v-if="activeTab === 'contact'" class="info-section fade-in-up">
       <view class="section-card">
         <view class="section-header">
-          <text class="section-title">鎹愮尞娴佺▼淇℃伅</text>
+          <text class="section-title">鍖婚櫌涓庤仈绯讳俊鎭�</text>
         </view>
-        <view class="process-timeline">
-          <view class="timeline-item" v-for="step in processSteps" :key="step.id">
-            <view class="timeline-marker" :class="{ active: step.completed }"></view>
-            <view class="timeline-content">
-              <text class="step-title">{{ step.title }}</text>
-              <text class="step-time" v-if="step.time">{{ step.time }}</text>
-              <text class="step-person" v-if="step.person">缁忓姙浜猴細{{ step.person }}</text>
+        <view class="info-grid">
+          <view class="info-item full-width">
+            <text class="label">娌荤枟鍖婚櫌</text>
+            <text class="value">{{ caseDetail.treatmenthospitalname || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">娌荤枟绉戝</text>
+            <text class="value">{{ caseDetail.treatmentdeptname || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">涓婃姤鍖婚櫌</text>
+            <text class="value">{{ caseDetail.toHospital || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item full-width">
+            <text class="label">鑱旂郴鐢佃瘽</text>
+            <text class="value">{{ caseDetail.phone || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">淇℃伅鍛�</text>
+            <text class="value">{{ caseDetail.infoName || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">淇℃伅鍛樼紪鍙�</text>
+            <text class="value">{{ caseDetail.infoNo || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">鎶ュ憡鑰�</text>
+            <text class="value">{{ caseDetail.reportername || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">鎶ュ憡鑰呯數璇�</text>
+            <text class="value">{{ caseDetail.reporterphone || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">鍗忚皟鍛�</text>
+            <text class="value">{{ caseDetail.coordinatorName || '鏈~鍐�' }}</text>
+          </view>
+          <view class="info-item">
+            <text class="label">鍗忚皟鍛樼紪鍙�</text>
+            <text class="value">{{ caseDetail.coordinatorNo || '鏈~鍐�' }}</text>
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <!-- 杞繍淇℃伅 -->
+    <view v-if="activeTab === 'transport'" class="info-section fade-in-up">
+      <view class="section-card">
+        <view class="section-header">
+          <view style="display: flex; justify-content: space-between; align-items: center;">
+            <text class="section-title">杞繍淇℃伅</text>
+            <!-- 杞繍鎿嶄綔鎸夐挳 -->
+            <view v-if="caseDetail.reportStatus === '3'" style="display: flex; gap: 20rpx;">
+              <button 
+                v-if="caseDetail.isTransport === '2' && !hasTransport" 
+                class="small-btn primary" 
+                @tap.stop="createTransport"
+              >
+                鍒涘缓杞繍鍗�
+              </button>
+              <button 
+                v-if="hasTransport" 
+                class="small-btn secondary" 
+                @tap.stop="viewTransportDetail"
+              >
+                鏌ョ湅杞繍鍗�
+              </button>
             </view>
           </view>
-        </view>  +
+        </view>
+        
+        <view class="info-content">
+          <view class="info-group">
+            <text class="group-title">鏄惁闇�瑕佽浆杩�</text>
+            <text class="group-content">{{ caseDetail.isTransport === '2' ? '闇�瑕�' : '涓嶉渶瑕�' }}</text>
+          </view>
+          
+          <!-- 鏈夎浆杩愪俊鎭椂鏄剧ず -->
+          <view v-if="hasTransport && caseDetail.serviceTransport" class="transport-info">
+            <view class="info-group" v-for="transport in caseDetail.serviceTransport" :key="transport.id">
+              <view class="sub-group">
+                <text class="sub-label">杞繍鍗曞彿:</text>
+                <text class="sub-value">{{ transport.reportId || transport.id }}</text>
+              </view>
+              <view class="sub-group">
+                <text class="sub-label">鍑哄彂鍦扮偣:</text>
+                <text class="sub-value">{{ transport.transportStartPlace }}</text>
+              </view>
+              <view class="sub-group">
+                <text class="sub-label">鍑哄彂鏃堕棿:</text>
+                <text class="sub-value">{{ formatDateTime(transport.transportStartTime) }}</text>
+              </view>
+              <view class="sub-group">
+                <text class="sub-label">璐熻矗鍗忚皟鍛�:</text>
+                <text class="sub-value">{{ transport.contactPerson }}</text>
+              </view>
+              <view class="sub-group">
+                <text class="sub-label">杞繍鐘舵��:</text>
+                <text class="sub-value status" :class="getTransportStatusClass(transport.transitStatus)">
+                  {{ getTransportStatusText(transport.transitStatus) }}
+                </text>
+              </view>
+              <view class="sub-group" v-if="transport.doctor">
+                <text class="sub-label">鎬ヨ瘖绉戝尰鐢�:</text>
+                <text class="sub-value">{{ transport.doctor }}</text>
+              </view>
+              <view class="sub-group" v-if="transport.nurse">
+                <text class="sub-label">鎶ゅ+:</text>
+                <text class="sub-value">{{ transport.nurse }}</text>
+              </view>
+              <view class="sub-group" v-if="transport.driver">
+                <text class="sub-label">椹鹃┒鍛�:</text>
+                <text class="sub-value">{{ transport.driver }}</text>
+              </view>
+              <view class="sub-group" v-if="transport.icuDoctor">
+                <text class="sub-label">ICU璇勪及鍖荤敓:</text>
+                <text class="sub-value">{{ transport.icuDoctor }}</text>
+              </view>
+            </view>
+          </view>
+          
+          <!-- 鏃犺浆杩愪俊鎭絾闇�瑕佽浆杩� -->
+          <view v-else-if="caseDetail.isTransport === '2'" class="transport-info">
+            <view class="empty-transport">
+              <text>璇ユ渚嬮渶瑕佽浆杩愶紝浣嗗皻鏈垱寤鸿浆杩愬崟</text>
+              <text v-if="caseDetail.reportStatus !== '3'" style="color: #f0ad4e; font-size: 24rpx; margin-top: 10rpx;">
+                闇�鍏堝鎵瑰悓鎰忔墠鑳藉垱寤鸿浆杩愬崟
+              </text>
+            </view>
+          </view>
+          
+          <!-- 鏃犻渶杞繍 -->
+          <view v-else class="transport-info">
+            <view class="empty-transport">
+              <text>璇ユ渚嬫棤闇�杞繍</text>
+            </view>
+          </view>
+        </view>
       </view>
     </view>
 
     <!-- 鎿嶄綔鎸夐挳 -->
     <view class="action-bar">
       <button class="action-btn secondary" @tap="goBack">杩斿洖</button>
-      <button class="action-btn primary" v-if="caseDetail.status === 'reported'" 
-              @tap="withdrawCase">鎾ゅ洖妗堜緥</button>
-      <button class="action-btn primary" v-else @tap="contactCoordinator">鑱旂郴鍗忚皟鍛�</button>
+      
+      <!-- 鏍规嵁鐘舵�佹樉绀轰笉鍚屾搷浣� -->
+      <button v-if="caseDetail.reportStatus === '1' || caseDetail.reportStatus === '2'" 
+              class="action-btn primary" 
+              @tap="handleEdit">
+        缂栬緫妗堜緥
+      </button>
+      
+      <!-- <button v-if="canDelete" 
+              class="action-btn error" 
+              @tap="handleDelete">
+        鍒犻櫎妗堜緥
+      </button> -->
     </view>
+
+    <!-- 鍔犺浇鐘舵�� -->
+    <u-loading-icon v-if="loading" :show="loading" text="鍔犺浇涓�..." />
   </view>
 </template>
 
 <script setup>
 import { ref, computed, onMounted } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { useDict } from "@/utils/dict"
 
-import {  onLoad } from '@dcloudio/uni-app'
+// 瀛楀吀鏁版嵁
+const dict = ref({})
 
-const caseDetail = ref({
-  id: 1,
-  donorNo: 'DON20240325001',
-  hospitalName: '闈掑矝闀滄箹鍖婚櫌',
-  hospitalLogo: '/static/hospital/kiang-wu.jpg',
-  caseType: '鍣ㄥ畼鎹愮尞妗堜緥',
-  donorName: '寮犱笁',
-  idCardNo: '370203198510123456',
-  gender: '鐢�',
-  age: 38,
-  bloodType: 'A鍨�',
-  nation: '姹夋棌',
-  address: '灞变笢鐪侀潚宀涘競甯傚崡鍖洪娓腑璺�100鍙�',
-  diagnosis: '鑴戝浼ゅ鑷磋剳姝讳骸',
-  inpatientNo: 'ZY20240325001',
-  departmentName: '绁炵粡澶栫',
-  infectiousDisease: '鏃�',
-  reportTime: '2024-03-25 09:30:00',
-  status: 'reported',
-  statusText: '宸蹭笂鎶�'
-})
+// 鏁版嵁
+const caseDetail = ref({})
+const loading = ref(false)
+const activeTab = ref('basic')
+const caseId = ref(null)
 
+// 閫夐」鍗�
 const tabs = ref([
   { id: 'basic', label: '鍩烘湰淇℃伅' },
   { id: 'medical', label: '鍖荤枟淇℃伅' },
-  { id: 'process', label: '娴佺▼淇℃伅' }
+  { id: 'contact', label: '鑱旂郴淇℃伅' },
+  { id: 'transport', label: '杞繍淇℃伅' }
 ])
 
-const activeTab = ref('basic')
+// 璁$畻灞炴��
+const hasTransport = computed(() => {
+  return caseDetail.value.serviceTransport
+})
 
-const processSteps = ref([
-  { id: 1, title: '妗堜緥涓婃姤', completed: true, time: '2024-03-25 09:30', person: '鏉庡尰鐢�' },
-  { id: 2, title: '淇℃伅瀹℃牳', completed: false, time: null, person: null },
-  { id: 3, title: '瀹跺睘娌熼��', completed: false, time: null, person: null },
-  { id: 4, title: '鎹愮尞纭', completed: false, time: null, person: null },
-  { id: 5, title: '鍣ㄥ畼鑾峰彇', completed: false, time: null, person: null }
-])
+const canDelete = computed(() => {
+  // 鍏佽鍒犻櫎鏈鎵规垨宸查┏鍥炵殑妗堜緥
+  return caseDetail.value.reportStatus === '1' || 
+         caseDetail.value.reportStatus === '2' || 
+         caseDetail.value.reportStatus === '4'
+})
 
-onLoad((options) => {
+onLoad(async (options) => {
   if (options.id) {
-    // 鏍规嵁ID鍔犺浇妗堜緥璇︽儏
-    loadCaseDetail(options.id)
+    caseId.value = options.id
+    // 鑾峰彇瀛楀吀鏁版嵁
+    dict.value = await useDict(
+      "sys_user_sex",
+      "sys_BloodType",
+      "sys_IDType",
+      "sys_AgeUnit"
+    )
+    // 鍔犺浇妗堜緥璇︽儏
+    await loadCaseDetail(options.id)
   }
 })
 
+// 鍔犺浇妗堜緥璇︽儏
+const loadCaseDetail = async (id) => {
+  loading.value = true
+  try {
+    const res = await uni.$uapi.get(`/project/donatebaseinforeport/getInfo/${id}`)
+    
+    if (res) {
+      caseDetail.value = res
+      
+      // 濡傛灉鐘舵�佹槸"宸蹭笂鎶�"(1)锛岃嚜鍔ㄦ洿鏂颁负"宸查槄璇�"(2)
+      if (caseDetail.value.reportStatus === '1') {
+        await updateCaseStatus('2')
+      }
+    } else {
+      throw new Error(res.msg || '鏁版嵁鍔犺浇澶辫触')
+    }
+  } catch (error) {
+    console.error('鍔犺浇妗堜緥璇︽儏澶辫触:', error)
+    uni.showToast({
+      title: '鏁版嵁鍔犺浇澶辫触锛岃閲嶈瘯',
+      icon: 'none'
+    })
+  } finally {
+    loading.value = false
+  }
+}
+
+// 鏇存柊妗堜緥鐘舵��
+const updateCaseStatus = async (newStatus) => {
+  try {
+    const updateData = {
+      ...caseDetail.value,
+      reportStatus: newStatus,
+      updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
+      updateBy: '绉诲姩绔敤鎴�'
+    }
+    
+    const res = await uni.$uapi.post("/project/donatebaseinforeport/edit", updateData)
+    
+    if (res.code === 200) {
+      caseDetail.value.reportStatus = newStatus
+    }
+  } catch (error) {
+    console.error('鏇存柊鐘舵�佸け璐�:', error)
+  }
+}
+
+// 鑾峰彇鐘舵�佹牱寮�
+const getStatusClass = (status) => {
+  const map = {
+    '1': 'reported',
+    '2': 'read',
+    '3': 'agreed',
+    '4': 'rejected'
+  }
+  return map[status] || 'reported'
+}
+
+// 鑾峰彇鐘舵�佹枃鏈�
+const getStatusText = (status) => {
+  const map = {
+    '1': '宸蹭笂鎶�',
+    '2': '宸查槄璇�',
+    '3': '宸插悓鎰�',
+    '4': '宸查┏鍥�'
+  }
+  return map[status] || '宸蹭笂鎶�'
+}
+
+// 鑾峰彇鎬у埆鏂囨湰
+const getGenderText = (gender) => {
+  if (!dict.value.sys_user_sex) return gender
+  const genderItem = dict.value.sys_user_sex.find(item => item.dictValue === gender)
+  return genderItem ? genderItem.dictLabel : gender
+}
+
+// 鑾峰彇琛�鍨嬫枃鏈�
+const getBloodTypeText = (bloodType) => {
+  if (!dict.value.sys_BloodType) return bloodType
+  const bloodTypeItem = dict.value.sys_BloodType.find(item => item.dictValue === bloodType)
+  return bloodTypeItem ? bloodTypeItem.dictLabel : bloodType
+}
+
+// 鑾峰彇骞撮緞鍗曚綅鏂囨湰
+const getAgeUnitText = (ageunit) => {
+  if (!ageunit) return ''
+  const unitMap = {
+    'year': '宀�',
+    'month': '涓湀',
+    'day': '澶�'
+  }
+  return unitMap[ageunit] || ageunit
+}
+
+// 鑾峰彇瀹屾暣鎴风睄鍦板潃
+const getFullRegisterAddress = () => {
+  const { 
+    registerprovincename, 
+    registercityname, 
+    registertownname, 
+    registercommunityname, 
+    registeraddress 
+  } = caseDetail.value
+  
+  const parts = [
+    registerprovincename,
+    registercityname,
+    registertownname,
+    registercommunityname,
+    registeraddress
+  ]
+  return parts.filter(part => part).join('')
+}
+
+// 鑾峰彇瀹屾暣鐜颁綇鍦板潃
+const getFullResidenceAddress = () => {
+  const { 
+    residenceprovincename, 
+    residencecountyname, 
+    residencetownname, 
+    residencecommunityname, 
+    residenceaddress 
+  } = caseDetail.value
+  
+  const parts = [
+    residenceprovincename,
+    residencecountyname,
+    residencetownname,
+    residencecommunityname,
+    residenceaddress
+  ]
+  return parts.filter(part => part).join('')
+}
+
+// 鑾峰彇杞繍鐘舵�佹枃鏈�
+const getTransportStatusText = (status) => {
+  const map = {
+    1: '寰呰浆杩�',
+    2: '杞繍涓�',
+    3: '杞繍瀹屾垚',
+    4: '杞繍鍙栨秷',
+    5: '鏆傚瓨'
+  }
+  return map[status] || '鏈煡'
+}
+
+// 鑾峰彇杞繍鐘舵�佹牱寮�
+const getTransportStatusClass = (status) => {
+  const map = {
+    1: 'pending',
+    2: 'transporting',
+    3: 'completed',
+    4: 'cancelled',
+    5: 'draft'
+  }
+  return map[status] || 'pending'
+}
+
+// 鏍煎紡鍖栨棩鏈熸椂闂�
+const formatDateTime = (dateTime) => {
+  if (!dateTime) return ''
+  return dateTime.replace('T', ' ').substring(0, 16)
+}
+
+// 閫夐」鍗″垏鎹�
 const switchTab = (tabId) => {
   activeTab.value = tabId
 }
 
+// 杩斿洖
 const goBack = () => {
   uni.navigateBack()
 }
 
-const withdrawCase = () => {
+// 缂栬緫妗堜緥
+const handleEdit = () => {
+  uni.navigateTo({
+    url: `/pages/case/CaseDetails?id=${caseId.value}&edit=true`
+  })
+}
+
+
+
+// 鍒犻櫎妗堜緥
+const handleDelete = () => {
   uni.showModal({
-    title: '纭鎾ゅ洖',
-    content: '纭畾瑕佹挙鍥炶繖涓崘鐚渚嬪悧锛�',
-    success: (res) => {
+    title: '纭鍒犻櫎',
+    content: `纭畾瑕佸垹闄ゆ渚� ${caseDetail.value.caseNo} 鍚楋紵`,
+    success: async (res) => {
       if (res.confirm) {
-        uni.showToast({ title: '鎾ゅ洖鎴愬姛', icon: 'success' })
-        setTimeout(() => {
-          uni.navigateBack()
-        }, 1500)
+        try {
+          const result = await uni.$uapi.delete(`/project/donatebaseinforeport/${caseId.value}`)
+          if (result.code === 200) {
+            uni.showToast({ title: '鍒犻櫎鎴愬姛', icon: 'success' })
+            setTimeout(() => {
+              uni.navigateBack()
+            }, 1500)
+          } else {
+            uni.showToast({ title: result.msg || '鍒犻櫎澶辫触', icon: 'none' })
+          }
+        } catch (error) {
+          console.error('鍒犻櫎澶辫触:', error)
+          uni.showToast({ title: '鍒犻櫎澶辫触', icon: 'none' })
+        }
       }
     }
   })
 }
 
-const contactCoordinator = () => {
-  uni.makePhoneCall({
-    phoneNumber: '13800138000'
+// 鍒涘缓杞繍鍗�
+const createTransport = () => {
+  if (caseDetail.value.reportStatus !== '3') {
+    uni.showToast({ title: '妗堜緥闇�鍏堝鎵瑰悓鎰�', icon: 'none' })
+    return
+  }
+  
+  uni.navigateTo({
+    url: `/pages/transport/create?caseId=${caseId.value}&caseNo=${caseDetail.value.caseNo}`
   })
 }
 
-const loadCaseDetail = (id) => {
-  // 妯℃嫙API璋冪敤
-  console.log('鍔犺浇妗堜緥璇︽儏:', id)
+// 鏌ョ湅杞繍鍗曡鎯�
+const viewTransportDetail = () => {
+  if (hasTransport.value && caseDetail.value.serviceTransport[0]) {
+    const transport = caseDetail.value.serviceTransport[0]
+    uni.navigateTo({
+      url: `/pages/transport/detail?id=${transport.id}`
+    })
+  }
 }
 </script>
 
@@ -227,6 +596,7 @@
   min-height: 100vh;
   background: linear-gradient(135deg, #fafdff 0%, #e3f0ff 100%);
   padding: 20rpx;
+  padding-bottom: 120rpx; /* 涓烘搷浣滄爮鐣欏嚭绌洪棿 */
 }
 
 .header-card {
@@ -255,6 +625,7 @@
   height: 80rpx;
   border-radius: 16rpx;
   margin-right: 20rpx;
+  background: #f5f5f7;
 }
 
 .hospital-details {
@@ -267,6 +638,10 @@
   font-weight: 600;
   color: #1d1d1f;
   margin-bottom: 8rpx;
+  max-width: 400rpx;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
 }
 
 .case-type {
@@ -293,6 +668,11 @@
   &.agreed {
     background: rgba(52, 199, 89, 0.1);
     color: #34c759;
+  }
+  
+  &.rejected {
+    background: rgba(255, 59, 48, 0.1);
+    color: #ff3b30;
   }
 }
 
@@ -327,10 +707,17 @@
   padding: 8rpx;
   margin-bottom: 30rpx;
   box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.05);
+  overflow-x: auto;
+  white-space: nowrap;
+  
+  &::-webkit-scrollbar {
+    display: none;
+  }
 }
 
 .tab-item {
   flex: 1;
+  min-width: 140rpx;
   text-align: center;
   padding: 20rpx;
   font-size: 28rpx;
@@ -391,15 +778,20 @@
     font-size: 28rpx;
     color: #1d1d1f;
     font-weight: 500;
+    word-break: break-all;
   }
 }
 
 .info-content {
   .info-group {
     margin-bottom: 32rpx;
+    padding-bottom: 20rpx;
+    border-bottom: 1rpx solid #f0f0f0;
     
     &:last-child {
       margin-bottom: 0;
+      padding-bottom: 0;
+      border-bottom: none;
     }
   }
   
@@ -408,6 +800,7 @@
     color: #86868b;
     margin-bottom: 12rpx;
     display: block;
+    font-weight: 500;
   }
   
   .group-content {
@@ -417,70 +810,118 @@
   }
 }
 
-.process-timeline {
-  position: relative;
-  padding-left: 40rpx;
+/* 杞繍淇℃伅鏍峰紡 */
+.transport-info {
+  .info-group {
+    border: 2rpx solid #f0f0f0;
+    border-radius: 12rpx;
+    padding: 20rpx;
+    margin-bottom: 20rpx;
+    background: #fafafa;
+    
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
   
-  &::before {
-    content: '';
-    position: absolute;
-    left: 15rpx;
-    top: 0;
-    bottom: 0;
-    width: 2rpx;
-    background: #e5e5e7;
+  .sub-group {
+    display: flex;
+    margin-bottom: 12rpx;
+    align-items: center;
+    
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+  
+  .sub-label {
+    font-size: 26rpx;
+    color: #606266;
+    min-width: 160rpx;
+    margin-right: 10rpx;
+  }
+  
+  .sub-value {
+    font-size: 26rpx;
+    color: #303133;
+    flex: 1;
+    
+    &.status {
+      padding: 4rpx 12rpx;
+      border-radius: 6rpx;
+      font-size: 24rpx;
+      
+      &.pending {
+        background: rgba(240, 173, 78, 0.1);
+        color: #f0ad4e;
+      }
+      
+      &.transporting {
+        background: rgba(0, 122, 255, 0.1);
+        color: #007aff;
+      }
+      
+      &.completed {
+        background: rgba(76, 217, 100, 0.1);
+        color: #4cd964;
+      }
+      
+      &.cancelled {
+        background: rgba(220, 223, 230, 0.1);
+        color: #dcdfe6;
+      }
+      
+      &.draft {
+        background: rgba(144, 147, 153, 0.1);
+        color: #909399;
+      }
+    }
+  }
+  
+  .empty-transport {
+    text-align: center;
+    padding: 40rpx 0;
+    color: #909399;
+    font-size: 28rpx;
   }
 }
 
-.timeline-item {
-  position: relative;
-  margin-bottom: 40rpx;
-  
-  &:last-child {
-    margin-bottom: 0;
-  }
-}
-
-.timeline-marker {
-  position: absolute;
-  left: -40rpx;
-  top: 8rpx;
-  width: 32rpx;
-  height: 32rpx;
-  border-radius: 50%;
-  background: #e5e5e7;
-  border: 4rpx solid #fff;
-  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
-  
-  &.active {
-    background: #007aff;
-  }
-}
-
-.timeline-content {
-  padding-bottom: 20rpx;
-}
-
-.step-title {
-  display: block;
-  font-size: 28rpx;
-  font-weight: 600;
-  color: #1d1d1f;
-  margin-bottom: 8rpx;
-}
-
-.step-time, .step-person {
-  display: block;
+/* 灏忓瀷鎸夐挳 */
+.small-btn {
+  padding: 8rpx 20rpx;
   font-size: 24rpx;
-  color: #86868b;
-  margin-bottom: 4rpx;
+  border-radius: 6rpx;
+  border: none;
+  
+  &.primary {
+    background: #007aff;
+    color: #fff;
+  }
+  
+  &.secondary {
+    background: #ecf5ff;
+    color: #007aff;
+    border: 1rpx solid #007aff;
+  }
+  
+  &:active {
+    opacity: 0.8;
+  }
 }
 
 .action-bar {
   display: flex;
   gap: 20rpx;
-  padding: 40rpx 0;
-  background: transparent;
+  padding: 20rpx 0;
+  background: #fff;
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  padding: 20rpx 30rpx;
+  padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
+  box-shadow: 0 -2rpx 20rpx rgba(0, 0, 0, 0.08);
+  z-index: 100;
 }
 
 .action-btn {
@@ -509,6 +950,24 @@
       transform: scale(0.98);
     }
   }
+  
+  &.success {
+    background: linear-gradient(90deg, #34c759 0%, #4cd964 100%);
+    color: #fff;
+    
+    &:active {
+      transform: scale(0.98);
+    }
+  }
+  
+  &.error {
+    background: linear-gradient(90deg, #ff3b30 0%, #ff5a5a 100%);
+    color: #fff;
+    
+    &:active {
+      transform: scale(0.98);
+    }
+  }
 }
 
 .fade-in-up {

--
Gitblit v1.9.3