Files
2024-02-22 18:37:23 +08:00

418 lines
9.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view
:class="['order']"
v-if="data"
>
<view
class="order-header"
@tap="toOrderInfo"
>
<view class="order-logo">
<view class="color-y">Y</view>
<view>SHOP商城</view>
</view>
<view
class="order-status status-2"
v-if="data._status"
>
{{ data._status._type === '8' && data.shippingType === 2 ? "待核销" : data._status._title }}
</view>
</view>
<view
class="order-goods"
@tap="toOrderInfo"
>
<view
v-for="(item, index) in data.cartInfo"
:key="index"
class="order-evaluate"
:class="{evaluateBtn: data._status._type == 3}"
>
<Goods
row
:jump="false"
imgWidth="200rpx"
info-padding="10rpx 40rpx"
:goods="item.productInfo"
>
<template #options>
<view
class="goods-options">
<!-- sku select -->
<view class="sku-row flex">
<view
class="sku-info flex flex-jc__sb flex-ai__center"
>
<view class="info">
{{
item.productInfo && item.productInfo.attrInfo && item.productInfo.attrInfo.sku
}}
</view>
<view>
</view>
</view>
</view>
<!-- 售后 -->
<!-- bottom -->
<view class="price-row flex flex-ai__center flex-jc__sb">
<!-- price -->
<view class="price-box flex flex-ai__center">
{{ item.truePrice }}
</view>
<!-- -->
<view class="flex flex-ai__center">
<view
class="after-sale-box"
v-if="item.orderDetailState!==1"
>
<span v-if="item.orderDetailState===2"> 售后中 </span>
<span v-if="item.orderDetailState===3"> 售后完成 </span>
</view>
<view class="price-box cart-num flex flex-ai__center">
<view
v-if="data._status._type == 3 && item.isReply === 0"
class="order-actions-primary order-evaluate-btn"
@tap.stop="toEvaluate(item.unique,data.orderId)"
>
去评价
</view>
x{{ item.cartNum }}
</view>
</view>
</view>
</view>
</template>
</Goods>
</view>
</view>
<view
class="order-info"
@tap="toOrderInfo"
>
<view class="text">总价¥{{ data.cost }}</view>
<view class="text">总优惠¥{{ couponPrice }}</view>
<view class="text">运费¥{{ totalPostage }}</view>
<view class="text flex flex-ai__center">总计
<view class="total-price">¥{{ totalPrice }}</view>
</view>
</view>
<view v-if="data._status">
<view
class="order-actions"
>
<!-- 未支付 -->
<view class="order-actions-left">
</view>
<view class="order-actions-btns">
<view
v-if="data._status._type === '0'"
class="order-actions-default"
@tap="showModal(1)"
>
取消订单
</view>
<view
v-if="data._status._type === '0'"
class="order-actions-primary"
@tap="handlePay"
>
立即付款
</view>
<view
v-if="(data.shippingType ===1&&['1','2','3','4','8','6'].includes(data._status._type))||data.shippingType ===2&&['6'].includes(data._status._type)"
class="order-actions-default"
@tap="toSelectRefundGood(data.id)"
>
申请退款
</view>
<view
v-if="(data.shippingType ===2 && ['8'].includes(data._status._type))"
class="order-actions-default"
@tap="showModal(3)"
>
取消订单
</view>
<!-- _type: 2待收货 3已收货 4已完成 8代发货 6待成团 7已成团 -->
<view
v-if="data._status._type==='8' && data.shippingType === 2"
class="order-actions-primary"
@tap="emit('checkOffCode',data.writeOffCode)"
>
核销码
</view>
<view
class="order-actions-default"
v-if="data._status._type === '2'"
@tap="toOrderInfo"
>
查看物流
</view>
<view
v-if="data._status._type === '2'"
class="order-actions-primary"
@tap="showModal(2)"
>
确认收货
</view>
<view
v-if="['4','5','-2'].includes(data._status._type)"
class="order-actions-default"
@tap="showModal(0)"
>
删除订单
</view>
<view
v-if="data._status._type === '6'"
class="order-actions-primary"
@tap="goGroupByDetail({teamworkId:data.teamworkId})"
>
邀请好友拼团
</view>
</view>
</view>
</view>
<Modal
ref="modalRef"
:content="modalTitle"
@confirm="confirmModal" />
</view>
</template>
<script setup>
import { ref } from 'vue';
import { cancelAfterVerification, orderTake } from '@/api/order'
import Modal from "@/components/Modal/index.vue"
import { useRouter } from "@/hooks/useRouter";
import { useInterface } from "@/hooks/useInterface";
import { useOrder } from "@/hooks/useOrder";
import { useJump } from "@/hooks/useJump";
import Goods from "@/components/goodsComponents/Goods.vue";
const {
modalRef,
modalType,
modalTitle,
showModal,
cancelOrder,
deleteOrder,
toEvaluate,
toSelectRefundGood,
showWsReceipt,
} = useOrder()
const {push} = useRouter()
const {goGroupByDetail} = useJump()
const {toast} = useInterface()
const emit = defineEmits(['refresh', 'pay', 'checkOffCode'])
const props = defineProps(['class', 'data'])
const data = ref(props.data)
// 运费金额
const totalPostage = ref(props.data.totalPostage)
// 实际支付金额
const payPrice = ref(props.data.payPrice)
// 优惠券金额
const couponPrice = ref(props.data.totalCouponPrice)
// 订单总价
const totalPrice = ref(props.data.totalPrice)
/**
* 确认取消订单
* @returns {Promise<void>}
*/
async function doCancelOrder() {
cancelOrder(data.value).then(() => {
emit('refresh')
})
}
/**
* 确认删除订单
* @returns {Promise<void>}
*/
async function doDeleteOrder() {
deleteOrder(data.value).then(() => {
emit('refresh')
})
}
/**
* 确认收货
* @returns {Promise<void>}
*/
async function doTakeGoods() {
let option = {
uni: data.value.orderId,
}
try {
let payInfo = JSON.parse(data.value.payInfo)
const res = await showWsReceipt(payInfo.transaction_id)
if (res !== 'success') return
await orderTake(option)
emit('refresh')
toast({title: '已收货'});
} catch (e) {
console.error(e)
toast({title: '收货失败', icon: 'error'});
}
}
const doCancelAnOrder = async () => {
await cancelAfterVerification({id: data.value.orderId})
toast({title: '取消成功'})
emit('refresh')
}
/**
* 确认弹窗
*/
function confirmModal() {
const funcArr = [doDeleteOrder, doCancelOrder, doTakeGoods, doCancelAnOrder]
funcArr[modalType.value]()
}
function handlePay() {
emit('pay', data.value.orderId)
}
function toOrderInfo() {
push({url: '/pages/orderInfo/orderInfo'}, {
data: {
key: data.value.unique,
orderId: data.value.orderId,
}
})
}
</script>
<style
lang="scss"
scoped>
.order-header {
width: 100%;
box-sizing: border-box;
.order-logo, .order-status {
flex-shrink: 0;
}
.order-logo {
white-space: nowrap;
}
.order-status {
max-width: 80%;
text-align: right;
white-space: pre-wrap;
font-size: 22rpx;
}
}
// 商品SKU 数量等操作条
.goods-options {
width: 100%;
.sku-row {
margin-bottom: 30rpx;
.sku-info {
@include usePadding(10, 4);
border: 1rpx solid #ccc;
border-radius: 5rpx;
font-size: 24rpx;
transition: all .3s;
max-width: 100%;
.info {
width: 100%;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
&:active {
scale: 1.1;
}
.icon {
margin-left: 15rpx;
}
}
}
.price-row {
width: 100%;
.price-box {
font-size: 30rpx;
color: $primary-color;
.old-price {
font-size: 20rpx;
color: $tips-color;
text-decoration: line-through;
margin-left: 10rpx;
}
}
.after-sale-box {
font-size: 22rpx;
margin-right: 5rpx;
color: $tips-color;
}
.cart-num {
font-size: 24rpx;
.input {
width: 120rpx;
input {
width: 100%;
text-align: center;
color: #333;
}
}
.button {
font-size: 32rpx;
width: 34rpx;
aspect-ratio: 1/1;
border-radius: 5rpx;
border: 2rpx solid #cccccc;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
transition: all .3s;
&:active {
scale: 1.2;
}
}
}
}
}
</style>