WXL
4 天以前 871522ed7e06fd9c62a87c178d7f5c88d7853a20
pages/case/index.vue
@@ -24,7 +24,7 @@
        <text
          v-for="(type, index) in caseTypes"
          :key="index"
          :class="{ active: currentType === type.value }"
          :class="{ active: currentType == type.value }"
          @tap="selectType(type.value)"
          >{{ type.label }}</text
        >
@@ -75,12 +75,15 @@
              <text class="type">{{ caseItem.caseType }}</text>
            </view>
          </view>
          <text class="status" :class="caseItem.status.replace('ed', '')">{{
            caseItem.statusText
          }}</text>
          <text
            class="status"
            :class="caseItem.reportStatus.replace('ed', '')"
            >{{ caseItem.statusText }}</text
          >
        </view>
        <view class="detail-info">
          <!-- 基础信息保持不变 -->
          <view class="info-item">
            <text class="label">捐献编号</text>
            <text class="value">{{ caseItem.donorNo }}</text>
@@ -107,14 +110,18 @@
            <text class="label">疾病诊断</text>
            <text class="value">{{ caseItem.diagnosis }}</text>
          </view>
          <!-- 联系方式 -->
          <view class="info-item" v-if="caseItem.phone">
            <text class="label">联系电话</text>
            <text class="value">{{ caseItem.phone }}</text>
          </view>
          <view class="info-item">
            <text class="label">上报时间</text>
            <text class="value">{{ caseItem.reportTime }}</text>
          </view>
          <view class="info-item">
            <text class="label">上报人</text>
            <text class="value">{{ caseItem.reporterName }}</text>
          </view>
          <view class="info-item" v-if="caseItem.reviewTime">
            <text class="label">审核时间</text>
            <text class="value">{{ caseItem.reviewTime }}</text>
@@ -125,141 +132,99 @@
          </view>
        </view>
        <!-- 转运信息区域 -->
        <view class="transport-section">
        <!-- 转运信息区域 - 修改判断逻辑 -->
        <view
          class="transport-section"
          v-if="caseItem.isTransport == '2' || caseItem.isTransport == 2"
        >
          <view class="transport-info">
            <text class="label">转运状态</text>
            <text
              class="transport-status"
              :class="transportStatusMap[caseItem.transportStatus].class"
              :class="getTransportStatusClass(caseItem)"
            >
              {{ transportStatusMap[caseItem.transportStatus].text }}
              {{ getTransportStatusText(caseItem) }}
            </text>
          </view>
          <!-- 显示转运详情:只要有转运单号就显示 -->
          <view
            class="transport-details"
            v-if="caseItem.transportOrderNo && caseItem.transportOrderNo !== ''"
          >
          <!-- 转运详情判断逻辑修改 -->
          <view class="transport-details" v-if="hasTransport(caseItem)">
            <view class="detail-item">
              <text class="detail-label">转运单号</text>
              <text class="detail-value">{{ caseItem.transportOrderNo }}</text>
              <text class="detail-value">{{
                getTransportOrderNo(caseItem)
              }}</text>
            </view>
            <view class="detail-item" v-if="caseItem.transportTime">
            <view class="detail-item" v-if="getTransportStartTime(caseItem)">
              <text class="detail-label">计划转运时间</text>
              <text class="detail-value">{{ caseItem.transportTime }}</text>
            </view>
            <view class="detail-item" v-if="caseItem.transportDetails?.vehicle">
              <text class="detail-label">转运车辆</text>
              <text class="detail-value">{{
                caseItem.transportDetails.vehicle
                getTransportStartTime(caseItem)
              }}</text>
            </view>
            <view class="detail-item" v-if="caseItem.transportDetails?.driver">
              <text class="detail-label">驾驶员</text>
            <view class="detail-item" v-if="getTransportPlace(caseItem)">
              <text class="detail-label">出发地点</text>
              <text class="detail-value">{{
                caseItem.transportDetails.driver
                getTransportPlace(caseItem)
              }}</text>
            </view>
            <view class="detail-item" v-if="caseItem.transportDetails?.phone">
              <text class="detail-label">联系电话</text>
              <text class="detail-value">{{
                caseItem.transportDetails.phone
              }}</text>
            <view class="detail-item" v-if="getCoordinator(caseItem)">
              <text class="detail-label">协调员</text>
              <text class="detail-value">{{ getCoordinator(caseItem) }}</text>
            </view>
            <!-- 转运中才显示的动态信息 -->
            <view
              class="detail-item"
              v-if="
                caseItem.transportStatus === 'transporting' &&
                caseItem.transportDetails?.currentLocation
              "
            >
              <text class="detail-label">当前位置</text>
              <text class="detail-value">{{
                caseItem.transportDetails.currentLocation
              }}</text>
            <!-- 转运状态信息 -->
            <view class="detail-item" v-if="getTransportStatus(caseItem) == 2">
              <text class="detail-label">转运状态</text>
              <text class="detail-value">转运中</text>
            </view>
            <view
              class="detail-item"
              v-if="
                caseItem.transportStatus === 'transporting' &&
                caseItem.transportDetails?.estimatedTime
              "
            >
              <text class="detail-label">预计到达</text>
              <text class="detail-value">{{
                caseItem.transportDetails.estimatedTime
              }}</text>
            </view>
            <!-- 完成后显示的信息 -->
            <view
              class="detail-item"
              v-if="
                caseItem.transportStatus === 'completed' &&
                caseItem.transportDetails?.completedTime
              "
            >
              <text class="detail-label">完成时间</text>
              <text class="detail-value">{{
                caseItem.transportDetails.completedTime
              }}</text>
            <view class="detail-item" v-if="getTransportStatus(caseItem) == 3">
              <text class="detail-label">转运状态</text>
              <text class="detail-value">已完成</text>
            </view>
          </view>
          <!-- 操作按钮 -->
          <!-- 操作按钮 - 修改判断逻辑 -->
          <view class="transport-actions">
            <!-- 可创建转运单的条件:已同意 + 需转运 + 无转运单 -->
            <button
              v-if="
                !caseItem.transportOrderNo &&
                caseItem.status === 'agreed'
              "
              v-if="canCreateTransport(caseItem)"
              class="transport-btn primary"
              @tap.stop="createTransportOrder(caseItem)"
            >
              创建转运单
            </button>
            <!-- 需转运但未同意 -->
            <button
              v-if="
                caseItem.transportStatus === 'not_transported' &&
                caseItem.status !== 'agreed'
              "
              v-if="caseItem.isTransport == '2' && !hasTransport(caseItem)"
              class="transport-btn disabled"
              disabled
            >
              需先同意案例
            </button>
            <!-- 只要有转运单号就可以查看详情 -->
            <!-- 有转运单可查看 -->
            <button
              v-if="
                caseItem.transportOrderNo && caseItem.transportOrderNo !== ''
              "
              v-if="hasTransport(caseItem)"
              class="transport-btn secondary"
              @tap.stop="viewTransportDetail(caseItem)"
            >
              查看转运详情
            </button>
            <button
              v-if="caseItem.transportStatus === 'transporting'"
              class="transport-btn track"
              @tap.stop="trackTransport(caseItem)"
            >
              实时跟踪
              查看转运单
            </button>
          </view>
        </view>
        <!-- 无需转运提示 -->
        <view
          class="transport-section"
          v-else-if="caseItem.reportStatus == '3'"
        >
          <view class="transport-info">
            <text class="transport-note">该案例无需转运</text>
          </view>
        </view>
        <view class="footer">
          <view class="action-info">
            <text class="label">案例状态</text>
@@ -268,25 +233,17 @@
          <view class="actions">
            <button
              class="action-btn"
              v-if="caseItem.status === 'reported'"
              v-if="caseItem.reportStatus != '1'"
              @tap.stop="withdrawCase(caseItem)"
            >
              撤回
            </button>
            <button
              class="action-btn"
              v-if="
                caseItem.status === 'read' ||
                caseItem.status === 'agreed' ||
                caseItem.status === 'rejected'
              "
              @tap.stop="viewDetails(caseItem)"
            >
            <button class="action-btn" @tap.stop="viewDetails(caseItem)">
              查看详情
            </button>
            <button
              class="action-btn secondary"
              v-if="caseItem.status === 'reported'"
              v-if="caseItem.reportStatus != '1'"
              @tap.stop="editCase(caseItem)"
            >
              编辑
@@ -301,7 +258,7 @@
      </view>
      <!-- 空状态 -->
      <view class="empty-state" v-if="!loading && filteredCases.length === 0">
      <view class="empty-state" v-if="!loading && filteredCases.length == 0">
        <image src="/static/empty/no-case.png" mode="aspectFit" />
        <text>暂无器官捐献案例记录</text>
      </view>
@@ -357,14 +314,201 @@
// 撤回确认弹窗相关
const showWithdrawModal = ref(false);
const currentCase = ref({});
// 数据映射函数 - 修改以匹配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"];
  // 转运状态映射
  const getTransportStatusClass = (caseData) => {
    if (!hasTransport(caseData)) {
      return "not-transported";
    }
    const status = getTransportStatus(caseData);
    const map = {
      1: "pending",
      2: "transporting",
      3: "completed",
      4: "cancelled",
      5: "draft",
    };
    return map[status] || "pending";
  };
  return {
    id: apiData.id || apiData.donatebaseinfoReportId,
    donorNo: apiData.caseNo,
    hospitalName: apiData.treatmenthospitalname,
    hospitalLogo: "/static/hospital/default.jpg",
    caseType: "器官捐献案例",
    donorName: apiData.name,
    idCardNo: apiData.idcardno,
    gender:
      dict.value.sys_user_sex?.find((item) => item.dictValue == apiData.sex)
        ?.dictLabel || apiData.sex,
    age: apiData.age,
    ageunit: apiData.ageunit,
    bloodType:
      dict.value.sys_BloodType?.find(
        (item) => item.dictValue == apiData.bloodType,
      )?.dictLabel || apiData.bloodType,
    diagnosis: apiData.diagnosisname,
    illnessoverview: apiData.illnessoverview,
    patientstate: apiData.patientstate,
    gcsScore: apiData.gcsScore,
    infectious: apiData.infectious,
    infectiousOther: apiData.infectiousOther,
    isTransport: apiData.isTransport,
    // 新增PC端字段
    education: apiData.education,
    occupation: apiData.occupation,
    nativeplace: apiData.nativeplace,
    nation: apiData.nation,
    nationality: apiData.nationality,
    birthday: apiData.birthday,
    idcardtype: apiData.idcardtype,
    phone: apiData.phone,
    // 医院信息
    departmentName: apiData.treatmentdeptname,
    contactPerson: apiData.coordinatorName || apiData.infoName,
    contactPhone: apiData.coordinatorNo || apiData.phone,
    // 上报信息
    reportTime: apiData.reporttime,
    reporterName: apiData.reportername || apiData.infoName,
    reviewTime: apiData.approvetime,
    reviewerName: apiData.approvername,
    // 状态和转运
    ...statusInfo,
    // 转运信息
    serviceTransport: apiData.serviceTransport || [],
    // 其他字段
    remark: apiData.remark,
  };
};
// 转运判断方法 - 与PC端保持一致
const hasTransport = (caseData) => {
  console.log(caseData.serviceTransport);
  return caseData.serviceTransport;
};
const canCreateTransport = (caseData) => {
  return (
    caseData.status == "3" && // 已同意
    (caseData.isTransport == "2" || caseData.isTransport == 2) && // 需要转运
    !hasTransport(caseData)
  ); // 无转运单
};
const getTransportOrderNo = (caseData) => {
  if (hasTransport(caseData)) {
    const transport = caseData.serviceTransport[0];
    return transport.reportId || transport.id || "";
  }
  return "";
};
const getTransportStartTime = (caseData) => {
  if (hasTransport(caseData)) {
    return caseData.serviceTransport[0].transportStartTime;
  }
  return "";
};
const getTransportPlace = (caseData) => {
  if (hasTransport(caseData)) {
    return caseData.serviceTransport[0].transportStartPlace;
  }
  return "";
};
const getCoordinator = (caseData) => {
  if (hasTransport(caseData)) {
    return caseData.serviceTransport[0].contactPerson;
  }
  return "";
};
const getTransportStatus = (caseData) => {
  if (hasTransport(caseData)) {
    return caseData.serviceTransport[0].transitStatus;
  }
  return null;
};
const getTransportStatusText = (caseData) => {
  if (!hasTransport(caseData)) {
    return "需转运";
  }
  const status = getTransportStatus(caseData);
  const map = {
    1: "待转运",
    2: "转运中",
    3: "已完成",
    4: "已取消",
    5: "暂存",
  };
  return map[status] || "未知";
};
// 转运状态样式
const getTransportStatusClass = (caseData) => {
  if (!hasTransport(caseData)) {
    return "not-transported";
  }
  const status = getTransportStatus(caseData);
  const map = {
    1: "pending",
    2: "transporting",
    3: "completed",
    4: "cancelled",
    5: "draft",
  };
  return map[status] || "pending";
};
// 修复编辑按钮跳转
const editCase = (caseItem) => {
  uni.navigateTo({
    url: `/pages/case/CaseDetails?id=${caseItem.id}&edit=true`,
  });
};
// 修复查看详情按钮跳转
const viewDetails = (caseItem) => {
  uni.navigateTo({
    url: `/pages/case/CaseInfo?id=${caseItem.id}`,
  });
};
// 原有的转运操作方法保持不变
const createTransportOrder = (caseItem) => {
  uni.navigateTo({
    url: `/pages/transport/create?caseId=${caseItem.id}&caseNo=${caseItem.donorNo}`,
  });
};
const viewTransportDetail = (caseItem) => {
  if (hasTransport(caseItem)) {
    const transport = caseItem.serviceTransport[0];
    uni.navigateTo({
      url: `/pages/transport/detail?orderNo=${transport.id}`,
    });
  }
};
// 筛选相关
const caseTypes = [
  { label: "全部", value: "all" },
  { label: "已上报", value: "reported" },
  { label: "已阅读", value: "read" },
  { label: "已同意", value: "agreed" },
  { label: "已驳回", value: "rejected" },
  { label: "全部", value: "" },
  { label: "已上报", value: "1" },
  { label: "已阅读", value: "2" },
  { label: "已同意", value: "3" },
  { label: "已驳回", value: "4" },
];
const currentType = ref("all");
const startDate = ref("");
@@ -381,97 +525,6 @@
  completed: { text: "已完成", color: "success", class: "completed" },
};
// 数据映射函数
// 数据映射函数
const mapApiDataToCaseItem = (apiData) => {
  const statusMap = {
    1: { status: "reported", statusText: "已上报" },
    2: { status: "read", statusText: "已阅读" },
    3: { status: "agreed", statusText: "已同意" },
    4: { status: "rejected", statusText: "已驳回" },
  };
  const transportStatusMap = {
    1: "not_transported",
    2: "transporting",
    3: "completed",
    4: "not_transported",
    5: "not_transported",
  };
  const statusInfo = statusMap[apiData.reportStatus] || statusMap["1"];
  // 处理转运信息 - 更加健壮的处理
  let transportDetails = null;
  let transportStatus = "not_transported";
  let transportOrderNo = "";
  let transportTime = "";
  // 优先从 serviceTransport 获取转运信息
  if (
    apiData.serviceTransport &&
    Array.isArray(apiData.serviceTransport) &&
    apiData.serviceTransport.length > 0
  ) {
    const transport = apiData.serviceTransport[0];
    transportDetails = {
      driver: transport.driver || "",
      vehicle: transport.vehicle || "",
      phone: transport.driverPhone || "",
      currentLocation: transport.transportStartPlace || "",
      estimatedTime: transport.estimatedTime || "",
      completedTime: transport.completedTime || "",
    };
    transportStatus =
      transportStatusMap[transport.transitStatus] || "not_transported";
    transportOrderNo = transport.id || "";
    transportTime = transport.transportStartTime || "";
  }
  // 如果直接有转运信息,也进行处理
  if (apiData.transportOrderNo) {
    transportOrderNo = apiData.transportOrderNo;
  }
  if (apiData.transportStartTime) {
    transportTime = apiData.transportStartTime;
  }
  if (apiData.transitStatus) {
    transportStatus =
      transportStatusMap[apiData.transitStatus] || "not_transported";
  }
  return {
    id: apiData.id || apiData.donatebaseinfoReportId,
    donorNo: apiData.caseNo,
    hospitalName: apiData.treatmenthospitalname,
    hospitalLogo: "/static/hospital/default.jpg",
    caseType: "器官捐献案例",
    donorName: apiData.name,
    idCardNo: apiData.idcardno,
    gender:
      dict.value.sys_user_sex?.find((item) => item.dictValue === apiData.sex)
        ?.dictLabel || apiData.sex,
    age: apiData.age,
    bloodType:
      dict.value.sys_BloodType?.find(
        (item) => item.dictValue === apiData.bloodType
      )?.dictLabel || apiData.bloodType,
    diagnosis: apiData.diagnosisname,
    reportTime: apiData.reporttime,
    reporterName: apiData.reportername,
    reviewTime: apiData.reviewTime,
    reviewerName: apiData.reviewerName,
    departmentName: apiData.treatmentdeptname,
    contactPerson: apiData.userName || apiData.contactPerson,
    contactPhone: apiData.phone,
    ...statusInfo,
    transportStatus: transportStatus,
    transportOrderNo: transportOrderNo,
    transportTime: transportTime,
    transportDetails: transportDetails,
  };
};
// 生命周期
onLoad(async (options) => {
  // 获取字典数据
@@ -479,7 +532,7 @@
    "sys_IDType",
    "sys_user_sex",
    "sys_BloodType",
    "sys_DiseaseType"
    "sys_DiseaseType",
  );
  // 加载数据
@@ -516,13 +569,13 @@
    const res = await uni.$uapi.post(
      "/project/donatebaseinforeport/list",
      params
      params,
    );
    console.log(res, "res");
    const mappedData = res.map((item) => mapApiDataToCaseItem(item));
    if (pageNum.value === 1) {
    if (pageNum.value == 1) {
      cases.value = mappedData;
    } else {
      cases.value = [...cases.value, ...mappedData];
@@ -558,7 +611,9 @@
  let result = cases.value;
  if (currentType.value !== "all") {
    result = result.filter((caseItem) => caseItem.status === currentType.value);
    result = result.filter(
      (caseItem) => caseItem.reportStatus == currentType.value,
    );
  }
  if (startDate.value && endDate.value) {
@@ -600,19 +655,6 @@
  await donatebaseinforeportList();
};
// 其他功能函数(保持原有逻辑)
const createTransportOrder = (caseItem) => {
  uni.navigateTo({
    url: `/pages/case/transferinfo?caseId=${caseItem.id}&donorNo=${caseItem.donorNo}`,
  });
};
const viewTransportDetail = (caseItem) => {
  uni.navigateTo({
    url: `/pages/transport/detail?orderNo=${caseItem.transportOrderNo}`,
  });
};
const trackTransport = (caseItem) => {
  uni.navigateTo({
    url: `/pages/transport/track?orderNo=${caseItem.transportOrderNo}`,
@@ -620,9 +662,7 @@
};
const updateTransportStatus = (orderNo, newStatus) => {
  const caseItem = cases.value.find(
    (item) => item.transportOrderNo === orderNo
  );
  const caseItem = cases.value.find((item) => item.transportOrderNo == orderNo);
  if (caseItem) {
    caseItem.transportStatus = newStatus;
  }
@@ -641,7 +681,7 @@
const confirmWithdraw = () => {
  const index = cases.value.findIndex(
    (item) => item.id === currentCase.value.id
    (item) => item.id == currentCase.value.id,
  );
  if (index !== -1) {
    cases.value.splice(index, 1);
@@ -656,18 +696,6 @@
const cancelWithdraw = () => {
  showWithdrawModal.value = false;
};
const viewDetails = (caseItem) => {
  uni.navigateTo({
    url: `/pages/case/detail?id=${caseItem.id}`,
  });
};
const editCase = (caseItem) => {
  uni.navigateTo({
    url: `/pages/case/edit?id=${caseItem.id}`,
  });
};
</script>