From 03043192ddf00f9a36b7454799a9152cd1b50a0b Mon Sep 17 00:00:00 2001
From: admin <344137771@qq.com>
Date: Tue, 06 Jan 2026 11:13:45 +0800
Subject: [PATCH] 1
---
src/views/w8ben/index.vue | 242 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 242 insertions(+), 0 deletions(-)
diff --git a/src/views/w8ben/index.vue b/src/views/w8ben/index.vue
new file mode 100644
index 0000000..49bea3e
--- /dev/null
+++ b/src/views/w8ben/index.vue
@@ -0,0 +1,242 @@
+<template>
+ <div class="w8ben-form">
+ <fx-header>
+ <template #title>
+ {{ $t('W-8BEN Form') }}
+ </template>
+ </fx-header>
+
+ <!-- 已提交提示 -->
+ <div v-if="isSubmitted" class="submitted-tip px-8 pt-8 pb-4">
+ <div class="submitted-box inputBackground rounded-lg p-6 text-center flex items-center justify-center">
+ <img src="@/assets/image/public/checked.png" class="w-8 h-8 mr-3" alt="submitted" />
+ <p class="textColor font-semibold" style="font-size: 2rem;">{{ $t('已提交') }}</p>
+ </div>
+ </div>
+
+ <div class="px-8 pt-8" :class="{ 'pt-0': isSubmitted }">
+ <!-- 个人姓名 -->
+ <div class="form-item mb-8">
+ <label class="label textColor mb-4 block">{{ $t('个人姓名') }}</label>
+ <input type="text" class="form-input inputBackground textColor" :placeholder="$t('护照上的英文名')"
+ v-model="formData.name" />
+ </div>
+
+ <!-- 个人国籍 -->
+ <div class="form-item mb-8">
+ <label class="label textColor mb-4 block">{{ $t('个人国籍') }}</label>
+ <div class="form-input inputBackground textColor flex justify-between items-center cursor-pointer"
+ @click="openNationalityList">
+ <span :class="{ 'text-gray-400': !formData.citizenshipName }">
+ {{ formData.citizenshipName || $t('护照国家') }}
+ </span>
+ <img src="@/assets/image/down-arrow.png" class="w-5 h-3" alt="arrow" />
+ </div>
+ </div>
+
+ <!-- 居住地址 -->
+ <div class="form-item mb-8">
+ <label class="label textColor mb-4 block">{{ $t('居住地址') }}</label>
+ <textarea class="form-textarea inputBackground textColor" :placeholder="$t('您的真实英文地址,不可写邮政信箱')"
+ v-model="formData.address" rows="3"></textarea>
+ </div>
+
+ <!-- 外国税号 -->
+ <div class="form-item mb-8">
+ <label class="label textColor mb-4 block">{{ $t('外国税号') }}</label>
+ <input type="text" class="form-input inputBackground textColor" :placeholder="$t('欧洲居民填当地税号')"
+ v-model="formData.foreignTIN" />
+ </div>
+
+ <!-- 美国税号 -->
+ <div class="form-item mb-8">
+ <label class="label textColor mb-4 block">{{ $t('美国税号') }}</label>
+ <input type="text" class="form-input inputBackground textColor" :placeholder="$t('非美国人留空')"
+ v-model="formData.usTIN" />
+ </div>
+
+ <!-- 我确认该受益所有人为本地居民 -->
+ <div class="form-item mb-8">
+ <label class="label textColor mb-4 block">{{ $t('我确认该受益所有人为本地居民') }}</label>
+ <input type="text" class="form-input inputBackground textColor" :placeholder="$t('国家')"
+ v-model="formData.treatyBenefits" />
+ </div>
+
+ <!-- 提交按钮 -->
+ <button class="submit-btn btnMain text-white w-full h-24 rounded mt-8" @click="onSubmit">
+ {{ $t('submit') }}
+ </button>
+ </div>
+
+ <!-- 国籍选择器 -->
+ <nationality-list ref="nationalityRef" :title="$t('selectNation')" @getName="onNationalitySelect" />
+ </div>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted } from 'vue';
+import { useRouter } from 'vue-router';
+import { useI18n } from 'vue-i18n';
+import { showToast } from 'vant';
+import nationalityList from '@/views/authentication/components/nationalityList.vue';
+import countries from '@/views/authentication/components/countryList.js';
+import { _submitW8ben, _getW8ben } from '@/service/user.api.js';
+
+const router = useRouter();
+const { t, locale } = useI18n();
+
+const nationalityRef = ref(null);
+const isSubmitted = ref(false);
+
+const formData = reactive({
+ name: '',
+ citizenship: '',
+ citizenshipName: '',
+ address: '',
+ foreignTIN: '',
+ usTIN: '',
+ treatyBenefits: ''
+});
+
+const openNationalityList = () => {
+ nationalityRef.value.open();
+};
+
+const onNationalitySelect = (params) => {
+ formData.citizenship = params.code;
+ formData.citizenshipName = params.name;
+};
+
+// 根据国家代码获取国家名称
+const getCountryNameByCode = (code) => {
+ if (!code) return '';
+ const countryList = countries[locale.value] || countries['en'];
+ const country = countryList[code];
+ return country ? country.name : code;
+};
+
+// 获取表单数据回显
+const fetchFormData = () => {
+ _getW8ben().then(data => {
+ // 如果 data 不为空,表示已提交过
+ if (data) {
+ isSubmitted.value = true;
+ formData.name = data.name || '';
+ formData.citizenship = data.citizenship || '';
+ formData.citizenshipName = getCountryNameByCode(data.citizenship);
+ formData.address = data.address || '';
+ formData.foreignTIN = data.foreignTIN || '';
+ formData.usTIN = data.usTIN || '';
+ formData.treatyBenefits = data.treatyBenefits || '';
+ return;
+ }
+ }).catch(() => {
+ // 获取失败不做处理,使用空表单
+ });
+};
+
+onMounted(() => {
+ fetchFormData();
+});
+
+const onSubmit = () => {
+ // 验证必填字段
+ if (!formData.name) {
+ showToast(t('请输入姓名'));
+ return;
+ }
+ if (!formData.citizenshipName) {
+ showToast(t('请选择国籍'));
+ return;
+ }
+ if (!formData.address) {
+ showToast(t('请输入居住地址'));
+ return;
+ }
+ if (!formData.foreignTIN) {
+ showToast(t('请输入外国税号'));
+ return;
+ }
+ if (!formData.treatyBenefits) {
+ showToast(t('请输入税收协定'));
+ return;
+ }
+
+ // 提交表单
+ _submitW8ben({
+ name: formData.name,
+ citizenship: formData.citizenship,
+ address: formData.address,
+ foreignTIN: formData.foreignTIN,
+ usTIN: formData.usTIN,
+ treatyBenefits: formData.treatyBenefits
+ }).then(() => {
+ showToast(t('提交成功'));
+ router.back();
+ })
+};
+</script>
+
+<style lang="scss" scoped>
+.w8ben-form {
+ padding-bottom: 30px;
+ min-height: 100vh;
+}
+
+.form-item {
+ .label {
+ font-size: 14px;
+ font-weight: 500;
+ }
+}
+
+.form-input {
+ width: 100%;
+ height: 44px;
+ padding: 0 12px;
+ border-radius: 8px;
+ font-size: 14px;
+ border: none;
+ outline: none;
+ box-sizing: border-box;
+}
+
+.form-textarea {
+ width: 100%;
+ padding: 12px;
+ border-radius: 8px;
+ font-size: 14px;
+ border: none;
+ outline: none;
+ resize: none;
+ box-sizing: border-box;
+}
+
+.submit-btn {
+ font-size: 16px;
+ font-weight: 500;
+ border: none;
+ cursor: pointer;
+}
+
+/* 国家选择弹窗样式穿透 - 字体加大 */
+:deep(.van-action-sheet__header) {
+ font-size: 18px !important;
+}
+
+:deep(.van-search__field) {
+ font-size: 16px !important;
+}
+
+:deep(.van-field__control) {
+ font-size: 16px !important;
+}
+
+:deep(.list-view) {
+ font-size: 16px !important;
+}
+
+:deep(.van-action-sheet__content .textColor) {
+ font-size: 16px !important;
+}
+</style>
--
Gitblit v1.9.3