LtyhShop/pc/pages/order/order_logistics.vue
2025-04-09 14:59:26 +08:00

224 lines
7.3 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.

<script setup lang="ts">
import { useCopy } from '~/composables/useCopy'
import { invoiceListApi, orderLogisticsApi } from '~/server/orderApi'
import { merCustomerApi } from '~/server/merchantApi'
import useOrder from '~/composables/useOrder'
import { ProductTypeEnum } from '@/enums/productEnums'
import { ItemObject } from '~/types/global'
//订单号
const route = useRoute()
const orderNo = ref<string>(<string>route.query.orderNo)
const secondType = ref<string>(<string>route.query.secondType) //二级订单类型
//物流列表
const { data: invoiceList } = await useAsyncData(async () => invoiceListApi(orderNo.value))
//包裹切换
const logisticsIdx = ref<number>(0)
const handleChangeTab = async (index: number) => {
logisticsIdx.value = index
refresh()
}
// 物流信息详情
const {
data: logisticsInfo,
refresh,
pending: listLoading,
} = await useAsyncData(async () => orderLogisticsApi(invoiceList.value.invoiceList[logisticsIdx.value].id))
//复制
const { handleCopy } = useCopy()
const handleCopyNum = () => {
handleCopy(invoiceList.value.invoiceList[logisticsIdx.value].trackingNumber)
}
//获取客服配置
const { chatConfig, getPlatChatConfig } = useOrder()
const chatConfigData = reactive<ItemObject>({})
const getChatConfig = async () => {
let data = await merCustomerApi(invoiceList.value.invoiceList[logisticsIdx.value].merId)
Object.assign(chatConfigData, data)
}
if (secondType.value != ProductTypeEnum.Integral) getChatConfig()
//联系客服
const handleChat = async () => {
if (secondType.value == ProductTypeEnum.Integral) {
getPlatChatConfig()
} else {
await chatConfig(chatConfigData)
}
}
</script>
<template>
<div class="wrapper_1200">
<div class="w-100% borRadius bg-#FFF py-30px mbtom20 mt-20px">
<!-- 包裹选择-->
<div class="flex flex-justify-between mb-35px px-30px">
<div class="acea-row">
<div
v-for="(item, index) in invoiceList.invoiceList"
:key="index"
class="text-16px cursors mr-50px"
:class="logisticsIdx === index ? 'font-color' : 'text-#666666'"
@click="handleChangeTab(index)"
>
{{ '包裹' + (index + 1) }}
</div>
</div>
<div
@click="handleChat"
class="w-86px h-30px text-center lh-29px borderSolE9 b-rd-22px text-12px font-color cursors"
>
联系商家
</div>
</div>
<!-- 商品信息 -->
<div class="acea-row items-center" style="margin-right: -30px">
<div
v-for="item in invoiceList.invoiceList[logisticsIdx].detailList"
:key="item.id"
class="acea-row mb-20px goods"
>
<el-image :src="item.image" class="w-108px h-108px b-rd-8px mr-20px"></el-image>
<div class="text-14px text-#333333 acea-row flex-col flex-justify-around">
<div class="fontsweight w-415px line1">{{ item.productName }}</div>
<div class="">规格:{{ item.sku }}</div>
<div class="">发货数量:{{ item.num }}</div>
</div>
<!-- <div v-if="invoiceList.invoiceList[logisticsIdx].detailList.length > 1" class="w-1px h-82px bg-#EEEEEE ml-20px mr-20px"></div>-->
</div>
</div>
</div>
<!--快递配送-->
<div
v-if="invoiceList.invoiceList[logisticsIdx].deliveryType === 'express'"
v-loading="listLoading"
class="w-100% borRadius bg-#FFF py-20px px-30px mbtom20"
>
<!-- 物流公司信息-->
<div class="flex flex-justify-between mb-20px">
<div class="flex-between-center">
<div class="w-50px h-50px bg-#F7F7F7 b-rd-50% flex-center">
<span class="iconfont icon-kuaidi" style="font-size: 24px"></span>
</div>
<div class="text-14px text-#333 ml-20px">{{ invoiceList.invoiceList[logisticsIdx].expressName }}</div>
<div class="text-14px text-#333 ml-20px">{{ invoiceList.invoiceList[logisticsIdx].trackingNumber }}</div>
</div>
<div
@click="handleCopyNum"
class="w-56px h-30px text-center lh-29px borderSol b-rd-22px text-12px text-#666666 cursors"
>
复制
</div>
</div>
<el-divider border-style="dashed" />
<!-- 物流详情信息-->
<div v-if="logisticsInfo" class="relative" style="top: 30px">
<div class="logisticsCon" v-for="(item, index) in logisticsInfo.list" :key="index">
<div class="acea-row">
<div
class="data text-12px mr-20px text-right mb-40px relative"
:class="index === 0 ? 'text333 text-#333' : 'text-status'"
>
<div class="mb-5px">{{ item.time.split(' ')[0] }}</div>
<div>{{ item.time.split(' ')[1] }}</div>
</div>
<div class="w-90% mb-10px relative" :class="index !== logisticsInfo.list.length - 1 ? 'text' : ''">
<div class="circular flex-center" :class="index === 0 ? 'on' : ''">
<div v-if="index === 0" class="checked"></div>
</div>
<div class="text-14px pl-20px absolute" :class="index === 0 ? 'font-color' : 'text-status'">
{{ item.status }}
</div>
<div
v-if="index === logisticsInfo.list.length - 1"
class="circular flex-center"
style="margin: -9px 0 0px -3px"
></div>
</div>
</div>
</div>
</div>
</div>
<div
v-else-if="invoiceList.invoiceList[logisticsIdx].deliveryType === 'noNeed'"
v-loading="listLoading"
class="w-100% borRadius bg-#FFF py-20px px-30px mbtom20"
>
<div class="text-14px text-#333">{{ secondType == ProductTypeEnum.Fictitious ? '虚拟发货' : '无需发货' }}</div>
<el-divider border-style="dashed" />
<div class="relative">
<div class="text-14px text-#333" :title="invoiceList.invoiceList[logisticsIdx].deliveryMark">
备注信息{{ invoiceList.invoiceList[logisticsIdx].deliveryMark || '无' }}
</div>
</div>
</div>
<div v-else v-loading="listLoading" class="w-100% borRadius bg-#FFF py-20px px-30px mbtom20">
<div class="text-14px text-#333">商家送货</div>
<el-divider border-style="dashed" />
<div class="relative">
<div class="text-14px text-#333">
{{ invoiceList.invoiceList[logisticsIdx].deliveryCarrier }}{{
invoiceList.invoiceList[logisticsIdx].carrierPhone
}}
</div>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
.goods {
border-right: 1px solid #eeeeee;
padding-right: 30px;
padding-left: 30px;
&:nth-last-child(2n) {
border-right: none;
}
}
.font-color,
.text333 {
top: -16px;
}
.text-status {
top: -10px;
color: #666666;
}
.logisticsCon {
.circular {
width: 8px;
height: 8px;
background: #d0d0d0;
border-radius: 50%;
opacity: 1;
border: 2px solid #ffffff;
color: #666666;
margin: -9px 0 0px -5px;
position: absolute;
}
.checked {
width: 7px;
height: 7px;
background: #e93323;
border-radius: 50%;
}
.on {
width: 13px;
height: 13px;
opacity: 1;
top: -6px;
left: -2px;
border: 1px solid #ff877c;
position: absolute;
background: #fff !important;
}
.text {
border-left: 2px solid #d0d0d0;
}
}
</style>