<template>
|
<view class="page"><view class="nav"><view @tap="goBack">返回</view><text>商户提现</text><view></view></view><view class="balance"><text>当前可提</text><text class="amount">¥{{amount}}</text><view class="button" @tap="startWithdrawal">提现</view></view><view class="heading"><text>提现记录</text><text>共 {{records.length}} 条</text></view><scroll-view class="scroll" scroll-y="true"><view v-if="loading" class="state">正在加载</view><view v-else-if="records.length == 0" class="state">暂无提现记录</view><view v-for="item in records" :key="item.id" class="record"><view><text>提现</text><text class="money">¥{{format(item.amountCents)}}</text></view><view class="record-bottom"><text>{{displayTime(item)}} {{item.cardMasked}}</text><text :class="'status ' + item.status">{{statusText(item.status)}}</text></view><text v-if="item.reason.length > 0" class="reason">{{item.reason}}</text></view></scroll-view></view>
|
</template>
|
<script setup lang="uts">
|
import { loadOnboardingStatus, loadWithdrawalSummary, loadWithdrawals, SettlementWithdrawal } from '../../services/settlement.uts'
|
const loading = ref(true); const available = ref(0); const onboardingStatus = ref('unsubmitted'); const records = ref<Array<SettlementWithdrawal>>([])
|
const amount = computed(() => (available.value / 100).toFixed(2)); const format = (cents: number): string => (cents / 100).toFixed(2); const formatTime = (value: string): string => value.replace('T', ' ')
|
const statusText = (value: string): string => value == 'paid' ? '已到账' : value == 'processing' ? '到账处理中' : value == 'rejected' ? '已驳回' : value == 'failed' ? '提现失败' : '待审核'
|
const displayTime = (item: SettlementWithdrawal): string => item.status == 'paid' && item.paidAt.length > 0 ? '到账 ' + formatTime(item.paidAt) : formatTime(item.createdAt)
|
const goBack = () => uni.navigateBack()
|
const startWithdrawal = () => { if (onboardingStatus.value == 'approved') { uni.navigateTo({ url: '/pages/withdrawal-detail/withdrawal-detail' }); return }; if (onboardingStatus.value == 'pending') { uni.navigateTo({ url: '/pages/merchant-onboarding-pending/merchant-onboarding-pending' }); return }; uni.navigateTo({ url: '/pages/merchant-onboarding/merchant-onboarding' }) }
|
const load = () => { loading.value = true; loadOnboardingStatus((item) => { onboardingStatus.value = item.status }, () => {}); loadWithdrawalSummary((data: any) => { available.value = Number(data.availableAmountCents || 0) }, () => {}); loadWithdrawals(1, 50, (data) => { records.value = data.records; loading.value = false }, (error: any) => { loading.value = false; uni.showToast({ title: error.message || '提现记录加载失败', icon: 'none' }) }) }
|
onShow(() => load())
|
</script>
|
<style>.page{height:100vh;background:#f4f6f9}.nav{height:174rpx;padding:68rpx 38rpx 0;display:flex;justify-content:space-between;align-items:center;box-sizing:border-box;color:#202b3e;font-size:32rpx;font-weight:700}.nav view{width:80rpx;font-size:25rpx}.balance{margin:0 34rpx;padding:38rpx 32rpx;background:#fff;border-radius:34rpx;text-align:center;color:#7d8797}.amount{display:block;margin:15rpx 0;color:#273345;font-size:58rpx;font-weight:700}.button{height:88rpx;border-radius:44rpx;background:#ff7625;color:#fff;line-height:88rpx;font-weight:700}.heading{display:flex;justify-content:space-between;padding:35rpx 42rpx 18rpx;color:#273345;font-size:30rpx;font-weight:700}.heading text:last-child{color:#a0a9b7;font-size:24rpx}.scroll{height:calc(100vh - 555rpx);padding:0 34rpx;box-sizing:border-box}.record{padding:26rpx 28rpx;margin-bottom:1rpx;background:#fff}.record view{display:flex;justify-content:space-between;color:#2c3748;font-size:28rpx;font-weight:700}.record-bottom{margin-top:18rpx!important;color:#7e8999!important;font-size:23rpx!important;font-weight:400!important}.money{font-weight:700}.status{font-weight:700}.pending,.processing{color:#e58b28}.paid{color:#249765}.rejected,.failed,.reason{color:#e95b5b}.reason{display:block;margin-top:8rpx;font-size:22rpx}.state{padding:120rpx;text-align:center;color:#8993a1}</style>
|