bk-shop/src/subpages/trade/after-sale.js

700 lines
27 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import React, { useEffect, useRef } from "react"
import { useSelector } from "react-redux"
import { useImmer } from "use-immer"
import Taro, { getCurrentInstance } from "@tarojs/taro"
import api from "@/api"
import doc from "@/doc"
import { AtButton, AtInput, AtCurtain, AtCountdown } from 'taro-ui'
import { SpPage, SpTabs, SpCell, SpCheckbox, SpImage, SpInputNumber, SpFloatLayout, SpUpload, SpPrice, SpHtml, SpOrderItem } from '@/components'
import { View, Text, Picker, Input, ScrollView } from "@tarojs/components"
import { AFTER_SALE_TYPE, REFUND_FEE_TYPE, LOGISTICS_CODE } from '@/consts'
import { pickBy, showToast, classNames, VERSION_STANDARD, VERSION_PLATFORM, JumpGoodDetail, copyText } from '@/utils'
import "./after-sale.scss"
const initialState = {
info: null,
curTabIdx: 1,
tabList: AFTER_SALE_TYPE,
reasonIndex: '',
reasons: [],
refundFee: 0,
refundPoint: 0,
refundType: 'offline',
description: '',
pic: '',
// 用于云店后台交易设置-到店退货关闭时判断
offlineAftersalesIsOpen: false,
offlineAftersales: false,
refundTypeList: REFUND_FEE_TYPE,
refundStore: '', // 退货门店
contact: '', // 联系人
mobile: '', // 联系电话
openRefundType: false,
selectRefundValue: 'offline',
afterSaleDesc: {
intro: '',
is_open: false
},
afterSaleChecked: {},
afterSaleTotalNum: 0,
allClicked: false,
afterSaleTotalprice: 0,
loading: true,
isOpened: false,
isAddrOpened: false,
aftersales: null,
expressList: [],
corpIndex: null,
logi_no: ''
}
function TradeAfterSale (props) {
const $instance = getCurrentInstance()
const { aftersales_bn: afterSaleTid } = $instance.router.params
const [state, setState] = useImmer(initialState)
const pageRef = useRef()
const { info, curTabIdx, tabList, reasonIndex, reasons, refundFee, refundPoint, refundType, refundTypeList, description, pic, openRefundType, selectRefundValue,
refundStore, contact, mobile, afterSaleDesc, offlineAftersalesIsOpen, offlineAftersales, afterSaleTotalNum, allClicked, afterSaleTotalprice, loading, isOpened, isAddrOpened, aftersales, expressList, corpIndex, logi_no } = state
useEffect(() => {
fetch()
Taro.eventCenter.on('onEventPickerStore', (item) => {
console.log('onEventPickerStore:', item)
setState(draft => {
draft.refundStore = item
})
})
const _expressList = Object.keys(LOGISTICS_CODE).map(key => {
return {
name: LOGISTICS_CODE[key],
code: key
}
})
setState(draft => {
draft.expressList = _expressList
})
return () => {
Taro.eventCenter.off('onEventPickerStore')
}
}, [])
useEffect(() => {
if (openRefundType) {
pageRef.current.pageLock()
} else {
pageRef.current.pageUnLock()
}
}, [openRefundType])
const onCancel = () => {
Taro.navigateBack()
}
const onSubmitExp = async () => {
const { item_id, orderId: order_id, afterSalesBn: aftersales_bn } = aftersales
const corp_code = expressList[corpIndex]?.code
if (!corp_code) {
showToast('请填写物流公司')
return
}
if (!logi_no) {
showToast('请填写物流单号')
return
}
await api.aftersales.sendback({
item_id,
order_id,
aftersales_bn,
logi_no,
corp_code
})
showToast('操作成功')
setTimeout(() => {
// Taro.navigateBack()
fetch()
}, 300)
}
const onChangeExpress = (e) => {
const { value } = e.detail
setState(draft => {
draft.corpIndex = value
})
}
const getLogisticName = () => {
const { name } = expressList[corpIndex] || {}
return name
}
const fetch = async () => {
const { id, aftersales_bn } = $instance.router.params
if (aftersales_bn) {
const resInfo = await api.aftersales.info({
aftersales_bn,
// item_id,
// order_id
})
const _aftersales = pickBy(resInfo, doc.trade.TRADE_AFTER_SALES_ITEM)
console.log("🚀 ~ _aftersales:", _aftersales)
if (_aftersales.sendbackData) {
const { corp_code } = _aftersales.sendbackData
_aftersales.sendbackData.name = LOGISTICS_CODE[corp_code]
}
setState(draft => {
draft.aftersales = _aftersales
draft.afterSaleTotalNum = _aftersales.items.reduce((sum, { num }) => sum + num, 0)
draft.afterSaleTotalprice = _aftersales.items.reduce((sum, { price }) => sum + price, 0)
})
}
const { orderInfo, offline_aftersales_is_open, distributor } = await api.trade.detail(id)
const reasons = await api.aftersales.reasonList()
const { intro, is_open } = await api.aftersales.remindDetail()
const { offline_aftersales } = distributor
const _info = pickBy(orderInfo, doc.trade.TRADE_ITEM)
setState(draft => {
draft.info = _info
draft.reasons = reasons
draft.offlineAftersalesIsOpen = offline_aftersales_is_open
draft.offlineAftersales = offline_aftersales == 1
draft.afterSaleDesc = {
intro,
is_open
}
if ((VERSION_STANDARD && !offline_aftersales_is_open) || (VERSION_PLATFORM && offline_aftersales == 0)) {
draft.refundTypeList = REFUND_FEE_TYPE.filter(item => item.value != 'offline')
draft.refundType = 'logistics'
}
draft.loading = false
})
}
const onChangeItemCheck = (item, index, type) => {
// const _info = info
// _info.items[index].checked = e
setState(draft => {
if (type === 'all') {
draft.allClicked = !allClicked
draft.info.items.map((_item) => {
_item.checked = !allClicked
})
} else {
draft.info.items[index].checked = !item.checked
}
draft.allClicked = draft.info.items.every((item) => item.checked)
draft.afterSaleTotalNum = draft.info.items.filter((_item) => _item.checked).reduce((sum, { num }) => sum + num, 0)
draft.afterSaleTotalprice = draft.info.items.filter((_item) => _item.checked).reduce((sum, { price }) => sum + price, 0)
})
}
const onChangeItemNum = (e, index) => {
setState(draft => {
draft.info.items[index].refundNum = e
})
}
const getRealRefundFee = () => {
let rFee = 0
if (info) {
const { items } = info
rFee = items
.filter((item) => item.checked)
.reduce((sum, { price, num, refundNum }) => sum + price / num * refundNum, 0)
}
return rFee.toFixed(2)
}
const getRealRefundPoint = () => {
let rPoint = 0
if (info) {
const { items } = info
rPoint = items
.filter((item) => item.checked)
.reduce((sum, { point, num, refundNum }) => sum + point / num * refundNum, 0)
}
return rPoint.toFixed(2)
}
const onChangeRefundType = ({ value }) => {
setState(draft => {
draft.selectRefundValue = value
})
}
const getRefundTypeName = () => {
const { title } = refundTypeList.find(item => item.value == refundType) || {}
return title
}
const onSubmit = async () => {
const { id } = $instance.router.params
const checkedItems = info?.items.filter(item => !!item.checked)
if (checkedItems.length == 0) {
return showToast('请选择需要售后的商品')
}
if (!reasons?.[reasonIndex]) {
return showToast('请选择退货原因')
}
const aftersales_type = tabList[curTabIdx].type
const reason = reasons?.[reasonIndex]
let params = {
detail: checkedItems.map(({ id: _id, refundNum, num }) => {
return {
id: _id,
num: num || refundNum
}
}),
order_id: id,
aftersales_type,
reason,
description,
evidence_pic: pic
}
// 退货退款
if (aftersales_type == 'REFUND_GOODS') {
params = {
...params,
return_type: refundType
}
// 到店退货
if (refundType == 'offline') {
if (!refundStore) {
return showToast('请选择退货门店')
}
if (!contact) {
return showToast('请输入联系人姓名')
}
if (!mobile) {
return showToast('请输入联系人电话')
}
params = {
...params,
return_type: refundType,
aftersales_address_id: refundStore.address_id,
contact,
mobile
}
}
}
await api.aftersales.apply(params)
showToast('提交成功')
setTimeout(() => {
// Taro.redirectTo({
// url: `/subpage/pages/trade/detail?id=${id}`
// })
// fetch()
Taro.navigateBack()
}, 500)
}
const handleClickCopy = (val) => {
copyText(val)
Taro.showToast({
title: '复制成功',
icon: 'none'
})
}
return <SpPage ref={pageRef} loading={loading} className='page-trade-after-sale has-navbar' isBlack showNavSearchIcon renderFooter={
!loading && !afterSaleTid ? <View className='btn-wrap'>
<AtButton type='primary' onClick={onSubmit}>提交售后申请</AtButton>
</View> : null
}
>
{!afterSaleTid ? <View className="after-item">
<View className="after-item-label">请选择售后类型:</View>
<Picker
mode='selector'
range={tabList.map(item => item.title)}
onChange={(e) => {
setState(draft => {
draft.curTabIdx = +e.detail.value
})
}}
>
<View className="after-item-input">
<View className="input-txt">{tabList[curTabIdx] ? tabList[curTabIdx].title : '请选择售后类型'}</View>
<View className="iconfont icon-arrowRight" style={{ color: tabList[curTabIdx] > -1 ? '#000' : '#a5a5a5' }}></View>
</View>
</Picker>
</View> : aftersales?.progress && aftersales.progress != 12 ? <View className="after-item">
<View className="after-item-label">售后单号{afterSaleTid}</View>
<View className="after-item-label" style={{ fontSize: '30rpx', display: 'flex', alignItems: 'flex-end', justifyContent: 'space-between', opacity: '80', margin: '36rpx 0 50rpx 0', lineHeight: '0.8' }}>
<Text style={{ marginRight: '20rpx', fontWeight: 'bold' }}>{['', '售后审核通过,请您发货并填写物流单号', '等待商家确认收货', '已驳回', '已完成', '退款驳回', '退款完成', '已关闭', '商家确认收货,等待审核退款', '退款处理中'][aftersales?.progress || 0]}</Text>
<View style={{ display: 'flex', alignItems: 'flex-end', justifyContent: 'space-between' }}>
{/* <View style={{ fontSize: '20rpx', textAlign: 'end' }}>还剩<AtCountdown
format={{ day: '天', hours: '时', minutes: '分', seconds: '' }}
isShowDay
day={1}
hours={23}
minutes={59}
seconds={0}
/></View> */}
<Text onClick={() => setState(draft => { draft.isOpened = true })} style={{ fontSize: '20rpx', borderBottom: '1px solid #000', padding: '0 0 4rpx' }}>全部流程</Text>
</View>
</View>
</View> : null}
{aftersales?.progress >= 1 && aftersales?.progress != 3 && <>
<View className="after-item" style={{ display: 'flex', alignItems: 'flex-end', justifyContent: 'space-between', marginBottom: '30rpx' }}>
<Text style={{ fontSize: '24rpx', marginTop: '-10rpx' }}>退货单号填写</Text>
{aftersales?.hasAftersalesAddress && <Text onClick={() => setState(draft => { draft.isAddrOpened = true })} style={{ fontSize: '20rpx', borderBottom: '1px solid #000', padding: '0 0 4rpx', marginTop: '-10rpx', lineHeight: 0.8 }}>查看退货地址</Text>}
</View>
<View className="after-item mt-40" style={{ marginBottom: '50rpx' }}>
{!aftersales?.hasSendbackData ? <Picker
mode='selector'
rangeKey='name'
range={expressList}
onChange={onChangeExpress}
>
<View className="after-item-input">
<View className={`input-txt`}>{`${getLogisticName() || '请选择快递公司'}`}</View>
<View className="iconfont icon-arrowRight" style={{ color: getLogisticName() ? '#000' : '#a5a5a5' }}></View>
</View>
</Picker> : <View className="after-item-input">
<View className={`input-txt color-hui`}>{`${aftersales?.sendbackData?.name || ''}`}</View>
</View>}
</View>
<View className="after-item mt-40" style={{ marginBottom: '50rpx' }}>
<View className="after-item-input">
{!aftersales?.hasSendbackData ? <Input className="desc-ipt" value={logi_no} placeholder='物流单号' onInput={(e) => {
setState(draft => {
draft.logi_no = e.detail.value
})
}}></Input>
:
<View className={`input-txt color-hui`}>{`${aftersales?.sendbackData?.logi_no || ''}`}</View>}
</View>
</View>
<View style={{ margin: '0 auto', marginBottom: '70rpx', textAlign: 'center' }}>
{/* <AtButton type='primary' onClick={onSubmitExp}>确认上传</AtButton> */}
<Text onClick={() => handleClickCopy(aftersales?.sendbackData?.logi_no || '')} style={{ fontSize: '20rpx', borderBottom: '1px solid #000', lineHeight: 0.8 }}>复制物流单号</Text>
</View>
</>}
{/* <SpTabs current={curTabIdx} tablist={tabList} onChange={(e) => {
setState(draft => {
draft.curTabIdx = e
})
}} /> */}
{!afterSaleTid ? <>
<View className="choose-item">请选择您要退货的商品</View>
<View className="choose-all">
<SpCheckbox label='全选' checked={allClicked} onChange={onChangeItemCheck.bind(this, null, null, 'all')} />
</View>
</> : <Text className="choose-item" style={{ fontSize: '30rpx', fontWeight: 'bold' }}>退</Text>}
<View className='refund-items'>
<View className='items-container'>
{
(aftersales?.items || info?.items || []).map((item, index) => (
<View className="item-box" onClick={onChangeItemCheck.bind(this, item, index)}>
<View className='item-wrap' key={`item-wrap__${index}`}>
{!afterSaleTid && <View className='item-hd'>
<SpCheckbox checked={item.checked} onChange={onChangeItemCheck.bind(this, item, index)} />
</View>}
<View className='item-bd'>
{/* <SpOrderItem
key={`item__${index}`}
info={item}
isShowNational
isPointitemGood={false}
onClick={() => {
if (info.order_class == 'pointsmall') {
Taro.navigateTo({
url: `/subpages/pointshop/espier-detail?id=${item.good_id}`
})
} else {
JumpGoodDetail(item.good_id, item.distributor_id)
}
}}
/> */}
<SpImage src={item.pic} width={150} height={150} mode='aspectFill' radius={4} circle={4} />
<View className='goods-info'>
<View className='goods-info-hd'>
<Text className='goods-title'>{item.itemName}</Text>
</View>
<View className='goods-info-bd'>
<View>{item.itemSpecDesc && <Text className='sku-info'>{`${item.descInfo}`}</Text>}</View>
{/* <View><SpPrice size={28} value={item.price / item.num} /> x <Text className='num'>{item.num}</Text></View> */}
</View>
<View className='goods-info-ft'>
<Text>数量{item.num}</Text>
<SpPrice size={20} value={item.price / item.num} showSeparator noDecimal={false} />
{/* <SpInputNumber
disabled={!item.leftAftersalesNum}
value={item.refundNum}
max={item.leftAftersalesNum}
min={1}
onChange={(e) => onChangeItemNum(e, index)}
/> */}
</View>
</View>
</View>
</View>
<SpPrice value={item.price} showSeparator noDecimal={false} />
</View>
))
}
</View>
</View>
<View className="after-item mt-40" style={{ marginTop: '60rpx' }}>
<View className="after-item-label color-hui">退货原因</View>
{!afterSaleTid ? <Picker
mode='selector'
range={reasons}
onChange={(e) => {
setState(draft => {
draft.reasonIndex = e.detail.value
})
}}
>
<View className="after-item-input">
<View className={`input-txt`}>{`${reasons?.[reasonIndex] || '请选择退货原因'}`}</View>
<View className="iconfont icon-arrowRight" style={{ color: reasons?.[reasonIndex] ? '#000' : '#a5a5a5' }}></View>
</View>
</Picker> : <View className="after-item-input">
<View className={`input-txt color-hui`}>{`${aftersales?.reason || reasons?.[reasonIndex] || '请选择退货原因'}`}</View>
</View>}
</View>
<View className="after-item mt-40">
<View className="after-item-label color-hui">退货数量*</View>
<View className="after-item-input">
<View className="input-txt color-hui">{`${afterSaleTotalNum || '请选择退货数量'}`}</View>
</View>
</View>
{/* <View className='picker-reason'>
<Picker
mode='selector'
range={reasons}
onChange={(e) => {
setState(draft => {
draft.reasonIndex = e.detail.value
})
}}
>
<SpCell title='退款原因' isLink value={<Text>{`${reasons?.[reasonIndex] || '请选择取消原因'}`}</Text>}></SpCell>
</Picker>
</View> */}
<View className='refund-desc-container'>
</View>
{false && <View className='refund-detail'>
<View className='refund-amount'>
<SpCell title='退款金额' value={getRealRefundFee()} />
</View>
<View className='refund-point'>
{/* <SpCell title='退积分' value={info?.point} /> */}
<SpCell title='退积分' value={getRealRefundPoint()} />
</View>
</View>}
{/* {curTabIdx == 1 && <View className='return-goods-type'>
<SpCell border title='退货方式' value={getRefundTypeName()} isLink onClick={() => {
setState(draft => {
draft.openRefundType = true
draft.selectRefundValue = refundType
})
}}></SpCell>
{
refundType == 'offline' && ((offlineAftersalesIsOpen && VERSION_STANDARD) || (VERSION_PLATFORM && offlineAftersales)) && <>
<SpCell border title='退货门店' isLink value={<Text className={classNames({
'placeholder': !refundStore
})}>{refundStore ? refundStore.name : '请选择退货门店'}</Text>} onClick={() => {
Taro.navigateTo({
url: `/subpages/trade/store-picker?distributor_id=${info.distributorId}&refund_store=${refundStore?.address_id}`
})
}} />
<SpCell border title='联系人' value={<AtInput
name='contact'
value={contact}
placeholder='请填写联系人姓名'
onChange={(e) => {
setState(draft => {
draft.contact = e
})
}}
/>}>
</SpCell>
<SpCell title='联系电话' value={<AtInput
name='mobile'
value={mobile}
placeholder='请填写联系人电话'
onChange={(e) => {
setState(draft => {
draft.mobile = e
})
}}
/>}></SpCell>
</>
}
</View>} */}
<View className='desc-container'>
<View className='title'>
<Text>退货商品{afterSaleTotalNum}</Text>
<Text>退款金额<SpPrice size={30} value={afterSaleTotalprice} showSeparator noDecimal={false} /></Text>
</View>
{!afterSaleTid ? <View className='desc-content'>
{/* <Text className='iconfont icon-bianji1'></Text> */}
{/* <AtTextarea type='textarea' name='description' value={description} placeholder='在此填写备注要求' maxLength={200} onChange={(e) => {
setState(draft => {
draft.description = e
})
}} /> */}
<Input className="desc-ipt" value={description} placeholder='在此填写备注要求' onInput={(e) => {
setState(draft => {
draft.description = e.detail.value
})
}}></Input>
</View>
: <View style={{ opacity: '0.8', fontSize: '24rpx' }}>备注{aftersales?.description || description}</View>}
{/* <SpUpload
value={pic}
max={3}
onChange={(val) => {
setState((draft) => {
draft.pic = val
})
}}
/> */}
</View>
{
afterSaleDesc.is_open && <View className='after-sale-desc'>
<View className='desc-title'><Text className='iconfont icon-xinxi'></Text></View>
<SpHtml content={afterSaleDesc.intro} />
</View>
}
<SpFloatLayout
title='选择退货方式'
className='refund-type'
open={openRefundType}
onClose={() => {
setState((draft) => {
draft.openRefundType = false
})
}}
renderFooter={
<AtButton circle type='primary' onClick={() => {
setState(draft => {
draft.refundType = selectRefundValue
draft.openRefundType = false
})
}}>
确定
</AtButton>
}
>
{refundTypeList.map((item, index) => (
<View className='refund-type-item' key={`refund-type-item__${index}`}>
<SpCheckbox
checked={item.value == selectRefundValue}
onChange={onChangeRefundType.bind(this, item)}
>
<View className='refund-item-wrap'>
<View className='title'>{item.title}</View>
<View className='desc'>{item.desc}</View>
</View>
</SpCheckbox>
</View>
))}
</SpFloatLayout>
<AtCurtain
className='curtain'
isOpened={isOpened}
onClose={() => {
setState((draft) => {
draft.isOpened = false
})
}}
>
<View className="curtain_content">
<View className="curtain_content_title">
<SpImage src={`member/logo-black.png`} height={32} mode='heightFix' isNew />
<Text style={{ marginLeft: '6px' }}>退货流程</Text>
</View>
<View className={`receiver_name ${false && 'active'}`}>提交申请</View>
<View className={`receiver_name ${aftersales?.progress == 0 && 'active'}`} style={{ display: 'flex', alignItems: 'flex-end' }}>
<Text style={{ marginRight: '36px' }}>商家处理</Text>
{/* <View style={{ color: '#000', fontSize: '20rpx' }}>还剩<AtCountdown
format={{ day: '天', hours: '时', minutes: '分', seconds: '' }}
isShowDay
day={1}
hours={23}
minutes={59}
seconds={0}
/></View> */}
</View>
<View className="receiver_name op">商家同意后请按照给出的退货地址退货并请记录退货运单</View>
<View className="receiver_name op">如商家拒绝您可以修改申请后再次发起商家会重新处理</View>
<View className="receiver_name op" style={{ marginBottom: '50rpx' }}>如商家超时未处理退货申请将达成请按系统给出的退货地址退货</View>
<View className={`receiver_name ${[2].includes(aftersales?.progress) && 'active'}`}>寄回商品</View>
<View className={`receiver_name ${aftersales?.progress == 4 && aftersales?.aftersalesStatus != 2 && 'active'}`}>商家退款</View>
<View className={`receiver_name ${aftersales?.progress == 4 && aftersales?.aftersalesStatus == 2 && 'active'}`}>退款成功</View>
<View className="line"></View>
<View className="curtain_content_text">
<View className="curtain_content_text_title">温馨提示</View>
<View class="receiver_item">
BIRKENSTOCK支持七天(从收到商品之日起开始计算)无理由退换货如需退换货退回货品需不影响二次销售原装鞋盒务必完好(如鞋盒有遗失需补偿20元)试穿时需将鞋盒内的包装纸垫于脚下过程中不刻意踩踏后跟如鞋面或鞋底出现脏污磨损破损鞋跟出现折痕等都将影响商品的二次销售我们将无法为您提供七天无理由退换货服务敬请谅解如果您还有其他问题或需要更多帮助可及时联系客服我们将竭诚为您服务(特别提示:仓库不接受到付平邮邮政小包)
</View>
</View>
<AtButton type='primary' onClick={() => setState((draft) => { draft.isOpened = false })}>我知道了</AtButton>
</View>
</AtCurtain>
<AtCurtain
className='curtain'
isOpened={isAddrOpened}
onClose={() => {
setState((draft) => {
draft.isAddrOpened = false
})
}}
>
<View className="curtain_content">
<View className="curtain_content_title">
<SpImage src={`member/logo-black.png`} height={32} mode='heightFix' isNew />
<Text style={{ marginLeft: '6px' }}>退货地址</Text>
</View>
<View className={`addr_item`}>
<View className="addr_item_left">收件人</View>
<View className="addr_item_right">{aftersales?.afterSalesContact}</View>
</View>
<View className={`addr_item`}>
<View className="addr_item_left">联系电话</View>
<View className="addr_item_right">{aftersales?.afterSalesMobile}</View>
</View>
<View className={`addr_item`}>
<View className="addr_item_left">收件地址</View>
<View className="addr_item_right">{aftersales?.afterSalesAddress}</View>
</View>
<View className={`addr_item`}>
<View className="addr_item_left">邮编</View>
<View className="addr_item_right">{aftersales?.afterSalesZip}</View>
</View>
<View className="fuzhi">复制地址</View>
<View className="line" style={{ margin: '130rpx 0 110rpx 0' }}></View>
<View className="curtain_content_text">
<View className="curtain_content_text_title">温馨提示</View>
<View class="receiver_item">
BIRKENSTOCK支持七天(从收到商品之日起开始计算)无理由退换货如需退换货退回货品需不影响二次销售原装鞋盒务必完好(如鞋盒有遗失需补偿20元)试穿时需将鞋盒内的包装纸垫于脚下过程中不刻意踩踏后跟如鞋面或鞋底出现脏污磨损破损鞋跟出现折痕等都将影响商品的二次销售我们将无法为您提供七天无理由退换货服务敬请谅解如果您还有其他问题或需要更多帮助可及时联系客服我们将竭诚为您服务(特别提示:仓库不接受到付平邮邮政小包)
</View>
</View>
</View>
</AtCurtain>
</SpPage>
}
TradeAfterSale.options = {
addGlobalClass: true
}
export default TradeAfterSale