import { request } from '../../utils/request' import { PagedResult, OrderItem } from '../../types/models' import { fenToYuan, formatDateTime, formatCountdown } from '../../utils/format' const STATUS_FILTERS = [ { name: '全部', value: 0 }, { name: '待支付', value: 1 }, { name: '已支付', value: 2 }, { name: '已取消', value: 3 }, { name: '已过期', value: 4 }, { name: '已退款', value: 5 }, ] const STATUS_TEXT: Record = { 1: '待支付', 2: '已支付', 3: '已取消', 4: '已过期', 5: '已退款' } const STATUS_TYPE: Record = { 1: 'orange', 2: 'green', 3: 'gray', 4: 'gray', 5: 'blue' } Page({ data: { filters: STATUS_FILTERS, activeFilter: 0, list: [] as OrderItem[], loading: true, page: 1, pageSize: 20, hasMore: true, }, onShow() { this.refresh() }, refresh() { this.setData({ page: 1, hasMore: true, loading: this.data.list.length === 0 }) this.fetchList(1) }, onReachBottom() { if (!this.data.hasMore || this.data.loading) return this.fetchList(this.data.page + 1) }, fetchList(page: number) { const params: Record = { page, page_size: this.data.pageSize } const filter = this.data.activeFilter if (filter > 0) params.status = filter request>({ url: '/order', data: params }) .then((res) => { const now = Math.floor(Date.now() / 1000) const list = res.list.map((it) => ({ ...it, _statusText: STATUS_TEXT[it.order_status] || '', _statusType: STATUS_TYPE[it.order_status] || 'gray', _amount: fenToYuan(it.pay_amount), _time: formatDateTime(it.created_at), _orderTail: `…${it.order_no.slice(-4)}`, _countdown: it.order_status === 1 && it.expire_time > now ? formatCountdown(it.expire_time - now) : '', _benefit: it.member_days > 0 ? `${it.member_days} 天会员` : '', _canCancel: it.order_status === 1 && it.pay_channel !== 2, _payChannelText: it.pay_channel === 2 ? '虚拟支付' : '', })) const merged = page === 1 ? list : this.data.list.concat(list) this.setData({ list: merged, hasMore: merged.length < res.total, loading: false, page, }) }) .catch(() => this.setData({ loading: false })) }, onFilterTap(e: WechatMiniprogram.TouchEvent) { const index = Number(e.currentTarget.dataset.index) if (index === this.data.activeFilter) return this.setData({ activeFilter: index, list: [], loading: true }) this.refresh() }, onCancel(e: WechatMiniprogram.TouchEvent) { const orderNo = e.currentTarget.dataset.no as string wx.showModal({ title: '取消订单', content: '确认取消该订单?', success: (res) => { if (!res.confirm) return request({ url: `/order/${orderNo}/cancel`, method: 'POST' }) .then(() => { wx.showToast({ title: '已取消', icon: 'success' }) this.refresh() }) .catch(() => {}) }, }) }, onPay() { wx.showToast({ title: '请返回商城重新下单支付', icon: 'none' }) }, onRefund(e: WechatMiniprogram.TouchEvent) { const orderNo = e.currentTarget.dataset.no as string wx.showModal({ title: '申请退款', editable: true, placeholderText: '请填写退款原因', success: (res) => { if (!res.confirm) return const reason = (res.content || '').trim() if (!reason) { wx.showToast({ title: '请填写退款原因', icon: 'none' }) return } request({ url: '/order/refund', method: 'POST', data: { order_no: orderNo, reason } }) .then(() => { wx.showToast({ title: '退款申请已提交,等待审核', icon: 'none' }) this.refresh() }) .catch(() => {}) }, }) }, onGoMall() { wx.navigateTo({ url: '/pages/mall/mall' }) }, })