import React, { Component } from 'react' import Taro, { getCurrentInstance } from '@tarojs/taro' import { View, ScrollView, Text } from '@tarojs/components' import { connect } from 'react-redux' import { AtTabs, AtTabsPane, AtCurtain } from 'taro-ui' import _mapKeys from 'lodash/mapKeys' import { Loading, SpNote, SpNavBar, SpPage, SpImage } from '@/components' import api from '@/api' import { withPager } from '@/hocs' import { log, pickBy, resolveOrderStatus, getCurrentRoute, classNames, isNavbar, getBrowserEnv, VERSION_PLATFORM, formatDateTime } from '@/utils' import { Tracker } from '@/service' import TradeItem from './comps/new-item' import './list.scss' @connect(({ colors }) => ({ colors: colors.current })) @withPager export default class TradeList extends Component { $instance = getCurrentInstance() constructor(props) { super(props) this.state = { ...this.state, curTabIdx: 0, tabList: [ { title: '全部', status: '0' }, { title: '待付款', status: '5' }, { title: '待发货', status: '6' }, { title: '待收货', status: '1' } ], // 是否显示待评价 evaluate: 1, list: [], rate_status: false, curItemActionsId: null, showDeliveryModal: false, deliveryList: [], deliveryName: '', deliveryCode: '' } } componentDidMount () { const { status = 0, evaluate = 1 } = this.$instance.router.params const _tabList = JSON.parse(JSON.stringify(this.state.tabList)) if (evaluate == 1) { _tabList.push({ title: '待评价', status: '7', is_rate: 0 }) _tabList.push({ title: '已完成', status: '3', is_rate: 0 }) _tabList.push({ title: '售后', status: '---', is_rate: 0 }) } const tabIdx = _tabList.findIndex((tab) => tab.status === status) if (tabIdx >= 0) { this.setState( { curTabIdx: tabIdx, list: [], evaluate, tabList: _tabList } ) } } componentDidShow () { this.resetPage() this.setState({ list: [] }) setTimeout(() => { this.nextPage() }, 500) } onPullDownRefresh = () => { Tracker.dispatch('PAGE_PULL_DOWN_REFRESH') this.refresh() } refresh = () => { Taro.showLoading({ title: '加载中', icon: 'none' }) this.resetPage(() => { this.nextPage() this.setState({ list: [] }) Taro.hideLoading() }) } componentWillUnmount () { this.hideLayer() } calcTimer (totalSec) { let remainingSec = totalSec const dd = Math.floor(totalSec / 24 / 3600) remainingSec -= dd * 3600 * 24 const hh = Math.floor(remainingSec / 3600) remainingSec -= hh * 3600 const mm = Math.floor(remainingSec / 60) remainingSec -= mm * 60 const ss = Math.floor(remainingSec) return { dd, hh, mm, ss } } async fetch (params) { const { tabList, curTabIdx } = this.state params = _mapKeys( { ...params, order_type: 'normal', status: tabList[curTabIdx].status, is_rate: tabList[curTabIdx].is_rate }, function (val, key) { if (key === 'page_no') return 'page' if (key === 'page_size') return 'pageSize' return key } ) let list = [], total = 0, rate_status = false if (params.status === '---') { // params.aftersales_status = 0 const { list: _list, total_count: _total } = await api.aftersales.list(params) list = _list total = _total rate_status = true } else { const { list: _list, pager: { count: _total }, rate_status: _rate_status } = await api.trade.list(params) list = _list total = _total rate_status = _rate_status } let nList = pickBy(list, { tid: 'order_id', status_desc: 'order_status_msg', order_status_des: 'order_status_des', aftersales_bn: ({ aftersales_bn, aftersales }) => { return aftersales_bn || aftersales?.aftersales_bn }, aftersales_type: ({ aftersales }) => { return aftersales?.aftersales_type }, status: ({ order_status }) => resolveOrderStatus(order_status), totalItems: ({ items }) => items?.reduce((acc, item) => +item.num + acc, 0), // payment: ({ item_fee_new }) => (item_fee_new / 100).toFixed(2), payment: ({ total_fee, refund_fee }) => ((+total_fee || refund_fee) / 100).toFixed(2), total_fee: 'total_fee', pay_type: 'pay_type', point: 'point', order_class: 'order_class', freight_fee: 'freight_fee', freight_type: 'freight_type', type: 'type', is_rate: 'is_rate', dada: 'dada', create_date: ({ create_date, create_time }) => { return create_date || formatDateTime(create_time * 1000) }, is_all_delivery: 'is_all_delivery', is_logistics: 'is_split', receipt_type: 'receipt_type', delivery_type: 'delivery_type', pay_status: 'pay_status', delivery_status: 'delivery_status', delivery_code: 'delivery_code', delivery_corp: 'delivery_corp', delivery_corp_name: 'delivery_corp_name', delivery_id: 'delivery_id', distributor_info: 'distributor_info', orders_delivery_id: 'orders_delivery_id', order_type: 'order_type', can_apply_cancel: 'can_apply_cancel', order: ({ items, detail }) => pickBy(items || detail, { order_id: 'order_id', item_id: 'item_id', pic_path: 'pic', title: ({ item_name, item_name_2 }) => item_name_2 || item_name, origincountry_name: 'origincountry_name', origincountry_img_url: 'origincountry_img_url', type: 'type', item_spec_desc: 'item_spec_desc', // price: ({ item_fee_new }) => (item_fee_new / 100).toFixed(2), price: ({ total_fee }) => (+total_fee / 100).toFixed(2), item_fee: 'item_fee', point: 'item_point', num: 'num', order_item_type: 'order_item_type' }), timer: ({ auto_cancel_time, create_time }) => auto_cancel_time > parseInt(new Date().getTime() / 1000) ? this.calcTimer(auto_cancel_time - parseInt(new Date().getTime() / 1000)) : null }) log.debug('[trade list] list fetched and processed: ', nList) this.setState({ list: [...this.state.list, ...nList], rateStatus: rate_status }) Taro.stopPullDownRefresh() return { total } } handleClickTab = (idx) => { this.hideLayer() if (this.state.page.isLoading) return if (idx !== this.state.curTabIdx) { this.resetPage() this.setState({ list: [] }) } this.setState( { curTabIdx: idx }, () => { this.nextPage() } ) } handleClickItem = (trade) => { const { tid, aftersales_bn } = trade let url = `/subpage/pages/trade/detail?id=${tid}` if (aftersales_bn) { url = `/subpages/trade/after-sale?aftersales_bn=${aftersales_bn}&id=${tid}` } if (trade.order_class === 'pointsmall') { url += `&type=pointitem` } Taro.navigateTo({ url }) } handleClickItemBtn = async (trade, type) => { console.log(trade) const { tid, aftersales_bn } = trade let detailUrl = `/subpage/pages/trade/detail?id=${tid}` if (trade.order_class === 'pointsmall') { detailUrl += `&type=pointitem` } if (type === 'confirm') { await api.trade.confirm(tid) const { fullPath } = getCurrentRoute(this.$instance.router) Taro.redirectTo({ url: fullPath }) return } switch (type) { case 'cancel': Taro.navigateTo({ url: `/subpage/pages/trade/cancel?order_id=${tid}` }) break case 'rate': Taro.navigateTo({ url: `/marketing/pages/item/rate?id=${tid}` }) break case 'aftersales': Taro.navigateTo({ url: `/subpages/trade/after-sale?id=${tid}&aftersales_bn=${aftersales_bn || ''}` }) break case 'delivery': { let { delivery_code, delivery_corp, delivery_corp_name, orders_delivery_id, delivery_type, is_all_delivery, tid, order_type } = trade this.handleClickDelivery(true, trade) // if (is_all_delivery || delivery_type === 'old') { // Taro.navigateTo({ // url: `/subpage/pages/trade/delivery-info?delivery_id=${orders_delivery_id}&delivery_code=${delivery_code}&delivery_corp=${delivery_corp}&delivery_name=${delivery_corp_name || delivery_corp // }&delivery_type=${delivery_type}&order_type=${order_type}&order_id=${tid}` // }) // } else { // Taro.navigateTo({ // url: `/subpage/pages/trade/split-bagpack?order_type=${order_type}&order_id=${tid}` // }) // } } break default: Taro.navigateTo({ url: detailUrl }) } } handleClickDelivery = async (flag, trade) => { if (flag) { Taro.showLoading({ title: '' }) let { delivery_type, delivery_id, order_type, tid: order_id } = trade let list = [] if (delivery_type !== 'new') { list = await api.trade.deliveryInfoNew({ delivery_id }) } else { list = await api.trade.deliveryInfo(order_type, order_id) } const nList = pickBy(list, { title: 'AcceptStation', content: ({ AcceptTime }) => AcceptTime ? AcceptTime.substring(5, 16) : '' }) this.setState({ deliveryList: nList, deliveryName: trade.delivery_corp_name, deliveryCode: trade.delivery_code }) } this.setState({ showDeliveryModal: flag }) Taro.hideLoading() // Taro.navigateTo({ // url: `/subpage/pages/trade/delivery-info?order_type=${this.state.info.order_type}&order_id=${this.state.info.tid}&delivery_code=${this.state.info.delivery_code}&delivery_corp=${this.state.info.delivery_corp}&delivery_name=${this.state.info.delivery_name}` // }) } handleActionClick = (type, item) => { this.hideLayer() } handleActionBtnClick = (item) => { this.setState({ curItemActionsId: item.tid }) } hideLayer = () => { this.setState({ curItemActionsId: null }) } render () { const { colors } = this.props const { curTabIdx, curItemActionsId, tabList, list = [], page, rateStatus, evaluate, showDeliveryModal, deliveryList, info = {}, deliveryName, deliveryCode } = this.state return ( {tabList.map((panes, pIdx) => ( ))} {list.map((item) => { return ( ) })} {page.isLoading && 正在加载...} {!page.isLoading && !page.hasNext && !list.length && ( 您的{curTabIdx != '0' ? tabList[curTabIdx].title : ''}订单为空 )} {!!curItemActionsId && } { this.setState({ showDeliveryModal: false }) }} > 物流信息 {deliveryName}:{deliveryCode} {deliveryList.map((item, index) => {item.content} {item.title} )} ) } }