From 871522ed7e06fd9c62a87c178d7f5c88d7853a20 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期一, 20 四月 2026 18:04:35 +0800
Subject: [PATCH] 初始提交
---
pages/case/index.vue | 498 +++++++++++++++++++++++++++++--------------------------
1 files changed, 263 insertions(+), 235 deletions(-)
diff --git a/pages/case/index.vue b/pages/case/index.vue
index 3836b08..2ccea17 100644
--- a/pages/case/index.vue
+++ b/pages/case/index.vue
@@ -24,7 +24,7 @@
<text
v-for="(type, index) in caseTypes"
:key="index"
- :class="{ active: currentType === type.value }"
+ :class="{ active: currentType == type.value }"
@tap="selectType(type.value)"
>{{ type.label }}</text
>
@@ -75,12 +75,15 @@
<text class="type">{{ caseItem.caseType }}</text>
</view>
</view>
- <text class="status" :class="caseItem.status.replace('ed', '')">{{
- caseItem.statusText
- }}</text>
+ <text
+ class="status"
+ :class="caseItem.reportStatus.replace('ed', '')"
+ >{{ caseItem.statusText }}</text
+ >
</view>
<view class="detail-info">
+ <!-- 鍩虹淇℃伅淇濇寔涓嶅彉 -->
<view class="info-item">
<text class="label">鎹愮尞缂栧彿</text>
<text class="value">{{ caseItem.donorNo }}</text>
@@ -107,14 +110,18 @@
<text class="label">鐤剧梾璇婃柇</text>
<text class="value">{{ caseItem.diagnosis }}</text>
</view>
+
+ <!-- 鑱旂郴鏂瑰紡 -->
+ <view class="info-item" v-if="caseItem.phone">
+ <text class="label">鑱旂郴鐢佃瘽</text>
+ <text class="value">{{ caseItem.phone }}</text>
+ </view>
+
<view class="info-item">
<text class="label">涓婃姤鏃堕棿</text>
<text class="value">{{ caseItem.reportTime }}</text>
</view>
- <view class="info-item">
- <text class="label">涓婃姤浜�</text>
- <text class="value">{{ caseItem.reporterName }}</text>
- </view>
+
<view class="info-item" v-if="caseItem.reviewTime">
<text class="label">瀹℃牳鏃堕棿</text>
<text class="value">{{ caseItem.reviewTime }}</text>
@@ -125,141 +132,99 @@
</view>
</view>
- <!-- 杞繍淇℃伅鍖哄煙 -->
- <view class="transport-section">
+ <!-- 杞繍淇℃伅鍖哄煙 - 淇敼鍒ゆ柇閫昏緫 -->
+ <view
+ class="transport-section"
+ v-if="caseItem.isTransport == '2' || caseItem.isTransport == 2"
+ >
<view class="transport-info">
<text class="label">杞繍鐘舵��</text>
<text
class="transport-status"
- :class="transportStatusMap[caseItem.transportStatus].class"
+ :class="getTransportStatusClass(caseItem)"
>
- {{ transportStatusMap[caseItem.transportStatus].text }}
+ {{ getTransportStatusText(caseItem) }}
</text>
</view>
- <!-- 鏄剧ず杞繍璇︽儏锛氬彧瑕佹湁杞繍鍗曞彿灏辨樉绀� -->
- <view
- class="transport-details"
- v-if="caseItem.transportOrderNo && caseItem.transportOrderNo !== ''"
- >
+ <!-- 杞繍璇︽儏鍒ゆ柇閫昏緫淇敼 -->
+ <view class="transport-details" v-if="hasTransport(caseItem)">
<view class="detail-item">
<text class="detail-label">杞繍鍗曞彿</text>
- <text class="detail-value">{{ caseItem.transportOrderNo }}</text>
+ <text class="detail-value">{{
+ getTransportOrderNo(caseItem)
+ }}</text>
</view>
- <view class="detail-item" v-if="caseItem.transportTime">
+ <view class="detail-item" v-if="getTransportStartTime(caseItem)">
<text class="detail-label">璁″垝杞繍鏃堕棿</text>
- <text class="detail-value">{{ caseItem.transportTime }}</text>
- </view>
-
- <view class="detail-item" v-if="caseItem.transportDetails?.vehicle">
- <text class="detail-label">杞繍杞﹁締</text>
<text class="detail-value">{{
- caseItem.transportDetails.vehicle
+ getTransportStartTime(caseItem)
}}</text>
</view>
- <view class="detail-item" v-if="caseItem.transportDetails?.driver">
- <text class="detail-label">椹鹃┒鍛�</text>
+ <view class="detail-item" v-if="getTransportPlace(caseItem)">
+ <text class="detail-label">鍑哄彂鍦扮偣</text>
<text class="detail-value">{{
- caseItem.transportDetails.driver
+ getTransportPlace(caseItem)
}}</text>
</view>
- <view class="detail-item" v-if="caseItem.transportDetails?.phone">
- <text class="detail-label">鑱旂郴鐢佃瘽</text>
- <text class="detail-value">{{
- caseItem.transportDetails.phone
- }}</text>
+ <view class="detail-item" v-if="getCoordinator(caseItem)">
+ <text class="detail-label">鍗忚皟鍛�</text>
+ <text class="detail-value">{{ getCoordinator(caseItem) }}</text>
</view>
- <!-- 杞繍涓墠鏄剧ず鐨勫姩鎬佷俊鎭� -->
- <view
- class="detail-item"
- v-if="
- caseItem.transportStatus === 'transporting' &&
- caseItem.transportDetails?.currentLocation
- "
- >
- <text class="detail-label">褰撳墠浣嶇疆</text>
- <text class="detail-value">{{
- caseItem.transportDetails.currentLocation
- }}</text>
+ <!-- 杞繍鐘舵�佷俊鎭� -->
+ <view class="detail-item" v-if="getTransportStatus(caseItem) == 2">
+ <text class="detail-label">杞繍鐘舵��</text>
+ <text class="detail-value">杞繍涓�</text>
</view>
-
- <view
- class="detail-item"
- v-if="
- caseItem.transportStatus === 'transporting' &&
- caseItem.transportDetails?.estimatedTime
- "
- >
- <text class="detail-label">棰勮鍒拌揪</text>
- <text class="detail-value">{{
- caseItem.transportDetails.estimatedTime
- }}</text>
- </view>
-
- <!-- 瀹屾垚鍚庢樉绀虹殑淇℃伅 -->
- <view
- class="detail-item"
- v-if="
- caseItem.transportStatus === 'completed' &&
- caseItem.transportDetails?.completedTime
- "
- >
- <text class="detail-label">瀹屾垚鏃堕棿</text>
- <text class="detail-value">{{
- caseItem.transportDetails.completedTime
- }}</text>
+ <view class="detail-item" v-if="getTransportStatus(caseItem) == 3">
+ <text class="detail-label">杞繍鐘舵��</text>
+ <text class="detail-value">宸插畬鎴�</text>
</view>
</view>
- <!-- 鎿嶄綔鎸夐挳 -->
+ <!-- 鎿嶄綔鎸夐挳 - 淇敼鍒ゆ柇閫昏緫 -->
<view class="transport-actions">
+ <!-- 鍙垱寤鸿浆杩愬崟鐨勬潯浠讹細宸插悓鎰� + 闇�杞繍 + 鏃犺浆杩愬崟 -->
<button
- v-if="
- !caseItem.transportOrderNo &&
- caseItem.status === 'agreed'
- "
+ v-if="canCreateTransport(caseItem)"
class="transport-btn primary"
@tap.stop="createTransportOrder(caseItem)"
>
鍒涘缓杞繍鍗�
</button>
+ <!-- 闇�杞繍浣嗘湭鍚屾剰 -->
<button
- v-if="
- caseItem.transportStatus === 'not_transported' &&
- caseItem.status !== 'agreed'
- "
+ v-if="caseItem.isTransport == '2' && !hasTransport(caseItem)"
class="transport-btn disabled"
disabled
>
闇�鍏堝悓鎰忔渚�
</button>
- <!-- 鍙鏈夎浆杩愬崟鍙峰氨鍙互鏌ョ湅璇︽儏 -->
+ <!-- 鏈夎浆杩愬崟鍙煡鐪� -->
<button
- v-if="
- caseItem.transportOrderNo && caseItem.transportOrderNo !== ''
- "
+ v-if="hasTransport(caseItem)"
class="transport-btn secondary"
@tap.stop="viewTransportDetail(caseItem)"
>
- 鏌ョ湅杞繍璇︽儏
- </button>
-
- <button
- v-if="caseItem.transportStatus === 'transporting'"
- class="transport-btn track"
- @tap.stop="trackTransport(caseItem)"
- >
- 瀹炴椂璺熻釜
+ 鏌ョ湅杞繍鍗�
</button>
</view>
</view>
-
+ <!-- 鏃犻渶杞繍鎻愮ず -->
+ <view
+ class="transport-section"
+ v-else-if="caseItem.reportStatus == '3'"
+ >
+ <view class="transport-info">
+ <text class="transport-note">璇ユ渚嬫棤闇�杞繍</text>
+ </view>
+ </view>
<view class="footer">
<view class="action-info">
<text class="label">妗堜緥鐘舵��</text>
@@ -268,25 +233,17 @@
<view class="actions">
<button
class="action-btn"
- v-if="caseItem.status === 'reported'"
+ v-if="caseItem.reportStatus != '1'"
@tap.stop="withdrawCase(caseItem)"
>
鎾ゅ洖
</button>
- <button
- class="action-btn"
- v-if="
- caseItem.status === 'read' ||
- caseItem.status === 'agreed' ||
- caseItem.status === 'rejected'
- "
- @tap.stop="viewDetails(caseItem)"
- >
+ <button class="action-btn" @tap.stop="viewDetails(caseItem)">
鏌ョ湅璇︽儏
</button>
<button
class="action-btn secondary"
- v-if="caseItem.status === 'reported'"
+ v-if="caseItem.reportStatus != '1'"
@tap.stop="editCase(caseItem)"
>
缂栬緫
@@ -301,7 +258,7 @@
</view>
<!-- 绌虹姸鎬� -->
- <view class="empty-state" v-if="!loading && filteredCases.length === 0">
+ <view class="empty-state" v-if="!loading && filteredCases.length == 0">
<image src="/static/empty/no-case.png" mode="aspectFit" />
<text>鏆傛棤鍣ㄥ畼鎹愮尞妗堜緥璁板綍</text>
</view>
@@ -357,14 +314,201 @@
// 鎾ゅ洖纭寮圭獥鐩稿叧
const showWithdrawModal = ref(false);
const currentCase = ref({});
+// 鏁版嵁鏄犲皠鍑芥暟 - 淇敼浠ュ尮閰峆C绔瓧娈�
+const mapApiDataToCaseItem = (apiData) => {
+ const statusMap = {
+ 1: { status: "1", statusText: "宸蹭笂鎶�" },
+ 2: { status: "2", statusText: "宸查槄璇�" },
+ 3: { status: "3", statusText: "宸插悓鎰�" },
+ 4: { status: "4", statusText: "宸查┏鍥�" },
+ };
+
+ const statusInfo = statusMap[apiData.reportStatus] || statusMap["1"];
+
+ // 杞繍鐘舵�佹槧灏�
+ const getTransportStatusClass = (caseData) => {
+ if (!hasTransport(caseData)) {
+ return "not-transported";
+ }
+ const status = getTransportStatus(caseData);
+ const map = {
+ 1: "pending",
+ 2: "transporting",
+ 3: "completed",
+ 4: "cancelled",
+ 5: "draft",
+ };
+ return map[status] || "pending";
+ };
+
+ return {
+ id: apiData.id || apiData.donatebaseinfoReportId,
+ donorNo: apiData.caseNo,
+ hospitalName: apiData.treatmenthospitalname,
+ hospitalLogo: "/static/hospital/default.jpg",
+ caseType: "鍣ㄥ畼鎹愮尞妗堜緥",
+ donorName: apiData.name,
+ idCardNo: apiData.idcardno,
+ gender:
+ dict.value.sys_user_sex?.find((item) => item.dictValue == apiData.sex)
+ ?.dictLabel || apiData.sex,
+ age: apiData.age,
+ ageunit: apiData.ageunit,
+ bloodType:
+ dict.value.sys_BloodType?.find(
+ (item) => item.dictValue == apiData.bloodType,
+ )?.dictLabel || apiData.bloodType,
+ diagnosis: apiData.diagnosisname,
+ illnessoverview: apiData.illnessoverview,
+ patientstate: apiData.patientstate,
+ gcsScore: apiData.gcsScore,
+ infectious: apiData.infectious,
+ infectiousOther: apiData.infectiousOther,
+ isTransport: apiData.isTransport,
+ // 鏂板PC绔瓧娈�
+ education: apiData.education,
+ occupation: apiData.occupation,
+ nativeplace: apiData.nativeplace,
+ nation: apiData.nation,
+ nationality: apiData.nationality,
+ birthday: apiData.birthday,
+ idcardtype: apiData.idcardtype,
+ phone: apiData.phone,
+ // 鍖婚櫌淇℃伅
+ departmentName: apiData.treatmentdeptname,
+ contactPerson: apiData.coordinatorName || apiData.infoName,
+ contactPhone: apiData.coordinatorNo || apiData.phone,
+ // 涓婃姤淇℃伅
+ reportTime: apiData.reporttime,
+ reporterName: apiData.reportername || apiData.infoName,
+ reviewTime: apiData.approvetime,
+ reviewerName: apiData.approvername,
+ // 鐘舵�佸拰杞繍
+ ...statusInfo,
+ // 杞繍淇℃伅
+ serviceTransport: apiData.serviceTransport || [],
+ // 鍏朵粬瀛楁
+ remark: apiData.remark,
+ };
+};
+// 杞繍鍒ゆ柇鏂规硶 - 涓嶱C绔繚鎸佷竴鑷�
+const hasTransport = (caseData) => {
+ console.log(caseData.serviceTransport);
+
+ return caseData.serviceTransport;
+};
+
+const canCreateTransport = (caseData) => {
+ return (
+ caseData.status == "3" && // 宸插悓鎰�
+ (caseData.isTransport == "2" || caseData.isTransport == 2) && // 闇�瑕佽浆杩�
+ !hasTransport(caseData)
+ ); // 鏃犺浆杩愬崟
+};
+
+const getTransportOrderNo = (caseData) => {
+ if (hasTransport(caseData)) {
+ const transport = caseData.serviceTransport[0];
+ return transport.reportId || transport.id || "";
+ }
+ return "";
+};
+
+const getTransportStartTime = (caseData) => {
+ if (hasTransport(caseData)) {
+ return caseData.serviceTransport[0].transportStartTime;
+ }
+ return "";
+};
+
+const getTransportPlace = (caseData) => {
+ if (hasTransport(caseData)) {
+ return caseData.serviceTransport[0].transportStartPlace;
+ }
+ return "";
+};
+
+const getCoordinator = (caseData) => {
+ if (hasTransport(caseData)) {
+ return caseData.serviceTransport[0].contactPerson;
+ }
+ return "";
+};
+const getTransportStatus = (caseData) => {
+ if (hasTransport(caseData)) {
+ return caseData.serviceTransport[0].transitStatus;
+ }
+ return null;
+};
+
+const getTransportStatusText = (caseData) => {
+ if (!hasTransport(caseData)) {
+ return "闇�杞繍";
+ }
+ const status = getTransportStatus(caseData);
+ const map = {
+ 1: "寰呰浆杩�",
+ 2: "杞繍涓�",
+ 3: "宸插畬鎴�",
+ 4: "宸插彇娑�",
+ 5: "鏆傚瓨",
+ };
+ return map[status] || "鏈煡";
+};
+
+// 杞繍鐘舵�佹牱寮�
+const getTransportStatusClass = (caseData) => {
+ if (!hasTransport(caseData)) {
+ return "not-transported";
+ }
+ const status = getTransportStatus(caseData);
+ const map = {
+ 1: "pending",
+ 2: "transporting",
+ 3: "completed",
+ 4: "cancelled",
+ 5: "draft",
+ };
+ return map[status] || "pending";
+};
+
+// 淇缂栬緫鎸夐挳璺宠浆
+const editCase = (caseItem) => {
+ uni.navigateTo({
+ url: `/pages/case/CaseDetails?id=${caseItem.id}&edit=true`,
+ });
+};
+
+// 淇鏌ョ湅璇︽儏鎸夐挳璺宠浆
+const viewDetails = (caseItem) => {
+ uni.navigateTo({
+ url: `/pages/case/CaseInfo?id=${caseItem.id}`,
+ });
+};
+
+// 鍘熸湁鐨勮浆杩愭搷浣滄柟娉曚繚鎸佷笉鍙�
+const createTransportOrder = (caseItem) => {
+ uni.navigateTo({
+ url: `/pages/transport/create?caseId=${caseItem.id}&caseNo=${caseItem.donorNo}`,
+ });
+};
+
+const viewTransportDetail = (caseItem) => {
+ if (hasTransport(caseItem)) {
+ const transport = caseItem.serviceTransport[0];
+ uni.navigateTo({
+ url: `/pages/transport/detail?orderNo=${transport.id}`,
+ });
+ }
+};
// 绛涢�夌浉鍏�
const caseTypes = [
- { label: "鍏ㄩ儴", value: "all" },
- { label: "宸蹭笂鎶�", value: "reported" },
- { label: "宸查槄璇�", value: "read" },
- { label: "宸插悓鎰�", value: "agreed" },
- { label: "宸查┏鍥�", value: "rejected" },
+ { label: "鍏ㄩ儴", value: "" },
+ { label: "宸蹭笂鎶�", value: "1" },
+ { label: "宸查槄璇�", value: "2" },
+ { label: "宸插悓鎰�", value: "3" },
+ { label: "宸查┏鍥�", value: "4" },
];
const currentType = ref("all");
const startDate = ref("");
@@ -381,97 +525,6 @@
completed: { text: "宸插畬鎴�", color: "success", class: "completed" },
};
-// 鏁版嵁鏄犲皠鍑芥暟
-// 鏁版嵁鏄犲皠鍑芥暟
-const mapApiDataToCaseItem = (apiData) => {
- const statusMap = {
- 1: { status: "reported", statusText: "宸蹭笂鎶�" },
- 2: { status: "read", statusText: "宸查槄璇�" },
- 3: { status: "agreed", statusText: "宸插悓鎰�" },
- 4: { status: "rejected", statusText: "宸查┏鍥�" },
- };
-
- const transportStatusMap = {
- 1: "not_transported",
- 2: "transporting",
- 3: "completed",
- 4: "not_transported",
- 5: "not_transported",
- };
-
- const statusInfo = statusMap[apiData.reportStatus] || statusMap["1"];
-
- // 澶勭悊杞繍淇℃伅 - 鏇村姞鍋ュ.鐨勫鐞�
- let transportDetails = null;
- let transportStatus = "not_transported";
- let transportOrderNo = "";
- let transportTime = "";
-
- // 浼樺厛浠� serviceTransport 鑾峰彇杞繍淇℃伅
- if (
- apiData.serviceTransport &&
- Array.isArray(apiData.serviceTransport) &&
- apiData.serviceTransport.length > 0
- ) {
- const transport = apiData.serviceTransport[0];
- transportDetails = {
- driver: transport.driver || "",
- vehicle: transport.vehicle || "",
- phone: transport.driverPhone || "",
- currentLocation: transport.transportStartPlace || "",
- estimatedTime: transport.estimatedTime || "",
- completedTime: transport.completedTime || "",
- };
- transportStatus =
- transportStatusMap[transport.transitStatus] || "not_transported";
- transportOrderNo = transport.id || "";
- transportTime = transport.transportStartTime || "";
- }
-
- // 濡傛灉鐩存帴鏈夎浆杩愪俊鎭紝涔熻繘琛屽鐞�
- if (apiData.transportOrderNo) {
- transportOrderNo = apiData.transportOrderNo;
- }
- if (apiData.transportStartTime) {
- transportTime = apiData.transportStartTime;
- }
- if (apiData.transitStatus) {
- transportStatus =
- transportStatusMap[apiData.transitStatus] || "not_transported";
- }
-
- return {
- id: apiData.id || apiData.donatebaseinfoReportId,
- donorNo: apiData.caseNo,
- hospitalName: apiData.treatmenthospitalname,
- hospitalLogo: "/static/hospital/default.jpg",
- caseType: "鍣ㄥ畼鎹愮尞妗堜緥",
- donorName: apiData.name,
- idCardNo: apiData.idcardno,
- gender:
- dict.value.sys_user_sex?.find((item) => item.dictValue === apiData.sex)
- ?.dictLabel || apiData.sex,
- age: apiData.age,
- bloodType:
- dict.value.sys_BloodType?.find(
- (item) => item.dictValue === apiData.bloodType
- )?.dictLabel || apiData.bloodType,
- diagnosis: apiData.diagnosisname,
- reportTime: apiData.reporttime,
- reporterName: apiData.reportername,
- reviewTime: apiData.reviewTime,
- reviewerName: apiData.reviewerName,
- departmentName: apiData.treatmentdeptname,
- contactPerson: apiData.userName || apiData.contactPerson,
- contactPhone: apiData.phone,
- ...statusInfo,
- transportStatus: transportStatus,
- transportOrderNo: transportOrderNo,
- transportTime: transportTime,
- transportDetails: transportDetails,
- };
-};
-
// 鐢熷懡鍛ㄦ湡
onLoad(async (options) => {
// 鑾峰彇瀛楀吀鏁版嵁
@@ -479,7 +532,7 @@
"sys_IDType",
"sys_user_sex",
"sys_BloodType",
- "sys_DiseaseType"
+ "sys_DiseaseType",
);
// 鍔犺浇鏁版嵁
@@ -516,13 +569,13 @@
const res = await uni.$uapi.post(
"/project/donatebaseinforeport/list",
- params
+ params,
);
console.log(res, "res");
const mappedData = res.map((item) => mapApiDataToCaseItem(item));
- if (pageNum.value === 1) {
+ if (pageNum.value == 1) {
cases.value = mappedData;
} else {
cases.value = [...cases.value, ...mappedData];
@@ -558,7 +611,9 @@
let result = cases.value;
if (currentType.value !== "all") {
- result = result.filter((caseItem) => caseItem.status === currentType.value);
+ result = result.filter(
+ (caseItem) => caseItem.reportStatus == currentType.value,
+ );
}
if (startDate.value && endDate.value) {
@@ -600,19 +655,6 @@
await donatebaseinforeportList();
};
-// 鍏朵粬鍔熻兘鍑芥暟锛堜繚鎸佸師鏈夐�昏緫锛�
-const createTransportOrder = (caseItem) => {
- uni.navigateTo({
- url: `/pages/case/transferinfo?caseId=${caseItem.id}&donorNo=${caseItem.donorNo}`,
- });
-};
-
-const viewTransportDetail = (caseItem) => {
- uni.navigateTo({
- url: `/pages/transport/detail?orderNo=${caseItem.transportOrderNo}`,
- });
-};
-
const trackTransport = (caseItem) => {
uni.navigateTo({
url: `/pages/transport/track?orderNo=${caseItem.transportOrderNo}`,
@@ -620,9 +662,7 @@
};
const updateTransportStatus = (orderNo, newStatus) => {
- const caseItem = cases.value.find(
- (item) => item.transportOrderNo === orderNo
- );
+ const caseItem = cases.value.find((item) => item.transportOrderNo == orderNo);
if (caseItem) {
caseItem.transportStatus = newStatus;
}
@@ -641,7 +681,7 @@
const confirmWithdraw = () => {
const index = cases.value.findIndex(
- (item) => item.id === currentCase.value.id
+ (item) => item.id == currentCase.value.id,
);
if (index !== -1) {
cases.value.splice(index, 1);
@@ -656,18 +696,6 @@
const cancelWithdraw = () => {
showWithdrawModal.value = false;
-};
-
-const viewDetails = (caseItem) => {
- uni.navigateTo({
- url: `/pages/case/detail?id=${caseItem.id}`,
- });
-};
-
-const editCase = (caseItem) => {
- uni.navigateTo({
- url: `/pages/case/edit?id=${caseItem.id}`,
- });
};
</script>
--
Gitblit v1.9.3