order-detail.vue 5.87 KB
<template>
  <view class="u-page">
    <!-- 页面级加载组件 -->
    <up-loading-page
        v-if="loading"
        :loading="true"
        title="加载中..."
        color="#3c9cff"
    ></up-loading-page>

    <!-- 内容容器 -->
    <view v-else class="content-wrap">
      <!-- 空状态 -->
      <view v-if="!Object.keys(orderDetail).length" class="empty-wrap">
        <text class="empty-icon">📄</text>
        <text class="empty-text">暂无工单详情</text>
        <text class="empty-subtext">请检查工单ID是否正确</text>
      </view>

      <!-- 工单详情内容 -->
      <up-cell-group :border="false" inset style="margin: 20rpx;" v-else>
        <!-- 1. 工单编号 -->
        <up-cell
            title="工单编号"
            :value="orderDetail.orderNo || '--'"
            class="up-line-1"
            align="middle"
        ></up-cell>

        <!-- 2. 工单位置 -->
        <up-cell
            title="工单位置"
            :value="orderDetail.roadName || '--'"
            class="up-line-1"
            align="middle"
        ></up-cell>

        <!-- 3. 工单名称 -->
        <up-cell
            title="工单名称"
            :value="orderDetail.orderName || '--'"
            class="up-line-1"
            align="middle"
        ></up-cell>

        <!-- 4. 情况描述 -->
        <up-cell
            title="情况描述"
            :value="orderDetail.remark || '--'"
            class="up-line-1"
            align="middle"
        ></up-cell>

        <!-- 5. 问题照片(核心修复:判断条件+空值处理) -->
        <up-cell title="问题照片" >
          <template #value>
          <view class="cell-content-wrap">

            <!-- 修复1:正确判断problemImgsList,补充空数组默认值 -->
            <up-album
                v-if="!!orderDetail.problemImgsList?.length"
                :urls="orderDetail.problemImgsList || []"
                singleSize="70"
                :preview-full-image="true"

            ></up-album>
            <text v-else class="empty-text">暂无问题照片</text>
          </view>
          </template>
        </up-cell>

        <!-- 6. 完成照片(优化:空值处理+容错) -->
        <up-cell title="完成照片" align="top">
          <template #value>
          <view class="cell-content-wrap">
            <up-album
                v-if="!!orderDetail.completeImgsList?.length"
                :urls="orderDetail.completeImgsList || []"
                singleSize="70"
                :preview-full-image="true"

            ></up-album>
            <text v-else class="empty-text">暂无完成照片</text>
          </view>
          </template>
        </up-cell>

        <!-- 7. 处理结果 -->
        <up-cell
            title="处理结果"
            :value="orderDetail.handleResult || '--'"
            class="up-line-1"
            align="middle"
            :border="false"
        ></up-cell>
      </up-cell-group>
    </view>
  </view>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue';
import { inspectionPlanDetail } from "@/api/quick-order/quick-order";
import { onLoad, onShow } from '@dcloudio/uni-app';

// 状态管理
const loading = ref(true);
const orderDetail = ref({});


/**
 * 获取工单详情
 */
const getOrderDetail = async (id: string) => {
  try {
    loading.value = true;
    const res = await inspectionPlanDetail({ id });
    console.log('接口返回:', res);
    // 优化:确保图片数组为数组类型,避免非数组导致渲染错误
    orderDetail.value = {
      ...res,
      problemImgsList: Array.isArray(res.problemImgsList) ? res.problemImgsList : [],
      completeImgsList: Array.isArray(res.completeImgsList) ? res.completeImgsList : []
    };
  } catch (error) {
    console.error('获取工单详情失败:', error);
    uni.showToast({ title: '加载失败,请重试', icon: 'none' });
  } finally {
    loading.value = false;
  }
};

// 页面加载
onLoad((options) => {
  const { id } = options;
  if (id) {
    getOrderDetail(id);
  } else {
    loading.value = false;
    uni.showToast({ title: '缺少工单ID', icon: 'none' });
  }
});
</script>

<style scoped lang="scss">
// 页面基础样式
.u-page {
  min-height: 100vh;
  background-color: #f5f5f5;
  box-sizing: border-box;
}

// 内容容器
.content-wrap {
  background: #fff;
  width: 100%;
  box-sizing: border-box;
  overflow-y: auto;
  min-height: calc(100vh - 40rpx);
}



// 空文本样式
.empty-text {
  color: #999;
  font-size: 28rpx;
  line-height: 80rpx;
  display: block;
  text-align: left;
}

// 优化uview组件样式
:deep(.up-cell-group) {
  --u-cell-group-background-color: #fff;
  --u-cell-group-border-radius: 12rpx;
  --u-cell-group-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
}

:deep(.up-cell) {
  --u-cell-title-font-size: 28rpx;
  --u-cell-value-font-size: 28rpx;
  --u-cell-title-color: #666;
  --u-cell-value-color: #333;
  --u-cell-padding: 20rpx 15rpx;
  --u-cell-border-color: #f5f5f5;
}

// 相册样式优化(关键:适配图片展示)
:deep(.up-album) {
  width: 100%;
  box-sizing: border-box;
}

:deep(.up-album__list) {
  display: flex;
  flex-wrap: wrap;
  padding: 0;
  margin: 0;
}

:deep(.up-album__item) {
  width: calc(33.333% - 10rpx);
  height: 200rpx; // 固定图片高度,避免变形
  margin: 5rpx;
  border-radius: 8rpx;
  overflow: hidden;
  background-color: #f8f8f8;
}

:deep(.up-album__image) {
  width: 100%;
  height: 100%;
  object-fit: cover; // 图片裁剪填充,避免拉伸
}

// 原生空状态样式
.empty-wrap {
  margin-top: 200rpx;
  text-align: center;
}

.empty-icon {
  font-size: 80rpx;
  display: block;
  margin-bottom: 20rpx;
  color: #ddd;
}

.empty-text {
  font-size: 28rpx;
  color: #999;
  display: block;
}

.empty-subtext {
  font-size: 24rpx;
  color: #ccc;
  margin-top: 10rpx;
  display: block;
}

// 加载组件样式
:deep(.up-loading-page) {
  margin-top: 100rpx;
}
</style>