From 4d9da000fbe74d344e0e4580b138e79d4ad98ede Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期一, 01 六月 2026 11:07:14 +0800
Subject: [PATCH] 维护
---
pages/case/CaseInfo.vue | 918 ++++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 738 insertions(+), 180 deletions(-)
diff --git a/pages/case/CaseInfo.vue b/pages/case/CaseInfo.vue
index f817e16..27c0c31 100644
--- a/pages/case/CaseInfo.vue
+++ b/pages/case/CaseInfo.vue
@@ -4,26 +4,39 @@
<view class="header-card">
<view class="case-header">
<view class="hospital-info">
- <image :src="caseDetail.hospitalLogo" mode="aspectFit" class="hospital-logo" />
+ <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>
@@ -31,8 +44,8 @@
<!-- 閫夐」鍗″鑸� -->
<view class="tab-navigation">
- <text
- v-for="tab in tabs"
+ <text
+ v-for="tab in tabs"
:key="tab.id"
:class="{ active: activeTab === tab.id }"
@tap="switchTab(tab.id)"
@@ -51,31 +64,60 @@
<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,136 +132,562 @@
<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">ICU璇勪及鍖荤敓</text>
+ <text class="value">{{ caseDetail.icuDoctor || "鏈~鍐�" }}</text>
+ </view>
+ <view class="info-item">
+ <text class="label">ICU鍖荤敓鐢佃瘽</text>
+ <text class="value">{{
+ caseDetail.icuDoctorPhone || "鏈~鍐�"
+ }}</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 { 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: "basic", label: "鍩烘湰淇℃伅" },
+ { id: "medical", 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 switchTab = (tabId) => {
- activeTab.value = tabId
-}
+// 鍔犺浇妗堜緥璇︽儏
+const loadCaseDetail = async (id) => {
+ loading.value = true;
+ try {
+ const res = await uni.$uapi.get(
+ `/project/donatebaseinforeport/getInfo/${id}`,
+ );
-const goBack = () => {
- uni.navigateBack()
-}
+ if (res.data) {
+ caseDetail.value = res.data;
-const withdrawCase = () => {
- uni.showModal({
- title: '纭鎾ゅ洖',
- content: '纭畾瑕佹挙鍥炶繖涓崘鐚渚嬪悧锛�',
- success: (res) => {
- if (res.confirm) {
- uni.showToast({ title: '鎾ゅ洖鎴愬姛', icon: 'success' })
- setTimeout(() => {
- uni.navigateBack()
- }, 1500)
- }
+ // 濡傛灉鐘舵�佹槸"宸蹭笂鎶�"(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 contactCoordinator = () => {
- uni.makePhoneCall({
- phoneNumber: '13800138000'
- })
-}
+// 鏇存柊妗堜緥鐘舵��
+const updateCaseStatus = async (newStatus) => {
+ try {
+ const updateData = {
+ ...caseDetail.value,
+ reportStatus: newStatus,
+ updateTime: new Date().toISOString().replace("T", " ").substring(0, 19),
+ updateBy: "绉诲姩绔敤鎴�",
+ };
-const loadCaseDetail = (id) => {
- // 妯℃嫙API璋冪敤
- console.log('鍔犺浇妗堜緥璇︽儏:', id)
-}
+ 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 handleEdit = () => {
+ uni.navigateTo({
+ url: `/pages/case/CaseDetails?id=${caseId.value}&edit=true`,
+ });
+};
+
+// 鍒犻櫎妗堜緥
+const handleDelete = () => {
+ uni.showModal({
+ title: "纭鍒犻櫎",
+ content: `纭畾瑕佸垹闄ゆ渚� ${caseDetail.value.caseNo} 鍚楋紵`,
+ success: async (res) => {
+ if (res.confirm) {
+ 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 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 viewTransportDetail = () => {
+ if (hasTransport.value && caseDetail.value.serviceTransport[0]) {
+ const transport = caseDetail.value.serviceTransport[0];
+ uni.navigateTo({
+ url: `/pages/transport/detail?id=${transport.id}`,
+ });
+ }
+};
</script>
<style lang="scss" scoped>
@@ -227,6 +695,7 @@
min-height: 100vh;
background: linear-gradient(135deg, #fafdff 0%, #e3f0ff 100%);
padding: 20rpx;
+ padding-bottom: 120rpx; /* 涓烘搷浣滄爮鐣欏嚭绌洪棿 */
}
.header-card {
@@ -234,7 +703,7 @@
border-radius: 32rpx;
padding: 40rpx 30rpx;
margin-bottom: 30rpx;
- box-shadow: 0 12px 48px 0 rgba(0, 113, 227, 0.10);
+ box-shadow: 0 12px 48px 0 rgba(0, 113, 227, 0.1);
border: 1.5px solid #e5eaf0;
}
@@ -255,6 +724,7 @@
height: 80rpx;
border-radius: 16rpx;
margin-right: 20rpx;
+ background: #f5f5f7;
}
.hospital-details {
@@ -267,6 +737,10 @@
font-weight: 600;
color: #1d1d1f;
margin-bottom: 8rpx;
+ max-width: 400rpx;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
}
.case-type {
@@ -279,20 +753,25 @@
border-radius: 20rpx;
font-size: 24rpx;
font-weight: 500;
-
+
&.reported {
background: rgba(255, 149, 0, 0.1);
color: #ff9500;
}
-
+
&.read {
background: rgba(0, 122, 255, 0.1);
color: #007aff;
}
-
+
&.agreed {
background: rgba(52, 199, 89, 0.1);
color: #34c759;
+ }
+
+ &.rejected {
+ background: rgba(255, 59, 48, 0.1);
+ color: #ff3b30;
}
}
@@ -301,18 +780,18 @@
display: flex;
justify-content: space-between;
}
-
+
.info-item {
display: flex;
flex-direction: column;
}
-
+
.label {
font-size: 24rpx;
color: #86868b;
margin-bottom: 8rpx;
}
-
+
.value {
font-size: 28rpx;
color: #1d1d1f;
@@ -327,16 +806,23 @@
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;
color: #86868b;
transition: all 0.3s ease;
-
+
&.active {
color: #007aff;
background: #f0f7ff;
@@ -350,7 +836,7 @@
border-radius: 32rpx;
padding: 40rpx 30rpx;
margin-bottom: 30rpx;
- box-shadow: 0 12px 48px 0 rgba(0, 113, 227, 0.10);
+ box-shadow: 0 12px 48px 0 rgba(0, 113, 227, 0.1);
border: 1.5px solid #e5eaf0;
}
@@ -376,40 +862,46 @@
.info-item {
display: flex;
flex-direction: column;
-
+
&.full-width {
grid-column: 1 / -1;
}
-
+
.label {
font-size: 24rpx;
color: #86868b;
margin-bottom: 8rpx;
}
-
+
.value {
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;
}
}
-
+
.group-title {
font-size: 26rpx;
color: #86868b;
margin-bottom: 12rpx;
display: block;
+ font-weight: 500;
}
-
+
.group-content {
font-size: 28rpx;
color: #1d1d1f;
@@ -417,70 +909,118 @@
}
}
-.process-timeline {
- position: relative;
- padding-left: 40rpx;
-
- &::before {
- content: '';
- position: absolute;
- left: 15rpx;
- top: 0;
- bottom: 0;
- width: 2rpx;
- background: #e5e5e7;
+/* 杞繍淇℃伅鏍峰紡 */
+.transport-info {
+ .info-group {
+ border: 2rpx solid #f0f0f0;
+ border-radius: 12rpx;
+ padding: 20rpx;
+ margin-bottom: 20rpx;
+ background: #fafafa;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ .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 {
@@ -491,20 +1031,38 @@
font-weight: 600;
border: none;
transition: all 0.3s ease;
-
+
&.secondary {
background: #f5f5f7;
color: #1d1d1f;
-
+
&:active {
background: #e5e5e7;
}
}
-
+
&.primary {
background: linear-gradient(90deg, #0071e3 0%, #2997ff 100%);
color: #fff;
-
+
+ &:active {
+ 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);
}
@@ -523,4 +1081,4 @@
transform: translateY(0);
}
}
-</style>
\ No newline at end of file
+</style>
--
Gitblit v1.9.3