|
|
@@ -1,403 +1,683 @@
|
|
|
<template>
|
|
|
<cwg-page-wrapper class="create-page" :isHeaderFixed="true">
|
|
|
<cwg-header :title="t('Documentary.TundManagement.item2')" />
|
|
|
- <view class="info-card">
|
|
|
- <cwg-complex-search :fields="filterFields" v-model="searchParams" @search="handleSearch"
|
|
|
- @reset="handleReset" />
|
|
|
- <cwg-tabel ref="tableRef" :columns="currentColumns" :immediate="false" :queryParams="search" :api="listApi"
|
|
|
- :show-operation="false">
|
|
|
- <!-- 状态列自定义渲染 -->
|
|
|
- <template #status="{ row }">
|
|
|
- <view v-if="getStatusText(row)" class="status-tag" :class="getStatusClass(row.status)">
|
|
|
- {{ getStatusText(row) }}
|
|
|
+ <uni-loading v-if="loading" />
|
|
|
+ <view id="custom_WalletTransfer" class="transfer-page" v-else>
|
|
|
+ <view class="main-content">
|
|
|
+ <view class="box box-step2">
|
|
|
+ <view class="b-card">
|
|
|
+ <view class="card-top">
|
|
|
+ <uni-forms ref="formRef" :model="form" :rules="rules" label-position="top"
|
|
|
+ validate-trigger="submit">
|
|
|
+
|
|
|
+ <view class="card-row card-tit">
|
|
|
+ <view class="title-wrapper">
|
|
|
+ <view class="tit">
|
|
|
+ <text class="iconfont icon-caret-right"></text>
|
|
|
+ <span>{{ t('wallet.item63') }}</span>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="card-row">
|
|
|
+ <uni-forms-item name="walletbalance">
|
|
|
+ <uni-easyinput v-model="walletbalanceDisplay" disabled class="disabled-input" />
|
|
|
+ </uni-forms-item>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <view class="card-row card-tit">
|
|
|
+ <view class="title-wrapper">
|
|
|
+ <view class="tit">
|
|
|
+ <text class="iconfont icon-caret-right"></text>
|
|
|
+ <span>{{ t('Custom.Transfer.IntoAccount') }}</span>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="card-row">
|
|
|
+ <uni-forms-item name="login">
|
|
|
+ <cwg-combox v-model:value="form.login" :clearable="false"
|
|
|
+ :options="toOptionsDisplay" :placeholder="t('placeholder.choose')" />
|
|
|
+ </uni-forms-item>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <view class="card-row card-tit">
|
|
|
+ <view class="title-wrapper">
|
|
|
+ <view class="tit">
|
|
|
+ <text class="iconfont icon-caret-right"></text>
|
|
|
+ <span>{{ t('Label.Amount') }}</span>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="card-row amount-box">
|
|
|
+ <uni-forms-item name="amount" :error-message="amountErrorMessage"
|
|
|
+ class="amount-input">
|
|
|
+ <uni-easyinput v-model="form.amount" :placeholder="t('placeholder.input')"
|
|
|
+ @blur="validateAmount" />
|
|
|
+ </uni-forms-item>
|
|
|
+ <view class="btn" v-t="'State.All'" @click="setAllAmount"></view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <view class="form-row">
|
|
|
+ <button class="s-btn reselect" type="primary" @click="toTransfer">{{ t('Btn.Submit')
|
|
|
+ }}</button>
|
|
|
+ </view>
|
|
|
+ </uni-forms>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
- <view v-else></view>
|
|
|
- </template>
|
|
|
- <!-- 账户类型列自定义渲染 -->
|
|
|
- <template #accountType="{ row }">
|
|
|
- {{ getAccountTypeText(row.type || row.loginType) }}
|
|
|
- </template>
|
|
|
- <!-- 金额列格式化 -->
|
|
|
- <template #amount="{ row }">
|
|
|
- <view>-{{ formatNumber(row.withdrawAmount || row.amount) }}</view>
|
|
|
- </template>
|
|
|
- <!-- 备注列格式化 -->
|
|
|
- <template #note="{ row }">
|
|
|
- <view>{{ formatNote(row.approveDesc) }}</view>
|
|
|
- </template>
|
|
|
- </cwg-tabel>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <!-- 失败弹窗 -->
|
|
|
+ <cwg-error-popup v-model:visible="dialogError" @confirm="closeDia" :responseMessage="RES" />
|
|
|
+ <!-- 成功弹窗 -->
|
|
|
+ <cwg-success-popup v-model:visible="dialogSuccess" @confirm="closeDia" />
|
|
|
+ <!-- 等待弹窗 -->
|
|
|
+ <cwg-wait-popup v-model:visible="dialogCheckWait" type="center" :mask-click="false" :showFooters="false" />
|
|
|
</view>
|
|
|
</cwg-page-wrapper>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { computed, ref, nextTick } from 'vue';
|
|
|
-import { useI18n } from 'vue-i18n';
|
|
|
-const { t, locale } = useI18n();
|
|
|
-import { customApi } from '@/service/custom';
|
|
|
-import useUserStore from "@/stores/use-user-store";
|
|
|
-const userStore = useUserStore();
|
|
|
-const userInfo = computed(() => userStore.userInfo);
|
|
|
-const search = ref({
|
|
|
- type: 1
|
|
|
+import { ref, reactive, computed, onMounted } from 'vue'
|
|
|
+import { useI18n } from 'vue-i18n'
|
|
|
+import { customApi } from '@/service/custom'
|
|
|
+import { documentaryApi } from '@/service/documentary'
|
|
|
+import Config from '@/config/index'
|
|
|
+
|
|
|
+const { Code } = Config
|
|
|
+const { t } = useI18n()
|
|
|
+
|
|
|
+const loading = ref(false)
|
|
|
+const flag = ref(false)
|
|
|
+const RES = ref('')
|
|
|
+const walletbalance = ref('0')
|
|
|
+const toOptions = ref([])
|
|
|
+
|
|
|
+const form = reactive({
|
|
|
+ currency: 'USD',
|
|
|
+ login: null,
|
|
|
+ amount: ''
|
|
|
})
|
|
|
-const getInfoAgentTransfer = computed(() => userInfo.value.customInfo?.agentTransfer)
|
|
|
-const typeMap = computed(() => ([
|
|
|
- { value: 1, text: t('Custom.Recording.NewAccount') },
|
|
|
- { value: 2, text: t('Custom.Recording.LeverageApply') },
|
|
|
- { value: 3, text: t('Custom.Recording.InternalTransfer') },
|
|
|
- { value: 4, text: t('Custom.Recording.ActivitiesApply') },
|
|
|
- ...(getInfoAgentTransfer.value == 1 ? [{ value: 5, text: t('Home.page_ib.item9') }] : [])
|
|
|
-]));
|
|
|
-const isZh = computed(() => ['cn', 'zh', 'zhHant'].includes(locale.value));
|
|
|
-
|
|
|
-// 账户类型映射
|
|
|
-const accountTypeMap = {
|
|
|
- 1: 'AccountType.ClassicAccount',
|
|
|
- 2: 'AccountType.SeniorAccount',
|
|
|
- 5: 'AccountType.SpeedAccount',
|
|
|
- 6: 'AccountType.SpeedAccount',
|
|
|
- 7: 'AccountType.StandardAccount',
|
|
|
- 8: 'AccountType.CentAccount'
|
|
|
+
|
|
|
+const currencyOptions = [{ text: 'USD', value: 'USD' }]
|
|
|
+
|
|
|
+const walletbalanceDisplay = computed(() => `$ ${walletbalance.value}`)
|
|
|
+
|
|
|
+const groupTypeName = (type) => {
|
|
|
+ if (type == '1') return t("AccountType.ClassicAccount")
|
|
|
+ if (type == '2') return t("AccountType.SeniorAccount")
|
|
|
+ if (type == '5') return t("AccountType.SpeedAccount")
|
|
|
+ if (type == '6') return t("AccountType.SpeedAccount")
|
|
|
+ if (type == '7') return t("AccountType.StandardAccount")
|
|
|
+ if (type == '8') return t("AccountType.CentAccount")
|
|
|
+ return ''
|
|
|
}
|
|
|
-// 拒绝原因映射(示例)
|
|
|
-const reasons = ref({})
|
|
|
-// 根据类型获取列配置
|
|
|
-const getColumnsByType = (type: number) => {
|
|
|
- switch (type) {
|
|
|
- case 1: // 开户记录
|
|
|
- return [
|
|
|
- {
|
|
|
- prop: 'platform',
|
|
|
- label: t('Custom.Recording.Platform'),
|
|
|
- align: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'type',
|
|
|
- label: t('Custom.PaymentHistory.payType'),
|
|
|
- align: 'left',
|
|
|
- slot: 'accountType'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'withdrawCurrency',
|
|
|
- label: t('Custom.Recording.CurrencyType'),
|
|
|
- align: 'left',
|
|
|
- formatter: ({ row }) => row.currency || '--',
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'leverage',
|
|
|
- label: t('Custom.Recording.Lever'),
|
|
|
- formatter: ({ row }) => `1: ${row.leverage}` || '--',
|
|
|
- align: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'addTime',
|
|
|
- label: t('Custom.PaymentHistory.ApplicationDate'),
|
|
|
- type: 'date',
|
|
|
- dateFormat: 'YYYY-MM-DD HH:mm',
|
|
|
- align: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'status',
|
|
|
- label: t('Custom.Recording.Status'),
|
|
|
- slot: 'status',
|
|
|
- align: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'note',
|
|
|
- label: t('Custom.Recording.Note'),
|
|
|
- type: 'note',
|
|
|
- align: 'left'
|
|
|
- }
|
|
|
- ]
|
|
|
- case 2: // 杠杆修改记录
|
|
|
- return [
|
|
|
- {
|
|
|
- prop: 'login',
|
|
|
- label: t('Custom.Recording.TradingAccount'),
|
|
|
- align: 'left',
|
|
|
- formatter: ({ row }) => row.login || '--'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'oldLeverage',
|
|
|
- label: t('Custom.Recording.OldLever'),
|
|
|
- align: 'left',
|
|
|
- formatter: ({ row }) => row.oldLeverage ? `1:${row.oldLeverage}` : '--'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'newLeverage',
|
|
|
- label: t('Custom.Recording.NewLever'),
|
|
|
- align: 'left',
|
|
|
- formatter: ({ row }) => row.newLeverage ? `1:${row.newLeverage}` : '--'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'addTime',
|
|
|
- label: t('Custom.PaymentHistory.ApplicationDate'),
|
|
|
- type: 'date',
|
|
|
- dateFormat: 'YYYY-MM-DD HH:mm',
|
|
|
- align: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'status',
|
|
|
- label: t('Custom.PaymentHistory.Status'),
|
|
|
- slot: 'status',
|
|
|
- align: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'note',
|
|
|
- label: t('Custom.Recording.Note'),
|
|
|
- type: 'note',
|
|
|
- align: 'left'
|
|
|
- }
|
|
|
- ]
|
|
|
- case 3: // 转账记录
|
|
|
- case 5: // 内部转账记录
|
|
|
- return [
|
|
|
- {
|
|
|
- prop: 'withdrawLogin',
|
|
|
- label: t('Custom.Recording.TransferAccounts'),
|
|
|
- align: 'left',
|
|
|
- formatter: ({ row }) => row.withdrawLogin || '--'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'depositLogin',
|
|
|
- label: t('Custom.Recording.IntoAccount'),
|
|
|
- align: 'left',
|
|
|
- formatter: ({ row }) => row.depositLogin || '--',
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'withdrawCurrency',
|
|
|
- label: t('Custom.Recording.CurrencyType'),
|
|
|
- align: 'left',
|
|
|
- formatter: ({ row }) => row.withdrawCurrency || '--',
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'withdrawAmount',
|
|
|
- label: t('Custom.Recording.Amount'),
|
|
|
- align: 'left',
|
|
|
- slot: 'amount'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'addTime',
|
|
|
- label: t('Custom.PaymentHistory.ApplicationDate'),
|
|
|
- type: 'date',
|
|
|
- dateFormat: 'YYYY-MM-DD HH:mm',
|
|
|
- align: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'status',
|
|
|
- label: t('Custom.PaymentHistory.Status'),
|
|
|
- slot: 'status',
|
|
|
- align: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'note',
|
|
|
- label: t('Custom.Recording.Note'),
|
|
|
- type: 'note',
|
|
|
- align: 'left'
|
|
|
- }
|
|
|
- ]
|
|
|
- case 4: // 活动申请记录
|
|
|
- return [
|
|
|
- {
|
|
|
- prop: 'login',
|
|
|
- label: t('Custom.Recording.TradingAccount'),
|
|
|
- align: 'left',
|
|
|
- formatter: ({ row }) => row.login || '--'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'loginType',
|
|
|
- label: t('Custom.Recording.AccountType'),
|
|
|
- align: 'left',
|
|
|
- slot: 'accountType'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'title',
|
|
|
- label: t('Custom.Recording.ActivityName'),
|
|
|
- align: 'left',
|
|
|
- formatter: ({ row }) => row.title || '--'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'addTime',
|
|
|
- label: t('Custom.PaymentHistory.ApplicationDate'),
|
|
|
- type: 'date',
|
|
|
- dateFormat: 'YYYY-MM-DD HH:mm',
|
|
|
- align: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'status',
|
|
|
- label: t('Custom.PaymentHistory.Status'),
|
|
|
- slot: 'status',
|
|
|
- align: 'left'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'note',
|
|
|
- label: t('Custom.Recording.Note'),
|
|
|
- type: 'note',
|
|
|
- align: 'left'
|
|
|
+
|
|
|
+// 单位类型
|
|
|
+function groupCurrency(type) {
|
|
|
+ const map = { GBP: ': £', USD: ': $', EUR: ': €', USC: ': ¢' }
|
|
|
+ return map[type] || ': $'
|
|
|
+}
|
|
|
+const toOptionsDisplay = computed(() => {
|
|
|
+ return toOptions.value.map(item => ({
|
|
|
+ text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
|
|
|
+ value: item.login
|
|
|
+ }))
|
|
|
+})
|
|
|
+
|
|
|
+const dialogCheck = ref(false)
|
|
|
+const dialogVisible = ref(false)
|
|
|
+const dialogCheckWait = ref(false)
|
|
|
+
|
|
|
+const dialogSuccess = computed(() => dialogCheck.value && dialogVisible.value)
|
|
|
+const dialogError = computed(() => dialogCheck.value && !dialogVisible.value)
|
|
|
+
|
|
|
+const rules = {
|
|
|
+ login: {
|
|
|
+ rules: [{ required: true, errorMessage: t('vaildate.select.empty') }]
|
|
|
+ },
|
|
|
+ currency: {
|
|
|
+ rules: [{ required: true, errorMessage: t('vaildate.select.empty') }]
|
|
|
+ },
|
|
|
+ amount: {
|
|
|
+ rules: [
|
|
|
+ { required: true, errorMessage: t('vaildate.amount.format') },
|
|
|
+ {
|
|
|
+ validateFunction: (rule, value, data, callback) => {
|
|
|
+ if (!value) {
|
|
|
+ callback(t('vaildate.amount.format'))
|
|
|
+ } else if (!/^[0-9]+([.]{1}[0-9]{1,2})?$/.test(value)) {
|
|
|
+ callback(t('vaildate.amount.format'))
|
|
|
+ }
|
|
|
+ return true
|
|
|
}
|
|
|
- ]
|
|
|
+ }
|
|
|
+ ]
|
|
|
}
|
|
|
}
|
|
|
-// 动态传入筛选字段配置
|
|
|
-const filterFields = computed(() => [
|
|
|
- { key: 'type', type: 'select', label: t('Custom.PaymentHistory.payType'), placeholder: t('placeholder.choose'), options: typeMap.value, defaultValue: 1 },
|
|
|
- { key: 'date', label: t('placeholder.Start') + ' - ' + t('placeholder.End'), type: 'daterange' }
|
|
|
-])
|
|
|
-const searchParams = ref({})
|
|
|
-const tableRef = ref(null)
|
|
|
-const handleSearch = (params) => {
|
|
|
- search.value = params
|
|
|
- nextTick(() => {
|
|
|
- tableRef.value.refreshTable()
|
|
|
- })
|
|
|
+const amountErrorMessage = ref('')
|
|
|
+const setAllAmount = () => {
|
|
|
+ form.amount = walletbalance.value.toFixed(2)
|
|
|
+ validateAmount()
|
|
|
}
|
|
|
-
|
|
|
-const handleReset = (params) => {
|
|
|
- search.value = params
|
|
|
- nextTick(() => {
|
|
|
- tableRef.value.refreshTable()
|
|
|
- })
|
|
|
-}
|
|
|
-// 当前列配置
|
|
|
-const currentColumns = computed(() => getColumnsByType(search.value.type))
|
|
|
-// 获取状态文本
|
|
|
-const getStatusText = (row: any) => {
|
|
|
- const status = row.status
|
|
|
- // 根据不同记录类型处理状态
|
|
|
- if (search.value.type === 1) {
|
|
|
- if (status === 1) return t('State.ToBeProcessed')
|
|
|
- if (status === 2 && row.accountStatus === 2) return t('State.Completed')
|
|
|
- if (status === 2 && (row.accountStatus === 1 || !row.accountStatus)) return t('State.InTheProcessing')
|
|
|
- if (status === 3) return t('State.Refused')
|
|
|
- } else if (search.value.type === 2) {
|
|
|
- if (status === 1) return t('State.ToBeProcessed')
|
|
|
- if (status === 2 && row.leverageStatus === 2) return t('State.Completed')
|
|
|
- if (status === 2 && row.leverageStatus === 1) return t('State.InTheProcessing')
|
|
|
- if (status === 3) return t('State.Refused')
|
|
|
- } else if (search.value.type === 3 || search.value.type === 5) {
|
|
|
- if (status === 1) return t('State.ToBeProcessed')
|
|
|
- if (status === 2 && row.withdrawStatus === 2 && row.depositStatus === 2) return t('State.Completed')
|
|
|
- if (status === 2 && (row.withdrawStatus === 1 || row.depositStatus === 1)) return t('State.InTheProcessing')
|
|
|
- if (status === 3 || row.withdrawStatus === 3 || row.depositStatus === 3) return t('State.Refused')
|
|
|
- } else {
|
|
|
- // 活动申请等
|
|
|
- if (status === 1) return t('State.ToBeProcessed')
|
|
|
- if (status === 2) return t('State.Completed')
|
|
|
- if (status === 3) return t('State.Refused')
|
|
|
+function validateAmount() {
|
|
|
+ const value = form.amount
|
|
|
+ if (!value) {
|
|
|
+ amountErrorMessage.value = t('vaildate.amount.format')
|
|
|
+ return false
|
|
|
+ } else if (!/^[0-9]+([.]{1}[0-9]{1,2})?$/.test(value)) {
|
|
|
+ amountErrorMessage.value = t('vaildate.amount.format')
|
|
|
}
|
|
|
- return ''
|
|
|
+ amountErrorMessage.value = ''
|
|
|
+ return true
|
|
|
}
|
|
|
-// 获取状态样式类
|
|
|
-const getStatusClass = (status: number) => {
|
|
|
- const classMap: Record<number, string> = {
|
|
|
- 1: 'status-pending',
|
|
|
- 2: 'status-success',
|
|
|
- 3: 'status-processing',
|
|
|
- 4: 'status-danger'
|
|
|
+const formRef = ref(null)
|
|
|
+
|
|
|
+const closeDia = () => {
|
|
|
+ if (formRef.value) {
|
|
|
+ form.amount = ''
|
|
|
+ form.login = null
|
|
|
+ amountErrorMessage.value = ''
|
|
|
+ formRef.value.clearValidate()
|
|
|
}
|
|
|
- return classMap[status] || ''
|
|
|
+ dialogCheck.value = false
|
|
|
+ dialogVisible.value = false
|
|
|
}
|
|
|
-// 获取账户类型文本
|
|
|
-const getAccountTypeText = (type: number) => {
|
|
|
- const key = accountTypeMap[type as keyof typeof accountTypeMap]
|
|
|
- return key ? t(key) : '--'
|
|
|
+
|
|
|
+const toTransfer = async () => {
|
|
|
+ try {
|
|
|
+ await formRef.value.validate()
|
|
|
+
|
|
|
+ if (walletbalance.value == '0' || Number(walletbalance.value) < Number(form.amount)) {
|
|
|
+ uni.showToast({ title: t('wallet.item64'), icon: 'none' })
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if (flag.value) return
|
|
|
+ flag.value = true
|
|
|
+ dialogCheckWait.value = true
|
|
|
+
|
|
|
+ let res = await documentaryApi.followTransferApply({
|
|
|
+ transferType: 2,
|
|
|
+ ...form
|
|
|
+ })
|
|
|
+
|
|
|
+ if (res.code == Code.StatusOK) {
|
|
|
+ dialogCheck.value = true
|
|
|
+ dialogVisible.value = true
|
|
|
+ flag.value = false
|
|
|
+ getWalletList() // refresh balance after success
|
|
|
+ } else {
|
|
|
+ RES.value = res.msg
|
|
|
+ dialogCheck.value = true
|
|
|
+ dialogVisible.value = false
|
|
|
+ flag.value = false
|
|
|
+ }
|
|
|
+ dialogCheckWait.value = false
|
|
|
+ } catch (e) {
|
|
|
+ if (e.code == 400) {
|
|
|
+ dialogCheckWait.value = false
|
|
|
+ RES.value = e.msg
|
|
|
+ dialogCheck.value = true
|
|
|
+ dialogVisible.value = false
|
|
|
+ flag.value = false
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-// 格式化数字
|
|
|
-const formatNumber = (value: string | number) => {
|
|
|
- if (!value) return '--'
|
|
|
- const num = Number(value)
|
|
|
- return isNaN(num) ? '--' : num.toFixed(2)
|
|
|
+
|
|
|
+const getToDateList = async () => {
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ let res = await documentaryApi.CustomDropdown({})
|
|
|
+ if (res.code == Code.StatusOK) {
|
|
|
+ toOptions.value = res.data || []
|
|
|
+ } else {
|
|
|
+ uni.showToast({ title: res.msg, icon: 'none' })
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e)
|
|
|
+ }
|
|
|
+ loading.value = false
|
|
|
}
|
|
|
-// 格式化备注
|
|
|
-const formatNote = (approveDesc: string) => {
|
|
|
- if (!approveDesc) return '--'
|
|
|
- const reason = reasons.value[approveDesc as keyof typeof reasons.value]
|
|
|
- if (reason) {
|
|
|
- return isZh.value ? reason.content : reason.enContent
|
|
|
+
|
|
|
+const getWalletList = async () => {
|
|
|
+ try {
|
|
|
+ let res = await documentaryApi.followWalletSingle({})
|
|
|
+ if (res.code == Code.StatusOK) {
|
|
|
+ walletbalance.value = res.data != null ? res.data.walletAmount : '0'
|
|
|
+ } else {
|
|
|
+ uni.showToast({ title: res.msg, icon: 'none' })
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e)
|
|
|
}
|
|
|
- return approveDesc
|
|
|
}
|
|
|
-const listApi = ref(null)
|
|
|
-listApi.value = customApi.CustomRecordAccount
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ getToDateList()
|
|
|
+ getWalletList()
|
|
|
+})
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
@import "@/uni.scss";
|
|
|
|
|
|
-.avatar {
|
|
|
- width: px2rpx(60);
|
|
|
- height: px2rpx(60);
|
|
|
- border-radius: 4px;
|
|
|
-}
|
|
|
+.transfer-page {
|
|
|
+ width: 100%;
|
|
|
+ padding-bottom: px2rpx(20);
|
|
|
|
|
|
-.content-title {
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
- font-size: px2rpx(20);
|
|
|
- font-weight: 500;
|
|
|
-
|
|
|
- .content-title-btns {
|
|
|
- margin: px2rpx(8) 0;
|
|
|
-
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- gap: px2rpx(12);
|
|
|
-
|
|
|
- .btn-primary {
|
|
|
- min-width: px2rpx(120);
|
|
|
- background-color: var(--color-error);
|
|
|
- color: white;
|
|
|
- padding: 0 px2rpx(12);
|
|
|
- border: none;
|
|
|
- font-size: px2rpx(14);
|
|
|
- text-align: center;
|
|
|
- cursor: pointer;
|
|
|
+ .main-content {
|
|
|
+ text-align: left;
|
|
|
+
|
|
|
+ .box {
|
|
|
+ padding-top: px2rpx(5);
|
|
|
+ color: #303133;
|
|
|
+
|
|
|
+ .b-card {
|
|
|
+ background-color: #fff;
|
|
|
+ margin-bottom: px2rpx(10);
|
|
|
+ border-radius: px2rpx(6);
|
|
|
+ box-shadow: 0 px2rpx(1) px2rpx(6) 0 rgba(0, 0, 0, 0.05);
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ box-shadow: 0 px2rpx(2) px2rpx(8) 0 rgba(0, 0, 0, 0.1);
|
|
|
+ }
|
|
|
+
|
|
|
+ .card-top {
|
|
|
+ padding: px2rpx(15) px2rpx(20);
|
|
|
+
|
|
|
+ .card-row {
|
|
|
+ margin-bottom: px2rpx(30);
|
|
|
+
|
|
|
+ &:last-child {
|
|
|
+ margin-bottom: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .amount-box {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: px2rpx(12);
|
|
|
+
|
|
|
+ .amount-input {
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ .btn {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ font-size: px2rpx(14);
|
|
|
+ color: var(--color-zinc-600);
|
|
|
+ margin-bottom: px2rpx(22);
|
|
|
+ height: px2rpx(35);
|
|
|
+ background-color: #cf1322;
|
|
|
+ color: #fff;
|
|
|
+ border-radius: px2rpx(4);
|
|
|
+ font-weight: 600;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ border: none;
|
|
|
+ padding: 0 px2rpx(20);
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .card-tit {
|
|
|
+ margin-bottom: px2rpx(0) !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .tit {
|
|
|
+ font-size: px2rpx(16);
|
|
|
+ font-weight: 600;
|
|
|
+ margin-bottom: px2rpx(16);
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ color: var(--color-navy-900);
|
|
|
+ position: relative;
|
|
|
+ padding-left: 20px;
|
|
|
+
|
|
|
+ &:after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: 50%;
|
|
|
+ transform: translateY(-50%);
|
|
|
+ width: 0;
|
|
|
+ height: 0;
|
|
|
+ border-top: 6px solid transparent;
|
|
|
+ border-bottom: 6px solid transparent;
|
|
|
+ border-left: 8px solid currentColor;
|
|
|
+ }
|
|
|
+
|
|
|
+ .iconfont {
|
|
|
+ margin-right: px2rpx(8);
|
|
|
+ color: var(--color-primary);
|
|
|
+ font-size: px2rpx(18);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .title-wrapper {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .box-step2 {
|
|
|
+ .form-row {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ margin-bottom: px2rpx(12);
|
|
|
+ gap: px2rpx(12);
|
|
|
+
|
|
|
+ &:last-child {
|
|
|
+ margin-bottom: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .form-col {
|
|
|
+ flex: 1;
|
|
|
+ min-width: px2rpx(140);
|
|
|
+
|
|
|
+ @media screen and (max-width: 991px) {
|
|
|
+ flex: 0 0 100%;
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .form-col-full {
|
|
|
+ width: 100%;
|
|
|
+ padding: 0 px2rpx(5);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .tips {
|
|
|
+ line-height: 1.8;
|
|
|
+ font-size: px2rpx(12);
|
|
|
+ color: #909399;
|
|
|
+ background-color: #f9f9f9;
|
|
|
+ padding: px2rpx(12);
|
|
|
+ border-radius: px2rpx(4);
|
|
|
+ border-left: px2rpx(2) solid #cf1322;
|
|
|
+
|
|
|
+ .title {
|
|
|
+ font-weight: 600;
|
|
|
+ margin-bottom: px2rpx(6);
|
|
|
+ color: #606266;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .picker-select {
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ border: 1px solid #dcdfe6;
|
|
|
+ border-radius: px2rpx(4);
|
|
|
+ padding: px2rpx(12) px2rpx(14);
|
|
|
+ font-size: px2rpx(14);
|
|
|
+ color: #606266;
|
|
|
+ line-height: 1.4;
|
|
|
+ width: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ border-color: #409eff;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.picker-disabled {
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ color: #c0c4cc;
|
|
|
+ cursor: not-allowed;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .disabled-input {
|
|
|
+ // background-color: #f5f7fa;
|
|
|
+ // border: 1px solid #dcdfe6;
|
|
|
+ border-radius: px2rpx(4);
|
|
|
+ // padding: px2rpx(12) px2rpx(14);
|
|
|
+ font-size: px2rpx(14);
|
|
|
+ color: #606266;
|
|
|
+ width: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+
|
|
|
+ .m-input {
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ border: 1px solid #dcdfe6;
|
|
|
+ border-radius: px2rpx(4);
|
|
|
+ padding: px2rpx(12) px2rpx(14);
|
|
|
+ font-size: px2rpx(14);
|
|
|
+ width: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+
|
|
|
+ &:focus {
|
|
|
+ border-color: #409eff;
|
|
|
+ outline: none;
|
|
|
+ box-shadow: 0 0 0 px2rpx(1) rgba(64, 158, 255, 0.2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ .popup-content {
|
|
|
+ padding: px2rpx(30) px2rpx(20);
|
|
|
+ text-align: center;
|
|
|
+ min-width: px2rpx(250);
|
|
|
+ max-width: 80%;
|
|
|
+ margin: 0 auto;
|
|
|
+
|
|
|
+ @media screen and (max-width: 991px) {
|
|
|
+ min-width: 80%;
|
|
|
+ max-width: 90%;
|
|
|
+ margin: 0 px2rpx(10);
|
|
|
+ }
|
|
|
+
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ .icon {
|
|
|
+ .iconfont {
|
|
|
+ font-size: px2rpx(60);
|
|
|
+ display: block;
|
|
|
+ margin: 0 auto;
|
|
|
+ }
|
|
|
+
|
|
|
+ .icon-chenggong {
|
|
|
+ color: #67c23a;
|
|
|
+ }
|
|
|
+
|
|
|
+ .icon-jingshi {
|
|
|
+ color: #f56c6c;
|
|
|
+ }
|
|
|
+
|
|
|
+ .icon-dengdai {
|
|
|
+ color: #e6a23c;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .des1 {
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: px2rpx(16);
|
|
|
+ margin: px2rpx(20) 0 px2rpx(15);
|
|
|
+ color: #303133;
|
|
|
+ line-height: 1.4;
|
|
|
+ padding: 0 px2rpx(10);
|
|
|
+ }
|
|
|
+
|
|
|
+ .dialog-footer {
|
|
|
display: flex;
|
|
|
- align-items: center;
|
|
|
justify-content: center;
|
|
|
- gap: px2rpx(8);
|
|
|
+ gap: px2rpx(10);
|
|
|
+ margin-top: px2rpx(10);
|
|
|
+
|
|
|
+ @media (max-width: 750rpx) {
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ gap: px2rpx(6);
|
|
|
+ }
|
|
|
+
|
|
|
+ button {
|
|
|
+ min-width: px2rpx(90);
|
|
|
+ padding: 0 px2rpx(12);
|
|
|
+ border-radius: px2rpx(4);
|
|
|
+ font-size: px2rpx(14);
|
|
|
+ transition: all 0.3s ease;
|
|
|
+ cursor: pointer;
|
|
|
+
|
|
|
+ &[type="primary"] {
|
|
|
+ background-color: #409eff;
|
|
|
+ color: #fff;
|
|
|
+ border: none;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ background-color: #66b1ff;
|
|
|
+ transform: translateY(px2rpx(-1));
|
|
|
+ box-shadow: 0 px2rpx(2) px2rpx(6) 0 rgba(64, 158, 255, 0.3);
|
|
|
+ }
|
|
|
+
|
|
|
+ &:active {
|
|
|
+ background-color: #3a8ee6;
|
|
|
+ transform: translateY(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &:not([type="primary"]) {
|
|
|
+ background-color: #fff;
|
|
|
+ border: 1px solid #dcdfe6;
|
|
|
+ color: #606266;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ border-color: #409eff;
|
|
|
+ color: #409eff;
|
|
|
+ transform: translateY(px2rpx(-1));
|
|
|
+ }
|
|
|
+
|
|
|
+ &:active {
|
|
|
+ transform: translateY(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .wait-popup {
|
|
|
+ .des1 {
|
|
|
+ margin-top: px2rpx(10);
|
|
|
}
|
|
|
|
|
|
- .btn-primary:active {
|
|
|
- background-color: #cf1322;
|
|
|
- ;
|
|
|
+ .icon {
|
|
|
+ .iconfont {
|
|
|
+ animation: spin 1s linear infinite;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-.operation-btn {
|
|
|
- :deep(span) {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- gap: px2rpx(4);
|
|
|
- cursor: pointer;
|
|
|
- background-color: var(--color-slate-150);
|
|
|
- padding: px2rpx(8) 0;
|
|
|
+// 动画
|
|
|
+@keyframes popupFadeIn {
|
|
|
+ from {
|
|
|
+ opacity: 0;
|
|
|
+ transform: scale(0.9);
|
|
|
+ }
|
|
|
+
|
|
|
+ to {
|
|
|
+ opacity: 1;
|
|
|
+ transform: scale(1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@keyframes fadeIn {
|
|
|
+ from {
|
|
|
+ opacity: 0;
|
|
|
+ transform: translateY(px2rpx(10));
|
|
|
+ }
|
|
|
+
|
|
|
+ to {
|
|
|
+ opacity: 1;
|
|
|
+ transform: translateY(0);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@keyframes pulse {
|
|
|
+ 0% {
|
|
|
+ transform: scale(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ 50% {
|
|
|
+ transform: scale(1.05);
|
|
|
+ }
|
|
|
+
|
|
|
+ 100% {
|
|
|
+ transform: scale(1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@keyframes spin {
|
|
|
+ from {
|
|
|
+ transform: rotate(0deg);
|
|
|
+ }
|
|
|
+
|
|
|
+ to {
|
|
|
+ transform: rotate(360deg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-.operation-btn.disabled {
|
|
|
- cursor: not-allowed;
|
|
|
- opacity: 0.5;
|
|
|
+// 表单错误信息样式
|
|
|
+.uni-forms-item__error {
|
|
|
+ font-size: px2rpx(12);
|
|
|
+ color: #f56c6c;
|
|
|
+ margin-top: px2rpx(4);
|
|
|
}
|
|
|
|
|
|
-.search-bar {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: flex-start;
|
|
|
- flex-wrap: wrap;
|
|
|
- gap: px2rpx(16);
|
|
|
- margin: px2rpx(16) 0;
|
|
|
-
|
|
|
- .cwg-combox,
|
|
|
- .uni-easyinput,
|
|
|
- .uni-date {
|
|
|
- width: px2rpx(240) !important;
|
|
|
- flex: none;
|
|
|
+// 适配不同屏幕尺寸(媒体查询中的 750rpx 保持不变)
|
|
|
+@media (max-width: 750rpx) {
|
|
|
+ .transfer-page {
|
|
|
+ .main-content {
|
|
|
+ padding: px2rpx(8);
|
|
|
+
|
|
|
+ .box {
|
|
|
+ .b-card {
|
|
|
+ .card-top {
|
|
|
+ padding: px2rpx(12) px2rpx(16);
|
|
|
+
|
|
|
+ .tit {
|
|
|
+ font-size: px2rpx(14);
|
|
|
+
|
|
|
+ .iconfont {
|
|
|
+ font-size: px2rpx(16);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .s-btn {
|
|
|
+ font-size: px2rpx(14);
|
|
|
+ padding: px2rpx(10) px2rpx(16);
|
|
|
+ }
|
|
|
+
|
|
|
+ .popup-content {
|
|
|
+ padding: px2rpx(20) px2rpx(16);
|
|
|
+
|
|
|
+ .icon {
|
|
|
+ .iconfont {
|
|
|
+ font-size: px2rpx(50);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .des1 {
|
|
|
+ font-size: px2rpx(14);
|
|
|
+ margin: px2rpx(15) 0 px2rpx(10);
|
|
|
+ }
|
|
|
+
|
|
|
+ .dialog-footer {
|
|
|
+ button {
|
|
|
+ min-width: px2rpx(80);
|
|
|
+ font-size: px2rpx(13);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
</style>
|