1262 lines
33 KiB
Vue
1262 lines
33 KiB
Vue
<template>
|
||
<view class="order" v-if="loading">
|
||
<view class="order-tip" v-if="order.status === 1">商家正在备货</view>
|
||
<view class="order-tip" v-if="order.status === 0">请在<up-count-down :time="time" @finish="timeFinish" />内支付,逾期将自动取消</view>
|
||
<view class="order-refund box" v-if="order.status === 8 || order.status === 9">
|
||
<up-icon name="checkmark-circle-fill" size="18" :color="Color" />
|
||
<text>交易关闭</text>
|
||
</view>
|
||
<view class="order-refund box" v-if="order.status === 6">
|
||
<up-icon name="checkmark-circle-fill" size="18" :color="Color" />
|
||
<text>退款成功</text>
|
||
</view>
|
||
<view class="order-refund box" v-if="order.status === 5">
|
||
<up-icon name="clock-fill" size="18" :color="Color" />
|
||
<text>退款中</text>
|
||
</view>
|
||
<view class="order-refund box box-jc" style="justify-content: space-between;" v-if="order.status === 4">
|
||
<view class="">
|
||
<up-icon name="checkmark-circle-fill" size="18" :color="Color" />
|
||
<text>已完成</text>
|
||
</view>
|
||
<view class="cart">
|
||
<up-icon name="shopping-cart" :color="Color" size="25" />
|
||
<view class="tag"><up-icon name="checkmark-circle-fill" :color="Color" size="14" /></view>
|
||
</view>
|
||
</view>
|
||
<!-- 海关清关信息 -->
|
||
<view class="customsBox" v-if="order.ships.length == 0 && order.customs_order">
|
||
<view class="tit">海关清关</view>
|
||
<view class="row">{{order.customs_order.created_at}} {{order.customs_order.status_msg}}</view>
|
||
<view class="row" v-if="order.customs_order.customs_status_msg">{{order.customs_order.updated_at}} {{order.customs_order.customs_status_msg}}</view>
|
||
</view>
|
||
<view class="box_order" v-for="ship in order.ships" :key="ship.id">
|
||
<div>
|
||
<view class="left">
|
||
<text @click="toShip(ship.id)">{{ship.company && ship.company.name}} {{ship.ship_sn}}</text>
|
||
<view class="btn" @click="copyBtn(ship.ship_sn)">复制</view>
|
||
</view>
|
||
<div class="logs" @click="toShip(ship.id)" v-if="ship.logs && ship.logs.length !== 0">
|
||
{{ship.logs[0].context}}
|
||
</div>
|
||
</div>
|
||
<up-icon name="arrow-right" :size="20" @click="toShip(ship.id)" />
|
||
</view>
|
||
<view class="order-address box" style="align-items: center;">
|
||
<up-icon name="map-fill" size="55rpx" :color="Color" />
|
||
<view class="order-address-info">
|
||
<view>
|
||
<text class="name">{{order.consignee}}</text>
|
||
<text class="tel">{{order.mobile}}</text>
|
||
</view>
|
||
<view class="address">{{order.address}}</view>
|
||
</view>
|
||
<text class="btn1" @click="showChoose = true" v-if="order.changeAddressType">修改</text>
|
||
</view>
|
||
|
||
<view class="box" style="flex-direction: column;">
|
||
<view class="order-goods" v-for="(item, index) in order.items" :key="index">
|
||
<view class="orderbox">
|
||
<image :src="item.pic_url + '?x-oss-process=image/format,webp'" :webp="true" mode="aspectFill" @click="toGroups(item)"></image>
|
||
<view class="order-goods-info box-jc">
|
||
<view class="order-goods-info-top box-jc">
|
||
<text class="title">{{item.goods_name}}</text>
|
||
<view class="price">
|
||
<text class="icon">¥</text>
|
||
<text>{{item.price}}</text>
|
||
</view>
|
||
</view>
|
||
<view class="order-goods-info-num box-jc" style="justify-content: space-between;">
|
||
<text>{{item.sku_name}}</text>
|
||
<text>x{{item.number}}</text>
|
||
</view>
|
||
<view class="rowBox">
|
||
<view class="cirbox">
|
||
<view class="cir" v-for="itm in item.small_refunds" :key="itm.id" @click.stop="openDetail(itm)">补偿金额{{itm.amount}}元</view>
|
||
</view>
|
||
<view class="">
|
||
<view class="order-goods-info-btn box-jc" style="justify-content: flex-end;flex-wrap: wrap;">
|
||
<!-- 仅有小额退款,没有常规退款的时候,可以再次申请常规退款 -->
|
||
<text class="btn2" @click.stop="toRefund(item)"
|
||
v-if="((order.status !== 0 && order.status !== 4 && order.status !== 7 && order.status !== 8 && order.status !== 9) ||
|
||
(order.status == 4 && order.settle_status == 0)) &&
|
||
(item.refund_status !== 3 && item.refund_status !== 4 && item.refund_status !== 1 && item.refund_status !== 6 && item.refund_status !== 7 || (item.refund_status == 2 && item.could_refund_amount * 100 > 0 && item.refund_amount == 0)) &&
|
||
order.pay_time">
|
||
申请退款
|
||
</text>
|
||
<text class="btn2" @click.stop="toAfterDetail(item.refund.order_refund_apply_id)" v-if="item.status !== 0 && item.refund && item.refund.order_refund_apply_id">售后详情</text>
|
||
</view>
|
||
<view class="order-goods-info-btn box-jc" style="justify-content: flex-end;" v-if="item.refund_status">
|
||
<text class="text" style="color: #F14939;" v-if="item.refund_status === 1">申请退款</text>
|
||
<text class="text" style="color: #F14939;" v-if="item.refund_status === 2">退款成功</text>
|
||
<text class="text" style="color: #F14939;" v-if="item.refund_status === 3">退款中</text>
|
||
<text class="text" style="color: #F14939;" v-if="item.refund_status === 4">拒绝退款</text>
|
||
<text class="text" style="color: #F14939;" v-if="item.refund_status === 6">退款关闭</text>
|
||
<text class="text" style="color: #F14939;" v-if="item.refund_status === 7">待退款</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<view class="btnBox" v-if="item.hasrefund">
|
||
<view class="btn2" @click="refundDetail(item.id)">退款详情</view>
|
||
</view>
|
||
<view v-if="(order.status === 0 || order.status == 1 || order.status == 2) && (item.delivery_mode === 1 || item.delivery_mode === 2)" class="mode">
|
||
最晚{{parseTime(item.delivery_expect_time)}}发货
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<template v-if="order.refund_apply">
|
||
<template v-for="it in order.refund_apply" :key="it.id">
|
||
<view v-if="it.status === 0" class="chuli" @click="toAfterDetail(it.id)">
|
||
<text>待团长处理</text><van-icon name="arrow" color="#999"/>
|
||
</view>
|
||
<view v-if="it.status === 11" class="chuli" @click="toAfterDetail(it.id)">
|
||
<text>团员已取消</text><van-icon name="arrow" color="#999"/>
|
||
</view>
|
||
<view v-if="it.status === 20" class="chuli" @click="toAfterDetail(it.id)">
|
||
<text>团长已同意,待团员退货</text><van-icon name="arrow" color="#999"/>
|
||
</view>
|
||
<view v-if="it.status === 21" class="chuli" @click="toAfterDetail(it.id)">
|
||
<text>团长已拒绝</text><van-icon name="arrow" color="#999"/>
|
||
</view>
|
||
<view v-if="it.status === 22" class="chuli" @click="toAfterDetail(it.id)">
|
||
<text>已填写物流单号,待退款</text><van-icon name="arrow" color="#999"/>
|
||
</view>
|
||
<view v-if="it.status === 30" class="chuli" @click="toAfterDetail(it.id)">
|
||
<text>团员已退货,待退款</text><van-icon name="arrow" color="#999"/>
|
||
</view>
|
||
<view v-if="it.status === 31" class="chuli" @click="toAfterDetail(it.id)">
|
||
<text>退款中</text><van-icon name="arrow" color="#999"/>
|
||
</view>
|
||
<view v-if="it.status === 32" class="chuli" @click="toAfterDetail(it.id)">
|
||
<text>已退款</text><van-icon name="arrow" color="#999"/>
|
||
</view>
|
||
<view v-if="it.status === 33" class="chuli" @click="toAfterDetail(it.id)">
|
||
<text>退款失败</text><van-icon name="arrow" color="#999"/>
|
||
</view>
|
||
</template>
|
||
</template>
|
||
<view class="order-price box-jc">
|
||
<view class="left">
|
||
<text>总价¥{{order.goods_price}}</text>
|
||
<text style="margin-left: 10rpx;">运费¥{{order.freight_price}}</text>
|
||
<text v-if="order.coupon_price != 0">优惠券 ¥{{order.coupon_price}}</text>
|
||
<text v-if="order.active_discount_amount != 0" style="margin-left: 10rpx;">优惠金额
|
||
¥{{order.active_discount_amount}}
|
||
</text>
|
||
<text v-if="order.score_profit != 0">积分抵扣 ¥{{order.score_profit}}</text>
|
||
</view>
|
||
<view class="right">
|
||
<text>实付款:</text>
|
||
<text class="icon">¥</text>
|
||
<text class="price">{{order.total_price}}</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<view class="order-info box">
|
||
<view class="order-info-item box-jc">
|
||
<text>订单编号</text>
|
||
<text class="text">{{order.order_sn}}</text>
|
||
</view>
|
||
<view class="order-info-item box-jc">
|
||
<text>下单时间</text>
|
||
<text class="text">{{order.created_at}}</text>
|
||
</view>
|
||
<view class="order-info-item box-jc" v-if="order.pay_time">
|
||
<text>付款时间</text>
|
||
<text class="text">{{order.pay_time}}</text>
|
||
</view>
|
||
<!-- <view class="order-info-item box-jc">
|
||
<text>支付方式</text>
|
||
<text class="text">微信支付</text>
|
||
</view> -->
|
||
<view class="order-info-item box-jc" v-if="order.status !== 0">
|
||
<text>支付状态</text>
|
||
<text class="text" v-if="order.pay_time">成功</text>
|
||
<text class="text" v-else>失败</text>
|
||
</view>
|
||
<view class="order-info-item box-jc">
|
||
<text>运费</text>
|
||
<text class="text">¥{{order.freight_price}}</text>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="order-btn box">
|
||
<text class="btn1" v-if="(order.status === 4 || order.status === 7) && !order.has_cross_border && order.invoice" @click="toApply(order)">查看发票</text>
|
||
<text class="btn1" v-if="(order.status === 4 || order.status === 7) && !order.has_cross_border && !order.invoice && getIntervalDay(getOldDay(), order.created_at)" @click="toApply(order)">申请发票</text>
|
||
<view class="btn1" v-if="(order.status == 1 || order.status == 2) && deduct_overtime_ship_on && order.couldShipUrge == 1" @click.stop="toUrgeDelivery()">催发货</view>
|
||
<text class="btn1" v-if="order.status === 0" @click="showCancel = true">取消订单</text>
|
||
<text class="btn3" v-if="order.status === 0" @click="selectMethod(order.id, order.items[0] && order.items[0].level_link_id || 0)">付款</text>
|
||
<!-- <text class="btn1" v-if="order.status === 3">查看物流</text> -->
|
||
<button class="btn1" @click="handleShare()" v-if="order.status !== 0" style="margin-left: 18rpx;">我要晒单</button>
|
||
|
||
<!-- <text class="btn1" v-if="order.status !== 0" @click="adddCartBatch(order.items)">再来一单</text> -->
|
||
<text class="btn1" v-if="order.status === 4" @click="toWrite(order.id)">评论</text>
|
||
<text class="btn3" v-if="order.status === 3" @click="confirmBtn(order.id)">确认收货</text>
|
||
</view>
|
||
|
||
<cancel-order :showCancel="showCancel" @close="showCancel = false" @cancelOrder="handleCancel" />
|
||
|
||
<!-- 客服 -->
|
||
<call-center :show="showService" @close="showService = false" :type="2" :orderId="orderId" />
|
||
|
||
<!-- 催发货 -->
|
||
<urge-delivery :show="showUrge" @close="showUrge = false" :info="orderInfo" @contactTeamer="getImg(1)" />
|
||
|
||
<!-- 隐私协议弹窗 -->
|
||
<privacy-popup :show-dialog="showPrivacy" @close="showPrivacy = false" @agree="showPrivacy = false" @refuse="showPrivacy = false" />
|
||
|
||
<!-- 修改地址 -->
|
||
<choose-addr :show="showChoose" :addrId="addrId" @close="showChoose = false" @choose="chooseFn" />
|
||
|
||
<up-modal :show="showSuccess" :showCancelButton="false" :showConfirmButton="false">
|
||
<view>
|
||
<view slot="title" class="refTitle">
|
||
<van-icon name="checked" size="36" :color="Color" />
|
||
<view>地址修改成功</view>
|
||
</view>
|
||
<view class="mesg">
|
||
<view class="tit">{{addrInfo.province.name}}{{addrInfo.city.name}}{{addrInfo.area.name}}{{addrInfo.address}}</view>
|
||
<text>{{addrInfo.name}} {{addrInfo.mobile}}</text>
|
||
</view>
|
||
<view style="padding: 50rpx 30rpx 30rpx;">
|
||
<view class="remind" @click="showSuccess = false">我知道了</view>
|
||
</view>
|
||
</view>
|
||
</up-modal>
|
||
|
||
<up-popup :show="showMethod" :round="10" mode="bottom" @close="showMethod = false, payData = {}" catchtouchmove="preventDefault" :safe-area-inset-bottom="true">
|
||
<view class="reTitle">
|
||
<text>选择支付方式</text>
|
||
<up-icon name="close" color="#777" size="20" @click="showMethod = false, payData = {}"/>
|
||
</view>
|
||
<view class="payBox">
|
||
<view class="row flex" v-for="it in payList" :key="it.id" @click="pay_method = it.id">
|
||
<view class="flex1">
|
||
<text class="iconfont logo" :class="'icon-' + it.icon" :style="{color: it.color}"></text>
|
||
<text>{{it.name}}</text>
|
||
</view>
|
||
<text class="iconfont icon-checked" v-if="it.id == pay_method"></text>
|
||
<text class="iconfont icon-circle" v-else></text>
|
||
</view>
|
||
</view>
|
||
<view style="padding: 30rpx;box-sizing: border-box;">
|
||
<view @click="toPay()" class="box_btn">支 付</view>
|
||
</view>
|
||
</up-popup>
|
||
|
||
<up-popup :show="showDetail" :round="10" mode="bottom" @close="showDetail = false" catchtouchmove="preventDefault" :safe-area-inset-bottom="true">
|
||
<view class="reTitle">
|
||
<text>退款详情</text>
|
||
<up-icon name="close" color="#777" size="20" @click="showDetail = false"/>
|
||
</view>
|
||
<view class="mesg1">
|
||
<view v-for="(item, index) in refundInfo" :key="item.id" class="rowbox">
|
||
<view class="tat">已退款:{{item.amount}}</view>
|
||
<view class="row is-done">
|
||
<view class="tt">退款完成</view>
|
||
<view class="time">{{item.refund_end_time}}</view>
|
||
<text>钱款退回:{{receiverType[item.receiver_type] ? receiverType[item.receiver_type] : item.receiver_type}}</text>
|
||
</view>
|
||
<view class="row">
|
||
<view class="tt">退款申请</view>
|
||
<view class="time">{{item.created_at}}</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<view style="padding: 30rpx;">
|
||
<view class="remind" @click="showDetail = false">我知道了</view>
|
||
</view>
|
||
</up-popup>
|
||
|
||
</view>
|
||
<div class="top" v-if="top">已确认收货,正在前往晒单...</div>
|
||
</template>
|
||
|
||
<script>
|
||
import { ref, reactive, toRefs } from 'vue'
|
||
import { get, post } from '@/api/request.js'
|
||
import callCenter from '@/components/callCenter/index.vue'
|
||
import cancelOrder from '@/components/order/CancelOrder.vue'
|
||
import urgeDelivery from '@/components/order/urgeDelivery.vue'
|
||
import { showToast, adddCartBatch, toWrite, getOldDay, getIntervalDay, uniShare } from '@/components/common.js'
|
||
import { Style, receiverType } from '@/utils/list.js'
|
||
import { sp2 } from '@/components/img.js'
|
||
import { judgePrivacy } from '@/components/common.js'
|
||
import privacyPopup from '@/components/privacyPopup/index.vue'
|
||
import chooseAddr from '@/components/order/chooseAddr.vue'
|
||
|
||
export default {
|
||
components: {
|
||
callCenter,
|
||
cancelOrder,
|
||
urgeDelivery,
|
||
privacyPopup,
|
||
chooseAddr
|
||
},
|
||
setup() {
|
||
const order = ref({})
|
||
const time = ref('')
|
||
const data = reactive({
|
||
complaintImg: '',
|
||
imageUrl: '',
|
||
shareUrl: '',
|
||
top: false,
|
||
id: '',
|
||
refund_mode: uni.getStorageSync('refund_mode') == 1,
|
||
showService: false,
|
||
orderId: '',
|
||
showUrge: false,
|
||
orderInfo: {},
|
||
deduct_overtime_ship_on: Number(uni.getStorageSync('deduct_overtime_ship_on')),
|
||
Color: uni.getStorageSync('theme_color'),
|
||
priceColor: Style[uni.getStorageSync('theme_index') * 1].priceColor,
|
||
sp2: sp2,
|
||
showPrivacy: false,
|
||
loading: false,
|
||
showChoose: false,
|
||
addrId: 0,
|
||
showSuccess: false,
|
||
addrInfo: {
|
||
province: {},
|
||
city: {},
|
||
area: {}
|
||
},
|
||
payData: {},
|
||
pay_method: 'alipay',
|
||
payList: [
|
||
// { id: 'wxpay', icon: 'wxpay', color: '#15BA11', name: '微信支付' },
|
||
{ id: 'alipay', icon: 'alipay', color: '#00A0EA', name: '支付宝' }
|
||
],
|
||
showMethod: false,
|
||
showDetail: false,
|
||
refundInfo: [],
|
||
})
|
||
|
||
async function getInfo(id) {
|
||
uni.showLoading({
|
||
title: '加载中...'
|
||
})
|
||
await get(`/api/v1/order/${id}`).then((res) => {
|
||
order.value = res.data
|
||
// 支付倒计时
|
||
if (res.data.status === 0) {
|
||
let end_time = res.data.created_at
|
||
let createdAt = new Date(end_time.replace(/-/g, '/')).getTime()
|
||
let endAt = createdAt + 15 * 60 * 1000
|
||
let nowAt = new Date().getTime()
|
||
let timestamp = endAt - nowAt
|
||
time.value = timestamp
|
||
}
|
||
order.value.items.forEach((itm) => {
|
||
itm.hasrefund = false
|
||
if(itm.refund && itm.refund.status == 4) {
|
||
itm.hasrefund = true
|
||
}
|
||
itm.small_refunds && itm.small_refunds.forEach((it) => {
|
||
if(it.status == 4) {
|
||
itm.hasrefund = true
|
||
}
|
||
})
|
||
})
|
||
uni.hideLoading()
|
||
})
|
||
}
|
||
// 退款按钮
|
||
function toRefund(item) {
|
||
// refund_mode为true申请退款,false销售二维码退款
|
||
// 待发货
|
||
console.log(data.refund_mode)
|
||
if (item.ship_status === 0) {
|
||
uni.redirectTo({
|
||
url: '/pages/mine/refund/choice/index?id=' + data.id + '&order_id=' + item.id
|
||
})
|
||
} else {
|
||
if (data.refund_mode) {
|
||
uni.navigateTo({
|
||
url: '/pages/mine/refund/service/index?order_id=' + order.value.id
|
||
})
|
||
} else {
|
||
getImg(1)
|
||
}
|
||
}
|
||
}
|
||
|
||
const toAfterDetail = (id) => {
|
||
uni.navigateTo({
|
||
url: '/pages/mine/refund/aftersale/index?refund_id=' + id
|
||
})
|
||
}
|
||
|
||
// 退款进度
|
||
function toRefundDetails() {
|
||
uni.navigateTo({
|
||
url: '/pages/mine/refund/details/index'
|
||
})
|
||
}
|
||
|
||
// 取消订单
|
||
const showCancel = ref(false)
|
||
async function handleCancel(reason) {
|
||
await get(`/api/v1/order/cancel/${order.value.id}`, { reason }).then((res) => {
|
||
showCancel.value = false
|
||
uni.navigateTo({
|
||
url: '/pages/order/cancel/index'
|
||
})
|
||
getInfo(order.value.id)
|
||
})
|
||
}
|
||
|
||
function toShip(id) {
|
||
uni.navigateTo({
|
||
url: '/pages/order/express/index?id=' + id
|
||
})
|
||
}
|
||
|
||
function timeFinish() {
|
||
getInfo(order.value.id)
|
||
}
|
||
|
||
const toGroups = (row) => {
|
||
if (row.shop_group_goods_id) {
|
||
uni.navigateTo({
|
||
url: '/pages/groups/index?id=' + row.shop_group_goods_id
|
||
})
|
||
} else if(row.level_link_id) {
|
||
uni.navigateTo({
|
||
url: '/pages/smallshop/classTwo?id=' + row.shop_goods_id + '&link_id=' + row.level_link_id
|
||
})
|
||
} else {
|
||
uni.navigateTo({
|
||
url: '/pages/productDetails/index?id=' + row.shop_goods_id
|
||
})
|
||
}
|
||
}
|
||
|
||
// 联系客服、投诉
|
||
const getImg = (type) => {
|
||
let imgsArray = []
|
||
if (type === 1) {
|
||
data.orderId = order.value.id
|
||
data.showService = true
|
||
} else {
|
||
uni.navigateTo({
|
||
url: '/pages/mine/msg/select?order_id=' + data.id
|
||
})
|
||
}
|
||
}
|
||
|
||
const shareBtn = async () => {
|
||
let price = 0
|
||
let goods = {}
|
||
if (order.value.items.length > 1) {
|
||
order.value.items.forEach((j) => {
|
||
if (j.price > price) {
|
||
price = j.price
|
||
goods = j
|
||
}
|
||
})
|
||
} else {
|
||
goods = order.value.items[0]
|
||
}
|
||
await getShareTemplate(goods)
|
||
await getShareUrl(goods)
|
||
}
|
||
|
||
// 获取分享图
|
||
const getShareTemplate = async (id) => {
|
||
await post('/api/v1/sales/share', {
|
||
shop_goods_id: id.shop_group_goods_id != 0 ? id.shop_group_goods_id : id.shop_goods_id
|
||
}).then((res) => {
|
||
res.data.forEach((item) => {
|
||
if (item.type === 4) {
|
||
data.imageUrl = item.image
|
||
}
|
||
})
|
||
})
|
||
}
|
||
|
||
// 分享路径
|
||
const getShareUrl = async (item) => {
|
||
await post('/api/v1/user/share', {
|
||
page: item.shop_group_goods_id != 0 ? 'pages/groups/index' : 'pages/productDetails/index',
|
||
query: item.shop_group_goods_id != 0 ? `id=${item.shop_group_goods_id}` : `id=${item.shop_goods_id}`
|
||
}).then((res) => {
|
||
data.shareUrl = res.data.path
|
||
})
|
||
}
|
||
|
||
// 确认收货
|
||
const confirmBtn = (id) => {
|
||
uni.showModal({
|
||
title: '确认收到货了吗',
|
||
content: '为了保证你的售后权益,请收到商品确认无误后再确认收货',
|
||
confirmColor: '#42b983',
|
||
success: function(res) {
|
||
if (res.confirm) {
|
||
get(`/api/v1/order/confirm/${id}`).then((res) => {
|
||
getInfo(order.value.id)
|
||
data.top = true
|
||
setTimeout(() => {
|
||
uni.navigateTo({
|
||
url: '/pages/order/comment/write?id=' + id
|
||
})
|
||
data.top = false
|
||
}, 1500)
|
||
})
|
||
}
|
||
}
|
||
})
|
||
}
|
||
|
||
function parseTime(time) {
|
||
let month = Number(time.substr(0, 10).split('-')[1])
|
||
let day = Number(time.substr(0, 10).split('-')[2])
|
||
return month + '月' + day + '日'
|
||
}
|
||
|
||
// 催发货
|
||
function toUrgeDelivery() {
|
||
get('/api/v1/order/urgeShip/' + order.value.id).then((res) => {
|
||
data.orderInfo = {
|
||
...order.value,
|
||
urge_status: res.data.urge_status,
|
||
delivery_time: order.value.delivery_expect_time ? parseTime(order.value.delivery_expect_time) : '',
|
||
deduct_amount: res.data.deduct_amount || 0
|
||
}
|
||
data.showUrge = true
|
||
})
|
||
}
|
||
|
||
async function copyBtn(val) {
|
||
if(await judgePrivacy()) {
|
||
data.showPrivacy = true
|
||
return false
|
||
}
|
||
uni.setClipboardData({
|
||
data: val
|
||
})
|
||
}
|
||
|
||
function toApply(order) {
|
||
if(order.invoice) {
|
||
uni.navigateTo({
|
||
url: '/pages/mine/invoice/detail?id=' + order.invoice.id
|
||
})
|
||
} else {
|
||
uni.navigateTo({
|
||
url: '/pages/mine/invoice/apply?id=' + order.id
|
||
})
|
||
}
|
||
}
|
||
|
||
function selectMethod(id, link_id) {
|
||
data.payData = {
|
||
id: id,
|
||
link_id: link_id
|
||
}
|
||
data.pay_method == 'wxpay'
|
||
data.showMethod = true
|
||
}
|
||
|
||
function toPay() {
|
||
if(data.payData.link_id) {
|
||
get(`/api/v1/goods/levelLink/${data.payData.link_id}`).then((res) => {
|
||
if(res.data.add_customer) {
|
||
payAgain(data.payData.id, data.payData.link_id)
|
||
} else {
|
||
payAgain(data.payData.id, 0)
|
||
}
|
||
})
|
||
} else {
|
||
payAgain(data.payData.id, 0)
|
||
}
|
||
}
|
||
|
||
function payAgain(id, link_id) {
|
||
uni.showLoading({
|
||
mask: true,
|
||
title: '加载中'
|
||
})
|
||
get(`/api/v1/pay/${id}`, { pay_style: 'app_pay', pay_type: data.pay_method == 'wxpay' ? 1 : 2 }).then((res) => {
|
||
if(data.pay_method == 'wxpay') {
|
||
// 跳转微信小程序
|
||
plus.share.getServices((ress) => {
|
||
let sweixin = null
|
||
for(let i = 0; i < ress.length; i++) {
|
||
if(ress[i].id == 'weixin') {
|
||
sweixin = ress[i]
|
||
}
|
||
}
|
||
if(sweixin) {
|
||
const path = res.data.jump_mini_path
|
||
sweixin.launchMiniProgram({
|
||
id: res.data.jump_mini_org_id, // 原始id:gh_开头 要跳转的微信小程序原始ID
|
||
path,
|
||
type: 0 // 默认为0, 0: 正式版 1:测试版 2:体验版
|
||
}, (success) => {
|
||
|
||
}, (err) => {
|
||
console.log(err)
|
||
return uni.showToast({
|
||
title: '请检查手机是否有微信应用~',
|
||
icon: 'none'
|
||
})
|
||
})
|
||
}
|
||
})
|
||
} else if(data.pay_method == 'alipay') {
|
||
let alipayUrl = res.data.jump_mini_path
|
||
if (uni.getSystemInfoSync().platform == "ios") {
|
||
alipayUrl = res.data.jump_mini_path.replace('alipays', 'alipay')
|
||
}
|
||
plus.runtime.openURL(alipayUrl)
|
||
}
|
||
uni.hideLoading()
|
||
}).catch(() => {
|
||
uni.hideLoading()
|
||
})
|
||
}
|
||
|
||
function chooseFn(e) {
|
||
uni.showLoading({
|
||
title: '正在修改...'
|
||
})
|
||
data.addrInfo = e
|
||
let params = {
|
||
order_id: data.id,
|
||
address: {
|
||
consignee: e.name,
|
||
mobile: e.mobile,
|
||
province_id: e.province_id,
|
||
city_id: e.city_id,
|
||
area_id: e.area_id,
|
||
address_detail: e.address,
|
||
address: e.province.name + e.city.name + e.area.name + e.address
|
||
}
|
||
}
|
||
post('/api/v1/order/changeAddress', params).then(async(res) => {
|
||
uni.hideLoading()
|
||
await getInfo(data.id)
|
||
data.showSuccess = true
|
||
})
|
||
}
|
||
|
||
function handleShare() {
|
||
let title = '老板,跟团成功了,期待早日收到货~'
|
||
let imageUrl = data.imageUrl
|
||
let path = data.shareUrl
|
||
uniShare(title, imageUrl, path)
|
||
}
|
||
|
||
function openDetail(row) {
|
||
uni.showModal({
|
||
title: '详情',
|
||
content: '补偿金额' + row.amount + '元,到账时间:' + row.created_at,
|
||
showCancel: false
|
||
})
|
||
}
|
||
|
||
function refundDetail(id) {
|
||
get('/api/v1/order/itemDetail/' + id, {need_refund_detail: 1}).then((res) => {
|
||
let list = []
|
||
list = list.concat(res.refunds || [])
|
||
list = list.concat(res.small_refunds || [])
|
||
data.refundInfo = list
|
||
data.showDetail = true
|
||
})
|
||
}
|
||
|
||
return {
|
||
uniShare,
|
||
getInfo,
|
||
order,
|
||
time,
|
||
toRefund,
|
||
toRefundDetails,
|
||
showCancel,
|
||
handleCancel,
|
||
payAgain,
|
||
toShip,
|
||
toGroups,
|
||
...toRefs(data),
|
||
getImg,
|
||
toWrite,
|
||
shareBtn,
|
||
adddCartBatch,
|
||
confirmBtn,
|
||
toAfterDetail,
|
||
parseTime,
|
||
toUrgeDelivery,
|
||
copyBtn,
|
||
toApply,
|
||
getOldDay,
|
||
getIntervalDay,
|
||
selectMethod,
|
||
toPay,
|
||
chooseFn,
|
||
handleShare,
|
||
openDetail,
|
||
timeFinish,
|
||
receiverType,
|
||
refundDetail
|
||
}
|
||
},
|
||
async onLoad(options) {
|
||
this.id = options.id
|
||
// await this.$onLaunched
|
||
},
|
||
async onShow() {
|
||
await this.getInfo(this.id)
|
||
await this.shareBtn()
|
||
this.loading = true
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.order-info-item {
|
||
justify-content: space-between;
|
||
}
|
||
.customsBox{
|
||
background: #fff;
|
||
padding: 24rpx 30rpx;
|
||
margin: 24rpx;
|
||
border-radius: 10rpx;
|
||
font-size: 26rpx;
|
||
line-height: 46rpx;
|
||
color: #666;
|
||
.tit{
|
||
font-size: 28rpx;
|
||
color: #2c2c2c;
|
||
font-weight: 600;
|
||
}
|
||
}
|
||
.box_order{
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
background: #fff;
|
||
padding: 24rpx;
|
||
margin: 24rpx;
|
||
border-radius: 10rpx;
|
||
.left{
|
||
font-size: 28rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
.btn{
|
||
font-size: 22rpx;
|
||
border: 1rpx solid #2c2c2c;
|
||
border-radius: 20rpx;
|
||
padding: 4rpx 20rpx;
|
||
margin-left: 20rpx;
|
||
}
|
||
}
|
||
.logs{
|
||
margin-top: 20rpx;
|
||
font-size: 24rpx;
|
||
color:#666;
|
||
}
|
||
}
|
||
|
||
.top {
|
||
position: fixed;
|
||
top: 40%;
|
||
left: 50%;
|
||
transform: translate(-50%);
|
||
background: rgba(0, 0, 0, 0.7);
|
||
color: #fff;
|
||
font-size: 25rpx;
|
||
padding: 25rpx;
|
||
border-radius: 10rpx;
|
||
}
|
||
|
||
.order {
|
||
padding: 1px 0 140rpx;
|
||
&-tip {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 26rpx;
|
||
color: #666;
|
||
padding-top: 24rpx;
|
||
}
|
||
|
||
.box {
|
||
display: flex;
|
||
padding: 24rpx;
|
||
background-color: #fff;
|
||
border-radius: 10rpx;
|
||
margin: 24rpx 24rpx 0;
|
||
}
|
||
|
||
.box-jc {
|
||
display: flex;
|
||
}
|
||
|
||
.btn1,
|
||
.btn2,
|
||
.btn3 {
|
||
border-radius: 30rpx;
|
||
padding: 5rpx 20rpx !important;
|
||
box-sizing: border-box;
|
||
text-align: center;
|
||
font-size: 26rpx;
|
||
}
|
||
|
||
.btn1 {
|
||
color: #555;
|
||
border: 2rpx solid #bbbbbb;
|
||
font-size: 26rpx;
|
||
}
|
||
|
||
.btn2 {
|
||
color: v-bind('Color');
|
||
border: 2rpx solid v-bind('Color');
|
||
margin-left: 10rpx;
|
||
}
|
||
|
||
.btn3 {
|
||
color: #fff;
|
||
background: v-bind('Color');
|
||
}
|
||
|
||
&-refund {
|
||
align-items: center;
|
||
font-size: 30rpx;
|
||
|
||
text {
|
||
margin-left: 15rpx;
|
||
}
|
||
|
||
image {
|
||
width: 50rpx;
|
||
height: 50rpx;
|
||
}
|
||
}
|
||
|
||
.order-express {
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
|
||
.left {
|
||
font-size: 28rpx;
|
||
|
||
.name {
|
||
// margin-right: 30rpx;
|
||
}
|
||
}
|
||
|
||
.btn {
|
||
font-size: 26rpx;
|
||
color: v-bind('Color');
|
||
border: 2rpx solid v-bind('Color');
|
||
border-radius: 34rpx;
|
||
padding: 0 10rpx;
|
||
flex-shrink: 0;
|
||
}
|
||
}
|
||
|
||
.order-address {
|
||
&-info {
|
||
flex: 1;
|
||
margin-left: 14rpx;
|
||
color: #666666;
|
||
font-size: 28rpx;
|
||
|
||
.name {
|
||
font-weight: bold;
|
||
color: #2c2c2c;
|
||
margin-right: 24rpx;
|
||
}
|
||
|
||
.address {
|
||
font-size: 24rpx;
|
||
margin-top: 16rpx;
|
||
}
|
||
}
|
||
|
||
.btn1 {
|
||
display: inline-table;
|
||
margin: auto;
|
||
margin-left: 30rpx;
|
||
font-size: 26rpx;
|
||
}
|
||
}
|
||
|
||
.order-goods {
|
||
margin-bottom: 22rpx;
|
||
.orderbox{
|
||
display: flex;
|
||
justify-content: space-between;
|
||
}
|
||
image {
|
||
width: 160rpx;
|
||
height: 160rpx;
|
||
background: #cbcacb;
|
||
border-radius: 10rpx;
|
||
margin-right: 15rpx;
|
||
}
|
||
|
||
&-info {
|
||
flex-direction: column;
|
||
width: calc(100% - 180rpx);
|
||
|
||
&-top {
|
||
.title {
|
||
flex: 1;
|
||
font-size: 28rpx;
|
||
display: -webkit-box;
|
||
-webkit-box-orient: vertical;
|
||
-webkit-line-clamp: 2;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.price {
|
||
font-size: 34rpx;
|
||
color: v-bind('priceColor');
|
||
margin-left: 10rpx;
|
||
|
||
.icon {
|
||
font-size: 24rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
&-num,
|
||
.text {
|
||
font-size: 24rpx;
|
||
color: #999999;
|
||
line-height: 22rpx;
|
||
}
|
||
|
||
&-btn {
|
||
.btn2 {
|
||
font-size: 24rpx;
|
||
}
|
||
|
||
button {
|
||
line-height: 35rpx;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.order-price {
|
||
align-items: center;
|
||
font-size: 24rpx;
|
||
justify-content: space-between;
|
||
|
||
.left {
|
||
width: 60%;
|
||
color: #7b7b7b;
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
|
||
text:first-child {
|
||
margin-right: 30rpx;
|
||
}
|
||
}
|
||
|
||
.right {
|
||
width: 40%;
|
||
height: 64rpx;
|
||
line-height: 58rpx;
|
||
text-align: right;
|
||
|
||
.icon,
|
||
.price {
|
||
color: v-bind('priceColor');
|
||
}
|
||
|
||
.icon {
|
||
margin-left: 5rpx;
|
||
}
|
||
|
||
.price {
|
||
font-size: 30rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
.order-goods-btn {
|
||
display: flex;
|
||
justify-content: flex-end;
|
||
font-size: 24rpx;
|
||
margin-top: 22rpx;
|
||
|
||
text:not(:first-child) {
|
||
margin-left: 18rpx;
|
||
}
|
||
}
|
||
|
||
.order-info {
|
||
padding: 0 30rpx;
|
||
flex-direction: column;
|
||
|
||
&-item {
|
||
font-size: 30rpx;
|
||
height: 90rpx;
|
||
align-items: center;
|
||
box-sizing: border-box;
|
||
border-bottom: 2rpx solid #e5e5e5;
|
||
|
||
.text {
|
||
font-size: 26rpx;
|
||
color: #555555;
|
||
}
|
||
}
|
||
|
||
&-item:last-child {
|
||
border-bottom: none;
|
||
}
|
||
}
|
||
|
||
.order-btn {
|
||
position: fixed;
|
||
bottom: 0;
|
||
margin: 0;
|
||
width: calc(100% - 60rpx);
|
||
justify-content: flex-end;
|
||
font-size: 30rpx;
|
||
|
||
text:not(:first-child) {
|
||
margin-left: 18rpx;
|
||
}
|
||
|
||
.btn3 {
|
||
min-width: 170rpx;
|
||
}
|
||
|
||
button {
|
||
line-height: 40rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
.chuli{
|
||
padding: 20rpx;
|
||
font-size: 26rpx;
|
||
color: #999;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
background: #F7F7F7;
|
||
margin-bottom: 16rpx;
|
||
border-radius: 6rpx;
|
||
}
|
||
.mode{
|
||
font-size: 24rpx;
|
||
color: #000;
|
||
display: flex;
|
||
align-items: center;
|
||
margin-top: 16rpx;
|
||
border-radius: 6rpx;
|
||
}
|
||
.cart{
|
||
position: relative;
|
||
.tag{
|
||
width: 14px;
|
||
height: 14px;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
position: absolute;
|
||
border-radius: 50%;
|
||
background-color: #fff;
|
||
top: -6rpx;
|
||
right: -10rpx;
|
||
}
|
||
}
|
||
.refTitle{
|
||
font-size: 30rpx;
|
||
color: #000;
|
||
padding: 30rpx 0;
|
||
text-align: center;
|
||
font-weight: 600;
|
||
}
|
||
.refTitle1{
|
||
font-size: 30rpx;
|
||
color: #000;
|
||
padding: 0 30rpx 0;
|
||
box-sizing: border-box;
|
||
font-weight: 600;
|
||
}
|
||
.mesg1{
|
||
font-size: 28rpx;
|
||
color: #303030;
|
||
padding: 30rpx 30rpx 0;
|
||
box-sizing: border-box;
|
||
height: 65vh;
|
||
overflow: auto;
|
||
.rowbox{
|
||
border-top: 1rpx solid #eee;
|
||
padding-top: 20rpx;
|
||
}
|
||
.tat{
|
||
font-size: 30rpx;
|
||
color: v-bind('Color');
|
||
font-weight: 600;
|
||
}
|
||
.row{
|
||
padding-left: 54rpx;
|
||
position: relative;
|
||
padding-bottom: 16rpx;
|
||
.tt{
|
||
font-size: 28rpx;
|
||
color: #333;
|
||
font-weight: 600;
|
||
}
|
||
.time{
|
||
font-size: 24rpx;
|
||
color: #98989F;
|
||
}
|
||
text{
|
||
font-size: 26rpx;
|
||
color: #666;
|
||
line-height: 40rpx;
|
||
}
|
||
&: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 {
|
||
.tt{
|
||
color: #333;
|
||
}
|
||
&:after {
|
||
border-color: v-bind('Color');
|
||
}
|
||
&:before {
|
||
background-color: v-bind('Color');
|
||
box-shadow: v-bind('Color') 0 0 10px;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
.mesg{
|
||
font-size: 26rpx;
|
||
color: #303030;
|
||
padding: 30rpx;
|
||
background-color: #F8F8F8;
|
||
width: 90%;
|
||
margin: 0 auto;
|
||
box-sizing: border-box;
|
||
.tit{
|
||
font-weight: 600;
|
||
font-size: 28rpx;
|
||
margin-bottom: 20rpx;
|
||
}
|
||
}
|
||
.remind{
|
||
width: 100%;
|
||
height: 72rpx;
|
||
background: v-bind('Color');
|
||
font-size: 30rpx;
|
||
color: #fff;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
border-radius: 72rpx;
|
||
}
|
||
.icon-checked{
|
||
color: v-bind('Color');
|
||
}
|
||
.icon-circle{
|
||
color: #aaa;
|
||
}
|
||
.reTitle{
|
||
font-size: 30rpx;
|
||
color: #000;
|
||
padding: 30rpx;
|
||
box-sizing: border-box;
|
||
font-weight: bold;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
border-bottom: 1px solid #e5e5e5;
|
||
background-color: #F6F6F6;
|
||
border-radius: 10px 10px 0 0;
|
||
}
|
||
.payBox{
|
||
background: #ffffff;
|
||
border-radius: 10rpx;
|
||
padding: 30rpx;
|
||
font-size: 28rpx;
|
||
height: 40vh;
|
||
.row{
|
||
padding: 20rpx 0;
|
||
.logo{
|
||
font-size: 16px;
|
||
margin-right: 10rpx;
|
||
display: inline-block;
|
||
width: 20px;
|
||
text-align: center;
|
||
}
|
||
}
|
||
}
|
||
.flex{
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
}
|
||
.flex1{
|
||
display: flex;
|
||
align-items: center;
|
||
}
|
||
.box_btn{
|
||
width: 100%;
|
||
height: 80rpx;
|
||
background: v-bind('Color');
|
||
font-size: 30rpx;
|
||
border-radius: 80rpx;
|
||
color: #ffffff;
|
||
text-align: center;
|
||
line-height: 80rpx;
|
||
}
|
||
.rowBox{
|
||
margin-top: 10rpx;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
.cirbox{
|
||
width: calc(100% - 150rpx);
|
||
.cir{
|
||
height: 20px;
|
||
line-height: 20px;
|
||
padding: 0 5px;
|
||
margin-bottom: 5px;
|
||
border-radius: 30rpx;
|
||
text-align: center;
|
||
font-size: 24rpx;
|
||
color: #F56C6C;
|
||
border: 1rpx solid #F56C6C;
|
||
display: inline-block;
|
||
}
|
||
}
|
||
}
|
||
</style>
|