|
|
@@ -0,0 +1,1176 @@
|
|
|
+<template>
|
|
|
+ <div class="page remit-page">
|
|
|
+ <van-form ref="paymentForm" :model="paymentForm" class="payment-form" v-if="targetBankOptions.length > 0 && countryOptions.length > 0">
|
|
|
+ <div class="bank-summary">{{ bankSummary }}</div>
|
|
|
+ <!-- 第一步:基本信息 -->
|
|
|
+ <div v-show="currentStep === 1" class="form-section">
|
|
|
+ <h3 class="section-title">{{ t('eur-remit.item6') }}</h3>
|
|
|
+
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.bankId"
|
|
|
+ type="select"
|
|
|
+ fkey="bankId"
|
|
|
+ :label="t('eur-remit.item7')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['bankId']"
|
|
|
+ :columns="targetBankOptions"
|
|
|
+ :show-search="true"
|
|
|
+ @change="handleBankChange"
|
|
|
+ :loading="loadingStates.validateStep1"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.amount"
|
|
|
+ type="number"
|
|
|
+ fkey="amount"
|
|
|
+ :label="t('eur-remit.item9')"
|
|
|
+ @change="handleBankChange"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['amount']"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.postscript"
|
|
|
+ type="text"
|
|
|
+ fkey="postscript"
|
|
|
+ :label="t('eur-remit.item10')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['postscript']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.relationship"
|
|
|
+ type="select"
|
|
|
+ fkey="relationship"
|
|
|
+ :label="t('eur-remit.item11')"
|
|
|
+ :columns="relationshipOptions"
|
|
|
+ :loading="loadingStates.validateStep1"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.sourceFunds"
|
|
|
+ type="select"
|
|
|
+ fkey="sourceFunds"
|
|
|
+ :label="t('eur-remit.item33')"
|
|
|
+ :columns="sourceFundsOptions"
|
|
|
+ :loading="loadingStates.validateStep1"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payPurpose"
|
|
|
+ type="select"
|
|
|
+ fkey="payPurpose"
|
|
|
+ :label="t('eur-remit.item41')"
|
|
|
+ :columns="payPurposeOptions"
|
|
|
+ :loading="loadingStates.validateStep1"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <!-- 第二步:付款人信息 -->
|
|
|
+ <div v-show="currentStep === 2" class="form-section">
|
|
|
+ <h3 class="section-title">{{ t('eur-remit.item50') }}</h3>
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerType"
|
|
|
+ type="select"
|
|
|
+ fkey="payerType"
|
|
|
+ :label="t('eur-remit.item51')"
|
|
|
+ :columns="payerTypeOptions"
|
|
|
+ :loading="loadingStates.validateStep2"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerLastName"
|
|
|
+ type="text"
|
|
|
+ fkey="payerLastName"
|
|
|
+ :label="t('eur-remit.item53')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerLastName']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerFirstName"
|
|
|
+ type="text"
|
|
|
+ fkey="payerFirstName"
|
|
|
+ :label="t('eur-remit.item54')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerFirstName']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerIdNo"
|
|
|
+ type="text"
|
|
|
+ fkey="payerIdNo"
|
|
|
+ :label="t('eur-remit.item55')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerIdNo']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerIdNoType"
|
|
|
+ type="select"
|
|
|
+ fkey="payerIdNoType"
|
|
|
+ :label="t('eur-remit.item56')"
|
|
|
+ :columns="idNoTypeOptions"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerIdNoType']"
|
|
|
+ :loading="loadingStates.validateStep2"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerIdCountry"
|
|
|
+ type="select"
|
|
|
+ fkey="payerIdCountry"
|
|
|
+ :label="t('eur-remit.item59')"
|
|
|
+ :show-search="true"
|
|
|
+ :columns="countryOptions"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerIdCountry']"
|
|
|
+ :loading="loadingStates.validateStep2"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerBirthday"
|
|
|
+ type="date"
|
|
|
+ fkey="payerBirthday"
|
|
|
+ :label="t('eur-remit.item61')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerBirthday']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerNationalityCountry"
|
|
|
+ type="select"
|
|
|
+ fkey="payerNationalityCountry"
|
|
|
+ :show-search="true"
|
|
|
+ :label="t('eur-remit.item62')"
|
|
|
+ :columns="countryOptions"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerNationalityCountry']"
|
|
|
+ :loading="loadingStates.validateStep2"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerMobile"
|
|
|
+ type="text"
|
|
|
+ fkey="payerMobile"
|
|
|
+ :label="t('eur-remit.item64')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerMobile']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerCountryCode"
|
|
|
+ type="select"
|
|
|
+ fkey="payerCountryCode"
|
|
|
+ :label="t('eur-remit.item65')"
|
|
|
+ :show-search="true"
|
|
|
+ :columns="countryOptions"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerCountryCode']"
|
|
|
+ :loading="loadingStates.validateStep2"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerCityCode"
|
|
|
+ type="select"
|
|
|
+ fkey="payerCityCode"
|
|
|
+ :label="t('eur-remit.item67')"
|
|
|
+ :show-search="true"
|
|
|
+ :columns="payerCityList"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerCityCode']"
|
|
|
+ :loading="loadingStates.validateStep2"
|
|
|
+ :disabled="!paymentForm.payerCountryCode"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerAddress"
|
|
|
+ type="text"
|
|
|
+ fkey="payerAddress"
|
|
|
+ :label="t('eur-remit.item69')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerAddress']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerPostCode"
|
|
|
+ type="text"
|
|
|
+ fkey="payerPostCode"
|
|
|
+ :label="t('eur-remit.item70')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerPostCode']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.payerOccupation"
|
|
|
+ type="text"
|
|
|
+ fkey="payerOccupation"
|
|
|
+ :label="t('eur-remit.item71')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['payerOccupation']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 第三步:收款人信息 -->
|
|
|
+ <div v-show="currentStep === 3" class="form-section">
|
|
|
+ <h3 class="section-title">{{ t('eur-remit.item73') }}</h3>
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benAccountNum"
|
|
|
+ type="text"
|
|
|
+ fkey="benAccountNum"
|
|
|
+ :label="t('eur-remit.item75')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['benAccountNum']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benAccountName"
|
|
|
+ type="text"
|
|
|
+ fkey="benAccountName"
|
|
|
+ :label="t('eur-remit.item76')"
|
|
|
+ :required="true"
|
|
|
+ :rules="rules['benAccountName']"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benCountryCode"
|
|
|
+ type="select"
|
|
|
+ fkey="benCountryCode"
|
|
|
+ :label="t('eur-remit.item77')"
|
|
|
+ :show-search="true"
|
|
|
+ :columns="countryOptions"
|
|
|
+ :loading="loadingStates.validateStep3"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benCityCode"
|
|
|
+ type="select"
|
|
|
+ fkey="benCityCode"
|
|
|
+ :label="t('eur-remit.item79')"
|
|
|
+ :show-search="true"
|
|
|
+ :columns="payeeCityList"
|
|
|
+ :loading="loadingStates.validateStep3"
|
|
|
+ :disabled="!paymentForm.benCountryCode"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benAddress"
|
|
|
+ type="text"
|
|
|
+ fkey="benAddress"
|
|
|
+ :label="t('eur-remit.item81')"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benPostCode"
|
|
|
+ type="text"
|
|
|
+ fkey="benPostCode"
|
|
|
+ :label="t('eur-remit.item82')"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benLastName"
|
|
|
+ type="text"
|
|
|
+ fkey="benLastName"
|
|
|
+ :label="t('eur-remit.item83')"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benFirstName"
|
|
|
+ type="text"
|
|
|
+ fkey="benFirstName"
|
|
|
+ :label="t('eur-remit.item84')"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benBankCode"
|
|
|
+ type="text"
|
|
|
+ fkey="benBankCode"
|
|
|
+ :label="t('eur-remit.item85')"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benNationalityCountry"
|
|
|
+ type="select"
|
|
|
+ fkey="benNationalityCountry"
|
|
|
+ :label="t('eur-remit.item86')"
|
|
|
+ :show-search="true"
|
|
|
+ :columns="countryOptions"
|
|
|
+ :loading="loadingStates.validateStep3"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benIdNoType"
|
|
|
+ type="select"
|
|
|
+ fkey="benIdNoType"
|
|
|
+ :label="t('eur-remit.item88')"
|
|
|
+ :columns="idNoTypeOptions"
|
|
|
+ :loading="loadingStates.validateStep3"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benIdNo"
|
|
|
+ type="text"
|
|
|
+ fkey="benIdNo"
|
|
|
+ :label="t('eur-remit.item91')"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benIdExpirationDate"
|
|
|
+ type="date"
|
|
|
+ fkey="benIdExpirationDate"
|
|
|
+ :label="t('eur-remit.item92')"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benBirthday"
|
|
|
+ type="date"
|
|
|
+ fkey="benBirthday"
|
|
|
+ :label="t('eur-remit.item93')"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benMobileCode"
|
|
|
+ type="select"
|
|
|
+ fkey="benMobileCode"
|
|
|
+ :label="t('eur-remit.item94')"
|
|
|
+ :show-search="true"
|
|
|
+ :columns="mobileCodeOptions"
|
|
|
+ :loading="loadingStates.validateStep3"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benMobile"
|
|
|
+ type="text"
|
|
|
+ fkey="benMobile"
|
|
|
+ :label="t('eur-remit.item96')"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ <remit-input
|
|
|
+ v-model:value="paymentForm.benBankAccountType"
|
|
|
+ type="select"
|
|
|
+ fkey="benBankAccountType"
|
|
|
+ :label="t('eur-remit.item97')"
|
|
|
+ :columns="bankAccountTypeOptions"
|
|
|
+ :loading="loadingStates.validateStep3"
|
|
|
+ @change="handleBankChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 第四步:确认信息 -->
|
|
|
+ <div v-if="currentStep === 4" class="form-section">
|
|
|
+ <h3 class="section-title">{{ t('eur-remit.item100') }}</h3>
|
|
|
+ <div class="confirm-info">
|
|
|
+ <div class="info-group">
|
|
|
+ <h4>{{ t('eur-remit.item6') }}</h4>
|
|
|
+ <div class="info-item">
|
|
|
+ <span class="label">{{ t('eur-remit.item7') }}</span>
|
|
|
+ <span class="value">{{ getBankName(formData.bankId) }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="info-item">
|
|
|
+ <span class="label">{{ t('eur-remit.item9') }}</span>
|
|
|
+ <span class="value">{{ formData.amount }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="info-item">
|
|
|
+ <span class="label">{{ t('eur-remit.item10') }}</span>
|
|
|
+ <span class="value">{{ formData.postscript }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="info-group">
|
|
|
+ <h4>{{ t('eur-remit.item50') }}</h4>
|
|
|
+ <div class="info-item">
|
|
|
+ <span class="label">{{ t('eur-remit.item53') }}</span>
|
|
|
+ <span class="value">{{ formData.payer.payerLastName }} {{ formData.payer.payerFirstName }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="info-item">
|
|
|
+ <span class="label">{{ t('eur-remit.item55') }}</span>
|
|
|
+ <span class="value">{{ formData.payer.payerIdNo }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="info-group">
|
|
|
+ <h4>{{ t('eur-remit.item73') }}</h4>
|
|
|
+ <div class="info-item">
|
|
|
+ <span class="label">{{ t('eur-remit.item75') }}</span>
|
|
|
+ <span class="value">{{ formData.payee.benAccountNum }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="info-item">
|
|
|
+ <span class="label">{{ t('eur-remit.item76') }}</span>
|
|
|
+ <span class="value">{{ formData.payee.benAccountName }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 步骤控制按钮 -->
|
|
|
+ <div class="form-actions">
|
|
|
+ <template v-if="currentStep === 1">
|
|
|
+ <van-button type="warning" block @click="validateStep1" :loading="loadingStates.validateStep1">
|
|
|
+ {{ t('eur-remit.next') }}
|
|
|
+ </van-button>
|
|
|
+ </template>
|
|
|
+ <template v-else-if="currentStep === 2">
|
|
|
+ <van-button plain block @click="currentStep = 1" class="prev-btn">
|
|
|
+ {{ t('eur-remit.prev') }}
|
|
|
+ </van-button>
|
|
|
+ <van-button type="warning" block @click="validateStep2" :loading="loadingStates.validateStep2">
|
|
|
+ {{ t('eur-remit.next') }}
|
|
|
+ </van-button>
|
|
|
+ </template>
|
|
|
+ <template v-else-if="currentStep === 3">
|
|
|
+ <van-button plain block @click="currentStep = 2" class="prev-btn">
|
|
|
+ {{ t('eur-remit.prev') }}
|
|
|
+ </van-button>
|
|
|
+ <van-button type="warning" block @click="validateStep3" :loading="loadingStates.validateStep3">
|
|
|
+ {{ t('eur-remit.next') }}
|
|
|
+ </van-button>
|
|
|
+ </template>
|
|
|
+ <template v-else-if="currentStep === 4">
|
|
|
+ <van-button plain block @click="currentStep = 3" class="prev-btn">
|
|
|
+ {{ t('eur-remit.prev') }}
|
|
|
+ </van-button>
|
|
|
+ <van-button type="warning" block @click="validateStep4" :loading="loadingStates.validateStep4">
|
|
|
+ {{ t('eur-remit.item104') }}
|
|
|
+ </van-button>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ <div class="form-actions">
|
|
|
+ <template v-if="currentStep === 4">
|
|
|
+ <van-button type="warning" block @click="validateStep5" :loading="loadingStates.validateStep5" :disabled="!isAllValidated">
|
|
|
+ {{ t('eur-remit.item105') }}
|
|
|
+ </van-button>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </van-form>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup lang="ts">
|
|
|
+import { useI18n } from 'vue-i18n'
|
|
|
+import { showToast } from 'vant'
|
|
|
+import { useRouter } from 'vue-router'
|
|
|
+import { ucardApi } from '@/api/ucard'
|
|
|
+import RemitInput from '@/components/RemitInput.vue'
|
|
|
+import { lang } from '@/composables/config'
|
|
|
+const { t } = useI18n()
|
|
|
+import useUserStore from '@/stores/use-user-store'
|
|
|
+import { ucardValidateParams } from '@/api/ucard'
|
|
|
+const userStore = useUserStore()
|
|
|
+const userInfo = userStore.userInfo?.customInfo
|
|
|
+const router = useRouter()
|
|
|
+
|
|
|
+// 当前步骤
|
|
|
+const currentStep = ref(1)
|
|
|
+
|
|
|
+// 加载状态
|
|
|
+const loadingStates = ref({
|
|
|
+ validateStep1: false,
|
|
|
+ validateStep2: false,
|
|
|
+ validateStep3: false,
|
|
|
+ validateStep4: false,
|
|
|
+ validateStep5: false,
|
|
|
+})
|
|
|
+const isAllValidated = ref(false)
|
|
|
+
|
|
|
+const formData = ref<ucardValidateParams>({uniqueId: userInfo?.uniqueId,} as ucardValidateParams)
|
|
|
+// 表单数据
|
|
|
+const paymentForm = ref({
|
|
|
+ bankId: 2671,
|
|
|
+ uniqueId: userInfo?.uniqueId,
|
|
|
+ originOrderNo: '',
|
|
|
+ amount: 200,
|
|
|
+ postscript: 'testorder',
|
|
|
+ relationship: 'OTHER',
|
|
|
+ sourceFunds: 'SAVINGS',
|
|
|
+ payPurpose: 'INTERNATIONAL_TRADE',
|
|
|
+ payerType: 'INDIVIDUAL',
|
|
|
+ payerLastName: 'zhang',
|
|
|
+ payerFirstName: 'tom',
|
|
|
+ payerIdNo: 'ES125664',
|
|
|
+ payerIdNoType: 'PASSPORT',
|
|
|
+ payerIdCountry: 'SG',
|
|
|
+ payerBirthday: '1990-10-10',
|
|
|
+ payerNationalityCountry: 'SG',
|
|
|
+ payerMobile: '+65012345678',
|
|
|
+ payerCountryCode: 'SG',
|
|
|
+ payerCityCode: 'SG_1',
|
|
|
+ payerAddress: '21 Tampines Ave 1, Singapore 529757',
|
|
|
+ payerPostCode: '999002',
|
|
|
+ payerOccupation: 'worker',
|
|
|
+ benAccountNum: '235486845630',
|
|
|
+ benAccountName: 'wangfei',
|
|
|
+ benCountryCode: 'SG',
|
|
|
+ benCityCode: 'SG_1',
|
|
|
+ benAddress: '21 Tampines Ave 1, Singapore 529757',
|
|
|
+ benPostCode: '999002',
|
|
|
+ benTransBankSwift: '',
|
|
|
+ benLastName: 'zhang',
|
|
|
+ benFirstName: 'alex',
|
|
|
+ benNationalityCountry: 'SG',
|
|
|
+ benIdNoType: 'PASSPORT',
|
|
|
+ benIdNo: '1334924322424',
|
|
|
+ benIdExpirationDate: '2030-01-01',
|
|
|
+ benBirthday: '2001-01-01',
|
|
|
+ benMobileCode: '+67',
|
|
|
+ benMobile: '18326559132',
|
|
|
+ benBankAccountType: 'SAVINGS',
|
|
|
+ benBankCode: '',
|
|
|
+})
|
|
|
+
|
|
|
+// 表单验证规则
|
|
|
+const rules = {
|
|
|
+ bankId: [{ required: true, message: t('eur-remit.ms3') }],
|
|
|
+ amount: [
|
|
|
+ { required: true, message: t('eur-remit.ms6') },
|
|
|
+ { pattern: /\b(?:[1-9]\d{2,}|100)(?:\.\d{1,2})?\b/g, message: t('eur-remit.ms') },
|
|
|
+ ],
|
|
|
+ postscript: [
|
|
|
+ { required: true, message: t('eur-remit.ms7') },
|
|
|
+ { max: 64, min: 5, message: t('eur-remit.ms8') },
|
|
|
+ ],
|
|
|
+ uniqueId: [{ required: true, message: t('eur-remit.ms4') }],
|
|
|
+ // 付款人信息验证规则
|
|
|
+ payerLastName: [
|
|
|
+ { required: true, message: t('eur-remit.ms9') },
|
|
|
+ { max: 50, min: 2, message: t('eur-remit.ms10') },
|
|
|
+ ],
|
|
|
+ payerFirstName: [
|
|
|
+ { required: true, message: t('eur-remit.ms10_1') },
|
|
|
+ { max: 50, min: 2, message: t('eur-remit.ms10') },
|
|
|
+ ],
|
|
|
+ payerIdNo: [
|
|
|
+ { required: true, message: t('eur-remit.ms11') },
|
|
|
+ { max: 18, min: 6, message: t('eur-remit.ms12') },
|
|
|
+ ],
|
|
|
+ payerIdNoType: [{ required: true, message: t('eur-remit.ms13') }],
|
|
|
+ payerIdCountry: [{ required: true, message: t('eur-remit.ms14') }],
|
|
|
+ payerBirthday: [{ required: true, message: t('eur-remit.ms16') }],
|
|
|
+ payerNationalityCountry: [{ required: true, message: t('eur-remit.ms17') }],
|
|
|
+ payerMobile: [
|
|
|
+ { required: true, message: t('eur-remit.ms18') },
|
|
|
+ { pattern: /^\+?\d{8,15}$/, message: t('eur-remit.ms19') },
|
|
|
+ ],
|
|
|
+ payerCountryCode: [{ required: true, message: t('eur-remit.ms20') }],
|
|
|
+ payerCityCode: [{ required: true, message: t('eur-remit.ms22') }],
|
|
|
+ payerAddress: [
|
|
|
+ { required: true, message: t('eur-remit.ms23') },
|
|
|
+ { max: 100, min: 10, message: t('eur-remit.ms24') },
|
|
|
+ ],
|
|
|
+ payerPostCode: [
|
|
|
+ { required: true, message: t('eur-remit.ms25') },
|
|
|
+ { max: 9, min: 3, message: t('eur-remit.ms26') },
|
|
|
+ ],
|
|
|
+ payerOccupation: [
|
|
|
+ { required: true, message: t('eur-remit.ms27') },
|
|
|
+ { max: 10, min: 3, message: t('eur-remit.ms28') },
|
|
|
+ ],
|
|
|
+
|
|
|
+ // 收款人信息验证规则
|
|
|
+ benAccountNum: [
|
|
|
+ { required: true, message: t('eur-remit.ms29') },
|
|
|
+ { max: 48, min: 2, message: t('eur-remit.ms30') },
|
|
|
+ ],
|
|
|
+ benAccountName: [
|
|
|
+ { required: true, message: t('eur-remit.ms31') },
|
|
|
+ { max: 100, min: 1, message: t('eur-remit.ms32') },
|
|
|
+ ],
|
|
|
+}
|
|
|
+// 关系
|
|
|
+const relationshipOptions = ref([
|
|
|
+ { text: t('eur-remit.item26'), value: 'SELF' },
|
|
|
+ { text: t('eur-remit.item21'), value: 'HUSBAND' },
|
|
|
+ { text: t('eur-remit.item31'), value: 'WIFE' },
|
|
|
+ { text: t('eur-remit.item16'), value: 'FATHER' },
|
|
|
+ { text: t('eur-remit.item22'), value: 'MOTHER' },
|
|
|
+ { text: t('eur-remit.item29'), value: 'SON' },
|
|
|
+ { text: t('eur-remit.item15'), value: 'DAUGHTER' },
|
|
|
+ { text: t('eur-remit.item27'), value: 'SISTER' },
|
|
|
+ { text: t('eur-remit.item12'), value: 'BROTHER' },
|
|
|
+ { text: t('eur-remit.item17'), value: 'FATHER_IN_LAW' },
|
|
|
+ { text: t('eur-remit.item23'), value: 'MOTHER_IN_LAW' },
|
|
|
+ { text: t('eur-remit.item28'), value: 'SISTER_IN_LAW' },
|
|
|
+ { text: t('eur-remit.item13'), value: 'BROTHER_IN_LAW' },
|
|
|
+ { text: t('eur-remit.item19'), value: 'GRAND_FATHER' },
|
|
|
+ { text: t('eur-remit.item20'), value: 'GRAND_MOTHER' },
|
|
|
+ { text: t('eur-remit.item24'), value: 'NEPHEW' },
|
|
|
+ { text: t('eur-remit.item25'), value: 'NIECE' },
|
|
|
+ { text: t('eur-remit.item30'), value: 'UNCLE' },
|
|
|
+ { text: t('eur-remit.item14'), value: 'COUSIN' },
|
|
|
+ { text: t('eur-remit.item18'), value: 'FRIEND' },
|
|
|
+ { text: t('eur-remit.item32'), value: 'OTHER' },
|
|
|
+])
|
|
|
+
|
|
|
+// 资金来源
|
|
|
+const sourceFundsOptions = ref([
|
|
|
+ { text: t('eur-remit.item34'), value: 'SAVINGS' },
|
|
|
+ { text: t('eur-remit.item35'), value: 'SALARY' },
|
|
|
+ { text: t('eur-remit.item36'), value: 'INVESTMENT' },
|
|
|
+ { text: t('eur-remit.item37'), value: 'OTHER' },
|
|
|
+])
|
|
|
+// 付款目的
|
|
|
+const payPurposeOptions = ref([
|
|
|
+ { text: t('eur-remit.item42'), value: 'PURCHASE_OF_GOODS_OR_SERVICES' },
|
|
|
+ { text: t('eur-remit.item43'), value: 'FREIGHT_AND_TRANSPORTATION_COSTS' },
|
|
|
+ { text: t('eur-remit.item44'), value: 'EDUCATION_EXPENSES' },
|
|
|
+ { text: t('eur-remit.item45'), value: 'IMMIGRATION_INVESTMENT' },
|
|
|
+ { text: t('eur-remit.item46'), value: 'CHARITABLE_DONATIONS' },
|
|
|
+ { text: t('eur-remit.item47'), value: 'FAMILY_SUPPORT' },
|
|
|
+ { text: t('eur-remit.item48'), value: 'DIVIDEND_OR_INTEREST_PAYMENTS' },
|
|
|
+ { text: t('eur-remit.item49'), value: 'INTERNATIONAL_TRADE' },
|
|
|
+])
|
|
|
+
|
|
|
+// 付款人类型
|
|
|
+const payerTypeOptions = ref([{ text: t('eur-remit.item52'), value: 'INDIVIDUAL' }])
|
|
|
+
|
|
|
+// 证件类型
|
|
|
+const idNoTypeOptions = ref([
|
|
|
+ { text: t('eur-remit.item57'), value: 'PASSPORT' },
|
|
|
+ { text: t('eur-remit.item58'), value: 'EUROPEAN_ID' },
|
|
|
+])
|
|
|
+
|
|
|
+// 手机区号
|
|
|
+const mobileCodeOptions = ref([
|
|
|
+ { text: t('eur-remit.item95'), value: '+65' },
|
|
|
+ { text: t('eur-remit.item95_1'), value: '+86' },
|
|
|
+ { text: t('eur-remit.item95_2'), value: '+1' },
|
|
|
+])
|
|
|
+
|
|
|
+const getMobileCode = async () => {
|
|
|
+ try {
|
|
|
+ const res = await ucardApi.countryGet()
|
|
|
+ mobileCodeOptions.value = res.data.map((item: { callingCode: string; name: string; enName: string }) => ({
|
|
|
+ text: '+' + item.callingCode + ' ' + (lang.value === 'cn' ? item.name : item.enName),
|
|
|
+ value: item.callingCode,
|
|
|
+ }))
|
|
|
+ } catch (error) {
|
|
|
+ showToast(error || String(error))
|
|
|
+ }
|
|
|
+}
|
|
|
+// 银行账户类型
|
|
|
+const bankAccountTypeOptions = ref([
|
|
|
+ { text: t('eur-remit.item98'), value: 'SAVINGS' },
|
|
|
+ { text: t('eur-remit.item99'), value: 'CHECKING' },
|
|
|
+])
|
|
|
+
|
|
|
+const bankConfigList = ref<any[]>([])
|
|
|
+const targetBankOptions = ref<Array<{ text: string; value: number }>>([])
|
|
|
+const bankSummary = ref('')
|
|
|
+const loadBankConfigList = async () => {
|
|
|
+ try {
|
|
|
+ const res = await ucardApi.ucardBanks({})
|
|
|
+ if (res && (res.code === 0 || res.code === 200) && Array.isArray(res.data)) {
|
|
|
+ const allBanks = res.data.flatMap((item: any) => item?.bankList || [])
|
|
|
+ bankConfigList.value = allBanks
|
|
|
+ const options = allBanks.map((bank) => ({
|
|
|
+ text: bank.bankName + '(' + bank.bankId + ')',
|
|
|
+ value: bank.bankId,
|
|
|
+ }))
|
|
|
+
|
|
|
+ targetBankOptions.value = options
|
|
|
+ const names = allBanks.map((b) => String(b.bankName || '')).filter(Boolean)
|
|
|
+ bankSummary.value = `支持银行:${names.slice(0, 5).join('、')}${names.length > 5 ? ' 等' + names.length + '家' : ''}`
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ bankConfigList.value = []
|
|
|
+ targetBankOptions.value = []
|
|
|
+ bankSummary.value = ''
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 国家选项
|
|
|
+const countryOptions = ref<Array<{ text: string; value: string }>>([])
|
|
|
+const payerCityList = ref<Array<{ text: string; value: string }>>([])
|
|
|
+const payeeCityList = ref<Array<{ text: string; value: string }>>([])
|
|
|
+// 获取国家列表
|
|
|
+const getCountryListForSelect = async () => {
|
|
|
+ try {
|
|
|
+ const res = await ucardApi.ucardCountryCity({})
|
|
|
+ if (res.code === 200 || res.code === 0) {
|
|
|
+ countryOptions.value = res.data.map((item: any) => ({
|
|
|
+ text: lang.value === 'cn' ? item.cnName : item.enName,
|
|
|
+ value: item.code,
|
|
|
+ }))
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ countryOptions.value = []
|
|
|
+ }
|
|
|
+}
|
|
|
+// 获取城市列表
|
|
|
+const getCityListForSelect = async (countryCode: string, type: 'payer' | 'payee' = 'payer') => {
|
|
|
+ try {
|
|
|
+ const res = await ucardApi.ucardCountryCity({ code: countryCode })
|
|
|
+ if (res.code === 200 || res.code === 0) {
|
|
|
+ const cityList = res.data.map((item: any) => ({
|
|
|
+ text: lang.value === 'cn' ? item.cnName : item.enName,
|
|
|
+ value: item.code,
|
|
|
+ }))
|
|
|
+
|
|
|
+ if (type === 'payer') {
|
|
|
+ payerCityList.value = cityList
|
|
|
+ } else {
|
|
|
+ payeeCityList.value = cityList
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ if (type === 'payer') {
|
|
|
+ payerCityList.value = []
|
|
|
+ } else {
|
|
|
+ payeeCityList.value = []
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// API 调用函数
|
|
|
+interface ApiResponse {
|
|
|
+ success: boolean
|
|
|
+ message?: string
|
|
|
+ data?: any
|
|
|
+}
|
|
|
+const validateBasicInfo = async (data: ucardValidateParams): Promise<ApiResponse> => {
|
|
|
+ try {
|
|
|
+ const res = await ucardApi.ucardValidate({ ...data })
|
|
|
+ if (res.code === 200 || res.code === 0) {
|
|
|
+ return {
|
|
|
+ ...res.data,
|
|
|
+ success: true,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: res.msg || t('eur-remit.validateError'),
|
|
|
+ }
|
|
|
+ } catch (error: any) {
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: error.response?.data?.message || t('eur-remit.validateError'),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+const validatePayerInfo = async (data: ucardValidateParams): Promise<ApiResponse> => {
|
|
|
+ try {
|
|
|
+ const res = await ucardApi.ucardValidatePayer({ ...data })
|
|
|
+ if (res.code === 200 || res.code === 0) {
|
|
|
+ return {
|
|
|
+ ...res.data,
|
|
|
+ success: true,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: res.msg || t('eur-remit.validateError'),
|
|
|
+ }
|
|
|
+ } catch (error: any) {
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: error.response?.data?.message || t('eur-remit.validateError'),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+const validatePayeeInfo = async (data: ucardValidateParams): Promise<ApiResponse> => {
|
|
|
+ try {
|
|
|
+ const res = await ucardApi.ucardValidatePayee({ ...data })
|
|
|
+ if (res.code === 200 || res.code === 0) {
|
|
|
+ return {
|
|
|
+ ...res.data,
|
|
|
+ success: true,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: res.msg || t('eur-remit.validateError'),
|
|
|
+ }
|
|
|
+ } catch (error: any) {
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: error.response?.data?.message || t('eur-remit.validateError'),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+const executePayment = async (data: ucardValidateParams): Promise<ApiResponse> => {
|
|
|
+ try {
|
|
|
+ const res = await ucardApi.ucardTransfer({ ...data })
|
|
|
+ if (res.code === 200 || res.code === 0) {
|
|
|
+ return {
|
|
|
+ ...res,
|
|
|
+ success: true,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: res.msg || t('eur-remit.paymentError'),
|
|
|
+ }
|
|
|
+ } catch (error: any) {
|
|
|
+ return {
|
|
|
+ success: false,
|
|
|
+ message: error.response?.data?.message || t('eur-remit.paymentError'),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 获取银行名称
|
|
|
+const getBankName = (bankId: number) => {
|
|
|
+ const bank = bankConfigList.value.find((b) => b.bankId === bankId)
|
|
|
+ return bank ? bank.bankName : ''
|
|
|
+}
|
|
|
+
|
|
|
+// 第一步校验 - 基本信息完整性
|
|
|
+const validateStep1 = async () => {
|
|
|
+ loadingStates.value.validateStep1 = true
|
|
|
+ try {
|
|
|
+ // 检查必填字段
|
|
|
+ const requiredFields = ['bankId', 'amount', 'postscript', 'uniqueId'] as const
|
|
|
+ const missingFields = requiredFields.filter((field) => !formData.value[field])
|
|
|
+ if (missingFields.length > 0) {
|
|
|
+ showToast(t('eur-remit.requiredFieldsMissing'))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 检查金额格式
|
|
|
+ if (!/^\d+(\.\d{1,2})?$/.test(String(formData.value.amount))) {
|
|
|
+ showToast(t('eur-remit.amountFormat'))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ currentStep.value = 2
|
|
|
+ } catch (error) {
|
|
|
+ showToast(t('eur-remit.validateError'))
|
|
|
+ } finally {
|
|
|
+ loadingStates.value.validateStep1 = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 第二步校验 - 付款人信息
|
|
|
+const validateStep2 = async () => {
|
|
|
+ loadingStates.value.validateStep2 = true
|
|
|
+ try {
|
|
|
+ const requiredFields = [
|
|
|
+ 'payerLastName',
|
|
|
+ 'payerFirstName',
|
|
|
+ 'payerIdNo',
|
|
|
+ 'payerIdNoType',
|
|
|
+ 'payerIdCountry',
|
|
|
+ 'payerBirthday',
|
|
|
+ 'payerNationalityCountry',
|
|
|
+ 'payerMobile',
|
|
|
+ 'payerCountryCode',
|
|
|
+ 'payerCityCode',
|
|
|
+ 'payerAddress',
|
|
|
+ 'payerPostCode',
|
|
|
+ 'payerOccupation',
|
|
|
+ ] as const
|
|
|
+ const missingFields = requiredFields.filter((field) => !formData.value.payer[field])
|
|
|
+
|
|
|
+ if (missingFields.length > 0) {
|
|
|
+ showToast(t('eur-remit.requiredFieldsMissing'))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const response = await validatePayerInfo(formData.value.payer)
|
|
|
+ if (response.success) {
|
|
|
+ currentStep.value = 3
|
|
|
+ } else {
|
|
|
+ showToast(response.message || t('eur-remit.validateFailed'))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ showToast(t('eur-remit.validateError'))
|
|
|
+ return
|
|
|
+ } finally {
|
|
|
+ loadingStates.value.validateStep2 = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 第三步校验 - 收款人信息
|
|
|
+const validateStep3 = async () => {
|
|
|
+ loadingStates.value.validateStep3 = true
|
|
|
+ try {
|
|
|
+ const requiredFields = ['benAccountNum', 'benAccountName'] as const
|
|
|
+ const missingFields = requiredFields.filter((field) => !formData.value.payee[field])
|
|
|
+ if (missingFields.length > 0) {
|
|
|
+ showToast(t('eur-remit.requiredFieldsMissing'))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const response = await validatePayeeInfo(formData.value.payee)
|
|
|
+ if (response.success) {
|
|
|
+ currentStep.value = 4
|
|
|
+ isAllValidated.value = false
|
|
|
+ } else {
|
|
|
+ showToast(response.message || t('eur-remit.validateFailed'))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ showToast(t('eur-remit.validateError'))
|
|
|
+ return
|
|
|
+ } finally {
|
|
|
+ loadingStates.value.validateStep3 = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 第四步校验 校验所有信息
|
|
|
+const validateStep4 = async () => {
|
|
|
+ loadingStates.value.validateStep4 = true
|
|
|
+ try {
|
|
|
+ // 最终校验所有信息
|
|
|
+ const finalValidation = await validateBasicInfo(formData.value)
|
|
|
+ if (!finalValidation.success) {
|
|
|
+ showToast(finalValidation.message || t('eur-remit.validateFailed'))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ isAllValidated.value = true
|
|
|
+ } catch (error) {
|
|
|
+ showToast(t('eur-remit.validateError'))
|
|
|
+ return
|
|
|
+ } finally {
|
|
|
+ loadingStates.value.validateStep4 = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 第五步校验 - 最终确认并提交
|
|
|
+const validateStep5 = async () => {
|
|
|
+ loadingStates.value.validateStep5 = true
|
|
|
+ try {
|
|
|
+ const payResponse = await executePayment(formData.value)
|
|
|
+ if (payResponse.success) {
|
|
|
+ showToast(t('eur-remit.paymentSuccess'))
|
|
|
+ // 跳转到成功页面
|
|
|
+ router.push({
|
|
|
+ path: '/remit/success',
|
|
|
+ query: {
|
|
|
+ orderNo: payResponse.data?.orderNo,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ showToast(payResponse.message || t('eur-remit.paymentFailed'))
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ showToast(t('eur-remit.validateError'))
|
|
|
+ } finally {
|
|
|
+ loadingStates.value.validateStep5 = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const handleBankChange = (value: any) => {
|
|
|
+ const payerKeys = [
|
|
|
+ 'payerType',
|
|
|
+ 'payerLastName',
|
|
|
+ 'payerFirstName',
|
|
|
+ 'payerIdNo',
|
|
|
+ 'payerIdNoType',
|
|
|
+ 'payerIdCountry',
|
|
|
+ 'payerBirthday',
|
|
|
+ 'payerNationalityCountry',
|
|
|
+ 'payerMobile',
|
|
|
+ 'payerCountryCode',
|
|
|
+ 'payerCityCode',
|
|
|
+ 'payerAddress',
|
|
|
+ 'payerPostCode',
|
|
|
+ 'payerOccupation',
|
|
|
+ ]
|
|
|
+
|
|
|
+ const payeeKeys = [
|
|
|
+ 'bankId',
|
|
|
+ 'benAccountNum',
|
|
|
+ 'benAccountName',
|
|
|
+ 'benCountryCode',
|
|
|
+ 'benCityCode',
|
|
|
+ 'benAddress',
|
|
|
+ 'benPostCode',
|
|
|
+ 'benTransBankSwift',
|
|
|
+ 'benLastName',
|
|
|
+ 'benFirstName',
|
|
|
+ 'benNationalityCountry',
|
|
|
+ 'benIdNoType',
|
|
|
+ 'benIdNo',
|
|
|
+ 'benIdExpirationDate',
|
|
|
+ 'benBirthday',
|
|
|
+ 'benMobileCode',
|
|
|
+ 'benMobile',
|
|
|
+ 'benBankAccountType',
|
|
|
+ 'benBankCode',
|
|
|
+ ]
|
|
|
+ if (value.key === 'bankId') {
|
|
|
+ formData.value.bankId = value.value
|
|
|
+ }
|
|
|
+ if (payerKeys.includes(value.key)) {
|
|
|
+ formData.value.payer = { ...formData.value.payer, [value.key]: value.value }
|
|
|
+ } else if (payeeKeys.includes(value.key)) {
|
|
|
+ formData.value.payee = { ...formData.value.payee, [value.key]: value.value }
|
|
|
+ } else {
|
|
|
+ formData.value = { ...formData.value, [value.key]: value.value }
|
|
|
+ }
|
|
|
+ if (value.key === 'payerCountryCode') {
|
|
|
+ getCityListForSelect(value.value, 'payer')
|
|
|
+ formData.value.payer.payerCityCode = ''
|
|
|
+ } else if (value.key === 'benCountryCode') {
|
|
|
+ formData.value.payee.benCityCode = ''
|
|
|
+ getCityListForSelect(value.value, 'payee')
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ loadBankConfigList()
|
|
|
+ getCountryListForSelect()
|
|
|
+ getMobileCode()
|
|
|
+ if (paymentForm.value.payerCountryCode) {
|
|
|
+ getCityListForSelect(paymentForm.value.payerCountryCode, 'payer')
|
|
|
+ }
|
|
|
+ if (paymentForm.value.benCountryCode) {
|
|
|
+ getCityListForSelect(paymentForm.value.benCountryCode, 'payee')
|
|
|
+ }
|
|
|
+})
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="scss">
|
|
|
+.remit-page {
|
|
|
+ min-height: 100vh;
|
|
|
+ background: var(--action-bg);
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ padding-top: 32px;
|
|
|
+}
|
|
|
+
|
|
|
+.remit-form {
|
|
|
+ width: 100%;
|
|
|
+ max-width: 340px;
|
|
|
+ margin: 0 auto 24px auto;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ background: rgba(24, 24, 24, 0.92);
|
|
|
+ border-radius: 20px;
|
|
|
+ box-shadow: 0 4px 32px 0 rgba(214, 255, 0, 0.08);
|
|
|
+ padding: 32px 20px 24px 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.form-group {
|
|
|
+ width: 100%;
|
|
|
+ margin-bottom: 18px;
|
|
|
+}
|
|
|
+
|
|
|
+.form-label {
|
|
|
+ color: var(--white);
|
|
|
+ font-size: 15px;
|
|
|
+ margin-bottom: 8px;
|
|
|
+ display: block;
|
|
|
+}
|
|
|
+
|
|
|
+.balance-info {
|
|
|
+ width: 100%;
|
|
|
+ color: #bdbdbd;
|
|
|
+ font-size: 14px;
|
|
|
+ margin-bottom: 10px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+
|
|
|
+.balance-value {
|
|
|
+ color: var(--main-yellow);
|
|
|
+ font-weight: bold;
|
|
|
+ margin: 0 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.confirm-btn {
|
|
|
+ width: 100%;
|
|
|
+ height: 44px;
|
|
|
+ background: linear-gradient(90deg, var(--main-yellow) 0%, var(--main-yellow-dark) 100%);
|
|
|
+ color: #232323;
|
|
|
+ border: none;
|
|
|
+ border-radius: 22px;
|
|
|
+ font-size: 18px;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-top: 18px;
|
|
|
+ cursor: pointer;
|
|
|
+ box-shadow: 0 2px 12px 0 rgba(73, 247, 166, 0.1);
|
|
|
+ letter-spacing: 2px;
|
|
|
+ transition: background 0.2s, box-shadow 0.2s;
|
|
|
+
|
|
|
+ &:active {
|
|
|
+ opacity: 0.9;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.payment-form {
|
|
|
+ width: 100%;
|
|
|
+ max-width: 340px;
|
|
|
+ margin: 0 auto 24px auto;
|
|
|
+ background: rgba(24, 24, 24, 0.92);
|
|
|
+ border-radius: 20px;
|
|
|
+ box-shadow: 0 4px 32px 0 rgba(214, 255, 0, 0.08);
|
|
|
+ padding: 32px 20px 24px 20px;
|
|
|
+
|
|
|
+ ::v-deep .van-field {
|
|
|
+ background: transparent;
|
|
|
+ padding: 10px;
|
|
|
+ margin-bottom: 8px;
|
|
|
+
|
|
|
+ &__label {
|
|
|
+ color: var(--white);
|
|
|
+ font-size: 15px;
|
|
|
+ width: 120px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__control {
|
|
|
+ color: var(--white);
|
|
|
+ &::placeholder {
|
|
|
+ color: #bdbdbd;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &__right-icon {
|
|
|
+ color: var(--main-yellow);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.form-section {
|
|
|
+ margin: 24px 0;
|
|
|
+}
|
|
|
+
|
|
|
+.section-title {
|
|
|
+ color: var(--main-yellow);
|
|
|
+ font-size: 16px;
|
|
|
+ margin-bottom: 16px;
|
|
|
+}
|
|
|
+
|
|
|
+.form-actions {
|
|
|
+ margin: 16px 0 32px;
|
|
|
+ display: flex;
|
|
|
+ gap: 12px;
|
|
|
+
|
|
|
+ .prev-btn {
|
|
|
+ flex: 1;
|
|
|
+ border-color: var(--main-yellow);
|
|
|
+ color: var(--main-yellow);
|
|
|
+ }
|
|
|
+
|
|
|
+ .van-button {
|
|
|
+ flex: 2;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.confirm-info {
|
|
|
+ padding: 16px;
|
|
|
+ border-radius: 12px;
|
|
|
+ margin-bottom: 24px;
|
|
|
+
|
|
|
+ .info-group {
|
|
|
+ margin-bottom: 20px;
|
|
|
+
|
|
|
+ h4 {
|
|
|
+ color: var(--main-yellow);
|
|
|
+ font-size: 16px;
|
|
|
+ margin-bottom: 12px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .info-item {
|
|
|
+ display: flex;
|
|
|
+ margin-bottom: 8px;
|
|
|
+ color: var(--white);
|
|
|
+
|
|
|
+ .label {
|
|
|
+ width: 120px;
|
|
|
+ color: #bdbdbd;
|
|
|
+ }
|
|
|
+
|
|
|
+ .value {
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|