269 lines
5.7 KiB
Vue
269 lines
5.7 KiB
Vue
<template>
|
|
<view class="whole">
|
|
|
|
<view v-if="routeType == 1">
|
|
<web-view :src="mapUrl"></web-view>
|
|
</view>
|
|
|
|
<view class="express" v-if="routeType == 2">
|
|
<view class="express-code">
|
|
<view class="left">
|
|
<image v-if="order.items && order.items[0] && order.items[0].pic_url" :src="order.items && order.items[0] && order.items[0].pic_url" mode="aspectFill"></image>
|
|
<text class="text">{{ order.company && order.company.name }} </text>
|
|
<text>{{ order && order.ship_sn }}</text>
|
|
</view>
|
|
<view class="btn" @click="copyBtn(order.ship_sn)">复制</view>
|
|
</view>
|
|
<view class="express-order">
|
|
<view class="icon"><span class="iconfont icon-yunshuzhong Color"></span></view>
|
|
<view style="width: calc(100% - 26px);">
|
|
<view>订单编号:{{ order.order && order.order.order_sn }}</view>
|
|
<view class="address">收货地址:{{ order.order && order.order.address }}</view>
|
|
</view>
|
|
</view>
|
|
<view class="express-steps">
|
|
<view class="time-axis" :class="{ 'is-done': index === 0 }" v-for="(item, index) in order.logs"
|
|
:key="index">
|
|
<text v-for="(list, index) in item.context" :key="index" @click="clickMakePhoneCall"
|
|
:data-phone="list.type=='phone'?list.val:''" :class="list.type == 'phone' ? 'phoneColor' : ''">
|
|
{{ list.val }}
|
|
</text>
|
|
<view>{{ item.time }}</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 隐私协议弹窗 -->
|
|
<privacy-popup :show-dialog="showPrivacy" @close="showPrivacy = false" @agree="showPrivacy = false" @refuse="showPrivacy = false" />
|
|
</view>
|
|
|
|
</template>
|
|
|
|
<script>
|
|
import { ref, reactive, toRefs, onMounted } from 'vue'
|
|
import { get } from '@/api/request.js'
|
|
import { Style } from '@/utils/list.js'
|
|
import { judgePrivacy } from '@/components/common.js'
|
|
import privacyPopup from '@/components/privacyPopup/index.vue'
|
|
|
|
export default {
|
|
components: {
|
|
privacyPopup
|
|
},
|
|
setup(props) {
|
|
const data = reactive({
|
|
mapUrl: '',
|
|
shipId: '',
|
|
order: {},
|
|
Color: uni.getStorageSync('theme_color'),
|
|
priceColor: Style[uni.getStorageSync('theme_index') * 1].priceColor,
|
|
showPrivacy: false,
|
|
routeType: 0
|
|
})
|
|
|
|
const clickMakePhoneCall = (e) => {
|
|
uni.makePhoneCall({
|
|
phoneNumber: e.currentTarget.dataset.phone,
|
|
success: (res) => {
|
|
},
|
|
fail: (res) => {
|
|
}
|
|
})
|
|
}
|
|
|
|
const mobilePhoneArray = (strContent) => {
|
|
if (strContent == '') {
|
|
return
|
|
}
|
|
let list = []
|
|
const mobileReg = /(1[3|4|5|7|8][\d]{9}|0[\d]{2,3}-[\d]{7,8}|0[\d]{2,3}[\d]{7,8}|400[-]?[\d]{3}[-]?[\d]{4})/g
|
|
const phoneList = strContent.context.match(mobileReg)
|
|
const textList = strContent.context.split(mobileReg)
|
|
if (phoneList == null) {
|
|
list.push({
|
|
type: 'text',
|
|
val: textList[0]
|
|
})
|
|
return list
|
|
}
|
|
|
|
textList.forEach((item) => {
|
|
if (phoneList.indexOf(item) > -1) {
|
|
list.push({
|
|
type: 'phone',
|
|
val: item
|
|
})
|
|
} else {
|
|
list.push({
|
|
type: 'text',
|
|
val: item
|
|
})
|
|
}
|
|
})
|
|
return list
|
|
}
|
|
|
|
async function getShip() {
|
|
await get(`/api/v1/order/ship/${data.shipId}`).then((res) => {
|
|
if(res.data.status === 0 && res.data.logs.length === 0) {
|
|
res.data.logs.push({
|
|
context: '待揽件'
|
|
})
|
|
}
|
|
res.data.logs.forEach((item) => {
|
|
const list = mobilePhoneArray(item)
|
|
item.context = list
|
|
})
|
|
data.order = res.data
|
|
data.routeType = res.data.has_route_map ? 1 : 2
|
|
data.mapUrl = res.data.route_map_url + '&nocopy=true&title=物流信息&height=40vh'
|
|
})
|
|
}
|
|
|
|
// 复制
|
|
async function copyBtn(val) {
|
|
if(await judgePrivacy()) {
|
|
data.showPrivacy = true
|
|
return false
|
|
}
|
|
uni.setClipboardData({
|
|
data: val
|
|
})
|
|
}
|
|
|
|
return {
|
|
...toRefs(data),
|
|
getShip,
|
|
copyBtn,
|
|
clickMakePhoneCall
|
|
}
|
|
},
|
|
async onLoad(options) {
|
|
// await this.$onLaunched
|
|
this.shipId = options.id
|
|
this.getShip()
|
|
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.express {
|
|
min-height: 100%;
|
|
background-color: #fff;
|
|
padding: 0 30rpx;
|
|
&-code {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
height: 120rpx;
|
|
border-bottom: 2rpx solid #e5e5e5;
|
|
|
|
.left {
|
|
display: flex;
|
|
align-items: center;
|
|
font-size: 28rpx;
|
|
|
|
image {
|
|
width: 69rpx;
|
|
height: 69rpx;
|
|
background: rgba(203, 202, 203, 0.39);
|
|
opacity: 1;
|
|
border-radius: 10rpx;
|
|
margin-right: 15rpx;
|
|
}
|
|
|
|
.text {
|
|
color: v-bind('Color');
|
|
}
|
|
}
|
|
|
|
.btn {
|
|
font-size: 22rpx;
|
|
border: 1rpx solid #2c2c2c;
|
|
border-radius: 20rpx;
|
|
padding: 4rpx 20rpx;
|
|
}
|
|
}
|
|
|
|
&-order {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
font-size: 28rpx;
|
|
padding: 30rpx 0;
|
|
border-bottom: 2rpx solid #e5e5e5;
|
|
.icon{
|
|
transform: rotateY(180deg);
|
|
}
|
|
.address {
|
|
margin-top: 15rpx;
|
|
}
|
|
}
|
|
|
|
&-steps {
|
|
padding-bottom: 20rpx;
|
|
}
|
|
}
|
|
|
|
/* 时间轴 */
|
|
.time-axis {
|
|
color: #262626;
|
|
position: relative;
|
|
padding-left: 50rpx;
|
|
list-style: none;
|
|
font-size: 28rpx;
|
|
margin: 10rpx 0;
|
|
|
|
&:before {
|
|
position: absolute;
|
|
margin-top: 16rpx;
|
|
left: 9rpx;
|
|
content: ' ';
|
|
height: 20rpx;
|
|
width: 20rpx;
|
|
border-radius: 50%;
|
|
background-color: #e8e8e8;
|
|
}
|
|
|
|
&:after {
|
|
position: absolute;
|
|
top: 32rpx;
|
|
left: 16rpx;
|
|
bottom: -38rpx;
|
|
content: ' ';
|
|
width: 2rpx;
|
|
border-right: 2rpx solid #e8e8e8;
|
|
}
|
|
|
|
&:not(:first-child) {
|
|
padding-top: 16rpx;
|
|
}
|
|
|
|
&:last-child {
|
|
&:after {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
&.is-done {
|
|
&:after {
|
|
border-color: v-bind('Color');
|
|
}
|
|
|
|
&:before {
|
|
background-color: v-bind('Color');
|
|
box-shadow: v-bind('Color') 0 0 10px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.phoneColor {
|
|
color: #61b8fd;
|
|
}
|
|
.Color{
|
|
color: v-bind('Color');
|
|
font-size: 20px;
|
|
}
|
|
</style>
|