WXL
9 天以前 2895b4ea66e09cb355aeb4e030ca0de297bf8ce3
pages/case/index.vue
@@ -124,8 +124,8 @@
            <text class="value">{{ caseItem.reviewerName }}</text>
          </view>
        </view>
        <!-- 显示转运详情 -->
        <!-- 在 .detail-info 部分之后,.footer 部分之前添加转运信息区域 -->
        <!-- 转运信息区域 -->
        <view class="transport-section">
          <view class="transport-info">
            <text class="label">转运状态</text>
@@ -137,31 +137,80 @@
            </text>
          </view>
          <!-- 显示转运详情 -->
          <!-- 显示转运详情:只要有转运单号就显示 -->
          <view
            class="transport-details"
            v-if="caseItem.transportStatus !== 'not_transported'"
            v-if="caseItem.transportOrderNo && caseItem.transportOrderNo !== ''"
          >
            <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">
            <view class="detail-item" v-if="caseItem.transportTime">
              <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
              }}</text>
            </view>
            <view class="detail-item" v-if="caseItem.transportDetails?.driver">
              <text class="detail-label">驾驶员</text>
              <text class="detail-value">{{
                caseItem.transportDetails.driver
              }}</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>
            <!-- 转运中才显示的动态信息 -->
            <view
              class="detail-item"
              v-if="
                caseItem.transportDetails &&
                caseItem.transportStatus === 'transporting'
                caseItem.transportStatus === 'transporting' &&
                caseItem.transportDetails?.currentLocation
              "
            >
              <text class="detail-label">当前位置</text>
              <text class="detail-value">{{
                caseItem.transportDetails.currentLocation
              }}</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>
          </view>
@@ -170,7 +219,7 @@
          <view class="transport-actions">
            <button
              v-if="
                caseItem.transportStatus === 'not_transported' &&
                !caseItem.transportOrderNo &&
                caseItem.status === 'agreed'
              "
              class="transport-btn primary"
@@ -190,8 +239,11 @@
              需先同意案例
            </button>
            <!-- 只要有转运单号就可以查看详情 -->
            <button
              v-if="caseItem.transportStatus !== 'not_transported'"
              v-if="
                caseItem.transportOrderNo && caseItem.transportOrderNo !== ''
              "
              class="transport-btn secondary"
              @tap.stop="viewTransportDetail(caseItem)"
            >
@@ -207,6 +259,7 @@
            </button>
          </view>
        </view>
        <view class="footer">
          <view class="action-info">
            <text class="label">案例状态</text>
@@ -248,9 +301,14 @@
      </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>
      <!-- 加载状态 -->
      <view class="empty-state" v-if="loading">
        <text>数据加载中...</text>
      </view>
    </scroll-view>
@@ -275,70 +333,31 @@
</template>
<script setup>
import { ref, computed } from "vue";
import { ref, computed, onMounted } from "vue";
import { onLoad, onShow } from "@dcloudio/uni-app";
import { useDict } from "@/utils/dict";
// 响应式数据
const dict = ref({});
const genderOptions = ref([]);
const educationOptions = ref([]);
const loading = 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({});
onLoad(async (options) => {
  // 获取字典数据
  dict.value = await useDict(
    "sys_IDType",
    "sys_user_sex",
    "sys_BloodType",
    "sys_DiseaseType"
  );
  // 初始化选项数据
  initOptions();
  donatebaseinforeportList();
  donateTotal();
});
onShow(() => {
  // 这里可以添加从转运页面返回时的数据刷新逻辑
  // 例如检查本地存储中是否有需要更新的转运状态
  const transportUpdate = uni.getStorageSync("transportStatusUpdate");
  if (transportUpdate) {
    updateTransportStatus(transportUpdate.orderNo, transportUpdate.status);
    uni.removeStorageSync("transportStatusUpdate");
  }
});
// 初始化选项数据的方法
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" },
@@ -350,186 +369,7 @@
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: {
@@ -541,16 +381,186 @@
  completed: { text: "已完成", color: "success", class: "completed" },
};
// 筛选记录[3](@ref)
// 数据映射函数
// 数据映射函数
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) => {
  // 获取字典数据
  dict.value = await useDict(
    "sys_IDType",
    "sys_user_sex",
    "sys_BloodType",
    "sys_DiseaseType"
  );
  // 加载数据
  await loadInitialData();
});
onShow(() => {
  const transportUpdate = uni.getStorageSync("transportStatusUpdate");
  if (transportUpdate) {
    updateTransportStatus(transportUpdate.orderNo, transportUpdate.status);
    uni.removeStorageSync("transportStatusUpdate");
  }
});
// 数据加载函数
const loadInitialData = async () => {
  loading.value = true;
  try {
    await Promise.all([donatebaseinforeportList(), donateTotal()]);
  } catch (error) {
    console.error("初始化数据失败:", error);
  } finally {
    loading.value = false;
  }
};
// 获取案例列表
const donatebaseinforeportList = async () => {
  try {
    const params = {
      pageNum: pageNum.value,
      pageSize: pageSize.value,
    };
    const res = await uni.$uapi.post(
      "/project/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];
    }
    hasMore.value = pageNum.value * pageSize.value < res.total;
    total.value = res.total;
  } catch (error) {
    console.error("获取案例列表失败:", error);
    uni.showToast({
      title: "网络请求失败",
      icon: "none",
    });
  }
};
// 获取统计数据
const donateTotal = async () => {
  try {
    const res = await uni.$uapi.post("/project/donatebaseinforeport/getTotal");
    stats.value = {
      totalCases: res["1"] || 0,
      readCases: res["2"] || 0,
      agreedCases: res["3"] || 0,
    };
  } 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];
@@ -561,47 +571,11 @@
  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 viewTransportDetail = (caseItem) => {
  uni.navigateTo({
    url: `/pages/transport/detail?orderNo=${caseItem.transportOrderNo}`,
  });
};
// 实时跟踪
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 selectType = (type) => {
  currentType.value = type;
};
// 日期选择
const onStartDateChange = (e) => {
  startDate.value = e.detail.value;
};
@@ -610,28 +584,67 @@
  endDate.value = e.detail.value;
};
// 查看详情
// 刷新和加载更多
const onRefresh = async () => {
  refreshing.value = true;
  pageNum.value = 1;
  await donatebaseinforeportList();
  setTimeout(() => {
    refreshing.value = false;
  }, 1000);
};
const onLoadMore = async () => {
  if (!hasMore.value || loading.value) return;
  pageNum.value += 1;
  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}`,
  });
};
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}`,
  });
};
// 撤回案例[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;
    uni.showToast({
      title: "撤回成功",
@@ -641,46 +654,20 @@
  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>