| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 | <!-- 订单详情 --><template>  <s-layout title="发票详情" class="invoice-wrap" navbar="inner">    <view      class="invoice-heard ss-flex-col ss-row-right ss-col-center"      :style="[        {          marginTop: '-' + Number(statusBarHeight + 88) + 'rpx',          paddingTop: Number(statusBarHeight + 88) + 'rpx',        },      ]"    >      <view class="ss-flex ss-m-t-32 ss-m-b-32">        <text          class="sicon-warning-line"          v-if="state.data.status === 'waiting' || state.data.status === 'unpaid'"        ></text>        <text class="sicon-check-line" v-if="state.data.status === 'finish'"></text>        <view class="invoice-heard-title">{{ state.data.status_text }}</view>      </view>      <view class="ss-flex ss-m-b-52">        <view class="ss-m-r-20 invoice-heard-desc">预计可开发票金额:</view>        <view class="invoice-heard-price">¥{{ state.data.amount }}</view>      </view>    </view>    <view class="invoice-content ss-flex-col ss-col-center">      <view class="ss-m-t-50 ss-m-b-42 invoice-content-title">增值税电子普通发票</view>      <view class="ss-flex ss-m-b-64">        <view v-for="(item, index) in state.info" :key="item.title">          <view class="log-icon ss-flex">            <text class="sicon-circlecheck" v-if="statusNum >= index"></text>            <text class="sicon-unchecked" v-else></text>            <view              v-if="state.info.length - 1 != index"              class="line"              :class="statusNum >= index ? 'activity-color' : ''"            ></view>          </view>          <view class="log-title">{{ item.title }}</view>        </view>      </view>      <view class="invoice-content-list ss-flex ss-row-between ss-col-top">        <view class="">          <view class="ss-flex">            <view class="list-title">发票类型</view>            <view class="list-desc">{{ state.data.type_text }}</view>          </view>          <view class="ss-flex">            <view class="list-title">发票抬头</view>            <view class="list-desc">{{ state.data.name }}</view>          </view>          <view class="ss-flex" v-if="state.data.type === 'company'">            <view class="list-title">发票税号</view>            <view class="list-desc">{{ state.data.tax_no }}</view>          </view>          <view class="ss-flex" v-if="state.data.status === 'finish'">            <view class="list-title">实开金额</view>            <view class="list-desc">¥{{ state.data.invoice_amount }}</view>          </view>          <view class="ss-flex" v-if="state.data.status === 'finish'">            <view class="list-title">开票时间</view>            <view class="list-desc">{{ state.data.finish_time }}</view>          </view>          <view class="ss-flex">            <view class="list-title">申请时间</view>            <view class="list-desc">{{ state.data.create_time }}</view>          </view>        </view>        <view          class="invoice-content-img ss-flex-col ss-col-center"          v-if="state.data.status === 'finish'"        >          <su-image            class="invoice-img"            isPreview            :previewList="state.jointImage"            :current="0"            :src="sheep.$url.static('/static/img/shop/order/invoice_thumb.png')"            :height="110"            mode="scaleToFill"            v-if="state.jointImage[0].substr(-4) != '.pdf'"          ></su-image>          <!-- TODO: 发票为多个pdf时 -->          <view v-if="state.jointImage[0].substr(-4) == '.pdf'" @tap="onInvoice">            <image              :src="sheep.$url.static('/static/img/shop/order/invoice_thumb.png')"              class="invoice-img"            ></image>          </view>          <view class="invoice-img-num">共{{ state.numImage }}张</view>          <view class="invoice-img-title">点击预览发票</view>        </view>      </view>    </view>    <view class="invoice-order ss-m-t-20">      <view class="goods-box" v-for="item in state.data.order_items" :key="item.id">        <s-goods-item          :img="item.goods_image"          :title="item.goods_title"          :skuText="item.goods_sku_text"          :price="item.goods_price"          :num="item.goods_num"        />      </view>      <view class="invoice-order-list">        <view class="ss-flex">          <view class="list-title">订单状态</view>          <view class="list-desc">{{ state.data.order?.status_text }}</view>        </view>        <view class="ss-flex">          <view class="list-title">订单编号</view>          <view class="list-desc">{{ state.data.order?.order_sn }}</view>        </view>        <view class="ss-flex">          <view class="list-title">下单时间</view>          <view class="list-desc">{{ state.data.order?.create_time }}</view>        </view>      </view>    </view>  </s-layout></template><script setup>  import sheep from '@/sheep';  import { onLoad } from '@dcloudio/uni-app';  import { computed, reactive } from 'vue';  const statusBarHeight = sheep.$platform.device.statusBarHeight * 2;  const headerBg = sheep.$url.css('/static/img/shop/order/invoice_bg.png');  const state = reactive({    info: [      {        title: '订单提交',      },      {        title: '等待开票',      },      {        title: '开票完成',      },    ],    data: {},    jointImage: [],    numImage: 0,  });  const statusNum = computed(() => {    if (state.data.status === 'finish') {      return 2;    } else if (state.data.status === 'waiting') {      return 1;    } else {      return 0;    }  });  function onInvoice() {    // #ifdef H5    window.open(state.jointImage);    // #endif    // #ifdef MP || APP-PLUS    uni.downloadFile({      url: state.jointImage[0],      success: function (res) {        var filePath = res.tempFilePath;        uni.openDocument({          filePath: filePath,          showMenu: true,          success: function (res) {            console.log('打开文档成功');          },        });      },    });    // #endif  }  async function getInvoiceDetail(id) {    const { data } = await sheep.$api.order.invoice(id);    state.data = data;    state.data.download_urls?.forEach((i, index) => {      state.numImage = index + 1;      if (i.substr(-4) != '.pdf') {        state.jointImage.push(sheep.$url.static(i));      } else {        state.jointImage.push(sheep.$url.static(i));      }    });  }  onLoad((options) => {    getInvoiceDetail(options.invoiceId);  });</script><style lang="scss" scoped>  .invoice-heard {    width: 100%;    box-sizing: border-box;    background: v-bind(headerBg) no-repeat,      linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));    background-size: 750rpx 100%;    .sicon-warning-line {      color: #fff;      font-size: 34rpx;    }    .sicon-check-line {      color: #fff;      font-size: 34rpx;    }    .invoice-heard-title {      font-size: 34rpx;      font-weight: 500;      color: #ffffff;      margin-left: 8rpx;      line-height: normal;    }    .invoice-heard-desc {      font-size: 24rpx;      font-weight: 500;      color: #ffffff;    }    .invoice-heard-price {      font-size: 28rpx;      font-family: OPPOSANS;      font-weight: 500;      color: #ffffff;    }  }  .invoice-content {    width: 100%;    position: relative;    z-index: 3;    background: #ffffff;    border-radius: 20rpx;    margin-top: -16rpx;    .invoice-content-title {      font-size: 30rpx;      font-weight: 500;      color: #333333;    }    .log-icon {      .sicon-unchecked {        color: #c2bec2;        font-size: 44rpx;      }      .sicon-circlecheck {        color: #e60a00;        font-size: 44rpx;      }      .line {        width: 158rpx;        height: 6rpx;        background: #f2f2f2;        border: 2rpx solid #ffffff;      }      .activity-color {        background: #e60a00;      }    }    .log-title {      font-size: 26rpx;      font-weight: 500;      color: #333333;      margin-left: -26rpx;      margin-top: 30rpx;    }    .invoice-content-list {      width: 100%;      padding: 0 46rpx 0 30rpx;      box-sizing: border-box;    }    .list-title {      font-size: 26rpx;      font-weight: 500;      color: #999999;      margin-right: 44rpx;      margin-bottom: 36rpx;    }    .list-desc {      font-size: 26rpx;      font-weight: 500;      color: #333333;      margin-bottom: 36rpx;    }    .invoice-img {      width: 200rpx;      height: 110rpx;    }    .invoice-img-num {      width: 216rpx;      height: 40rpx;      background: rgba(#000000, 0.45);      font-size: 24rpx;      font-weight: 500;      color: #ffffff;      text-align: center;      margin-top: -30rpx;      z-index: 1;    }    .invoice-img-title {      font-size: 24rpx;      font-weight: 500;      color: #999999;    }  }  .invoice-order {    width: 100%;    padding-top: 30rpx;    box-sizing: border-box;    background: #fff;    border-radius: 20rpx;  }  .goods-box {    border-bottom: 2rpx solid #dfdfdf;  }  .invoice-order-list {    padding: 40rpx 24rpx 0 24rpx;    .list-title {      font-size: 26rpx;      font-weight: 500;      color: #999999;      margin-right: 44rpx;      margin-bottom: 36rpx;    }    .list-desc {      font-size: 26rpx;      font-weight: 500;      color: #333333;      margin-bottom: 36rpx;    }  }</style>
 |