|                                                                                                                                                                                                                                      |  | <template>  <view>    <view class="card">      <view class="flex card-header" style="justify-content: space-between;">        <view>订单详情</view>        <view :class="['tag', `tag-${data.status}`]">          {{ statusDesc }}        </view>      </view>      <view class="flex member" v-for="item in members" :key="item.id">        <view class="info">          <view class="flex info-top">            <view>{{ item.name }}</view>            <view>{{ getTypeDesc(item.type) }}</view>            <view class="light">{{ getTypeTips(item.type) }}</view>          </view>          <view class="info-bottom">{{ item.idNo }}</view>        </view>        <view class="flex price">¥<view class="highlight">{{ item.price }}</view></view>      </view>      <view class="row">        <view class="row-label">总价格</view>        <view class="row-content">          <view class="flex total-price">            <view>¥</view>            <view class="highlight">{{ totalPrice }}</view>            <view class="light" v-if="data.discount">              {{ `优惠(${data.discount})` }}            </view>          </view>        </view>      </view>    </view>    <view class="card">      <view class="card-header">联系人信息</view>      <view class="row">        <view class="row-label">真实姓名</view>        <view class="row-content">{{ data.name }}</view>      </view>      <view class="row">        <view class="row-label">手机号码</view>        <view class="row-content">{{ data.phone }}</view>      </view>    </view>    <view class="card order">      <view class="card-header">订单信息</view>      <view class="row">        <view class="row-label">订单编号</view>        <view class="row-content">{{ data.orderNo }}</view>      </view>      <view class="row">        <view class="row-label">下单时间</view>        <view class="row-content">{{ data.createTime }}</view>      </view>    </view>  </view></template>
<script>
  const ORDER_STATUS_AND_DESC_MAPPING = {    0: '待支付',    1: '已支付',    2: '已完成',  }  const MEMBER_TYPE_AND_DESC_MAPPING = {    0: '成人',    1: '青少年',    2: '儿童',  }  const MEMBER_TYPE_AND_TIPS_MAPPING = {    0: '(18周岁以上)',    1: '(14周岁以上)',    2: '(14周岁以下)',  }
  export default {    props: {      data: {        type: Object,        default() {          return {}        }      },    },    computed: {      statusDesc() {        const { status } = this.data        return ORDER_STATUS_AND_DESC_MAPPING[status]      },      productPackage() {        const { time, product } = this.data        const { timeOptions } = product || {}
        return timeOptions?.find?.(item => item.id === time) || {}      },			totalPrice() {        const { adults, teenager, child } = this.data
        const { adultsPrice, teenagerPrice, childPrice } = this.productPackage
        let total = 0                adults && (total += adults * (adultsPrice || 0))        teenager && (total += teenager * (teenagerPrice || 0))        child && (total += child * (childPrice || 0))
				return total			},      members() {        const { members } = this.data        const { adultsPrice, teenagerPrice, childPrice } = this.productPackage
        return members?.map?.(item => {          const { type } = item
          let price = 0                    switch(type) {            case 0: // 成年
              price =  adultsPrice              break            case 1: // 青少年
              price =  teenagerPrice              break            case 2: // 儿童
              price =  childPrice              break          }
          return { ...item, price }        })      },    },    methods: {      getTypeDesc(type) {        return MEMBER_TYPE_AND_DESC_MAPPING[type]      },      getTypeTips(type) {        return MEMBER_TYPE_AND_TIPS_MAPPING[type]      },    },  }</script>
<style scoped lang="scss">
  @import '../styles/style.scss';    @import '../styles/tag.scss';
  .member {    margin-top: 16rpx;    justify-content: space-between;    padding: 24rpx;    background: #F9F9F9;    border-radius: 24rpx;
    .info {      &-top {        justify-content: space-between;        column-gap: 24rpx;        font-size: 32rpx;        color: #181818;
        .light {          font-size: 24rpx;          color: #8B8B8B;        }      }
      &-bottom {        font-size: 28rpx;        color: #9B9B9B;      }    }
    .price {      column-gap: 4rpx;      font-size: 24rpx;      font-weight: 500;      color: #FF4800;
      .highlight {        font-size: 32rpx;      }    }
  }
  .row {    margin-top: 16rpx;    display: flex;    align-items: center;    justify-content: space-between;
    &-label {      font-size: 26rpx;      color: #8B8B8B;    }
    &-content {      font-size: 28rpx;      color: #393939;    }  }
  .order {    .row {      margin-top: 32rpx;    }  }
  .total-price {    column-gap: 8rpx;    font-size: 24rpx;    font-weight: 500;    color: #FF4800;
    .highlight {      font-size: 32rpx;    }
    .light {      font-size: 22rpx;      font-weight: 400;    }  }
</style>
 |