330 lines
9.3 KiB
Vue
330 lines
9.3 KiB
Vue
<!-- 订单详情 -->
|
|
<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>
|