WXL
22 小时以前 888f941ae16c850c0f1a844ec9436058840920bd
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="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>
@@ -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,90 @@
          </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'
              "
              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 +224,17 @@
          <view class="actions">
            <button
              class="action-btn"
              v-if="caseItem.status === 'reported'"
              v-if="caseItem.reportStatus == '1' || caseItem.reportStatus == '2'"
              @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' || caseItem.reportStatus == '2'"
              @tap.stop="editCase(caseItem)"
            >
              编辑
@@ -296,19 +244,19 @@
      </view>
      <!-- 加载更多 -->
      <view class="load-more" v-if="hasMore">
        <text>加载中...</text>
      <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">
      <view class="empty-state" v-if="!loading && filteredCases.length == 0">
        <image src="/static/empty/no-case.png" mode="aspectFit" />
        <text>暂无器官捐献案例记录</text>
      </view>
      <!-- 加载状态 -->
      <view class="empty-state" v-if="loading">
        <text>数据加载中...</text>
      </view>
    </scroll-view>
@@ -329,17 +277,25 @@
        </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 } from "@dcloudio/uni-app";
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);
@@ -357,88 +313,16 @@
// 撤回确认弹窗相关
const showWithdrawModal = ref(false);
const currentCase = ref({});
// 筛选相关
const caseTypes = [
  { label: "全部", value: "all" },
  { label: "已上报", value: "reported" },
  { label: "已阅读", value: "read" },
  { label: "已同意", value: "agreed" },
  { label: "已驳回", value: "rejected" },
];
const currentType = ref("all");
const startDate = ref("");
const endDate = ref("");
// 转运状态映射
const transportStatusMap = {
  not_transported: {
    text: "未转运",
    color: "warning",
    class: "not-transported",
  },
  transporting: { text: "转运中", color: "primary", class: "transporting" },
  completed: { text: "已完成", color: "success", class: "completed" },
};
// 数据映射函数
// 数据映射函数
// 数据映射函数 - 修改以匹配PC端字段
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",
    1: { status: "1", statusText: "已上报" },
    2: { status: "2", statusText: "已阅读" },
    3: { status: "3", statusText: "已同意" },
    4: { status: "4", statusText: "已驳回" },
  };
  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,
@@ -449,28 +333,178 @@
    donorName: apiData.name,
    idCardNo: apiData.idcardno,
    gender:
      dict.value.sys_user_sex?.find((item) => item.dictValue === apiData.sex)
      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
        (item) => item.dictValue == apiData.bloodType,
      )?.dictLabel || apiData.bloodType,
    diagnosis: apiData.diagnosisname,
    reportTime: apiData.reporttime,
    reporterName: apiData.reportername,
    reviewTime: apiData.reviewTime,
    reviewerName: apiData.reviewerName,
    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.userName || apiData.contactPerson,
    contactPhone: apiData.phone,
    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,
    transportStatus: transportStatus,
    transportOrderNo: transportOrderNo,
    transportTime: transportTime,
    transportDetails: transportDetails,
    // 转运信息
    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) => {
@@ -479,11 +513,17 @@
    "sys_IDType",
    "sys_user_sex",
    "sys_BloodType",
    "sys_DiseaseType"
    "sys_DiseaseType",
  );
  // 加载数据
  await loadInitialData();
});
onReachBottom(() => {
  if (hasMore.value && !loading.value && !loadingMore.value) {
    onLoadMore();
  }
});
onShow(() => {
@@ -496,121 +536,165 @@
// 数据加载函数
const loadInitialData = async () => {
  loading.value = true;
  initLoading.value = true;
  try {
    await Promise.all([donatebaseinforeportList(), donateTotal()]);
    await Promise.all([donatebaseinforeportList(true), donateTotal()]);
  } catch (error) {
    console.error("初始化数据失败:", error);
  } finally {
    loading.value = false;
    initLoading.value = false;
  }
};
// 获取案例列表
const donatebaseinforeportList = async () => {
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,
    };
    const res = await uni.$uapi.post(
      "/system/donatebaseinforeport/list",
      params
    );
    console.log(res, "res");
    const mappedData = res.map((item) => mapApiDataToCaseItem(item));
    if (pageNum.value === 1) {
      cases.value = mappedData;
    } else {
      cases.value = [...cases.value, ...mappedData];
    // 筛选条件 - 如果选择了"全部",不传reportStatus参数
    if (currentType.value !== "all") {
      params.reportStatus = currentType.value;
    }
    hasMore.value = pageNum.value * pageSize.value < res.total;
    total.value = res.total;
    // 时间筛选条件
    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("/system/donatebaseinforeport/getTotal");
    stats.value = {
      totalCases: res["1"] || 0,
      readCases: res["2"] || 0,
      agreedCases: res["3"] || 0,
    };
    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.status === currentType.value);
  }
  if (startDate.value && endDate.value) {
    result = result.filter((caseItem) => {
      const caseDate = caseItem.reportTime.split(" ")[0];
      return caseDate >= startDate.value && caseDate <= endDate.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();
  await donatebaseinforeportList(true);
  await donateTotal();
  setTimeout(() => {
    refreshing.value = false;
  }, 1000);
};
const onLoadMore = async () => {
  if (!hasMore.value || loading.value) return;
  pageNum.value += 1;
  if (!hasMore.value || loading.value || loadingMore.value) return;
  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) => {
@@ -620,9 +704,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;
  }
@@ -639,35 +721,40 @@
  showWithdrawModal.value = true;
};
const confirmWithdraw = () => {
  const index = cases.value.findIndex(
    (item) => item.id === currentCase.value.id
  );
  if (index !== -1) {
    cases.value.splice(index, 1);
    stats.value.totalCases -= 1;
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: "success",
      title: "撤回失败,请重试",
      icon: "none",
    });
  } finally {
    showWithdrawModal.value = false;
  }
  showWithdrawModal.value = false;
};
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>
@@ -1044,6 +1131,14 @@
      }
    }
  }
  .load-more, .no-more {
    text-align: center;
    padding: 40rpx 0;
    color: $text-secondary;
    font-size: 28rpx;
  }
  .empty-state {
    padding: 120rpx 0;
    text-align: center;
@@ -1128,4 +1223,25 @@
    }
  }
}
</style>
/* 浮动按钮样式 */
.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>