jiuyiUniapp/jiuyi2/pages/shop/store/order.vue

542 lines
13 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>
// 商家订单
import {
ref,
reactive,
computed,
getCurrentInstance,
} from 'vue'
import {
onLoad,
onReady,
onPageScroll,
} from '@dcloudio/uni-app';
import {
useStore
} from 'vuex'
// 顶部
import apex from '@/components/header/apex.vue'
//顶部条件栏
import JyShopNavigation from '@/components/public/jy-shop-navigation'
// 订单列表项
import orderItem from '@/components/shop/order/item.vue';
// 快递信息
import expressVue from '@/components/shop/order/express.vue';
// 工具库
import util from '@/common/js/util';
//
import api from '@/api/index.js'
const {
proxy
} = getCurrentInstance()
//
const store = useStore()
// tabs
const tabs = reactive([{
id: '',
name: '全部'
},
{
id: 0,
name: '待付款'
},
{
id: 1,
name: '待发货'
},
{
id: 4,
name: '待收货'
},
{
id: 7,
name: '售后/退款'
}
])
// 当前tab下标
const tabIndex = ref(0)
// 列表
const list = reactive({
search: '',
status: '',
data: [],
pageSize: 10,
pageNum: 1,
total: 0,
})
// 顶部导航背景颜色
const apexBgColor = ref('#ffffff00')
// 当前操作的订单
const orderDetail = reactive({})
// 确认退货的收货地址
const address = reactive({
real_name: '',
user_phone: '',
user_address: '',
})
// 用户信息
const userinfo = computed(() => store.state.userinfo)
onLoad((options) => {
// 获取商家订单列表
getList()
})
//
onReady(() => {
// proxy.$refs.addressRef.open()
})
onPageScroll((ev) => {
apexBgColor.value = ev.scrollTop > 44 ? '#fff' : '#ffffff00'
})
// 重载列表
function refreshList() {
list.pageNum = 1
getList()
}
// 获取更多列表
function getMoreList() {
if (list.data.length >= list.total) return
list.pageNum++
getList()
}
// 获取商家订单列表
function getList() {
api.shop.getShopOrderList({
query: {
merId: userinfo.value.merId,
searchStr: list.search,
status: list.status,
pageNum: list.pageNum,
pageSize: list.pageSize,
},
}).then(res => {
if (res.code == 200) {
if (list.pageNum == 1) list.data.length = 0
list.data.push(...res.rows.map(item => {
// 状态
item.status = Number(item.status)
item.refundStatus = Number(item.refundStatus)
// 编辑订单状态文字
if (item.refundStatus != 0) {
item.status_text = {
'0': '待商家审核',
'1': '商家拒绝',
'2': '退款中',
'3': '已退款',
'4': '用户退货',
'5': '商家待收货',
'6': '已撤销',
} [item.afterSaleStatus]
} else {
item.status_text = {
'0': '待支付',
'1': '待发货',
'4': '待收货',
'5': '已收货',
'6': '已完成',
'9': '已取消',
} [item.status]
}
return item
}))
list.total = res.total
return
}
util.alert({
content: res.msg,
showCancel: false
})
})
}
/**
* 点击订单列表项
* @param {Object} ev 订单列表项
*/
function handleItem(ev) {
console.log('handleItem', ev)
return
uni.navigateTo({
url: util.setUrl('/pages/shop/order/detail')
})
}
/**
* 点击tab
* @param {Object} ev
*/
function itemClick(ev) {
list.status = ev.id
// 重载列表
refreshList()
}
/* 填写退货物流信息
* @param {Object} item 订单详情
*/
function handleExpress(item) {
Object.assign(orderDetail, {}, item)
proxy.$refs.expressRef.open()
}
/**
* 填写退货物流信息
* @param {Object} param
*/
function handleExpressConfirm(param) {
// 商家发货
api.shop.setShopDeliver({
data: {
// 订单号
orderNo: orderDetail.orderNo,
// 商品总数
totalNum: orderDetail.totalNum,
// 快递公司名称
expressName: param.expressName,
// 运单号
trackingNumber: param.trackingNumber,
// 备注
deliveryMark: '',
// 商家id
merId: orderDetail.merId,
// 订单ID
orderId: orderDetail.id,
// 快递公司代码
deliveryType: param.id,
// 用户ID购买订单人
uid: orderDetail.uid,
}
}).then(res => {
// 重载列表
refreshList()
})
}
/**
* 快捷改价
* @param {Object} item 订单详情
*/
function handlePriceChange(item) {
item.price = item.totalPrice
Object.assign(orderDetail, {}, item)
proxy.$refs.changePriceRef.open()
}
// 快捷改价确定
function handlePriceChangeConfirm() {
// 商家发货
api.shop.setShopOrderPrice({
query: {
// 订单ID
id: orderDetail.id,
// 用户ID购买订单人
price: orderDetail.price,
}
}).then(res => {
if (res.code === 200) {
proxy.$refs.changePriceRef.close()
// 重载列表
refreshList()
return
}
util.alert({
content: res.msg,
showCancel: false
})
})
}
/**
* 商家拒绝售后
* @param {Object} item 订单项
*/
function handleUnrefund(item) {
api.shop.setShopOrderUnrefund({
data: {
// 售后订单id
id: item.refundOrder.id,
// 订单编号
refundOrderNo: item.orderNo,
// 订单金额
refundPrice: item.totalPrice,
},
}).then(res => {
if (res.code === 200) {
// 重载列表
refreshList()
return
}
util.alert({
content: res.msg,
showCancel: false
})
})
}
/**
* 商家同意售后
* @param {Object} item 订单项
*/
function handleRefund(item) {
console.log('handleRefund', item)
Object.assign(orderDetail, {}, item)
// 售后类型1-仅退款2-退货退款
if (item.refundOrder.afterSalesType == 1) handleOrderRefund()
else if (item.refundOrder.afterSalesType == 2) proxy.$refs.addressRef.open()
}
// 填写收货地址确认
function handleAddressConfirm() {
console.log('address', address)
// 验证必填项
if (!address.real_name) {
util.alert('收货人姓名不能为空')
return
}
if (!address.user_phone) {
util.alert('收货人电话不能为空')
return
}
if (!address.user_address) {
util.alert('收货地址不能为空')
return
}
//
handleOrderRefund()
}
// 确认售后
function handleOrderRefund() {
//
api.shop.setShopOrderRefund({
data: {
// 售后订单id
id: orderDetail.refundOrder.id,
// 订单编号
refundOrderNo: orderDetail.orderNo,
// 订单金额
refundPrice: orderDetail.totalPrice,
...address,
},
}).then(res => {
if (res.code === 200) {
proxy.$refs.addressRef.close()
address.real_name = ''
address.user_address = ''
address.user_phone = ''
// 重载列表
refreshList()
return
}
util.alert({
content: res.msg,
showCancel: false
})
})
}
/**
* 预览图片
* @param {Array} urls
* @param {Number} current
*/
function viewImage(urls, current) {
uni.previewImage({
urls,
current,
})
}
/**
* 商家确认收货
* @param {Object} item 订单项
*/
function handleRefundOrder(item) {
api.shop.setShopRefundOrder({
// 售后订单id
path: [item.refundOrder.id],
}).then(res => {
if (res.code === 200) {
// 重载列表
refreshList()
return
}
util.alert({
content: res.msg,
showCancel: false
})
})
}
</script>
<template>
<apex :bgColor="apexBgColor" mode="flex">
<template #content>
<view class="search rows f1 mr30 plr20 bf8f8f8 br10">
<uni-icons type="search" color="#999" />
<input class="input ml20" type="text" placeholder="搜索内容" />
</view>
</template>
</apex>
<view class="app">
<view class="shopHeaderBg bgColor"></view>
<!-- tab选项卡 -->
<view class="f1 pr">
<JyShopNavigation v-model="tabIndex" :list="tabs" @tabItemClick="itemClick" />
</view>
<view class="product mlr20 pr">
<!-- 订单列表 -->
<view class="order">
<template v-for="(item,index) in list.data" :key="index">
<view class="mtb30">
<orderItem :item="item" mode="shop" @item="handleItem">
<template #menu="scope">
<!-- 售后流程 -->
<template v-if="scope.item.refundStatus == 1 ">
<!-- 退款原因 -->
<view class="menu rows ptb20">
<view class="key fs0 c333">退款原因</view>
<view class="value f1 ml20">
<view class="c333 f28">{{item.refundOrder.refundReasonWap}}</view>
<view class="c333 f28">{{item.refundOrder.refundReasonContent}}</view>
<view class="imgList mt10 c666 f24">
<template
v-for="(secItem,secIndex) in item.refundOrder.refundReasonWapImg.split(',')"
:key="secIndex">
<image class="imgs wh80 br10" :src="secItem" mode="aspectFill"
@click.stop="viewImage(item.refundOrder.refundReasonWapImg.split(','),secIndex)" />
</template>
</view>
</view>
</view>
<!-- 待商家审核 -->
<view class="menu ptb20 df jcr" v-if="scope.item.afterSaleStatus == 0">
<view class="btn bar closeHollow plr30"
@click.stop="handleUnrefund(scope.item)">拒绝退款</view>
<view class="btn bar closeHollow plr30" @click.stop="handleRefund(scope.item)">
同意退款</view>
<!-- <view class="btn bar warmHollow plr30">联系用户</view> -->
</view>
<!-- 待商家确认收货 -->
<view class="menu ptb20 df jcr" v-if="scope.item.afterSaleStatus == 5">
<view class="btn bar warmHollow plr30"
@click.stop="handleRefundOrder(scope.item)">
确认收货</view>
</view>
</template>
<template v-else>
<!-- 收货地址 -->
<view class="menu rows ptb20" v-if="[2,3,4,5,6].includes(scope.item.status)">
<view class="key fs0 c333">收货地址</view>
<view class="value f1 ml20">
<view class="c333 f28">
{{scope.item.address.province}}{{scope.item.address.city}}{{scope.item.address.country}}{{scope.item.address.detail}}
</view>
<view class="mt10 c666 f24">
<text>{{scope.item.address.name}}</text>
<text>{{scope.item.address.mobile}}</text>
</view>
</view>
</view>
<!-- 操作按钮 -->
<view class="menu ptb20 df jcr" v-if="[0,1,6].includes(scope.item.status)">
<template v-if="scope.item.status == 0">
<view class="btn bar warmHollow plr30"
@click="handlePriceChange(scope.item)">
修改价格</view>
</template>
<template v-if="scope.item.status == 1">
<view class="btn bar warmHollow plr30"
@click.stop="handleExpress(scope.item)">
发货</view>
</template>
</view>
</template>
</template>
</orderItem>
</view>
</template>
</view>
</view>
<!-- 填充 -->
<view class="fill" style="height: 30rpx;"></view>
<!-- 物流弹窗 -->
<expressVue ref="expressRef" @confirm="handleExpressConfirm" />
<!-- 快捷改价 -->
<uni-popup ref="changePriceRef" type="center">
<view class="changePrice popMid bfff">
<view class="header rows ptb20 plr20">
<view>输入修改金额</view>
<uni-icons type="closeempty" @click="$refs.changePriceRef.close()" />
</view>
<view class="form oh mtb30 plr30 c333 f30">
<view class="line df aic">
<view class="mr20">输入金额</view>
<input type="text" v-model="orderDetail.price" placeholder="输入修改价格"
placeholder-class="placeholderStyle" />
</view>
</view>
<view class="btn warm mtb30 mlr30" @click="handlePriceChangeConfirm">确定金额</view>
</view>
</uni-popup>
<!-- 同意退款 -->
<uni-popup ref="addressRef" type="center">
<view class="addressAlt popMid bfff">
<view class="header rows ptb20 plr20">
<view>填写退货地址信息</view>
<uni-icons type="closeempty" @click="$refs.addressRef.close()" />
</view>
<view class="form oh plr30 c333 f30">
<view class="line mtb20">
<input type="text" v-model="address.real_name" placeholder="收货人姓名"
placeholder-class="placeholderStyle" />
</view>
<view class="line mtb20">
<input type="text" v-model="address.user_phone" placeholder="收货人电话"
placeholder-class="placeholderStyle" />
</view>
<view class="line mtb20">
<input type="text" v-model="address.user_address" placeholder="收货人详细地址"
placeholder-class="placeholderStyle" />
</view>
</view>
<view class="btn warm mtb30 mlr30" @click="handleAddressConfirm">确认</view>
</view>
</uni-popup>
</view>
</template>
<style scoped lang="scss">
// 搜索
.search {
height: 30px;
}
// 背景颜色
.bgColor {
height: 300rpx;
}
.menu {
border-top: 2rpx solid #eee;
}
</style>