<template>
|
<view class="case-record">
|
<!-- 统计卡片 -->
|
<view class="stats-card">
|
<view class="stat-item">
|
<text class="count">{{ stats.totalCases }}</text>
|
<text class="label">总上报量</text>
|
</view>
|
<view class="divider"></view>
|
<view class="stat-item">
|
<text class="count">{{ stats.readCases }}</text>
|
<text class="label">已阅读</text>
|
</view>
|
<view class="divider"></view>
|
<view class="stat-item">
|
<text class="count">{{ stats.agreedCases }}</text>
|
<text class="label">已同意</text>
|
</view>
|
</view>
|
|
<!-- 筛选栏 -->
|
<view class="filter-bar">
|
<view class="type-filter">
|
<text
|
v-for="(type, index) in caseTypes"
|
:key="index"
|
:class="{ active: currentType == type.value }"
|
@tap="selectType(type.value)"
|
>{{ type.label }}</text
|
>
|
</view>
|
|
<!-- 时间筛选 -->
|
<view class="date-filter">
|
<picker
|
mode="date"
|
:value="startDate"
|
:end="endDate"
|
@change="onStartDateChange"
|
>
|
<text>{{ startDate || "开始日期" }}</text>
|
</picker>
|
<text class="separator">至</text>
|
<picker
|
mode="date"
|
:value="endDate"
|
:start="startDate"
|
@change="onEndDateChange"
|
>
|
<text>{{ endDate || "结束日期" }}</text>
|
</picker>
|
</view>
|
</view>
|
|
<!-- 案例记录列表 -->
|
<scroll-view
|
scroll-y
|
class="case-list"
|
refresher-enabled
|
:refresher-triggered="refreshing"
|
@refresherrefresh="onRefresh"
|
@scrolltolower="onLoadMore"
|
>
|
<view
|
class="case-item card"
|
v-for="(caseItem, index) in filteredCases"
|
:key="index"
|
@tap="viewDetail(caseItem)"
|
>
|
<view class="header">
|
<view class="hospital-info">
|
<image :src="caseItem.hospitalLogo" mode="aspectFit" class="logo" />
|
<view class="info">
|
<text class="name">{{ caseItem.hospitalName }}</text>
|
<text class="type">{{ caseItem.caseType }}</text>
|
</view>
|
</view>
|
<text
|
class="status"
|
:class="getStatusClass(caseItem.reportStatus)"
|
>{{ caseItem.statusText }}</text
|
>
|
</view>
|
|
<view class="detail-info">
|
<!-- 基础信息保持不变 -->
|
<view class="info-item">
|
<text class="label">捐献编号</text>
|
<text class="value">{{ caseItem.donorNo }}</text>
|
</view>
|
<view class="info-item">
|
<text class="label">捐献者姓名</text>
|
<text class="value">{{ caseItem.donorName }}</text>
|
</view>
|
<view class="info-item">
|
<text class="label">证件号码</text>
|
<text class="value">{{ caseItem.idCardNo }}</text>
|
</view>
|
<view class="info-item">
|
<text class="label">性别/年龄</text>
|
<text class="value"
|
>{{ caseItem.gender }} / {{ caseItem.age }}岁</text
|
>
|
</view>
|
<view class="info-item">
|
<text class="label">血型</text>
|
<text class="value">{{ caseItem.bloodType }}</text>
|
</view>
|
<view class="info-item">
|
<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" v-if="caseItem.reviewTime">
|
<text class="label">审核时间</text>
|
<text class="value">{{ caseItem.reviewTime }}</text>
|
</view>
|
<view class="info-item" v-if="caseItem.reviewerName">
|
<text class="label">审核人</text>
|
<text class="value">{{ caseItem.reviewerName }}</text>
|
</view>
|
</view>
|
|
<!-- 转运信息区域 - 修改判断逻辑 -->
|
<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="getTransportStatusClass(caseItem)"
|
>
|
{{ getTransportStatusText(caseItem) }}
|
</text>
|
</view>
|
|
<!-- 转运详情判断逻辑修改 -->
|
<view class="transport-details" v-if="hasTransport(caseItem)">
|
<view class="detail-item">
|
<text class="detail-label">转运单号</text>
|
<text class="detail-value">{{
|
getTransportOrderNo(caseItem)
|
}}</text>
|
</view>
|
|
<view class="detail-item" v-if="getTransportStartTime(caseItem)">
|
<text class="detail-label">计划转运时间</text>
|
<text class="detail-value">{{
|
getTransportStartTime(caseItem)
|
}}</text>
|
</view>
|
|
<view class="detail-item" v-if="getTransportPlace(caseItem)">
|
<text class="detail-label">出发地点</text>
|
<text class="detail-value">{{
|
getTransportPlace(caseItem)
|
}}</text>
|
</view>
|
|
<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="getTransportStatus(caseItem) == 2">
|
<text class="detail-label">转运状态</text>
|
<text class="detail-value">转运中</text>
|
</view>
|
<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="canCreateTransport(caseItem)"
|
class="transport-btn primary"
|
@tap.stop="createTransportOrder(caseItem)"
|
>
|
创建转运单
|
</button>
|
|
<!-- 有转运单可查看 -->
|
<button
|
v-if="hasTransport(caseItem)"
|
class="transport-btn secondary"
|
@tap.stop="viewTransportDetail(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>
|
<text class="case-status">{{ caseItem.statusText }}</text>
|
</view>
|
<view class="actions">
|
<button
|
class="action-btn"
|
v-if="caseItem.reportStatus == '1' || caseItem.reportStatus == '2'"
|
@tap.stop="withdrawCase(caseItem)"
|
>
|
撤回
|
</button>
|
<button class="action-btn" @tap.stop="viewDetails(caseItem)">
|
查看详情
|
</button>
|
<button
|
class="action-btn secondary"
|
v-if="caseItem.reportStatus == '1' || caseItem.reportStatus == '2'"
|
@tap.stop="editCase(caseItem)"
|
>
|
编辑
|
</button>
|
</view>
|
</view>
|
</view>
|
|
<!-- 加载更多 -->
|
<view class="load-more" v-if="loadingMore">
|
<u-loading-icon text="加载中..."></u-loading-icon>
|
</view>
|
|
<!-- 无更多数据 -->
|
<view class="no-more" v-if="!hasMore && filteredCases.length > 0">
|
<text>已加载全部数据</text>
|
</view>
|
|
<!-- 空状态 -->
|
<view class="empty-state" v-if="!loading && filteredCases.length == 0">
|
<image src="/static/empty/no-case.png" mode="aspectFit" />
|
<text>暂无器官捐献案例记录</text>
|
</view>
|
</scroll-view>
|
|
<!-- 撤回确认弹窗 -->
|
<view class="modal-mask" v-if="showWithdrawModal">
|
<view class="modal-content">
|
<view class="modal-header">
|
<text class="modal-title">确认撤回</text>
|
</view>
|
<view class="modal-body">
|
<text>确定要撤回捐献案例 "{{ currentCase.donorNo }}" 吗?</text>
|
</view>
|
<view class="modal-footer">
|
<button class="modal-btn cancel" @tap="cancelWithdraw">取消</button>
|
<button class="modal-btn confirm" @tap="confirmWithdraw">
|
确认撤回
|
</button>
|
</view>
|
</view>
|
</view>
|
|
<!-- 加载状态 -->
|
<u-loading-page v-if="initLoading" :loading="true" text="数据加载中..." />
|
</view>
|
<view class="float-button" @tap="createNewCase">
|
<u-icon name="plus" color="#fff" size="24"></u-icon>
|
</view>
|
</template>
|
|
<script setup>
|
import { ref, computed, onMounted } from "vue";
|
import { onLoad, onShow, onReachBottom } from "@dcloudio/uni-app";
|
import { useDict } from "@/utils/dict";
|
|
// 响应式数据
|
const dict = ref({});
|
const loading = ref(false);
|
const initLoading = ref(false);
|
const loadingMore = ref(false);
|
const cases = ref([]);
|
const total = ref(0);
|
const pageNum = ref(1);
|
const pageSize = ref(10);
|
const hasMore = ref(true);
|
const refreshing = ref(false);
|
|
// 统计数据
|
const stats = ref({
|
totalCases: 0,
|
readCases: 0,
|
agreedCases: 0,
|
});
|
|
// 撤回确认弹窗相关
|
const showWithdrawModal = ref(false);
|
const currentCase = ref({});
|
// 数据映射函数 - 修改以匹配PC端字段
|
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"];
|
|
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,
|
};
|
};
|
// 转运判断方法 - 与PC端保持一致
|
const hasTransport = (caseData) => {
|
return caseData.serviceTransport && caseData.serviceTransport.length > 0;
|
};
|
const createNewCase = () => {
|
uni.navigateTo({
|
url: '/pages/case/CaseDetails'
|
});
|
};
|
const canCreateTransport = (caseData) => {
|
return (
|
(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/case/transferinfo?caseId=${caseItem.id}&caseNo=${caseItem.donorNo}`,
|
});
|
};
|
const getStatusClass = (status) => {
|
const map = {
|
'1': 'reported', // 已上报
|
'2': 'read', // 已阅读
|
'3': 'agreed', // 已同意
|
'4': 'rejected' // 已驳回
|
};
|
return map[status] || 'reported';
|
}
|
const viewTransportDetail = (caseItem) => {
|
if (hasTransport(caseItem)) {
|
const transport = caseItem.serviceTransport[0];
|
uni.navigateTo({
|
url: `/pages/case/transferinfo?id=${transport.id}`,
|
});
|
}
|
};
|
|
// 筛选相关
|
const caseTypes = [
|
{ label: "全部", value: "all" },
|
{ label: "已上报", value: "1" },
|
{ label: "已阅读", value: "2" },
|
{ label: "已同意", value: "3" },
|
{ label: "已驳回", value: "4" },
|
];
|
const currentType = ref("all");
|
const startDate = ref("");
|
const endDate = ref("");
|
|
// 生命周期
|
onLoad(async (options) => {
|
// 获取字典数据
|
dict.value = await useDict(
|
"sys_IDType",
|
"sys_user_sex",
|
"sys_BloodType",
|
"sys_DiseaseType",
|
);
|
|
// 加载数据
|
await loadInitialData();
|
});
|
|
onReachBottom(() => {
|
if (hasMore.value && !loading.value && !loadingMore.value) {
|
onLoadMore();
|
}
|
});
|
|
onShow(() => {
|
const transportUpdate = uni.getStorageSync("transportStatusUpdate");
|
if (transportUpdate) {
|
updateTransportStatus(transportUpdate.orderNo, transportUpdate.status);
|
uni.removeStorageSync("transportStatusUpdate");
|
}
|
});
|
|
// 数据加载函数
|
const loadInitialData = async () => {
|
initLoading.value = true;
|
try {
|
await Promise.all([donatebaseinforeportList(true), donateTotal()]);
|
} catch (error) {
|
console.error("初始化数据失败:", error);
|
} finally {
|
initLoading.value = false;
|
}
|
};
|
|
// 获取案例列表
|
const donatebaseinforeportList = async (reset = false) => {
|
if (reset) {
|
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,
|
};
|
|
// 筛选条件 - 如果选择了"全部",不传reportStatus参数
|
if (currentType.value !== "all") {
|
params.reportStatus = 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/donatebaseinforeport/list",
|
params,
|
);
|
|
console.log("接口返回数据:", res);
|
|
if (res.code == 200) {
|
const data =res.data || [];
|
const mappedData = data.map((item) => mapApiDataToCaseItem(item));
|
|
if (reset || pageNum.value == 1) {
|
console.log(mappedData,'mappedData');
|
|
cases.value = mappedData;
|
} else {
|
cases.value = [...cases.value, ...mappedData];
|
}
|
|
// 判断是否还有更多数据
|
hasMore.value = data.length >= pageSize.value;
|
total.value = res.total || 0;
|
|
// 如果有数据加载成功,增加页码
|
if (data.length > 0) {
|
pageNum.value++;
|
}
|
} else {
|
throw new Error(res.msg || "加载失败");
|
}
|
} catch (error) {
|
console.error("获取案例列表失败:", error);
|
uni.showToast({
|
title: "网络请求失败",
|
icon: "none",
|
});
|
} finally {
|
loading.value = false;
|
loadingMore.value = false;
|
}
|
};
|
|
// 获取统计数据
|
const donateTotal = async () => {
|
try {
|
const res = await uni.$uapi.post("/project/donatebaseinforeport/getTotal");
|
if (res.code === 200) {
|
stats.value = {
|
totalCases: res.data["all"] || 0,
|
readCases: res.data["2"] || 0,
|
agreedCases: res.data["3"] || 0,
|
};
|
} else {
|
throw new Error(res.msg || "获取统计失败");
|
}
|
} catch (error) {
|
console.error("获取统计数据失败:", error);
|
}
|
};
|
|
// 计算属性:筛选记录 - 现在只做前端状态筛选
|
const filteredCases = computed(() => {
|
let result = cases.value;
|
|
// 只做前端状态筛选,时间筛选已经通过接口实现
|
// if (currentType.value !== "all") {
|
// result = result.filter(
|
// (caseItem) => caseItem.reportStatus == currentType.value,
|
// );
|
// }
|
|
return result;
|
});
|
|
// 事件处理函数
|
const selectType = (type) => {
|
currentType.value = type;
|
// 重置分页,重新加载数据
|
pageNum.value = 1;
|
donatebaseinforeportList(true);
|
};
|
|
const onStartDateChange = (e) => {
|
startDate.value = e.detail.value;
|
// 如果结束日期已选择,立即触发筛选
|
if (endDate.value) {
|
pageNum.value = 1;
|
donatebaseinforeportList(true);
|
}
|
};
|
|
const onEndDateChange = (e) => {
|
endDate.value = e.detail.value;
|
// 如果开始日期已选择,立即触发筛选
|
if (startDate.value) {
|
pageNum.value = 1;
|
donatebaseinforeportList(true);
|
}
|
};
|
|
// 刷新和加载更多
|
const onRefresh = async () => {
|
refreshing.value = true;
|
pageNum.value = 1;
|
await donatebaseinforeportList(true);
|
await donateTotal();
|
setTimeout(() => {
|
refreshing.value = false;
|
}, 1000);
|
};
|
|
const onLoadMore = async () => {
|
if (!hasMore.value || loading.value || loadingMore.value) return;
|
await donatebaseinforeportList();
|
};
|
|
const trackTransport = (caseItem) => {
|
uni.navigateTo({
|
url: `/pages/transport/track?orderNo=${caseItem.transportOrderNo}`,
|
});
|
};
|
|
const updateTransportStatus = (orderNo, newStatus) => {
|
const caseItem = cases.value.find((item) => item.transportOrderNo == orderNo);
|
if (caseItem) {
|
caseItem.transportStatus = newStatus;
|
}
|
};
|
|
const viewDetail = (caseItem) => {
|
uni.navigateTo({
|
url: `/pages/case/detail?id=${caseItem.id}`,
|
});
|
};
|
|
const withdrawCase = (caseItem) => {
|
currentCase.value = caseItem;
|
showWithdrawModal.value = true;
|
};
|
|
const confirmWithdraw = async () => {
|
try {
|
const res = await uni.$uapi.delete(`/project/donatebaseinforeport/${currentCase.value.id}`);
|
|
if (res.code === 200) {
|
// 从列表中移除
|
const index = cases.value.findIndex(
|
(item) => item.id == currentCase.value.id
|
);
|
if (index !== -1) {
|
cases.value.splice(index, 1);
|
stats.value.totalCases -= 1;
|
}
|
|
uni.showToast({
|
title: "撤回成功",
|
icon: "success",
|
});
|
} else {
|
throw new Error(res.msg || "撤回失败");
|
}
|
} catch (error) {
|
console.error("撤回失败:", error);
|
uni.showToast({
|
title: "撤回失败,请重试",
|
icon: "none",
|
});
|
} finally {
|
showWithdrawModal.value = false;
|
}
|
};
|
|
const cancelWithdraw = () => {
|
showWithdrawModal.value = false;
|
};
|
</script>
|
|
<style lang="scss">
|
.case-record {
|
min-height: 100vh;
|
background: $bg-color;
|
|
.stats-card {
|
margin: 20rpx;
|
background: $primary-gradient;
|
border-radius: $radius-lg;
|
padding: 40rpx 30rpx;
|
display: flex;
|
align-items: center;
|
box-shadow: $shadow-md;
|
|
.stat-item {
|
flex: 1;
|
text-align: center;
|
|
.count {
|
font-size: 40rpx;
|
color: #fff;
|
font-weight: bold;
|
margin-bottom: 8rpx;
|
display: block;
|
}
|
|
.label {
|
font-size: 26rpx;
|
color: rgba(255, 255, 255, 0.9);
|
}
|
}
|
|
.divider {
|
width: 2rpx;
|
height: 60rpx;
|
background: rgba(255, 255, 255, 0.2);
|
}
|
}
|
|
.filter-bar {
|
background: #fff;
|
padding: 20rpx;
|
margin-bottom: 20rpx;
|
box-shadow: $shadow-sm;
|
|
.type-filter {
|
display: flex;
|
margin-bottom: 20rpx;
|
overflow-x: hidden;
|
|
text {
|
flex: 1;
|
text-align: center;
|
font-size: 28rpx;
|
color: $text-regular;
|
padding: 12rpx 0;
|
position: relative;
|
white-space: nowrap;
|
|
&.active {
|
color: $primary-color;
|
font-weight: bold;
|
|
&::after {
|
content: "";
|
position: absolute;
|
left: 50%;
|
bottom: 0;
|
transform: translateX(-50%);
|
width: 40rpx;
|
height: 4rpx;
|
background: $primary-color;
|
border-radius: 2rpx;
|
}
|
}
|
}
|
}
|
|
.date-filter {
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
overflow-x: hidden;
|
|
picker {
|
flex: 1;
|
width: 0;
|
|
text {
|
display: block;
|
text-align: center;
|
font-size: 26rpx;
|
color: $text-regular;
|
padding: 12rpx 0;
|
background: $bg-color;
|
border-radius: $radius-md;
|
white-space: nowrap;
|
overflow: hidden;
|
text-overflow: ellipsis;
|
}
|
}
|
|
.separator {
|
padding: 0 20rpx;
|
font-size: 26rpx;
|
color: $text-secondary;
|
}
|
}
|
}
|
|
.case-list {
|
height: calc(100vh - 300rpx);
|
overflow-x: hidden;
|
&::-webkit-scrollbar {
|
display: none;
|
}
|
|
.case-item {
|
margin: 20rpx;
|
background: #fff;
|
border-radius: $radius-lg;
|
padding: 30rpx;
|
box-shadow: $shadow-sm;
|
|
.header {
|
display: flex;
|
justify-content: space-between;
|
align-items: flex-start;
|
margin-bottom: 20rpx;
|
|
.hospital-info {
|
display: flex;
|
align-items: center;
|
|
.logo {
|
width: 60rpx;
|
height: 60rpx;
|
border-radius: $radius-sm;
|
margin-right: 16rpx;
|
}
|
|
.info {
|
.name {
|
font-size: 30rpx;
|
color: $text-primary;
|
font-weight: bold;
|
margin-bottom: 4rpx;
|
display: block;
|
}
|
|
.type {
|
font-size: 26rpx;
|
color: $text-regular;
|
}
|
}
|
}
|
|
.status {
|
font-size: 24rpx;
|
padding: 4rpx 12rpx;
|
border-radius: $radius-sm;
|
|
&.report {
|
color: $warning;
|
background: rgba($warning, 0.1);
|
}
|
|
&.read {
|
color: $info;
|
background: rgba($info, 0.1);
|
}
|
|
&.agree {
|
color: $success;
|
background: rgba($success, 0.1);
|
}
|
|
&.reject {
|
color: $danger;
|
background: rgba($danger, 0.1);
|
}
|
}
|
}
|
|
.detail-info {
|
padding: 20rpx 0;
|
border-top: 1rpx solid #eee;
|
border-bottom: 1rpx solid #eee;
|
|
.info-item {
|
display: flex;
|
justify-content: space-between;
|
margin-bottom: 12rpx;
|
|
&:last-child {
|
margin-bottom: 0;
|
}
|
|
.label {
|
font-size: 26rpx;
|
color: $text-regular;
|
min-width: 140rpx;
|
}
|
|
.value {
|
font-size: 26rpx;
|
color: $text-primary;
|
flex: 1;
|
text-align: right;
|
}
|
}
|
}
|
|
.footer {
|
padding-top: 20rpx;
|
display: flex;
|
justify-content: space-between;
|
align-items: center;
|
|
.action-info {
|
.label {
|
font-size: 26rpx;
|
color: $text-regular;
|
margin-right: 12rpx;
|
}
|
|
.case-status {
|
font-size: 28rpx;
|
color: $primary-color;
|
font-weight: bold;
|
}
|
}
|
|
.actions {
|
display: flex;
|
gap: 20rpx;
|
|
.action-btn {
|
height: 60rpx;
|
line-height: 60rpx;
|
padding: 0 30rpx;
|
font-size: 26rpx;
|
color: $primary-color;
|
background: $primary-light;
|
border-radius: $radius-xl;
|
|
&.secondary {
|
color: $text-regular;
|
background: #f5f5f5;
|
}
|
|
&:active {
|
opacity: 0.8;
|
}
|
}
|
}
|
}
|
|
&:active {
|
transform: scale(0.99);
|
}
|
}
|
}
|
.transport-section {
|
padding: 20rpx 0;
|
border-top: 1rpx solid #eee;
|
border-bottom: 1rpx solid #eee;
|
margin: 20rpx 0;
|
|
.transport-info {
|
display: flex;
|
justify-content: space-between;
|
align-items: center;
|
margin-bottom: 20rpx;
|
|
.label {
|
font-size: 26rpx;
|
color: #606266; /* 替换 $text-regular */
|
font-weight: bold;
|
}
|
|
.transport-status {
|
font-size: 26rpx;
|
padding: 6rpx 16rpx;
|
border-radius: 8rpx; /* 替换 $radius-sm,假设为8rpx */
|
|
&.not-transported {
|
color: #f0ad4e; /* 替换 $warning */
|
background: rgba(240, 173, 78, 0.1); /* 使用对应的rgba颜色 */
|
}
|
|
&.transporting {
|
color: #007aff; /* 替换 $primary-color */
|
background: rgba(0, 122, 255, 0.1);
|
}
|
|
&.completed {
|
color: #4cd964; /* 替换 $success */
|
background: rgba(76, 217, 100, 0.1);
|
}
|
}
|
}
|
|
.transport-details {
|
background: #f5f5f5; /* 替换 $bg-color */
|
border-radius: 16rpx; /* 替换 $radius-md,假设为16rpx */
|
padding: 20rpx;
|
margin-bottom: 20rpx;
|
|
.detail-item {
|
display: flex;
|
justify-content: space-between;
|
margin-bottom: 12rpx;
|
|
&:last-child {
|
margin-bottom: 0;
|
}
|
|
.detail-label {
|
font-size: 24rpx;
|
color: #606266; /* 替换 $text-regular */
|
}
|
|
.detail-value {
|
font-size: 24rpx;
|
color: #303133; /* 替换 $text-primary */
|
font-weight: 500;
|
}
|
}
|
}
|
|
.transport-actions {
|
display: flex;
|
gap: 20rpx;
|
flex-wrap: wrap;
|
|
.transport-btn {
|
height: 56rpx;
|
line-height: 56rpx;
|
padding: 0 24rpx;
|
font-size: 24rpx;
|
border-radius: 48rpx; /* 替换 $radius-xl,假设为48rpx */
|
border: none;
|
|
&.primary {
|
color: #fff;
|
background: #007aff; /* 替换 $primary-color */
|
}
|
|
&.secondary {
|
color: #007aff; /* 替换 $primary-color */
|
background: rgba(0, 122, 255, 0.1);
|
border: 1rpx solid #007aff; /* 替换 $primary-color */
|
}
|
|
&.track {
|
color: #fff;
|
background: #f0ad4e; /* 替换 $warning */
|
}
|
|
&.disabled {
|
color: #c0c4cc; /* 替换 $text-disabled */
|
background: #f5f5f5; /* 替换 $bg-color */
|
border: 1rpx solid #dcdfe6; /* 替换 $border-color */
|
}
|
|
&:active:not(.disabled) {
|
opacity: 0.8;
|
transform: scale(0.98);
|
}
|
}
|
}
|
}
|
|
.load-more, .no-more {
|
text-align: center;
|
padding: 40rpx 0;
|
color: $text-secondary;
|
font-size: 28rpx;
|
}
|
|
.empty-state {
|
padding: 120rpx 0;
|
text-align: center;
|
|
image {
|
width: 240rpx;
|
height: 240rpx;
|
margin-bottom: 30rpx;
|
}
|
|
text {
|
font-size: 28rpx;
|
color: $text-secondary;
|
}
|
}
|
|
/* 撤回确认弹窗样式 */
|
.modal-mask {
|
position: fixed;
|
top: 0;
|
left: 0;
|
right: 0;
|
bottom: 0;
|
background: rgba(0, 0, 0, 0.5);
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
z-index: 1000;
|
}
|
|
.modal-content {
|
background: #fff;
|
border-radius: 20rpx;
|
width: 600rpx;
|
overflow: hidden;
|
}
|
|
.modal-header {
|
padding: 40rpx 40rpx 20rpx;
|
text-align: center;
|
}
|
|
.modal-title {
|
font-size: 32rpx;
|
font-weight: bold;
|
color: $text-primary;
|
}
|
|
.modal-body {
|
padding: 20rpx 40rpx 40rpx;
|
text-align: center;
|
font-size: 28rpx;
|
color: $text-regular;
|
}
|
|
.modal-footer {
|
display: flex;
|
border-top: 1rpx solid #eee;
|
}
|
|
.modal-btn {
|
flex: 1;
|
height: 80rpx;
|
line-height: 80rpx;
|
font-size: 28rpx;
|
border: none;
|
border-radius: 0;
|
background: transparent;
|
|
&.cancel {
|
color: $text-regular;
|
border-right: 1rpx solid #eee;
|
}
|
|
&.confirm {
|
color: $danger;
|
font-weight: bold;
|
}
|
|
&:active {
|
background: #f5f5f5;
|
}
|
}
|
}
|
/* 浮动按钮样式 */
|
.float-button {
|
position: fixed;
|
bottom: 120rpx;
|
right: 40rpx;
|
width: 100rpx;
|
height: 100rpx;
|
background: $primary-color;
|
border-radius: 50%;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
box-shadow: 0 8rpx 20rpx rgba($primary-color, 0.3);
|
z-index: 100;
|
transition: all 0.3s ease;
|
|
&:active {
|
opacity: 0.8;
|
transform: scale(0.95);
|
}
|
}
|
</style>
|