WXL
3 天以前 2cc85c64f1c64a2dbaeae276a3e2ca8420de76b7
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>
@@ -124,87 +131,89 @@
            <text class="value">{{ caseItem.reviewerName }}</text>
          </view>
        </view>
        <!-- 显示转运详情 -->
        <!-- 在 .detail-info 部分之后,.footer 部分之前添加转运信息区域 -->
        <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.transportStatus !== 'not_transported'"
          >
          <!-- 转运详情判断逻辑修改 -->
          <view class="transport-details" v-if="hasTransport(caseItem)">
            <view class="detail-item">
              <text class="detail-label">转运单号</text>
              <text class="detail-value">{{ caseItem.transportOrderNo }}</text>
            </view>
            <view class="detail-item" v-if="caseItem.transportDetails">
              <text class="detail-label">转运车辆</text>
              <text class="detail-value">{{
                caseItem.transportDetails.vehicle
                getTransportOrderNo(caseItem)
              }}</text>
            </view>
            <view
              class="detail-item"
              v-if="
                caseItem.transportDetails &&
                caseItem.transportStatus === 'transporting'
              "
            >
              <text class="detail-label">当前位置</text>
            <view class="detail-item" v-if="getTransportStartTime(caseItem)">
              <text class="detail-label">计划转运时间</text>
              <text class="detail-value">{{
                caseItem.transportDetails.currentLocation
                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="
                caseItem.transportStatus === 'not_transported' &&
                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.transportStatus !== 'not_transported'"
              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">
@@ -215,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)"
            >
              编辑
@@ -243,12 +244,17 @@
      </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="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>
@@ -271,49 +277,256 @@
        </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 } from "vue";
import { onLoad, onShow } from "@dcloudio/uni-app";
import { ref, computed, onMounted } from "vue";
import { onLoad, onShow, onReachBottom } from "@dcloudio/uni-app";
import { useDict } from "@/utils/dict";
// 响应式数据
const dict = ref({});
const genderOptions = ref([]);
const educationOptions = 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: 8,
  readCases: 4,
  agreedCases: 2,
  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"
    "sys_DiseaseType",
  );
  // 初始化选项数据
  initOptions();
  donatebaseinforeportList();
  donateTotal();
  // 加载数据
  await loadInitialData();
});
onReachBottom(() => {
  if (hasMore.value && !loading.value && !loadingMore.value) {
    onLoadMore();
  }
});
onShow(() => {
  // 这里可以添加从转运页面返回时的数据刷新逻辑
  // 例如检查本地存储中是否有需要更新的转运状态
  const transportUpdate = uni.getStorageSync("transportStatusUpdate");
  if (transportUpdate) {
    updateTransportStatus(transportUpdate.orderNo, transportUpdate.status);
@@ -321,366 +534,227 @@
  }
});
// 初始化选项数据的方法
const initOptions = () => {
  genderOptions.value = dict.value.sys_IDType || [];
  educationOptions.value = dict.value.sys_user_sex || [];
};
const donatebaseinforeportList = async () => {
  const params = {
    pageNum: pageNum.value,
    pageSize: pageSize.value,
  };
  const res = await uni.$uapi.post("/system/donatebaseinforeport/list", params);
  total.value = res.total;
  console.log(res.records, "11");
};
const donateTotal = async () => {
  const res = await uni.$uapi.post("/system/donatebaseinforeport/getTotal");
  console.log(res);
};
// 筛选相关
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("");
// 案例记录数据 - 增加更多数据[1,4](@ref)
const cases = ref([
  {
    id: 1,
    donorNo: "DON20240325001",
    hospitalName: "青岛镜湖医院",
    hospitalLogo: "/static/hospital/kiang-wu.jpg",
    caseType: "器官捐献案例",
    donorName: "张三",
    idCardNo: "370203198510123456",
    gender: "男",
    age: 38,
    bloodType: "A型",
    diagnosis: "脑外伤导致脑死亡",
    reportTime: "2024-03-25 09:30",
    reporterName: "李医生",
    status: "agreed",
    statusText: "已同意",
    departmentName: "神经外科",
    contactPerson: "王护士",
    contactPhone: "13800138000",
    redCrossOrg: "青岛市红十字会",
    acquisitionOrg: "青岛市器官获取组织",
    transportStatus: "not_transported", // 转运状态:not_transported-未转运, transporting-转运中, completed-已完成
    transportOrderNo: "", // 转运单号
    transportTime: "", // 转运时间
    transportDetails: null, // 转运详情
  },
  {
    id: 2,
    donorNo: "DON20240320002",
    hospitalName: "青岛科大医院",
    hospitalLogo: "/static/hospital/must.jpg",
    caseType: "器官捐献案例",
    donorName: "李四",
    idCardNo: "370205197805207890",
    gender: "女",
    age: 45,
    bloodType: "O型",
    diagnosis: "急性心肌梗死",
    reportTime: "2024-03-20 15:00",
    reporterName: "张医生",
    status: "read",
    statusText: "已阅读",
    reviewTime: "2024-03-21 10:15",
    reviewerName: "审核专员A",
    departmentName: "心内科",
    contactPerson: "赵护士",
    contactPhone: "13900139000",
    redCrossOrg: "青岛市红十字会",
    acquisitionOrg: "青岛市器官获取组织",
    transportStatus: "transporting", // 转运中
    transportOrderNo: "TR20240321001",
    transportTime: "2024-03-21 14:30",
    transportDetails: {
      driver: "张师傅",
      vehicle: "鲁B12345",
      phone: "13800138000",
      estimatedTime: "2小时",
      currentLocation: "青岛市南区",
    },
  },
  {
    id: 3,
    donorNo: "DON20240318003",
    hospitalName: "青岛大学附属医院",
    hospitalLogo: "/static/hospital/qingda.jpg",
    caseType: "器官捐献案例",
    donorName: "王五",
    idCardNo: "370211197212153214",
    gender: "男",
    age: 51,
    bloodType: "B型",
    diagnosis: "颅内出血",
    reportTime: "2024-03-18 14:20",
    reporterName: "刘医生",
    status: "agreed",
    statusText: "已同意",
    reviewTime: "2024-03-19 09:45",
    reviewerName: "审核专员B",
    departmentName: "神经内科",
    contactPerson: "钱护士",
    contactPhone: "13600136000",
    redCrossOrg: "青岛市红十字会",
    acquisitionOrg: "青岛市器官获取组织",
    transportStatus: "completed", // 已完成
    transportOrderNo: "TR20240319001",
    transportTime: "2024-03-19 11:20",
    transportDetails: {
      driver: "李师傅",
      vehicle: "鲁B67890",
      phone: "13900139000",
      completedTime: "2024-03-19 13:45",
      distance: "156公里",
    },
  },
  {
    id: 4,
    donorNo: "DON20240315004",
    hospitalName: "青岛市立医院",
    hospitalLogo: "/static/hospital/shili.jpg",
    caseType: "器官捐献案例",
    donorName: "赵六",
    idCardNo: "370205198803274561",
    gender: "女",
    age: 36,
    bloodType: "AB型",
    diagnosis: "多器官功能衰竭",
    reportTime: "2024-03-15 16:40",
    reporterName: "陈医生",
    status: "rejected",
    statusText: "已驳回",
    reviewTime: "2024-03-16 11:20",
    reviewerName: "审核专员C",
    rejectReason: "资料不完整,需补充家属同意书",
    departmentName: "ICU",
    contactPerson: "孙护士",
    contactPhone: "13700137000",
    redCrossOrg: "青岛市红十字会",
    acquisitionOrg: "青岛市器官获取组织",
    transportStatus: "not_transported", // 转运状态:not_transported-未转运, transporting-转运中, completed-已完成
    transportOrderNo: "", // 转运单号
    transportTime: "", // 转运时间
    transportDetails: null, // 转运详情
  },
  {
    id: 5,
    donorNo: "DON20240310005",
    hospitalName: "青岛眼科医院",
    hospitalLogo: "/static/hospital/yanke.jpg",
    caseType: "角膜捐献案例",
    donorName: "孙七",
    idCardNo: "370203199205187896",
    gender: "男",
    age: 32,
    bloodType: "O型",
    diagnosis: "视网膜母细胞瘤",
    reportTime: "2024-03-10 08:15",
    reporterName: "眼科张医生",
    status: "read",
    statusText: "已阅读",
    reviewTime: "2024-03-11 14:30",
    reviewerName: "审核专员A",
    departmentName: "眼科",
    contactPerson: "周护士",
    contactPhone: "13500135000",
    redCrossOrg: "青岛市红十字会",
    acquisitionOrg: "青岛市眼库",
    transportStatus: "not_transported", // 转运状态:not_transported-未转运, transporting-转运中, completed-已完成
    transportOrderNo: "", // 转运单号
    transportTime: "", // 转运时间
    transportDetails: null, // 转运详情
  },
  {
    id: 6,
    donorNo: "DON20240305006",
    hospitalName: "青岛儿童医院",
    hospitalLogo: "/static/hospital/children.jpg",
    caseType: "器官捐献案例",
    donorName: "周八",
    idCardNo: "370211201802153248",
    gender: "女",
    age: 6,
    bloodType: "A型",
    diagnosis: "先天性心脏病",
    reportTime: "2024-03-05 11:25",
    reporterName: "儿科李医生",
    status: "reported",
    statusText: "已上报",
    departmentName: "儿科ICU",
    contactPerson: "吴护士",
    contactPhone: "13400134000",
    redCrossOrg: "青岛市红十字会",
    acquisitionOrg: "青岛市器官获取组织",
    transportStatus: "not_transported", // 转运状态:not_transported-未转运, transporting-转运中, completed-已完成
    transportOrderNo: "", // 转运单号
    transportTime: "", // 转运时间
    transportDetails: null, // 转运详情
  },
]);
// 转运状态映射
const transportStatusMap = {
  not_transported: {
    text: "未转运",
    color: "warning",
    class: "not-transported",
  },
  transporting: { text: "转运中", color: "primary", class: "transporting" },
  completed: { text: "已完成", color: "success", class: "completed" },
// 数据加载函数
const loadInitialData = async () => {
  initLoading.value = true;
  try {
    await Promise.all([donatebaseinforeportList(true), donateTotal()]);
  } catch (error) {
    console.error("初始化数据失败:", error);
  } finally {
    initLoading.value = false;
  }
};
// 筛选记录[3](@ref)
// 获取案例列表
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.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 hasMore = ref(true);
const refreshing = ref(false);
// 创建转运单
const createTransportOrder = (caseItem) => {
  console.log(caseItem);
  uni.navigateTo({
    url: `/pages/case/transferinfo?caseId=${caseItem.id}&donorNo=${caseItem.donorNo}`,
  });
// 事件处理函数
const selectType = (type) => {
  currentType.value = type;
  // 重置分页,重新加载数据
  pageNum.value = 1;
  donatebaseinforeportList(true);
};
// 查看转运详情
const viewTransportDetail = (caseItem) => {
  uni.navigateTo({
    url: `/pages/transport/detail?orderNo=${caseItem.transportOrderNo}`,
  });
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
  );
  const caseItem = cases.value.find((item) => item.transportOrderNo == orderNo);
  if (caseItem) {
    caseItem.transportStatus = newStatus;
  }
};
// 选择类型
const selectType = (type) => {
  currentType.value = type;
};
// 日期选择
const onStartDateChange = (e) => {
  startDate.value = e.detail.value;
};
const onEndDateChange = (e) => {
  endDate.value = e.detail.value;
};
// 查看详情
const viewDetail = (caseItem) => {
  uni.navigateTo({
    url: `/pages/case/detail?id=${caseItem.id}`,
  });
};
// 撤回案例[7](@ref)
const withdrawCase = (caseItem) => {
  currentCase.value = caseItem;
  showWithdrawModal.value = true;
};
// 确认撤回
const confirmWithdraw = () => {
  const index = cases.value.findIndex(
    (item) => item.id === currentCase.value.id
  );
  if (index !== -1) {
    // 从列表中移除已撤回的案例[4](@ref)
    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}`,
  });
};
// 下拉刷新
const onRefresh = () => {
  refreshing.value = true;
  loadCases();
  setTimeout(() => {
    refreshing.value = false;
  }, 1000);
};
// 加载更多
const onLoadMore = () => {
  if (!hasMore.value) return;
  loadCases();
};
// 加载记录
const loadCases = () => {
  // 这里调用API加载数据
  setTimeout(() => {
    hasMore.value = false;
  }, 1000);
};
</script>
@@ -1057,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;
@@ -1141,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>