Jelajahi Sumber

速汇新增文案

zhb 5 bulan lalu
induk
melakukan
5a703199cf

+ 1 - 1
api/ucard.ts

@@ -383,7 +383,7 @@ export const ucardApi = {
   reasonsRefusalList(
   reasonsRefusalList(
     params: { type?: string } = {}
     params: { type?: string } = {}
   ): Promise<BaseResponse<RefusalReason[]>> {
   ): Promise<BaseResponse<RefusalReason[]>> {
-    return post("/reasons/refusal/list", { ...params });
+    return post("/wasabi/api/reasons/refusal/list", { ...params });
   },
   },
   // 证件类型配置
   // 证件类型配置
   idTypesConfigList(
   idTypesConfigList(

+ 8 - 6
components/cwg-SuccessPrompt.vue

@@ -1,25 +1,27 @@
 <template>
 <template>
-  <view class="success-prompt-fullscreen">
+  <view class="success-prompt-fullscreen" v-if="props.show">
     <img class="success-prompt-img" src="/static/images/vector.png" alt="success" />
     <img class="success-prompt-img" src="/static/images/vector.png" alt="success" />
     <view class="success-prompt-title">{{ props.title }}</view>
     <view class="success-prompt-title">{{ props.title }}</view>
     <view class="success-prompt-desc">{{ props.desc }}</view>
     <view class="success-prompt-desc">{{ props.desc }}</view>
     <view class="fixed-btn">
     <view class="fixed-btn">
       <view class="cwg-button">
       <view class="cwg-button">
-        <u-button type="primary" block @click="props.btnClick">{{
-          props.btnTitle
-          }}</u-button>
+        <u-button type="primary" block @click="props.btnClick">{{ t('Custom.Settings.Title') }}</u-button>
       </view>
       </view>
     </view>
     </view>
   </view>
   </view>
 </template>
 </template>
 
 
 <script setup lang="ts">
 <script setup lang="ts">
+import { useI18n } from 'vue-i18n'
+
+const { t } = useI18n()
 const props = withDefaults(
 const props = withDefaults(
   defineProps<{
   defineProps<{
     title?: string;
     title?: string;
     btnTitle?: string;
     btnTitle?: string;
     desc?: string;
     desc?: string;
     btnClick?: () => void;
     btnClick?: () => void;
+    show?: boolean;
   }>(),
   }>(),
   {
   {
     title: "Retrive Successfully",
     title: "Retrive Successfully",
@@ -53,7 +55,7 @@ const props = withDefaults(
 
 
 .success-prompt-title {
 .success-prompt-title {
   text-align: center;
   text-align: center;
-  font-size: px2rpx(44);
+  font-size: px2rpx(24);
   font-weight: bold;
   font-weight: bold;
   color: #222;
   color: #222;
   line-height: px2rpx(28);
   line-height: px2rpx(28);
@@ -61,7 +63,7 @@ const props = withDefaults(
 }
 }
 
 
 .success-prompt-desc {
 .success-prompt-desc {
-  font-size: px2rpx(31);
+  font-size: px2rpx(16);
   color: #666;
   color: #666;
   text-align: center;
   text-align: center;
   max-width: px2rpx(620);
   max-width: px2rpx(620);

+ 49 - 0
composables/useIdTypeOptions.ts

@@ -0,0 +1,49 @@
+import { ref, computed, watch } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { ucardApi } from '@/api/ucard'
+
+export default function useIdTypeOptions() {
+    const { t } = useI18n()
+    const idTypesConfigList = ref('')
+    const allIdTypeOptions = computed(() => [
+        { text: t('card.Form.v3'), value: 'HK_HKID' },
+        { text: t('card.Form.v4'), value: 'PASSPORT' },
+        { text: t('card.Form.v5'), value: 'DLN' },
+        { text: t('card.Form.v6'), value: 'GOVERNMENT_ISSUED_ID_CARD' }
+    ])
+    /** 根据接口配置过滤后的可用证件类型 */
+    const availableIdTypeOptions = computed(() => {
+        const allowList = (idTypesConfigList.value || '')
+            .split(',')
+            .map(i => i.trim())
+            .filter(Boolean)
+        if (!allowList.length) return []
+        return allIdTypeOptions.value.filter(opt =>
+            allowList.includes(opt.value)
+        )
+    })
+
+    /** 拉取接口配置 */
+    async function loadIdTypesConfig(code: string) {
+        try {
+            const res = await ucardApi.idTypesConfigList({
+                code,
+                page: { current: 1, row: 10 }
+            })
+
+            if (res?.code === 200) {
+                idTypesConfigList.value = res?.data?.[0]?.idType || ''
+            }
+        } catch (err) {
+            console.error('[useIdTypeOptions] load failed:', err)
+            idTypesConfigList.value = ''
+        }
+    }
+    return {
+        /** options */
+        availableIdTypeOptions,
+        allIdTypeOptions,
+        /** methods */
+        loadIdTypesConfig
+    }
+}

+ 5 - 2
config/index.ts

@@ -1,7 +1,10 @@
 const config = {
 const config = {
-  Host00: 'https://secure.44a5c8109e4.com',
+  // Host00: 'https://secure.cwgrd.com',
+  // Host85: 'https://ucard.cwgrd.com',
   // Host85: 'http://192.168.0.18:8700',
   // Host85: 'http://192.168.0.18:8700',
-  Host85: 'https://ucard.44a5c8109e4.com',
+  Host00: "https://ucard.44a5c8109e4.com",
+  Host85: "https://ucard.44a5c8109e4.com",
+  
   Code: {
   Code: {
     StatusOK: 200,
     StatusOK: 200,
     StatusFail: 400,
     StatusFail: 400,

+ 5 - 1
locale/ar.json

@@ -3385,7 +3385,7 @@
     "Tips1": "1. يرجى التحقق من الرصيد المتاح في حسابك الحالي قبل تقديم طلب التحويل لتجنب التأثير على عملياتك التجارية.",
     "Tips1": "1. يرجى التحقق من الرصيد المتاح في حسابك الحالي قبل تقديم طلب التحويل لتجنب التأثير على عملياتك التجارية.",
     "Tips2": "2. يرجى إدخال مبلغ التحويل بعد اختيار عملة التحويل/نوع التحويل/طريقة الدفع، وتعبئة/تأكيد المعلومات التالية.",
     "Tips2": "2. يرجى إدخال مبلغ التحويل بعد اختيار عملة التحويل/نوع التحويل/طريقة الدفع، وتعبئة/تأكيد المعلومات التالية.",
     "Tips3": "3. رسوم الخدمة هي مبلغ تقديري، يمكن عرض الرسوم الفعلية بعد إتمام التحويل.",
     "Tips3": "3. رسوم الخدمة هي مبلغ تقديري، يمكن عرض الرسوم الفعلية بعد إتمام التحويل.",
-    "Tips4": "4. سنقوم بمعالجة طلبك بمجرد استلامه. عادةً ما تستغرق المعالجة ما يصل إلى ساعة واحدة. لتجنب التأثير على عملياتك التجارية، يرجى الانتباه إلى وقت تقديم الطلب.",
+    "Tips4": "4. سنقوم بمعالجة طلبك بمجرد استلامه. عادةً ما تستغرق المعالجة ما يصل إلى 24 ساعة. لتجنب التأثير على عملياتك التجارية، يرجى الانتباه إلى وقت تقديم الطلب.",
     "t1": "الدافع",
     "t1": "الدافع",
     "t2": "حساب الدافع",
     "t2": "حساب الدافع",
     "t3": "عملة التحويل/نوع التحويل/طريقة الدفع",
     "t3": "عملة التحويل/نوع التحويل/طريقة الدفع",
@@ -5165,6 +5165,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "رمز سويفت البنكي",
+        "fieldDescription": "أدخل رمز SWIFT لبنك شركة المستلم"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "وثيقة وجه بطاقة هوية المرسل",
         "fieldTitle": "وثيقة وجه بطاقة هوية المرسل",
         "fieldDescription": "يرجى تحميل وجه بطاقة الهوية"
         "fieldDescription": "يرجى تحميل وجه بطاقة الهوية"

+ 5 - 1
locale/cn.json

@@ -3345,7 +3345,7 @@
     "Tips1": "1. 请在提交转账申请前检查您当前账户的可用金额,避免影响你的交易操作。",
     "Tips1": "1. 请在提交转账申请前检查您当前账户的可用金额,避免影响你的交易操作。",
     "Tips2": "2. 请在选择转账币种/转账类型/支付方式后输入转账金额,并填写、确认以下信息。",
     "Tips2": "2. 请在选择转账币种/转账类型/支付方式后输入转账金额,并填写、确认以下信息。",
     "Tips3": "3. 手续费为预估金额,实际手续费在转账完成后查看。",
     "Tips3": "3. 手续费为预估金额,实际手续费在转账完成后查看。",
-    "Tips4": "4. 我们在收到申请后,会在第一时间处理,处理时间一般在1小时内完成,为避免影响您的交易操作,请注意您提交申请的时间。",
+    "Tips4": "4. 我们在收到申请后,会在第一时间处理,处理时间一般在24小时内完成,为避免影响您的交易操作,请注意您提交申请的时间。",
     "t1": "付款人",
     "t1": "付款人",
     "t2": "付款账户",
     "t2": "付款账户",
     "t3": "转账币种/转账类型/支付方式",
     "t3": "转账币种/转账类型/支付方式",
@@ -5125,6 +5125,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "银行SWIFT代码",
+        "fieldDescription": "请输入收款公司银行的SWIFT代码"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "付款人身份证正面文件",
         "fieldTitle": "付款人身份证正面文件",
         "fieldDescription": "请上传身份证正面文件"
         "fieldDescription": "请上传身份证正面文件"

+ 5 - 1
locale/de.json

@@ -3396,7 +3396,7 @@
     "Tips1": "1. Bitte überprüfen Sie das verfügbare Guthaben auf Ihrem aktuellen Konto, bevor Sie eine Überweisungsanfrage einreichen, um Beeinträchtigungen Ihrer Transaktionen zu vermeiden.",
     "Tips1": "1. Bitte überprüfen Sie das verfügbare Guthaben auf Ihrem aktuellen Konto, bevor Sie eine Überweisungsanfrage einreichen, um Beeinträchtigungen Ihrer Transaktionen zu vermeiden.",
     "Tips2": "2. Bitte geben Sie den Überweisungsbetrag ein, nachdem Sie die Überweisungswährung/Überweisungstyp/Zahlungsmethode ausgewählt haben, und füllen Sie die folgenden Informationen aus/bestätigen Sie diese.",
     "Tips2": "2. Bitte geben Sie den Überweisungsbetrag ein, nachdem Sie die Überweisungswährung/Überweisungstyp/Zahlungsmethode ausgewählt haben, und füllen Sie die folgenden Informationen aus/bestätigen Sie diese.",
     "Tips3": "3. Die Servicegebühr ist ein geschätzter Betrag, die tatsächliche Servicegebühr kann nach Abschluss der Überweisung eingesehen werden.",
     "Tips3": "3. Die Servicegebühr ist ein geschätzter Betrag, die tatsächliche Servicegebühr kann nach Abschluss der Überweisung eingesehen werden.",
-    "Tips4": "4. Wir werden Ihre Anfrage umgehend bearbeiten, sobald wir sie erhalten. Die Bearbeitungszeit dauert in der Regel bis zu 1 Stunde. Achten Sie auf den Zeitpunkt Ihrer Anfrage, um Beeinträchtigungen Ihrer Transaktionen zu vermeiden.",
+    "Tips4": "4. Wir werden Ihre Anfrage umgehend bearbeiten, sobald wir sie erhalten. Die Bearbeitungszeit dauert in der Regel bis zu 24 Stunde. Achten Sie auf den Zeitpunkt Ihrer Anfrage, um Beeinträchtigungen Ihrer Transaktionen zu vermeiden.",
     "t1": "Zahler",
     "t1": "Zahler",
     "t2": "Zahlungskonto",
     "t2": "Zahlungskonto",
     "t3": "Überweisungswährung/Überweisungstyp/Zahlungsmethode",
     "t3": "Überweisungswährung/Überweisungstyp/Zahlungsmethode",
@@ -5176,6 +5176,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "Bank-SWIFT-Code",
+        "fieldDescription": "Geben Sie den SWIFT-Code der Bank des Empfängers ein"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "Vorderseite des Sender-Ausweisdokuments",
         "fieldTitle": "Vorderseite des Sender-Ausweisdokuments",
         "fieldDescription": "Bitte laden Sie die Vorderseite des Ausweises hoch"
         "fieldDescription": "Bitte laden Sie die Vorderseite des Ausweises hoch"

+ 5 - 1
locale/en.json

@@ -3750,7 +3750,7 @@
     "Tips1": "1. Please check the available balance in your current account before submitting a transfer request to avoid affecting your transaction operations.",
     "Tips1": "1. Please check the available balance in your current account before submitting a transfer request to avoid affecting your transaction operations.",
     "Tips2": "2. Please enter the transfer amount after selecting the transfer currency/type/payment method, and fill in/confirm the following information.",
     "Tips2": "2. Please enter the transfer amount after selecting the transfer currency/type/payment method, and fill in/confirm the following information.",
     "Tips3": "3. The service fee is an estimated amount, the actual service fee can be viewed after the transfer is completed.",
     "Tips3": "3. The service fee is an estimated amount, the actual service fee can be viewed after the transfer is completed.",
-    "Tips4": "4. We will process your application as soon as we receive it. Processing usually takes within 1 hour. To avoid affecting your transaction operations, please pay attention to the time you submit the application.",
+    "Tips4": "4. We will process your application as soon as we receive it. Processing usually takes within 24 hour. To avoid affecting your transaction operations, please pay attention to the time you submit the application.",
     "t1": "Payer",
     "t1": "Payer",
     "t2": "Payer Account",
     "t2": "Payer Account",
     "t3": "Transfer Currency/Transfer Type/Payment Method",
     "t3": "Transfer Currency/Transfer Type/Payment Method",
@@ -5530,6 +5530,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "Bank Swift Code",
+        "fieldDescription": "Please enter the SWIFT code of the receiver's company bank"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "Sender ID Card Front Document",
         "fieldTitle": "Sender ID Card Front Document",
         "fieldDescription": "Please upload the front side of ID card"
         "fieldDescription": "Please upload the front side of ID card"

+ 5 - 1
locale/es.json

@@ -3397,7 +3397,7 @@
     "Tips1": "1. Por favor, verifique el saldo disponible en su cuenta antes de enviar una solicitud de transferencia para evitar afectar sus operaciones comerciales.",
     "Tips1": "1. Por favor, verifique el saldo disponible en su cuenta antes de enviar una solicitud de transferencia para evitar afectar sus operaciones comerciales.",
     "Tips2": "2. Por favor, ingrese el monto de la transferencia después de seleccionar la moneda del transferido/tipo de transferencia/metodo de pago y complete/ confirme la siguiente información.",
     "Tips2": "2. Por favor, ingrese el monto de la transferencia después de seleccionar la moneda del transferido/tipo de transferencia/metodo de pago y complete/ confirme la siguiente información.",
     "Tips3": "3. La tarifa de servicio es una cantidad estimada, la tarifa real se puede ver después de completar la transferencia.",
     "Tips3": "3. La tarifa de servicio es una cantidad estimada, la tarifa real se puede ver después de completar la transferencia.",
-    "Tips4": "4. Procesaremos su solicitud tan pronto como la recibamos. El tiempo de procesamiento generalmente se completa dentro de 1 hora. Para evitar afectar sus operaciones comerciales, por favor tenga en cuenta la hora en que envía su solicitud.",
+    "Tips4": "4. Procesaremos su solicitud tan pronto como la recibamos. El tiempo de procesamiento generalmente se completa dentro de 24 hora. Para evitar afectar sus operaciones comerciales, por favor tenga en cuenta la hora en que envía su solicitud.",
     "t1": "Pagador",
     "t1": "Pagador",
     "t2": "Cuenta del Pagador",
     "t2": "Cuenta del Pagador",
     "t3": "Moneda de Transferencia/Tipo de Transferencia/Metodo de Pago",
     "t3": "Moneda de Transferencia/Tipo de Transferencia/Metodo de Pago",
@@ -5177,6 +5177,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "Código SWIFT del banco",
+        "fieldDescription": "Ingrese el código SWIFT del banco de la empresa del destinatario"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "Documento frontal de identificación del remitente",
         "fieldTitle": "Documento frontal de identificación del remitente",
         "fieldDescription": "Por favor, suba el frente del documento de identificación"
         "fieldDescription": "Por favor, suba el frente del documento de identificación"

+ 5 - 1
locale/fa.json

@@ -3397,7 +3397,7 @@
     "Tips1": "1. قبل از ارسال درخواست انتقال، موجودی قابل استفاده در حساب خود را بررسی کنید تا از تأثیرگذاری بر عملیات تراکنش خود جلوگیری کنید.",
     "Tips1": "1. قبل از ارسال درخواست انتقال، موجودی قابل استفاده در حساب خود را بررسی کنید تا از تأثیرگذاری بر عملیات تراکنش خود جلوگیری کنید.",
     "Tips2": "2. پس از انتخاب ارز انتقال/نوع انتقال/روش پرداخت، مبلغ انتقال را وارد کرده و اطلاعات زیر را تکمیل/تأیید کنید.",
     "Tips2": "2. پس از انتخاب ارز انتقال/نوع انتقال/روش پرداخت، مبلغ انتقال را وارد کرده و اطلاعات زیر را تکمیل/تأیید کنید.",
     "Tips3": "3. هزینه خدمات یک مقدار تقریبی است، هزینه واقعی خدمات پس از تکمیل انتقال قابل مشاهده است.",
     "Tips3": "3. هزینه خدمات یک مقدار تقریبی است، هزینه واقعی خدمات پس از تکمیل انتقال قابل مشاهده است.",
-    "Tips4": "4. ما درخواست شما را بلافاصله پس از دریافت آن پردازش خواهیم کرد. زمان پردازش معمولاً در کمتر از 1 ساعت تکمیل می‌شود. برای جلوگیری از تأثیرگذاری بر عملیات تراکنش خود، لطفاً به زمان ارسال درخواست توجه کنید.",
+    "Tips4": "4. ما درخواست شما را بلافاصله پس از دریافت آن پردازش خواهیم کرد. زمان پردازش معمولاً در کمتر از 24 ساعت تکمیل می‌شود. برای جلوگیری از تأثیرگذاری بر عملیات تراکنش خود، لطفاً به زمان ارسال درخواست توجه کنید.",
     "t1": "پرداخت‌کننده",
     "t1": "پرداخت‌کننده",
     "t2": "حساب پرداخت‌کننده",
     "t2": "حساب پرداخت‌کننده",
     "t3": "ارز انتقال/نوع انتقال/روش پرداخت",
     "t3": "ارز انتقال/نوع انتقال/روش پرداخت",
@@ -5177,6 +5177,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "کد سوئیفت بانک",
+        "fieldDescription": "کد SWIFT بانک شرکت دریافت‌کننده را وارد کنید"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "سند جلوی کارت شناسایی فرستنده",
         "fieldTitle": "سند جلوی کارت شناسایی فرستنده",
         "fieldDescription": "لطفاً روی کارت شناسایی را بارگذاری کنید"
         "fieldDescription": "لطفاً روی کارت شناسایی را بارگذاری کنید"

+ 5 - 1
locale/id.json

@@ -3397,7 +3397,7 @@
     "Tips1": "1. Harap periksa saldo yang tersedia di akun Anda sebelum mengajukan permintaan transfer untuk menghindari mempengaruhi operasi transaksi Anda.",
     "Tips1": "1. Harap periksa saldo yang tersedia di akun Anda sebelum mengajukan permintaan transfer untuk menghindari mempengaruhi operasi transaksi Anda.",
     "Tips2": "2. Harap masukkan jumlah transfer setelah memilih mata uang transfer/jenis transfer/metode pembayaran, dan lengkapi/konfirmasi informasi berikut.",
     "Tips2": "2. Harap masukkan jumlah transfer setelah memilih mata uang transfer/jenis transfer/metode pembayaran, dan lengkapi/konfirmasi informasi berikut.",
     "Tips3": "3. Biaya layanan adalah jumlah perkiraan, biaya layanan yang sebenarnya dapat dilihat setelah transfer selesai.",
     "Tips3": "3. Biaya layanan adalah jumlah perkiraan, biaya layanan yang sebenarnya dapat dilihat setelah transfer selesai.",
-    "Tips4": "4. Kami akan memproses permintaan Anda segera setelah kami menerimanya. Waktu pemrosesan biasanya selesai dalam waktu 1 jam. Untuk menghindari mempengaruhi operasi transaksi Anda, harap perhatikan waktu pengajuan permintaan.",
+    "Tips4": "4. Kami akan memproses permintaan Anda segera setelah kami menerimanya. Waktu pemrosesan biasanya selesai dalam waktu 24 jam. Untuk menghindari mempengaruhi operasi transaksi Anda, harap perhatikan waktu pengajuan permintaan.",
     "t1": "Pemberi Pembayaran",
     "t1": "Pemberi Pembayaran",
     "t2": "Akun Pemberi Pembayaran",
     "t2": "Akun Pemberi Pembayaran",
     "t3": "Mata Uang Transfer/Tipe Transfer/Metode Pembayaran",
     "t3": "Mata Uang Transfer/Tipe Transfer/Metode Pembayaran",
@@ -5177,6 +5177,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "Kode SWIFT Bank",
+        "fieldDescription": "Masukkan kode SWIFT bank perusahaan penerima"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "Dokumen Depan Kartu ID Pengirim",
         "fieldTitle": "Dokumen Depan Kartu ID Pengirim",
         "fieldDescription": "Harap unggah bagian depan kartu ID"
         "fieldDescription": "Harap unggah bagian depan kartu ID"

+ 5 - 1
locale/ko.json

@@ -3397,7 +3397,7 @@
     "Tips1": "1. 이체 요청을 제출하기 전에 현재 계좌의 사용 가능한 잔액을 확인하여 거래 작업에 영향을 미치지 않도록 하세요.",
     "Tips1": "1. 이체 요청을 제출하기 전에 현재 계좌의 사용 가능한 잔액을 확인하여 거래 작업에 영향을 미치지 않도록 하세요.",
     "Tips2": "2. 이체 금액을 입력한 후 이체 통화/이체 유형/결제 방법을 선택하고 아래 정보를 작성/확인하세요.",
     "Tips2": "2. 이체 금액을 입력한 후 이체 통화/이체 유형/결제 방법을 선택하고 아래 정보를 작성/확인하세요.",
     "Tips3": "3. 서비스 수수료는 추정 금액으로, 실제 서비스 수수료는 이체 완료 후 확인할 수 있습니다.",
     "Tips3": "3. 서비스 수수료는 추정 금액으로, 실제 서비스 수수료는 이체 완료 후 확인할 수 있습니다.",
-    "Tips4": "4. 우리는 신청을 받은 즉시 처리할 것입니다. 처리 시간은 보통 1시간 이내에 완료됩니다. 거래 작업에 영향을 미치지 않도록 신청 시간을 주의하세요.",
+    "Tips4": "4. 우리는 신청을 받은 즉시 처리할 것입니다. 처리 시간은 보통 24 시간 이내에 완료됩니다. 거래 작업에 영향을 미치지 않도록 신청 시간을 주의하세요.",
     "t1": "지불자",
     "t1": "지불자",
     "t2": "지불 계좌",
     "t2": "지불 계좌",
     "t3": "이체 통화/이체 유형/결제 방법",
     "t3": "이체 통화/이체 유형/결제 방법",
@@ -5177,6 +5177,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "은행 SWIFT 코드",
+        "fieldDescription": "수신자 회사 은행의 SWIFT 코드를 입력하세요"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "송신자 신분증 앞면 문서",
         "fieldTitle": "송신자 신분증 앞면 문서",
         "fieldDescription": "신분증 앞면을 업로드해 주세요"
         "fieldDescription": "신분증 앞면을 업로드해 주세요"

+ 5 - 1
locale/ms.json

@@ -3397,7 +3397,7 @@
     "Tips1": "1. Sila semak baki yang tersedia dalam akaun anda sebelum menghantar permintaan pemindahan untuk mengelakkan gangguan pada operasi transaksi anda.",
     "Tips1": "1. Sila semak baki yang tersedia dalam akaun anda sebelum menghantar permintaan pemindahan untuk mengelakkan gangguan pada operasi transaksi anda.",
     "Tips2": "2. Sila masukkan jumlah pemindahan selepas memilih mata wang pemindahan/jenis pemindahan/kaedah pembayaran, dan lengkapi/ sahkan maklumat berikut.",
     "Tips2": "2. Sila masukkan jumlah pemindahan selepas memilih mata wang pemindahan/jenis pemindahan/kaedah pembayaran, dan lengkapi/ sahkan maklumat berikut.",
     "Tips3": "3. Caj perkhidmatan adalah anggaran, caj perkhidmatan sebenar boleh dilihat selepas pemindahan selesai.",
     "Tips3": "3. Caj perkhidmatan adalah anggaran, caj perkhidmatan sebenar boleh dilihat selepas pemindahan selesai.",
-    "Tips4": "4. Kami akan memproses permintaan anda sebaik sahaja kami menerimanya. Masa pemprosesan biasanya diselesaikan dalam 1 jam. Untuk mengelakkan gangguan pada operasi transaksi anda, sila ambil perhatian waktu permintaan anda dihantar.",
+    "Tips4": "4. Kami akan memproses permintaan anda sebaik sahaja kami menerimanya. Masa pemprosesan biasanya diselesaikan dalam 24 jam. Untuk mengelakkan gangguan pada operasi transaksi anda, sila ambil perhatian waktu permintaan anda dihantar.",
     "t1": "Pembayar",
     "t1": "Pembayar",
     "t2": "Akaun Pembayar",
     "t2": "Akaun Pembayar",
     "t3": "Mata Wang Pemindahan/Jenis Pemindahan/Kaedah Pembayaran",
     "t3": "Mata Wang Pemindahan/Jenis Pemindahan/Kaedah Pembayaran",
@@ -5177,6 +5177,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "Kod SWIFT Bank",
+        "fieldDescription": "Masukkan kod SWIFT bank syarikat penerima"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "Dokumen Depan Kad Pengenalan Penghantar",
         "fieldTitle": "Dokumen Depan Kad Pengenalan Penghantar",
         "fieldDescription": "Sila muat naik bahagian depan kad pengenalan"
         "fieldDescription": "Sila muat naik bahagian depan kad pengenalan"

+ 5 - 1
locale/pt.json

@@ -3397,7 +3397,7 @@
     "Tips1": "1. Por favor, verifique o saldo disponível na sua conta antes de enviar uma solicitação de transferência para evitar impactar suas operações de transação.",
     "Tips1": "1. Por favor, verifique o saldo disponível na sua conta antes de enviar uma solicitação de transferência para evitar impactar suas operações de transação.",
     "Tips2": "2. Por favor, insira o valor da transferência após selecionar a moeda da transferência/tipo de transferência/método de pagamento e preencha/confirme as seguintes informações.",
     "Tips2": "2. Por favor, insira o valor da transferência após selecionar a moeda da transferência/tipo de transferência/método de pagamento e preencha/confirme as seguintes informações.",
     "Tips3": "3. A taxa de serviço é um valor estimado, a taxa de serviço real pode ser visualizada após a conclusão da transferência.",
     "Tips3": "3. A taxa de serviço é um valor estimado, a taxa de serviço real pode ser visualizada após a conclusão da transferência.",
-    "Tips4": "4. Processaremos sua solicitação assim que a recebermos. O tempo de processamento normalmente é concluído em até 1 hora. Para evitar impactos nas suas operações de transação, por favor, preste atenção ao horário em que enviar sua solicitação.",
+    "Tips4": "4. Processaremos sua solicitação assim que a recebermos. O tempo de processamento normalmente é concluído em até 24 hora. Para evitar impactos nas suas operações de transação, por favor, preste atenção ao horário em que enviar sua solicitação.",
     "t1": "Pagador",
     "t1": "Pagador",
     "t2": "Conta do Pagador",
     "t2": "Conta do Pagador",
     "t3": "Moeda de Transferência/Tipo de Transferência/Método de Pagamento",
     "t3": "Moeda de Transferência/Tipo de Transferência/Método de Pagamento",
@@ -5177,6 +5177,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "Código SWIFT do banco",
+        "fieldDescription": "Digite o código SWIFT do banco da empresa do destinatário"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "Documento Frente do Cartão de Identidade do Remetente",
         "fieldTitle": "Documento Frente do Cartão de Identidade do Remetente",
         "fieldDescription": "Por favor, faça o upload da frente do documento de identidade"
         "fieldDescription": "Por favor, faça o upload da frente do documento de identidade"

+ 5 - 1
locale/th.json

@@ -3397,7 +3397,7 @@
     "Tips1": "1. กรุณาตรวจสอบยอดเงินที่สามารถใช้งานได้ในบัญชีของคุณก่อนที่จะส่งคำขอโอนเพื่อหลีกเลี่ยงผลกระทบต่อการดำเนินธุรกรรมของคุณ.",
     "Tips1": "1. กรุณาตรวจสอบยอดเงินที่สามารถใช้งานได้ในบัญชีของคุณก่อนที่จะส่งคำขอโอนเพื่อหลีกเลี่ยงผลกระทบต่อการดำเนินธุรกรรมของคุณ.",
     "Tips2": "2. กรุณากรอกจำนวนเงินโอนหลังจากเลือกสกุลเงิน/ประเภทการโอน/วิธีการชำระเงิน และกรอก/ยืนยันข้อมูลต่อไปนี้.",
     "Tips2": "2. กรุณากรอกจำนวนเงินโอนหลังจากเลือกสกุลเงิน/ประเภทการโอน/วิธีการชำระเงิน และกรอก/ยืนยันข้อมูลต่อไปนี้.",
     "Tips3": "3. ค่าธรรมเนียมบริการเป็นจำนวนประมาณ, ค่าธรรมเนียมจริงจะสามารถดูได้หลังจากที่โอนเสร็จสิ้น.",
     "Tips3": "3. ค่าธรรมเนียมบริการเป็นจำนวนประมาณ, ค่าธรรมเนียมจริงจะสามารถดูได้หลังจากที่โอนเสร็จสิ้น.",
-    "Tips4": "4. เราจะดำเนินการคำขอของคุณทันทีที่ได้รับ คำขอจะได้รับการดำเนินการภายใน 1 ชั่วโมงโดยปกติ เพื่อหลีกเลี่ยงผลกระทบต่อการดำเนินธุรกรรมของคุณ กรุณาสังเกตเวลาในการส่งคำขอ.",
+    "Tips4": "4. เราจะดำเนินการคำขอของคุณทันทีที่ได้รับ คำขอจะได้รับการดำเนินการภายใน 24 ชั่วโมงโดยปกติ เพื่อหลีกเลี่ยงผลกระทบต่อการดำเนินธุรกรรมของคุณ กรุณาสังเกตเวลาในการส่งคำขอ.",
     "t1": "ผู้โอนเงิน",
     "t1": "ผู้โอนเงิน",
     "t2": "บัญชีผู้โอน",
     "t2": "บัญชีผู้โอน",
     "t3": "สกุลเงินการโอน/ประเภทการโอน/วิธีการชำระเงิน",
     "t3": "สกุลเงินการโอน/ประเภทการโอน/วิธีการชำระเงิน",
@@ -5177,6 +5177,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "รหัส SWIFT ของธนาคาร",
+        "fieldDescription": "กรอกรหัส SWIFT ของธนาคารบริษัทผู้รับ"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "เอกสารด้านหน้าบัตรประจำตัวผู้ส่ง",
         "fieldTitle": "เอกสารด้านหน้าบัตรประจำตัวผู้ส่ง",
         "fieldDescription": "กรุณาอัพโหลดด้านหน้าของบัตรประจำตัวประชาชน"
         "fieldDescription": "กรุณาอัพโหลดด้านหน้าของบัตรประจำตัวประชาชน"

+ 5 - 1
locale/tr.json

@@ -3397,7 +3397,7 @@
     "Tips1": "1. Transfer talebini göndermeden önce mevcut hesabınızdaki kullanılabilir bakiyeyi kontrol edin, böylece ticaret işlemlerinizin etkilenmesini engellersiniz.",
     "Tips1": "1. Transfer talebini göndermeden önce mevcut hesabınızdaki kullanılabilir bakiyeyi kontrol edin, böylece ticaret işlemlerinizin etkilenmesini engellersiniz.",
     "Tips2": "2. Transfer miktarını girdikten sonra transfer para birimi/transfer tipi/ödeme yöntemini seçin ve aşağıdaki bilgileri doldurun/onaylayın.",
     "Tips2": "2. Transfer miktarını girdikten sonra transfer para birimi/transfer tipi/ödeme yöntemini seçin ve aşağıdaki bilgileri doldurun/onaylayın.",
     "Tips3": "3. Hizmet ücreti tahmini bir tutardır, gerçek hizmet ücreti transfer tamamlandığında görüntülenebilir.",
     "Tips3": "3. Hizmet ücreti tahmini bir tutardır, gerçek hizmet ücreti transfer tamamlandığında görüntülenebilir.",
-    "Tips4": "4. Başvurunuzu aldığımızda hemen işlem yapacağız. İşlem süresi genellikle 1 saat içinde tamamlanır. Ticaret işlemlerinizi etkilememek için başvuru saatinize dikkat edin.",
+    "Tips4": "4. Başvurunuzu aldığımızda hemen işlem yapacağız. İşlem süresi genellikle 24 saat içinde tamamlanır. Ticaret işlemlerinizi etkilememek için başvuru saatinize dikkat edin.",
     "t1": "Ödeyen",
     "t1": "Ödeyen",
     "t2": "Ödeme Hesabı",
     "t2": "Ödeme Hesabı",
     "t3": "Transfer Para Birimi/Transfer Tipi/Ödeme Yöntemi",
     "t3": "Transfer Para Birimi/Transfer Tipi/Ödeme Yöntemi",
@@ -5177,6 +5177,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "Banka SWIFT Kodu",
+        "fieldDescription": "Alıcının şirket bankasının SWIFT kodunu girin"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "Gönderen Kimlik Kartı Ön Belgesi",
         "fieldTitle": "Gönderen Kimlik Kartı Ön Belgesi",
         "fieldDescription": "Lütfen kimlik kartının ön yüzünü yükleyin"
         "fieldDescription": "Lütfen kimlik kartının ön yüzünü yükleyin"

+ 5 - 1
locale/vn.json

@@ -3396,7 +3396,7 @@
     "Tips1": "1. Vui lòng kiểm tra số dư khả dụng trong tài khoản của bạn trước khi gửi yêu cầu chuyển tiền để tránh ảnh hưởng đến các giao dịch của bạn.",
     "Tips1": "1. Vui lòng kiểm tra số dư khả dụng trong tài khoản của bạn trước khi gửi yêu cầu chuyển tiền để tránh ảnh hưởng đến các giao dịch của bạn.",
     "Tips2": "2. Vui lòng nhập số tiền chuyển sau khi chọn loại tiền tệ/chuyển tiền/phương thức thanh toán, và điền/xác nhận thông tin sau.",
     "Tips2": "2. Vui lòng nhập số tiền chuyển sau khi chọn loại tiền tệ/chuyển tiền/phương thức thanh toán, và điền/xác nhận thông tin sau.",
     "Tips3": "3. Phí dịch vụ là số ước tính, phí dịch vụ thực tế sẽ được hiển thị sau khi hoàn thành chuyển tiền.",
     "Tips3": "3. Phí dịch vụ là số ước tính, phí dịch vụ thực tế sẽ được hiển thị sau khi hoàn thành chuyển tiền.",
-    "Tips4": "4. Chúng tôi sẽ xử lý yêu cầu của bạn ngay khi nhận được, quá trình xử lý thường hoàn thành trong vòng 1 giờ. Để tránh ảnh hưởng đến giao dịch của bạn, vui lòng chú ý đến thời gian bạn gửi yêu cầu.",
+    "Tips4": "4. Chúng tôi sẽ xử lý yêu cầu của bạn ngay khi nhận được, quá trình xử lý thường hoàn thành trong vòng 24 giờ. Để tránh ảnh hưởng đến giao dịch của bạn, vui lòng chú ý đến thời gian bạn gửi yêu cầu.",
     "t1": "Người gửi tiền",
     "t1": "Người gửi tiền",
     "t2": "Tài khoản người gửi",
     "t2": "Tài khoản người gửi",
     "t3": "Tiền tệ chuyển tiền/Loại chuyển tiền/Phương thức thanh toán",
     "t3": "Tiền tệ chuyển tiền/Loại chuyển tiền/Phương thức thanh toán",
@@ -5176,6 +5176,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "Mã SWIFT ngân hàng",
+        "fieldDescription": "Nhập mã SWIFT của ngân hàng công ty người nhận"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "Tài liệu mặt trước CMND Người gửi",
         "fieldTitle": "Tài liệu mặt trước CMND Người gửi",
         "fieldDescription": "Vui lòng tải lên mặt trước CMND"
         "fieldDescription": "Vui lòng tải lên mặt trước CMND"

+ 5 - 1
locale/zhHant.json

@@ -3378,7 +3378,7 @@
     "Tips1": "1. 請在提交轉帳申請前檢查您當前帳戶的可用金額,避免影響你的交易操作。",
     "Tips1": "1. 請在提交轉帳申請前檢查您當前帳戶的可用金額,避免影響你的交易操作。",
     "Tips2": "2. 請在選擇轉帳幣種/轉帳類型/支付方式後輸入轉帳金額,並填寫、確認以下資訊。",
     "Tips2": "2. 請在選擇轉帳幣種/轉帳類型/支付方式後輸入轉帳金額,並填寫、確認以下資訊。",
     "Tips3": "3. 手續費為預估金額,實際手續費在轉帳完成後查看。",
     "Tips3": "3. 手續費為預估金額,實際手續費在轉帳完成後查看。",
-    "Tips4": "4. 我們在收到申請後,會在第一時間處理,處理時間一般在1小時內完成,為避免影響您的交易操作,請注意您提交申請的時間。",
+    "Tips4": "4. 我們在收到申請後,會在第一時間處理,處理時間一般在24小時內完成,為避免影響您的交易操作,請注意您提交申請的時間。",
     "t1": "付款人",
     "t1": "付款人",
     "t2": "付款帳戶",
     "t2": "付款帳戶",
     "t3": "轉帳幣種/轉帳類型/支付方式",
     "t3": "轉帳幣種/轉帳類型/支付方式",
@@ -5158,6 +5158,10 @@
       "Jervis Bay": "Jervis Bay"
       "Jervis Bay": "Jervis Bay"
     },
     },
     "fieldName": {
     "fieldName": {
+      "receiverBankSwiftCode": {
+        "fieldTitle": "銀行 SWIFT 代碼",
+        "fieldDescription": "請輸入收款公司銀行的 SWIFT 代碼"
+      },
       "sender_ic": {
       "sender_ic": {
         "fieldTitle": "付款人身分證正面文件",
         "fieldTitle": "付款人身分證正面文件",
         "fieldDescription": "請上傳身分證正面文件"
         "fieldDescription": "請上傳身分證正面文件"

+ 9 - 32
manifest.json

@@ -1,9 +1,9 @@
 {
 {
-    "name" : "CWG Card",
-    "appid" : "__UNI__EFA7490",
+    "name" : "C Pays",
+    "appid" : "__UNI__60A9455",
     "description" : "应用描述",
     "description" : "应用描述",
     "versionName" : "1.0.1",
     "versionName" : "1.0.1",
-    "versionCode" : "100",
+    "versionCode" : 2,
     "transformPx" : false,
     "transformPx" : false,
     "app-plus" : {
     "app-plus" : {
         "usingComponents" : true,
         "usingComponents" : true,
@@ -29,40 +29,17 @@
         "distribute" : {
         "distribute" : {
             "android" : {
             "android" : {
                 "permissions" : [
                 "permissions" : [
-                    "<uses-feature android:name=\"android.hardware.camera\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
-                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_MOCK_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
                     "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                     "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                     "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                     "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
                     "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                     "<uses-permission android:name=\"android.permission.CAMERA\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
-                    "<uses-permission android:name=\"android.permission.GET_TASKS\"/>",
-                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
-                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
-                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_SMS\"/>",
-                    "<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
                     "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
                     "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
-                    "<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
-                    "<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>",
-                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
-                    "<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>"
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>"
                 ],
                 ],
-                "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ]
+                "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
+                "targetSdkVersion" : 35,
+                "minSdkVersion" : 29
             },
             },
             "ios" : {
             "ios" : {
                 "UIBackgroundModes" : [ "audio" ],
                 "UIBackgroundModes" : [ "audio" ],

+ 25 - 4
pages/login/index.vue

@@ -1,5 +1,5 @@
 <script setup>
 <script setup>
-import { ref, onMounted, watch } from "vue";
+import { ref, onMounted, computed } from "vue";
 
 
 import { post } from "@/utils/request";
 import { post } from "@/utils/request";
 import { userToken } from "@/composables/config";
 import { userToken } from "@/composables/config";
@@ -10,7 +10,6 @@ import useRouter from "@/hooks/useRouter";
 import { useI18n } from "vue-i18n";
 import { useI18n } from "vue-i18n";
 const router = useRouter();
 const router = useRouter();
 const { t } = useI18n();
 const { t } = useI18n();
-
 const userStore = useUserStore();
 const userStore = useUserStore();
 // 响应式表单数据
 // 响应式表单数据
 const form = ref({
 const form = ref({
@@ -53,6 +52,7 @@ async function handleLogin() {
       userToken.value = res.data;
       userToken.value = res.data;
       uni.$u.toast(t("login.msg0_1"));
       uni.$u.toast(t("login.msg0_1"));
       getUserInfo();
       getUserInfo();
+      reasonsRefusalList();
       if (remenber.value.length) {
       if (remenber.value.length) {
         userStore.saveAccountInfo({
         userStore.saveAccountInfo({
           loginName: form.value.loginName,
           loginName: form.value.loginName,
@@ -78,8 +78,6 @@ async function getUserInfo() {
   try {
   try {
     const res = await ucardApi.getSingle();
     const res = await ucardApi.getSingle();
     userStore.saveUserInfo(res.data);
     userStore.saveUserInfo(res.data);
-    console.log(res, 111);
-
     if (res.code === 200) {
     if (res.code === 200) {
       if (!res.data || res.data.approveStatus != 2) {
       if (!res.data || res.data.approveStatus != 2) {
         router.push("/pages/mine/improve");
         router.push("/pages/mine/improve");
@@ -93,6 +91,29 @@ async function getUserInfo() {
     console.log(error, 111);
     console.log(error, 111);
   }
   }
 }
 }
+async function reasonsRefusalList() {
+  try {
+    const res = await ucardApi.reasonsRefusalList();
+    if (res.code === 200) {
+      pickFields(res.data);
+    } else {
+      uni.$u.toast(res.msg || t("login.msg0"));
+    }
+  } catch (error) {
+    console.log(error, 111);
+  }
+}
+function pickFields(source, fields = ['content', 'enContent']) {
+  const result = {}
+
+  Object.entries(source).forEach(([key, value]) => {
+    result[key] = fields.reduce((acc, f) => {
+      acc[f] = value[f] ?? null
+      return acc
+    }, {})
+  })
+  userStore.saveReasonsOptions(result);
+}
 
 
 onMounted(() => {
 onMounted(() => {
   const accountInfo = userStore.accountInfo;
   const accountInfo = userStore.accountInfo;

+ 11 - 22
pages/mine/improve.vue

@@ -26,7 +26,7 @@
         </view>
         </view>
         <!-- 第二步:国籍信息 -->
         <!-- 第二步:国籍信息 -->
         <view v-show="currentStep === 2" class="form-section">
         <view v-show="currentStep === 2" class="form-section">
-          <h3 class="section-title">{{ t("global.t1") }}</h3>
+          <h3 class="section-title">{{ t("ImproveImmediately.Title.AddressInformation") }}</h3>
           <cwg-input v-if="countryOptions.length > 0" v-model:value="formData.nationality" fkey="nationality"
           <cwg-input v-if="countryOptions.length > 0" v-model:value="formData.nationality" fkey="nationality"
             type="select" :required="true" :show-search="true" rulesKey="nationality" :columns="countryOptions"
             type="select" :required="true" :show-search="true" rulesKey="nationality" :columns="countryOptions"
             :label="t('card.Form.f7')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
             :label="t('card.Form.f7')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
@@ -54,9 +54,9 @@
         <!-- 第四步:证件信息 -->
         <!-- 第四步:证件信息 -->
         <view v-show="currentStep === 4" class="form-section">
         <view v-show="currentStep === 4" class="form-section">
           <h3 class="section-title">{{ t("card.Info.s2") }}</h3>
           <h3 class="section-title">{{ t("card.Info.s2") }}</h3>
-          <cwg-input v-model:value="formData.idType" rulesKey="idType" fkey="idType" :required="true" type="select"
-            :columns="idTypeOptions" :label="t('card.Form.f16')" :readonly="isReadonly" :disabled="isReadonly"
-            @change="handleChange" />
+          <cwg-input v-if="availableIdTypeOptions.length" v-model:value="formData.idType" rulesKey="idType"
+            fkey="idType" :required="true" type="select" :columns="availableIdTypeOptions" :label="t('card.Form.f16')"
+            :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
           <cwg-input v-model:value="formData.idNumber" :required="true" rulesKey="idNumber" fkey="idNumber"
           <cwg-input v-model:value="formData.idNumber" :required="true" rulesKey="idNumber" fkey="idNumber"
             :label="t('card.Form.f17')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
             :label="t('card.Form.f17')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
           <cwg-input v-if="formData.nationality == 'US'" v-model:value="formData.ssn" fkey="ssn" rulesKey="ssn"
           <cwg-input v-if="formData.nationality == 'US'" v-model:value="formData.ssn" fkey="ssn" rulesKey="ssn"
@@ -182,12 +182,16 @@ import { userToken } from "@/composables/config";
 import { ucardApi } from "@/api/ucard";
 import { ucardApi } from "@/api/ucard";
 import { userApi } from "@/api/user";
 import { userApi } from "@/api/user";
 import useUserStore from "@/stores/use-user-store";
 import useUserStore from "@/stores/use-user-store";
+import useIdTypeOptions from "@/composables/useIdTypeOptions";
 import { Patterns, Validators } from "@/utils/validators";
 import { Patterns, Validators } from "@/utils/validators";
 import CardWebsdkLink from "@/components/card-websdkLink.vue";
 import CardWebsdkLink from "@/components/card-websdkLink.vue";
 import useRouter from "@/hooks/useRouter";
 import useRouter from "@/hooks/useRouter";
 const router = useRouter();
 const router = useRouter();
 const userStore = useUserStore();
 const userStore = useUserStore();
 const userInfo = computed(() => userStore.userInfo);
 const userInfo = computed(() => userStore.userInfo);
+const { availableIdTypeOptions, loadIdTypesConfig } = useIdTypeOptions()
+console.log(availableIdTypeOptions, 1212121, 'storeIdTypeOptionsstoreIdTypeOptions');
+
 const { t } = useI18n();
 const { t } = useI18n();
 const currentStep = ref<number>(1);
 const currentStep = ref<number>(1);
 const cardWebsdkLinkRef = ref<InstanceType<typeof CardWebsdkLink> | null>(null);
 const cardWebsdkLinkRef = ref<InstanceType<typeof CardWebsdkLink> | null>(null);
@@ -207,13 +211,6 @@ const sexOptions = ref([
   { text: t("card.Form.v2"), value: "F" },
   { text: t("card.Form.v2"), value: "F" },
 ]);
 ]);
 
 
-const idTypeOptions = ref([
-  { text: t("card.Form.v3"), value: "HK_HKID" },
-  { text: t("card.Form.v4"), value: "PASSPORT" },
-  { text: t("card.Form.v5"), value: "DLN" },
-  { text: t("card.Form.v6"), value: "GOVERNMENT_ISSUED_ID_CARD" },
-]);
-
 function validateName(a: any, b?: any, c?: any) {
 function validateName(a: any, b?: any, c?: any) {
   const reg = /^[A-Z\s]+$/i;
   const reg = /^[A-Z\s]+$/i;
   // Element 风格: (rule, value, callback)
   // Element 风格: (rule, value, callback)
@@ -414,6 +411,7 @@ async function getCountryListForSelect() {
   }
   }
 }
 }
 
 
+
 // 获取城市列表
 // 获取城市列表
 async function getCityListForSelect(countryCode: string) {
 async function getCityListForSelect(countryCode: string) {
   try {
   try {
@@ -454,6 +452,7 @@ function handleChange(value: any) {
   if (value.key === "nationality") {
   if (value.key === "nationality") {
     formData.value = { ...formData.value, country: value.value };
     formData.value = { ...formData.value, country: value.value };
     getCityListForSelect(value.value);
     getCityListForSelect(value.value);
+    loadIdTypesConfig(value.value);
     formData.value.town = "";
     formData.value.town = "";
   }
   }
 }
 }
@@ -558,17 +557,6 @@ function initFormDataWithUserInfo() {
         });
         });
       }
       }
     }
     }
-
-    // 确保 idType 在选项中
-    if (formData.value.idType) {
-      const idTypeExists = idTypeOptions.value.some(item => item.value === formData.value.idType);
-      if (!idTypeExists) {
-        idTypeOptions.value.push({
-          text: formData.value.idType,
-          value: formData.value.idType
-        });
-      }
-    }
   }, 100);
   }, 100);
 }
 }
 
 
@@ -601,6 +589,7 @@ async function getUserSingle() {
       // 如果有国籍信息,加载对应的城市列表
       // 如果有国籍信息,加载对应的城市列表
       if (res.data.nationality) {
       if (res.data.nationality) {
         await getCityListForSelect(res.data.nationality);
         await getCityListForSelect(res.data.nationality);
+        await loadIdTypesConfig(res.data.nationality);
       }
       }
     }
     }
   } catch (error: any) {
   } catch (error: any) {

+ 7 - 3
pages/mine/info.vue

@@ -25,7 +25,7 @@
                 <view class="info-card">
                 <view class="info-card">
                     <view class="card-header">
                     <view class="card-header">
                         <cwg-icon name="dw" :size="20" color="#16a34a" />
                         <cwg-icon name="dw" :size="20" color="#16a34a" />
-                        <text class="card-title">{{ t('global.t1') }}</text>
+                        <text class="card-title">{{ t('ImproveImmediately.Title.AddressInformation') }}</text>
                     </view>
                     </view>
                     <view class="card-body">
                     <view class="card-body">
                         <info-row icon="gj" :label="t('card.Form.f7')" :value="userInfo.countryCnName" />
                         <info-row icon="gj" :label="t('card.Form.f7')" :value="userInfo.countryCnName" />
@@ -59,7 +59,7 @@
                     </view>
                     </view>
                     <view class="card-body">
                     <view class="card-body">
                         <verification-row icon="checkmarkempty" :label="t('card.Form.f16')"
                         <verification-row icon="checkmarkempty" :label="t('card.Form.f16')"
-                            :status="getIdentityStatus()" :date="getIdentityDate()" :idType="userInfo.idType"
+                            :status="getIdentityStatus()" :date="getIdentityDate()" :idType="idTypeOptions[0]?.text"
                             :idFrontUrl="userInfo.idFrontUrl" :idBackUrl="userInfo.idBackUrl"
                             :idFrontUrl="userInfo.idFrontUrl" :idBackUrl="userInfo.idBackUrl"
                             :idHoldUrl="userInfo.idHoldUrl" :isLast="true" />
                             :idHoldUrl="userInfo.idHoldUrl" :isLast="true" />
                     </view>
                     </view>
@@ -82,12 +82,16 @@ import VerificationRow from './components/VerificationRow.vue';
 import { useI18n } from "vue-i18n";
 import { useI18n } from "vue-i18n";
 import useUserStore from "@/stores/use-user-store";
 import useUserStore from "@/stores/use-user-store";
 import useRouter from "@/hooks/useRouter";
 import useRouter from "@/hooks/useRouter";
-
+import useIdTypeOptions from "@/composables/useIdTypeOptions";
+const { allIdTypeOptions } = useIdTypeOptions()
 const userStore = useUserStore();
 const userStore = useUserStore();
 const userInfo = computed(() => userStore.userInfo);
 const userInfo = computed(() => userStore.userInfo);
 const { t } = useI18n();
 const { t } = useI18n();
 const router = useRouter();
 const router = useRouter();
 
 
+const idTypeOptions = computed(() => {
+    return allIdTypeOptions.value?.filter(item => item.value === userInfo.value?.idType);
+});
 // 获取身份认证状态
 // 获取身份认证状态
 function getIdentityStatus() {
 function getIdentityStatus() {
     // 认证成功就是已认证;否则视为审核中(pending)
     // 认证成功就是已认证;否则视为审核中(pending)

+ 1 - 1
pages/recharge-record/detail.vue

@@ -303,7 +303,7 @@ const copyOrderNo = () => {
     data: orderDetail.orderNo,
     data: orderDetail.orderNo,
     success: () => {
     success: () => {
       uni.showToast({
       uni.showToast({
-        title: '订单号已复制',
+        title: t('card.Msg.m8') || '复制成功',
         icon: 'success'
         icon: 'success'
       });
       });
     }
     }

+ 61 - 52
pages/wallet/components/DynamicForm.vue

@@ -7,35 +7,39 @@
         <slot name="bottom"></slot>
         <slot name="bottom"></slot>
         <slot name="transferAmount"></slot>
         <slot name="transferAmount"></slot>
         <view v-for="(group, groupKey) in groupedFields" :key="groupKey">
         <view v-for="(group, groupKey) in groupedFields" :key="groupKey">
-          <view class="form-group">
+          <view class="form-group" v-if="type != 2">
             <text class="form-label1">{{ getGroupTitle(groupKey) }}</text>
             <text class="form-label1">{{ getGroupTitle(groupKey) }}</text>
           </view>
           </view>
           <view v-for="field in group" :key="field.fieldName" class="form-group">
           <view v-for="field in group" :key="field.fieldName" class="form-group">
             <template v-if="!isNoList.includes(field.fieldName)">
             <template v-if="!isNoList.includes(field.fieldName)">
               <!-- 输入框 -->
               <!-- 输入框 -->
               <cwg-input :rulesKey="field.fieldName" :label="tFieldTitle(field)" :required="field.required"
               <cwg-input :rulesKey="field.fieldName" :label="tFieldTitle(field)" :required="field.required"
-                v-if="field.fieldType === 'input'" v-model:value="form[field.fieldName]" :fkey="field.fieldName"
-                type="text" :placeholder="tDescription(field)" :disabled="!!field.fixedValue"
-                @change="clearFieldValidate(field)" />
+                :disabled="field.disabled || !!field.fixedValue" v-if="field.fieldType === 'input'"
+                v-model:value="form[field.fieldName]" :fkey="field.fieldName" type="text"
+                :placeholder="tDescription(field)" @change="clearFieldValidate(field)" />
               <!-- 数字 -->
               <!-- 数字 -->
               <cwg-input :rulesKey="field.fieldName" :label="tFieldTitle(field)" :required="field.required"
               <cwg-input :rulesKey="field.fieldName" :label="tFieldTitle(field)" :required="field.required"
-                v-else-if="field.fieldType === 'number'" v-model:value="form[field.fieldName]" :fkey="field.fieldName"
-                type="number" :placeholder="tDescription(field)" :disabled="!!field.fixedValue" />
+                :disabled="field.disabled || !!field.fixedValue" v-else-if="field.fieldType === 'number'"
+                v-model:value="form[field.fieldName]" :fkey="field.fieldName" type="number"
+                :placeholder="tDescription(field)" />
 
 
               <!-- 日期 -->
               <!-- 日期 -->
               <cwg-input :rulesKey="field.fieldName" :label="tFieldTitle(field)" :required="field.required"
               <cwg-input :rulesKey="field.fieldName" :label="tFieldTitle(field)" :required="field.required"
-                v-else-if="field.fieldType === 'date'" v-model:value="form[field.fieldName]" :fkey="field.fieldName"
-                type="date" :placeholder="tDescription(field)" @change="clearFieldValidate(field)" />
+                :disabled="field.disabled || !!field.fixedValue" v-else-if="field.fieldType === 'date'"
+                v-model:value="form[field.fieldName]" :fkey="field.fieldName" type="date"
+                :placeholder="tDescription(field)" @change="clearFieldValidate(field)" />
               <!-- 下拉选择 -->
               <!-- 下拉选择 -->
               <cwg-input :rulesKey="field.fieldName" :label="tFieldTitle(field)" :required="field.required"
               <cwg-input :rulesKey="field.fieldName" :label="tFieldTitle(field)" :required="field.required"
-                v-else-if="field.fieldType === 'select'" v-model:value="form[field.fieldName]" :fkey="field.fieldName"
-                type="select" :columns="field.availableDtos.map(i => ({ text: i.value, value: i.valueId }))"
+                :disabled="field.disabled || !!field.fixedValue" v-else-if="field.fieldType === 'select'"
+                v-model:value="form[field.fieldName]" :fkey="field.fieldName" type="select"
+                :columns="field.availableDtos.map(i => ({ text: i.value, value: i.valueId }))"
                 :placeholder="tDescription(field)" @change="clearFieldValidate(field)" />
                 :placeholder="tDescription(field)" @change="clearFieldValidate(field)" />
               <!-- 文件上传 -->
               <!-- 文件上传 -->
               <template v-else-if="field.fieldType === 'file'">
               <template v-else-if="field.fieldType === 'file'">
                 <cwg-input :rulesKey="field.fieldName" :label="tFieldTitle(field)" :required="field.required"
                 <cwg-input :rulesKey="field.fieldName" :label="tFieldTitle(field)" :required="field.required"
-                  v-model:value="form[field.fieldName]" :fkey="field.fieldName" type="upload"
-                  :accept="'.jpg,.jpeg,.png,.pdf'" :is-upload-d="true" @change="onFileChange(field, $event)">
+                  :disabled="field.disabled || !!field.fixedValue" v-model:value="form[field.fieldName]"
+                  :fkey="field.fieldName" type="upload" :accept="'.jpg,.jpeg,.png,.pdf'" :is-upload-d="true"
+                  @change="onFileChange(field, $event)">
                   <view class="cwg-upload">
                   <view class="cwg-upload">
                     <u-icon name="folder" />
                     <u-icon name="folder" />
                     <text class="name">{{ tFieldDescription(field) }}</text>
                     <text class="name">{{ tFieldDescription(field) }}</text>
@@ -76,13 +80,14 @@ import { useI18n } from "vue-i18n";
 import { uploadApi } from "@/api/upload";
 import { uploadApi } from "@/api/upload";
 import Config from "@/config";
 import Config from "@/config";
 const { Host00 } = Config;
 const { Host00 } = Config;
-const isNoList = ['payoutMethod', 'transferType', 'payoutCurrency', 'transferAmount', 'senderAddress', 'senderDateOfBirth', 'senderCity', 'senderCountry', 'senderNationality']
+const isNoList = ['payoutMethod', 'transferType', 'payoutCurrency', 'transferAmount', 'senderAddress', 'senderDateOfBirth', 'senderCity', 'senderNationality']
 
 
 // props
 // props
 const props = defineProps({
 const props = defineProps({
   fields: Array,
   fields: Array,
   globalForm: Object,
   globalForm: Object,
-  step2: Boolean
+  step2: Boolean,
+  type: String
 });
 });
 
 
 // emit
 // emit
@@ -132,7 +137,45 @@ watch(
 // 校验规则
 // 校验规则
 // -----------------------------------------------------
 // -----------------------------------------------------
 const rules = ref({});
 const rules = ref({});
+// -----------------------------------------------------
+// 多语言
+// -----------------------------------------------------
+const tFieldTitle = (f) =>
+  t(`global.fieldName.${f.fieldName}.fieldTitle`) || f.fieldTitle;
+
+const tFieldDescription = (f) =>
+  t(`global.fieldName.${f.fieldName}.fieldDescription`) || f.fieldDescription;
 
 
+const tDescription = (f) =>
+  t(`global.fieldName.${f.fieldName}.fieldDescription`) || f.fieldDescription;
+// -----------------------------------------------------
+// 校验
+// -----------------------------------------------------
+const getRules = (field) => {
+  const fieldRules = [];
+
+  if (field.required) {
+    fieldRules.push({
+      required: true,
+      message: tFieldTitle(field) + t("global.GlobalOrder.RulesRequire"),
+      trigger: ['blur', 'change']
+    });
+  }
+
+  if (field.regex) {
+    try {
+      fieldRules.push({
+        pattern: new RegExp(field.regex),
+        message: tFieldTitle(field) + t("global.GlobalOrder.RulesReg"),
+        trigger: ['blur', 'change']
+      });
+    } catch (e) {
+      console.warn('正则表达式解析失败:', field.regex, e);
+    }
+  }
+
+  return fieldRules;
+};
 // -----------------------------------------------------
 // -----------------------------------------------------
 // 字段初始化回显 (相当于Vue2中的watch fields)
 // 字段初始化回显 (相当于Vue2中的watch fields)
 // -----------------------------------------------------
 // -----------------------------------------------------
@@ -140,6 +183,7 @@ watch(
   () => props.fields,
   () => props.fields,
   (newFields) => {
   (newFields) => {
     if (!newFields || !Array.isArray(newFields)) return;
     if (!newFields || !Array.isArray(newFields)) return;
+    console.log('newFields', newFields);
 
 
     const newRules = {};
     const newRules = {};
     newFields.forEach((field) => {
     newFields.forEach((field) => {
@@ -171,17 +215,7 @@ watch(
   { immediate: true, deep: true }
   { immediate: true, deep: true }
 );
 );
 
 
-// -----------------------------------------------------
-// 多语言
-// -----------------------------------------------------
-const tFieldTitle = (f) =>
-  t(`global.fieldName.${f.fieldName}.fieldTitle`) || f.fieldTitle;
-
-const tFieldDescription = (f) =>
-  t(`global.fieldName.${f.fieldName}.fieldDescription`) || f.fieldDescription;
 
 
-const tDescription = (f) =>
-  t(`global.fieldName.${f.fieldName}.fieldDescription`) || f.fieldDescription;
 
 
 // -----------------------------------------------------
 // -----------------------------------------------------
 // 分组排序
 // 分组排序
@@ -207,44 +241,19 @@ const groupedFields = computed(() => {
   });
   });
 
 
   // 按固定顺序生成最终 groups
   // 按固定顺序生成最终 groups
-  const groupOrder = ["sender", "receiver"];
+  const groupOrder = ['common', "sender", "receiver"];
   const groups = {};
   const groups = {};
   groupOrder.forEach((key) => {
   groupOrder.forEach((key) => {
     if (groupsMap[key]) {
     if (groupsMap[key]) {
       groups[key] = groupsMap[key];
       groups[key] = groupsMap[key];
     }
     }
   });
   });
+  console.log(groups, 12121212);
+
   return groups;
   return groups;
 });
 });
 
 
-// -----------------------------------------------------
-// 校验
-// -----------------------------------------------------
-const getRules = (field) => {
-  const fieldRules = [];
 
 
-  if (field.required) {
-    fieldRules.push({
-      required: true,
-      message: tFieldTitle(field) + t("global.GlobalOrder.RulesRequire"),
-      trigger: ['blur', 'change']
-    });
-  }
-
-  if (field.regex) {
-    try {
-      fieldRules.push({
-        pattern: new RegExp(field.regex),
-        message: tFieldTitle(field) + t("global.GlobalOrder.RulesReg"),
-        trigger: ['blur', 'change']
-      });
-    } catch (e) {
-      console.warn('正则表达式解析失败:', field.regex, e);
-    }
-  }
-
-  return fieldRules;
-};
 
 
 const clearFieldValidate = (field) => {
 const clearFieldValidate = (field) => {
   nextTick(() => {
   nextTick(() => {

+ 90 - 56
pages/wallet/components/GlobalList.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-    <cwg-load-more-wrapper ref="loadMoreWrapperRef" :loading="loading" :finished="finished" :height='108'
+    <cwg-load-more-wrapper ref="loadMoreWrapperRef" :loading="loading" :finished="finished" :height='54'
         :refresher-enabled="true" @reach-bottom="loadMore" @refresh="handleRefresh">
         :refresher-enabled="true" @reach-bottom="loadMore" @refresh="handleRefresh">
         <view v-if="filteredRecords.length > 0" class="records-list">
         <view v-if="filteredRecords.length > 0" class="records-list">
             <view v-for="record in filteredRecords" :key="record.id" class="record-card"
             <view v-for="record in filteredRecords" :key="record.id" class="record-card"
@@ -10,10 +10,23 @@
                             <cwg-icon class="icons" :name="getDeductionIcon(record.type || record.typeStr)" :size="20"
                             <cwg-icon class="icons" :name="getDeductionIcon(record.type || record.typeStr)" :size="20"
                                 color="#ef4444" />
                                 color="#ef4444" />
                         </view>
                         </view>
+                    </view>
 
 
+                    <view class="record-right">
                         <view class="record-info">
                         <view class="record-info">
                             <view class="info-header">
                             <view class="info-header">
-                                <text class="record-type">{{ t('global.title1') }}</text>
+                                <text class="record-type">{{ Math.abs(Number(record.deductionAmount ||
+                                    0)).toFixed(2) }}
+                                    {{
+                                        record.sendCurrency
+                                        || 'USD' }}</text>
+                                <text class="record-detail"><cwg-icon name="icon_transfer" :size="18"
+                                        color="#000" /></text>
+                                <text class="record-type">{{ Math.abs(Number(record.transferAmount || 0)).toFixed(2) }}
+                                    {{
+                                        record.payoutCurrency
+                                        || 'USD' }}</text>
+
                                 <view :class="['status-badge', getStatusBadgeClass(record.status)]">
                                 <view :class="['status-badge', getStatusBadgeClass(record.status)]">
                                     <cwg-icon class="icons" :name="getStatusIcon(record.status)" :size="12"
                                     <cwg-icon class="icons" :name="getStatusIcon(record.status)" :size="12"
                                         :color="getStatusColor(record.status)" />
                                         :color="getStatusColor(record.status)" />
@@ -22,20 +35,25 @@
                                     </text>
                                     </text>
                                 </view>
                                 </view>
                             </view>
                             </view>
-                            <text class="record-detail" v-if="record.deductionAccountType == 1">{{ record.cardNumber ||
-                                '--' }}</text>
-                            <text class="record-detail" v-if="record.deductionAccountType == 2">{{
-                                t('global.GlobalOrder.bagBal') }}</text>
                         </view>
                         </view>
-                    </view>
+                        <view class="row">
+                            <view class="l"><text class="record-detail" v-if="record.deductionAccountType == 1">{{
+                                record.cardNumber ||
+                                    '--' }}</text>
+                                <text class="record-detail" v-if="record.deductionAccountType == 2">{{
+                                    t('global.GlobalOrder.bagBal') }}</text>
+                            </view>
+
+                            <view class="r">
+
+                                <text class="fee-text">{{ t('card.Form.f30') }} {{ Number(record.deductionFee ||
+                                    0).toFixed(2)
+                                    }} {{
+                                        record.sendCurrency
+                                        || 'USD' }}</text>
+                            </view>
+                        </view>
 
 
-                    <view class="record-right">
-                        <text class="amount-deduction">{{ Math.abs(Number(record.deductionAmount || 0)).toFixed(2) }}
-                            {{
-                                record.sendCurrency
-                                || 'USD' }}</text>
-                        <text class="fee-text">{{ t('card.Form.f30') }} {{ Number(record.deductionFee || 0).toFixed(2)
-                            }}</text>
                     </view>
                     </view>
                 </view>
                 </view>
 
 
@@ -63,7 +81,7 @@ import { showToast } from '@/utils/toast';
 import { ucardApi, TransactionInfo } from '@/api/ucard';
 import { ucardApi, TransactionInfo } from '@/api/ucard';
 import useRouter from "@/hooks/useRouter";
 import useRouter from "@/hooks/useRouter";
 const router = useRouter();
 const router = useRouter();
-import { transactionStatusMap, WITHDRAW_TYPE_MAP } from '@/utils/dataMap';
+import { globalStatusText } from '@/utils/dataMap';
 import useCardStore from '@/stores/use-card-store';
 import useCardStore from '@/stores/use-card-store';
 
 
 interface RecordItem extends TransactionInfo {
 interface RecordItem extends TransactionInfo {
@@ -79,7 +97,7 @@ interface RecordItem extends TransactionInfo {
     time?: string | number;
     time?: string | number;
 }
 }
 
 
-type NormalizedStatus = 'success' | 'processing' | 'failed';
+type NormalizedStatus = 'success' | 'wait_process' | 'fail';
 
 
 const props = defineProps<{
 const props = defineProps<{
     cardNo: string;
     cardNo: string;
@@ -87,6 +105,7 @@ const props = defineProps<{
     statusIndex: number;
     statusIndex: number;
     dateFilter: string;
     dateFilter: string;
     typeOptions: string[];
     typeOptions: string[];
+    payoutCurrency: string;
 }>();
 }>();
 
 
 const { t } = useI18n();
 const { t } = useI18n();
@@ -98,39 +117,29 @@ const loading = ref(false);
 const finished = ref(false);
 const finished = ref(false);
 
 
 const cardStore = useCardStore();
 const cardStore = useCardStore();
-
 const normalizeStatus = (status?: string | number): NormalizedStatus => {
 const normalizeStatus = (status?: string | number): NormalizedStatus => {
-    if (!status) return 'success';
-    const statusStr = String(status).toLowerCase();
-    if (statusStr === 'processing' || statusStr === 'wait_process') return 'processing';
-    if (statusStr === 'fail' || statusStr === 'failed') return 'failed';
-    if (statusStr === 'succeed' || statusStr === 'success') return 'success';
+    if (!status) return 'wait_process';
+    if (status === 'processing' || status === 'wait_process' || status === 'partner_processing') return 'wait_process';
+    if (status === 'fail' || status === 'cancel') return 'fail';
+    if (status === 'succeed' || status === 'success') return 'success';
     return 'success';
     return 'success';
 };
 };
 
 
 const getStatusText = (status?: string | number): string => {
 const getStatusText = (status?: string | number): string => {
-    if (!status) return '';
-    const statusKey = String(status).toLowerCase();
-    if (transactionStatusMap[statusKey as keyof typeof transactionStatusMap]) {
-        return t(transactionStatusMap[statusKey as keyof typeof transactionStatusMap]);
-    }
-    const normalized = normalizeStatus(status);
-    if (normalized === 'success') return t('card.Status.t1');
-    if (normalized === 'processing') return t('card.Status.t3');
-    return t('card.Status.t2');
+    return t(globalStatusText[status]);
 };
 };
 
 
 const getStatusIcon = (status?: string | number): string => {
 const getStatusIcon = (status?: string | number): string => {
     const normalized = normalizeStatus(status);
     const normalized = normalizeStatus(status);
     if (normalized === 'success') return 'checkmarkempty1';
     if (normalized === 'success') return 'checkmarkempty1';
-    if (normalized === 'processing') return 'info1';
+    if (normalized === 'wait_process') return 'info1';
     return 'closeempty1';
     return 'closeempty1';
 };
 };
 
 
 const getStatusColor = (status?: string | number): string => {
 const getStatusColor = (status?: string | number): string => {
     const normalized = normalizeStatus(status);
     const normalized = normalizeStatus(status);
     if (normalized === 'success') return '#22c55e';
     if (normalized === 'success') return '#22c55e';
-    if (normalized === 'processing') return '#eab308';
+    if (normalized === 'wait_process') return '#eab308';
     return '#ef4444';
     return '#ef4444';
 };
 };
 
 
@@ -139,19 +148,10 @@ const getStatusTextClass = (status?: string | number) => `status-text-${normaliz
 
 
 const getStatusValue = (index: number): NormalizedStatus | null => {
 const getStatusValue = (index: number): NormalizedStatus | null => {
     if (index === 0) return null;
     if (index === 0) return null;
-    const statusMap: NormalizedStatus[] = ['success', 'processing', 'failed'];
+    const statusMap: NormalizedStatus[] = ['success', 'wait_process', 'fail'];
     return statusMap[index - 1];
     return statusMap[index - 1];
 };
 };
 
 
-const getDeductionTypeText = (type?: string | number): string => {
-    if (!type) return '--';
-    const typeNum = typeof type === 'string' ? parseInt(type) : type;
-    if (WITHDRAW_TYPE_MAP[typeNum as keyof typeof WITHDRAW_TYPE_MAP]) {
-        return t(WITHDRAW_TYPE_MAP[typeNum as keyof typeof WITHDRAW_TYPE_MAP]);
-    }
-    return String(type);
-};
-
 const getDeductionIcon = (type?: string | number): string => {
 const getDeductionIcon = (type?: string | number): string => {
     const typeStr = String(type || '');
     const typeStr = String(type || '');
     if (typeStr.includes('服务费') || typeStr === '1') return 'servicefee';
     if (typeStr.includes('服务费') || typeStr === '1') return 'servicefee';
@@ -219,13 +219,13 @@ const copyOrderNo = (orderNo?: string) => {
 };
 };
 
 
 const fetchRecords = async (isLoadMore = false) => {
 const fetchRecords = async (isLoadMore = false) => {
-    // if (!props.cardNo || loading.value) return;
     if (isLoadMore && finished.value) return;
     if (isLoadMore && finished.value) return;
-
     loading.value = true;
     loading.value = true;
     try {
     try {
         const res = await ucardApi.globalOrdersList({
         const res = await ucardApi.globalOrdersList({
             cardNo: props.cardNo,
             cardNo: props.cardNo,
+            payoutCurrency: props.payoutCurrency,
+            status: props.statusIndex == 0 ? undefined : props.statusIndex,
             beginDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
             beginDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
             endDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
             endDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
             page: { current: page.value, row: pageSize },
             page: { current: page.value, row: pageSize },
@@ -254,9 +254,8 @@ const fetchRecords = async (isLoadMore = false) => {
 };
 };
 
 
 const goToDeductionDetail = (record: RecordItem) => {
 const goToDeductionDetail = (record: RecordItem) => {
-    console.log(record, 1212);
-
-    router.replace({
+    cardStore.saveOrderDetail(record);
+    router.push({
         path: '/pages/wallet/global-detail',
         path: '/pages/wallet/global-detail',
         query: { id: record.id }
         query: { id: record.id }
     });
     });
@@ -294,6 +293,16 @@ watch([() => props.dateFilter], () => {
     finished.value = false;
     finished.value = false;
     fetchRecords();
     fetchRecords();
 }, { immediate: false });
 }, { immediate: false });
+watch([() => props.payoutCurrency], () => {
+    page.value = 1;
+    finished.value = false;
+    fetchRecords();
+}, { immediate: false });
+watch([() => props.statusIndex], () => {
+    page.value = 1;
+    finished.value = false;
+    fetchRecords();
+}, { immediate: false });
 
 
 const loadMoreWrapperRef = ref<any>(null);
 const loadMoreWrapperRef = ref<any>(null);
 
 
@@ -337,6 +346,7 @@ defineExpose({
     overflow: hidden;
     overflow: hidden;
     transition: box-shadow 0.3s;
     transition: box-shadow 0.3s;
     padding: px2rpx(16);
     padding: px2rpx(16);
+    position: relative;
 }
 }
 
 
 .record-card:active {
 .record-card:active {
@@ -354,7 +364,6 @@ defineExpose({
     display: flex;
     display: flex;
     align-items: flex-start;
     align-items: flex-start;
     gap: px2rpx(12);
     gap: px2rpx(12);
-    flex: 1;
     min-width: 0;
     min-width: 0;
 }
 }
 
 
@@ -388,7 +397,7 @@ defineExpose({
 .info-header {
 .info-header {
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
-    gap: px2rpx(8);
+    gap: px2rpx(4);
     flex-wrap: wrap;
     flex-wrap: wrap;
 }
 }
 
 
@@ -401,19 +410,22 @@ defineExpose({
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
     gap: px2rpx(4);
     gap: px2rpx(4);
-    padding: px2rpx(3) px2rpx(2);
+    padding: px2rpx(3) px2rpx(8) px2rpx(3) px2rpx(3);
     border-radius: px2rpx(12);
     border-radius: px2rpx(12);
+    position: absolute;
+    top: px2rpx(1);
+    right: px2rpx(1);
 }
 }
 
 
 .status-success {
 .status-success {
     background-color: #f0fdf4;
     background-color: #f0fdf4;
 }
 }
 
 
-.status-processing {
+.status-wait_process {
     background-color: #fefce8;
     background-color: #fefce8;
 }
 }
 
 
-.status-failed {
+.status-fail {
     background-color: #fef2f2;
     background-color: #fef2f2;
 }
 }
 
 
@@ -425,11 +437,11 @@ defineExpose({
     color: #22c55e;
     color: #22c55e;
 }
 }
 
 
-.status-text-processing {
+.status-text-wait_process {
     color: #eab308;
     color: #eab308;
 }
 }
 
 
-.status-text-failed {
+.status-text-fail {
     color: #ef4444;
     color: #ef4444;
 }
 }
 
 
@@ -442,12 +454,34 @@ defineExpose({
 }
 }
 
 
 .record-right {
 .record-right {
+    flex: 1;
     display: flex;
     display: flex;
     flex-direction: column;
     flex-direction: column;
-    align-items: flex-end;
+    align-items: flex-start;
     gap: px2rpx(4);
     gap: px2rpx(4);
     margin-left: px2rpx(12);
     margin-left: px2rpx(12);
     flex-shrink: 0;
     flex-shrink: 0;
+
+    .row {
+        width: 100%;
+        display: flex;
+        align-items: center;
+        justify-content: space-around;
+
+    }
+
+    .l {
+        flex: 1;
+    }
+
+    .r {
+        display: flex;
+        flex-direction: column;
+        align-items: flex-start;
+        gap: px2rpx(4);
+        margin-left: px2rpx(12);
+        flex-shrink: 0;
+    }
 }
 }
 
 
 .amount-deduction {
 .amount-deduction {

+ 68 - 0
pages/wallet/composable/useOrderFields.ts

@@ -0,0 +1,68 @@
+import { computed, } from 'vue'
+import { useI18n } from 'vue-i18n'
+
+/**
+ * 订单字段处理 Composable
+ * 将 detailData 中的字段数据转换为分组列表,支持缓存数据立即渲染
+ */
+export function useOrderFields(detailData: any) {
+    const { t } = useI18n()
+
+    /** 1️⃣ 字段解析(一维数组) */
+    const fieldList = computed(() => {
+        const dt = detailData.value
+        if (!dt || !dt.fieldDtos || !Array.isArray(dt.fieldDtos)) {
+            return []
+        }
+        return [...dt.fieldDtos]
+            .sort((a, b) => (a.sorting || 0) - (b.sorting || 0))
+            .map(item => {
+                const key = Object.keys(dt).find(
+                    k => k.toLowerCase() === item.fieldName.toLowerCase()
+                )
+                const i18nKey = `global.fieldName.${item.fieldName}.fieldTitle`
+                let name = t(i18nKey)
+                if (name === i18nKey) {
+                    name = item.fieldName
+                }
+                let value = key ? dt[key] : item.fixedValue
+                if (
+                    item.fieldType === 'select' &&
+                    key &&
+                    !['transferType', 'payoutMethod'].includes(key)
+                ) {
+                    value = dt[key + 'Value'] || value
+                }
+                if (item.fieldName === 'transferAmount' && dt.payoutCurrency) {
+                    value = `${value} ${dt.payoutCurrency}`
+                }
+
+                return {
+                    name,
+                    value: value ?? '',
+                    type: item.fieldUserType || 'other',
+                    fieldName: item.fieldName,
+                    fieldType: item.fieldType,
+                    options: item.options || null
+                }
+            })
+    })
+
+    /** 2️⃣ 分组字段(按类型分组) */
+    const fieldGroups = computed(() => {
+        const groups: Record<string, any[]> = {}
+
+        fieldList.value.forEach(field => {
+            const type = field.type || 'other'
+            if (!groups[type]) {
+                groups[type] = []
+            }
+            groups[type].push(field)
+        })
+        return groups
+    })
+    return {
+        fieldList,
+        fieldGroups
+    }
+}

+ 238 - 285
pages/wallet/global-detail.vue

@@ -1,31 +1,27 @@
 <template>
 <template>
   <cwg-page-wrapper>
   <cwg-page-wrapper>
     <view class="order-detail-page">
     <view class="order-detail-page">
-
+      <view class="success-icon-wrap">
+        <image v-if="detailData.status === 'success'" src="/static/images/vector.png" alt="" mode="widthFix" />
+        <image v-else-if="detailData.status === 'fail'" src="/static/images/vector2.png" alt="" mode="widthFix" />
+        <image v-else src="/static/images/vector3.png" alt="" mode="widthFix" />
+        <text class="success-text">{{ t(globalStatusText[detailData.status]) }}</text>
+        <text v-if="approveDesc" class="success-text">{{ approveDesc }}</text>
+      </view>
       <!-- Content -->
       <!-- Content -->
       <view class="content">
       <view class="content">
-        <!-- Status Card -->
-        <!-- <view class="status-card">
-          <view class="status-icon-wrapper">
-            <view :class="['status-icon', `status-icon-${orderDetail.orderStatus}`]">
-              <uni-icons :type="getOrderStatusIcon(orderDetail.orderStatus)" size="40"
-                :color="getOrderStatusColor(orderDetail.orderStatus)" />
-            </view>
-          </view>
-          <text class="status-title">{{ getOrderStatusText(orderDetail.orderStatus) }}</text>
-          <text class="status-subtitle">{{ orderDetail.statusMessage }}</text>
-        </view> -->
-        <!-- Amount Info -->
         <view class="section-card">
         <view class="section-card">
           <view class="section-header">
           <view class="section-header">
             <uni-icons type="wallet" size="18" color="#2563eb" />
             <uni-icons type="wallet" size="18" color="#2563eb" />
-            <text class="section-title">{{ t('card.Form.f37') }}</text>
+            <text class="section-title">{{ t('Ib.Report.Title3') }}</text>
           </view>
           </view>
-
           <view class="info-list">
           <view class="info-list">
-            <view class="info-row" v-for="(item, index) in list.common" :key="index">
-              <text class="info-label">{{ item.name }}</text>
-              <text class="info-value">{{ item.value }}</text>
+            <view class="info-row" v-if="detailData.merchantOrderNo">
+              <text class="info-label">{{ t('card.Form.f35') }}</text>
+              <view class="info-value-wrapper">
+                <text class="info-value">{{ detailData.merchantOrderNo }}</text>
+                <cwg-icon name="copy" :size="14" color="#9ca3af" @click.stop="copyOrderNo" />
+              </view>
             </view>
             </view>
             <view class="info-row">
             <view class="info-row">
               <text class="info-label">{{ t('card.Form.f37') }}</text>
               <text class="info-label">{{ t('card.Form.f37') }}</text>
@@ -34,7 +30,6 @@
                 <text class="info-valuecurrency">USD</text>
                 <text class="info-valuecurrency">USD</text>
               </text>
               </text>
             </view>
             </view>
-
             <view class="info-row">
             <view class="info-row">
               <text class="info-label">{{ t('card.Form.f30') }}</text>
               <text class="info-label">{{ t('card.Form.f30') }}</text>
               <text class="info-value">
               <text class="info-value">
@@ -42,35 +37,25 @@
                 <text class="currency">USD</text>
                 <text class="currency">USD</text>
               </text>
               </text>
             </view>
             </view>
-
-            <!-- <view class="divider"></view>
-
             <view class="info-row">
             <view class="info-row">
-              <text class="info-label total-label">{{ t('card.Form.f55') }}</text>
-              <text class="info-value total-value">
-                {{ detailData.actualAmount.toFixed(2) }} <text class="currency">{{ orderDetail.currency || 'USD'
-                  }}</text>
+              <text class="info-label">{{ t('global.p12') }}</text>
+              <text class="info-value">
+                {{ detailData.exchangeRate ? `1 : ${detailData.exchangeRate}` : '-- ' }}
               </text>
               </text>
-            </view> -->
+            </view>
+            <view class="divider"></view>
+            <view class="info-row" v-for="(item, index) in list.common" :key="index">
+              <text class="info-label">{{ item.name }}</text>
+              <text class="info-value">{{ item.value }}</text>
+            </view>
           </view>
           </view>
         </view>
         </view>
-
-        <!-- Order Info -->
         <view class="section-card">
         <view class="section-card">
           <view class="section-header">
           <view class="section-header">
             <uni-icons type="list" size="18" color="#2563eb" />
             <uni-icons type="list" size="18" color="#2563eb" />
             <text class="section-title">{{ getGroupTitle('sender') }}</text>
             <text class="section-title">{{ getGroupTitle('sender') }}</text>
           </view>
           </view>
-
           <view class="info-list">
           <view class="info-list">
-            <!-- <view class="info-row" v-if="orderDetail.orderNo">
-              <text class="info-label">{{ t('card.Form.f35') }}</text>
-              <view class="info-value-wrapper">
-                <text class="info-value">{{ orderDetail.orderNo }}</text>
-                <cwg-icon name="copy" :size="14" color="#9ca3af" @click.stop="copyOrderNo" />
-              </view>
-            </view> -->
-
             <view class="info-row" v-for="(item, index) in list.sender" :key="index">
             <view class="info-row" v-for="(item, index) in list.sender" :key="index">
               <text class="info-label">{{ item.name }}</text>
               <text class="info-label">{{ item.name }}</text>
               <text class="info-value">{{ item.value }}</text>
               <text class="info-value">{{ item.value }}</text>
@@ -82,16 +67,7 @@
             <uni-icons type="list" size="18" color="#2563eb" />
             <uni-icons type="list" size="18" color="#2563eb" />
             <text class="section-title">{{ getGroupTitle('receiver') }}</text>
             <text class="section-title">{{ getGroupTitle('receiver') }}</text>
           </view>
           </view>
-
           <view class="info-list">
           <view class="info-list">
-            <!-- <view class="info-row" v-if="orderDetail.orderNo">
-              <text class="info-label">{{ t('card.Form.f35') }}</text>
-              <view class="info-value-wrapper">
-                <text class="info-value">{{ orderDetail.orderNo }}</text>
-                <cwg-icon name="copy" :size="14" color="#9ca3af" @click.stop="copyOrderNo" />
-              </view>
-            </view> -->
-
             <view class="info-row" v-for="(item, index) in list.receiver" :key="index">
             <view class="info-row" v-for="(item, index) in list.receiver" :key="index">
               <text class="info-label">{{ item.name }}</text>
               <text class="info-label">{{ item.name }}</text>
               <text class="info-value">{{ item.value }}</text>
               <text class="info-value">{{ item.value }}</text>
@@ -99,52 +75,82 @@
           </view>
           </view>
         </view>
         </view>
       </view>
       </view>
+      <view class="content" v-if="complianceStatus">
+        <view>
+          <view class="section-header">
+            <uni-icons type="list" size="18" color="#2563eb" />
+            <text class="section-title">{{ getGroupTitle('submitRfi') }}</text>
+          </view>
+        </view>
+        <DynamicForm ref="globalFormRef" :fields="complianceItems" :globalForm="globalForm" :step2="true" type="2">
+        </DynamicForm>
+      </view>
+      <!-- Bottom Actions -->
+      <view class="bottom-actions"
+        v-if="(detailData.approveStatus == 1 && detailData.status != 'cancel') || detailData.needSupplement">
+        <view v-if="detailData.approveStatus == 1 && detailData.status != 'cancel'" class="action-btn cancel-btn"
+          @click="cancelOrder">
+          <text class="btn-text">{{ t('global.GlobalOrder.CancelOrder') }}</text>
+        </view>
+        <view v-if="detailData.needSupplement" class="action-btn appeal-btn" @click="appealOrder">
+          <text class="btn-text">{{ t('global.GlobalOrder.submitRfi') }}</text>
+        </view>
+      </view>
     </view>
     </view>
   </cwg-page-wrapper>
   </cwg-page-wrapper>
 </template>
 </template>
 
 
 <script setup lang="ts">
 <script setup lang="ts">
-import { ref, reactive, nextTick, computed } from 'vue'
+import { ref, watch, nextTick, computed } from 'vue'
 import { onLoad, onUnload } from '@dcloudio/uni-app';
 import { onLoad, onUnload } from '@dcloudio/uni-app';
 import { useI18n } from 'vue-i18n';
 import { useI18n } from 'vue-i18n';
 import useCardStore from '@/stores/use-card-store';
 import useCardStore from '@/stores/use-card-store';
 import { ucardApi } from "@/api/ucard";
 import { ucardApi } from "@/api/ucard";
+import DynamicForm from "./components/DynamicForm.vue";
+import { useOrderFields } from './composable/useOrderFields';
+import { globalApprovalText, globalComplianceText, globalStatusText } from '@/utils/dataMap';
+import useUserStore from "@/stores/use-user-store";
+const { t, locale } = useI18n();
+
+const userStore = useUserStore();
+const approveDesc = ref('');
+const getApproveDesc = () => {
+  const d = detailData.value.approveDesc
+  if (!d) return
+  const c = userStore.reasonsOptions
+  const a = c[d || '']
+  const b = locale.value == 'cn' || locale.value == 'zh' ? a.content : a.enContent
+  if (!b) {
+    reasonsRefusalList()
+  }
+  approveDesc.value = b;
+}
+async function reasonsRefusalList() {
+  try {
+    const res = await ucardApi.reasonsRefusalList();
+    if (res.code === 200) {
+      pickFields(res.data);
 
 
-type OrderStatus = 'success' | 'processing' | 'failed' | 'cancelled';
-type ApprovalStatus = 'completed' | 'current' | 'pending';
-
-interface ApprovalStep {
-  title: string;
-  status: ApprovalStatus;
-  operator?: string;
-  time?: string;
-  remark?: string;
-}
-
-interface OrderDetail {
-  category?: 'recharge' | 'transaction' | 'deduction';
-  orderNo: string;
-  type: string;
-  amount: number;
-  fee: number;
-  actualAmount: number;
-  currency?: string;
-  orderStatus: OrderStatus;
-  statusMessage: string;
-  createTime: string;
-  completeTime?: string;
-  merchant?: string;
-  bankCard?: string;
-  remark?: string;
-  approvalSteps: ApprovalStep[];
-}
-
-// 订单详情数据(默认占位,进入页面后会用缓存覆盖)
-const orderDetail = reactive<OrderDetail>({});
-
-const { t } = useI18n();
-const cardStore = useCardStore();
+      getApproveDesc()
+    } else {
+      uni.$u.toast(res.msg || t("login.msg0"));
+    }
+  } catch (error) {
+    console.log(error, 111);
+  }
+}
+function pickFields(source, fields = ['content', 'enContent']) {
+  const result = {}
+  Object.entries(source).forEach(([key, value]) => {
+    result[key] = fields.reduce((acc, f) => {
+      acc[f] = value[f] ?? null
+      return acc
+    }, {})
+  })
+  userStore.saveReasonsOptions(result);
+}
 
 
+const cardStore = useCardStore();
 const getGroupTitle = (type) => {
 const getGroupTitle = (type) => {
   const map = {
   const map = {
     common: "global.GlobalOrder.common",
     common: "global.GlobalOrder.common",
@@ -155,61 +161,13 @@ const getGroupTitle = (type) => {
   };
   };
   return t(map[type] || type);
   return t(map[type] || type);
 }
 }
-
-// 获取订单状态图标
-const getOrderStatusIcon = (status: OrderStatus): string => {
-  switch (status) {
-    case 'success':
-      return 'checkmarkempty';
-    case 'processing':
-      return 'loop';
-    case 'failed':
-      return 'closeempty';
-    case 'cancelled':
-      return 'closeempty';
-    default:
-      return 'info';
-  }
-};
-
-// 获取订单状态颜色
-const getOrderStatusColor = (status: OrderStatus): string => {
-  switch (status) {
-    case 'success':
-      return '#22c55e';
-    case 'processing':
-      return '#eab308';
-    case 'failed':
-      return '#ef4444';
-    case 'cancelled':
-      return '#9ca3af';
-    default:
-      return '#9ca3af';
-  }
-};
-
-// 获取订单状态文本
-const getOrderStatusText = (status: OrderStatus): string => {
-  switch (status) {
-    case 'success':
-      return t('card.Status.t1'); // 成功
-    case 'processing':
-      return t('card.Status.t3'); // 处理中
-    case 'failed':
-      return t('card.Status.t2'); // 失败
-    case 'cancelled':
-      return t('card.Status.t5'); // 待处理 / 已取消,复用状态文案
-    default:
-      return t('card.Status.t5');
-  }
-};
 // 复制订单号
 // 复制订单号
 const copyOrderNo = () => {
 const copyOrderNo = () => {
   uni.setClipboardData({
   uni.setClipboardData({
-    data: orderDetail.orderNo,
+    data: detailData.value.merchantOrderNo,
     success: () => {
     success: () => {
       uni.showToast({
       uni.showToast({
-        title: '订单号已复制',
+        title: t('card.Msg.m8') || '复制成功',
         icon: 'success'
         icon: 'success'
       });
       });
     }
     }
@@ -219,191 +177,166 @@ const copyOrderNo = () => {
 // 取消订单
 // 取消订单
 const cancelOrder = () => {
 const cancelOrder = () => {
   uni.showModal({
   uni.showModal({
-    title: '确认取消',
-    content: '确定要取消此订单吗?',
-    success: (res) => {
-      if (res.confirm) {
-        uni.showToast({
-          title: '订单已取消',
-          icon: 'success'
-        });
+    title: t('Msg.SystemPrompt'),
+    cancelText: t('common.cancel'),
+    confirmText: t('common.confirm'),
+    content: t('global.GlobalOrder.ConfirmCancelOrder'),
+    success: async (e) => {
+      if (e.confirm) {
+        const res = await ucardApi.globalCancelOrder({ id: detailData.value.id })
+        if (res.code == 200) {
+          // 刷新订单详情
+          uni.showToast({
+            title: t('global.GlobalOrder.CancelOrderSuccess'),
+            icon: 'success'
+          });
+          await getOrderDetail(detailData.value.id);
+        }
       }
       }
     }
     }
   });
   });
 };
 };
-
-// 申诉订单
-const appealOrder = () => {
-  uni.showToast({
-    title: '提交申诉',
-    icon: 'none'
+const globalFormRef = ref(null)
+const setRfiInfos = () => {
+  let list = []
+  list = complianceItems.value.filter(item => globalForm.value[item.fieldName])
+  const rfiInfos = list.map((item) => {
+    const { fieldType, rfiId } = item;
+    let rfiValue = undefined;
+    let rfiValueUrl = undefined;
+    if (fieldType === "file") {
+      rfiValueUrl = globalForm.value[item.fieldName]
+    } else {
+      rfiValue = globalForm.value[item.fieldName];
+    }
+    return {
+      rfiId,
+      fieldType,
+      rfiValueUrl,
+      rfiValue,
+    };
   });
   });
+  return {
+    orderNo: detailData.value.orderNo,
+    rfiInfos,
+  };
+}
+// 申诉订单
+const appealOrder = async () => {
+  try {
+    const isValid = await globalFormRef.value.validateForm();
+    if (!isValid) {
+      return;
+    }
+    const params = setRfiInfos();
+    const res = await ucardApi.globalSupplementary(params);
+    if (res.code == 200) {
+      await getOrderDetail(detailData.value.id);
+    }
+  } catch (error) {
+    console.log(error);
+  }
 };
 };
 
 
-
-
-const isView = ref(false)
+const isLoading = ref(false) // 接口加载状态
 
 
 const detailData = ref<any>({})
 const detailData = ref<any>({})
 const list = ref<Record<string, any[]>>({})
 const list = ref<Record<string, any[]>>({})
 
 
 const complianceItems = ref<any[]>([])
 const complianceItems = ref<any[]>([])
-const globalForm = reactive<Record<string, any>>({})
+const globalForm = ref<any>({})
 
 
 const complianceStatus = ref(false)
 const complianceStatus = ref(false)
 
 
-// 外部参数
 const type = ref<'1' | '2'>('1')
 const type = ref<'1' | '2'>('1')
+
+const { fieldGroups } = useOrderFields(detailData)
+
+/** 自动同步字段分组到列表 */
+watch(
+  fieldGroups,
+  (val) => {
+    list.value = { ...val }
+  },
+  { immediate: true, deep: true }
+)
+
+/**
+ * 处理合规字段和状态
+ * 从 detailData 中提取并处理合规相关数据
+ */
+function processComplianceData() {
+  // 处理合规字段
+  complianceItems.value = (detailData.value.dataDtos || []).map(item => {
+    const fieldName = `${item.customerType}_${item.fieldName}`
+
+    if (item.status !== "pending_check" && item.status !== "approved") {
+      globalForm.value[fieldName] =
+        item.fieldType === 'file'
+          ? item.rfiValueUrl
+          : item.rfiValue
+
+      return { ...item, fieldName, disabled: true }
+    } else {
+      if (item.status == "pending" || item.status == "approved") {
+        return {
+          ...item, fieldName,
+          disabled: true,
+        };
+      } else {
+        return { ...item };
+      }
+    }
+  })
+  // 更新合规状态
+  complianceStatus.value = complianceItems.value.length > 0
+}
+
+/**
+ * 获取订单详情
+ * 接口返回后会更新 detailData,通过 watch 自动同步到 list
+ */
 async function getOrderDetail(id: string | number) {
 async function getOrderDetail(id: string | number) {
   try {
   try {
-    isView.value = false
-
+    isLoading.value = true
     const res = await ucardApi.globalOrdersDetail({ id })
     const res = await ucardApi.globalOrdersDetail({ id })
-
     if (res.code !== 200) {
     if (res.code !== 200) {
-      // ElMessage.error(res.msg)
+      console.warn('获取订单详情失败:', res.msg)
       return
       return
     }
     }
-
-    detailData.value = res.data
-    console.log(21312312, detailData.value, [...detailData.value.fieldDtos]);
-
-
-    /** 1️⃣ 处理 fieldDtos */
-    /** 1️⃣ 处理 fieldDtos */
-    /** 1️⃣ 处理 fieldDtos */
-    let a = []
-    let listData = [...detailData.value.fieldDtos]
-      .sort((a, b) => a.sorting - b.sorting)
-    listData.map((item) => {
-      const key = Object.keys(detailData.value).find(
-        (k) => k.toLowerCase() === item.fieldName.toLowerCase()
-      )
-
-      // const { t } = useI18n()
-      let name = item.fieldName // 默认使用字段名
-
-      try {
-        // 检查国际化键是否存在
-        const i18nKey = `global.fieldName.${item.fieldName}.fieldTitle`
-        name = t(i18nKey)
-        // 如果国际化返回的值和键相同,说明未找到翻译,使用默认值
-        if (name === i18nKey) {
-          name = item.fieldName
-        }
-      } catch (error) {
-        console.error('国际化处理错误:', error)
-        name = item.fieldName
-      }
-
-      let value = key ? detailData.value[key] : item.fixedValue
-
-      // 特殊处理 select 类型字段
-      if (
-        item.fieldType === 'select' &&
-        key &&
-        !['transferType', 'payoutMethod'].includes(key)
-      ) {
-        value = detailData.value[key + 'Value'] || value
-      }
-      // 确定字段类型,提供默认值
-      let type = item.fieldUserType || 'other'
-      let b = {
-        name,
-        value,
-        type,
-        fieldName: item.fieldName,
-        fieldType: item.fieldType,
-        options: item.options || null
-      }
-      if (item.fieldName === 'transferAmount') b.value = value + ' ' + detailData.value.payoutCurrency
-      a.push(b)
-      return {
-        name,
-        value,
-        type,
-        fieldName: item.fieldName,
-        fieldType: item.fieldType,
-        options: item.options || null
-      }
-    })
-    /** 2️⃣ 分组 */
-    const groups: Record<string, any[]> = {}
-
-    a.forEach((field) => {
-
-      let type = field.type || field.fieldUserType || 'other'
-      // if (type === 'common') type = 'sender'
-      if (!groups[type]) groups[type] = []
-      groups[type].push(field)
-    })
-
-    list.value = groups
-    console.log(list.value, 22222);
-
-
-    /** 3️⃣ nextTick 后处理合规字段 */
+    Object.assign(detailData.value, res.data)
     await nextTick()
     await nextTick()
-
-    let items: any[] = []
-
-    if (detailData.value?.dataDtos) {
-      items = detailData.value.dataDtos.map((item) => {
-        item.fieldName = `${item.customerType}_${item.fieldName}`
-
-        if (item.status !== 'pending_check') {
-          globalForm[item.fieldName] =
-            item.fieldType === 'file'
-              ? item.rfiValueUrl
-              : item.rfiValue
-
-          return {
-            ...item,
-            disabled: true
-          }
-        }
-
-        return { ...item }
-      })
-    }
-
-    complianceItems.value = items
-
-    /** 4️⃣ 合规状态 */
-    let status = false
-
-    if (type.value === '1') {
-      status =
-        detailData.value?.complianceStatus !== 'pending_check' &&
-        detailData.value?.complianceStatus !== null
-    }
-
-    if (type.value === '2') {
-      status = true
-    }
-
-    complianceStatus.value = status
-    isView.value = true
-  } catch (error: any) {
-    console.log(error, 12121);
-
-    // ElMessage.error(error?.message || 'System Error')
+    processComplianceData()
+    getApproveDesc()
+  } catch (e) {
+    console.error('获取订单详情异常:', e)
   } finally {
   } finally {
+    isLoading.value = false
   }
   }
 }
 }
 
 
-
-// 页面加载时,从 store 中读取订单详情
+// 页面加载时,先使用缓存数据渲染,然后获取最新数据
 onLoad((e) => {
 onLoad((e) => {
-  console.log(e, 2313);
-
-  getOrderDetail(e.id);
-
+  const cachedData = cardStore.detailData
+  if (cachedData) {
+    try {
+      const clonedData = JSON.parse(JSON.stringify(cachedData))
+      detailData.value = clonedData
+      processComplianceData()
+    } catch (error) {
+      console.error('加载缓存数据失败:', error)
+    }
+  }
+  if (e.id) {
+    nextTick(() => {
+      getOrderDetail(e.id)
+    })
+  }
 });
 });
 
 
 // 离开页面时清空订单详情
 // 离开页面时清空订单详情
 onUnload(() => {
 onUnload(() => {
-  // cardStore.clearOrderDetail();
+  cardStore.clearOrderDetail();
 });
 });
 </script>
 </script>
 
 
@@ -414,6 +347,26 @@ onUnload(() => {
   padding: 0;
   padding: 0;
 }
 }
 
 
+.success-icon-wrap {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-wrap: wrap;
+  background-color: #ffffff;
+
+  image {
+    width: 100%;
+  }
+
+  .success-text {
+    width: 100%;
+    text-align: center;
+    font-size: px2rpx(18);
+    color: #111827;
+    margin-bottom: px2rpx(24);
+  }
+}
+
 .order-detail-page {
 .order-detail-page {
   background-color: #f9fafb;
   background-color: #f9fafb;
   padding-bottom: px2rpx(80);
   padding-bottom: px2rpx(80);

+ 13 - 52
pages/wallet/global-list.vue

@@ -1,30 +1,15 @@
 <template>
 <template>
     <cwg-page-wrapper>
     <cwg-page-wrapper>
         <view class="bank-transaction-page">
         <view class="bank-transaction-page">
-
             <view class="filters-container" :style="{ top: statusBarHeight + 53 + 'px' }">
             <view class="filters-container" :style="{ top: statusBarHeight + 53 + 'px' }">
                 <view class="filter-item">
                 <view class="filter-item">
-                    <text class="filter-label">{{ t('card.Form.f52') }}</text>
-                    <picker :value="currentTypeIndex" :range="currentTypeOptions" @change="onTypeChange"
-                        class="filter-picker">
-                        <view class="picker-value">
-                            <text class="picker-text">{{ currentTypeOptions[currentTypeIndex] }}</text>
-                            <uni-icons type="down" size="14" color="#6b7280" class="picker-icon" />
-                        </view>
-                    </picker>
+                    <text class="filter-label">{{ t('global.p25') }}</text>
+                    <cwg-picker v-model="payoutCurrency" :options="currencyList" />
                 </view>
                 </view>
-
                 <view class="filter-item">
                 <view class="filter-item">
                     <text class="filter-label">{{ t('card.Form.f45') }}</text>
                     <text class="filter-label">{{ t('card.Form.f45') }}</text>
-                    <picker :value="statusFilterIndex" :range="statusOptions" @change="onStatusChange"
-                        class="filter-picker">
-                        <view class="picker-value">
-                            <text class="picker-text">{{ statusOptions[statusFilterIndex] }}</text>
-                            <uni-icons type="down" size="14" color="#6b7280" class="picker-icon" />
-                        </view>
-                    </picker>
+                    <cwg-picker v-model="statusFilterIndex" :options="statusOptions" />
                 </view>
                 </view>
-
                 <view class="filter-item">
                 <view class="filter-item">
                     <text class="filter-label">{{ t('card.Form.f43') }}</text>
                     <text class="filter-label">{{ t('card.Form.f43') }}</text>
                     <view class="filter-picker" @click="open">
                     <view class="filter-picker" @click="open">
@@ -33,20 +18,16 @@
                             <uni-icons type="calendar" size="14" color="#6b7280" class="picker-icon" />
                             <uni-icons type="calendar" size="14" color="#6b7280" class="picker-icon" />
                         </view>
                         </view>
                     </view>
                     </view>
-
                     <cwg-date-picker v-model:show="show" v-model="dateFilter" mode="date" @confirm="onDateConfirm"
                     <cwg-date-picker v-model:show="show" v-model="dateFilter" mode="date" @confirm="onDateConfirm"
                         :minDate="minDate" :maxDate="maxDate" />
                         :minDate="minDate" :maxDate="maxDate" />
                 </view>
                 </view>
-
                 <view class="reset-btn" @click="resetFilters">
                 <view class="reset-btn" @click="resetFilters">
                     <uni-icons type="loop" size="16" color="#2563eb" />
                     <uni-icons type="loop" size="16" color="#2563eb" />
                 </view>
                 </view>
             </view>
             </view>
-            <!-- Content -->
             <view class="content">
             <view class="content">
-                <!-- Recharge Records -->
-                <GlobalList ref="globalListRef" :cardNo="cardNo" :typeIndex="currentTypeIndex"
-                    :statusIndex="statusFilterIndex" :dateFilter="dateFilter" :typeOptions="currentTypeOptions" />
+                <GlobalList ref="globalListRef" :cardNo="cardNo" :payoutCurrency="payoutCurrency"
+                    :statusIndex="statusFilterIndex" :dateFilter="dateFilter" />
             </view>
             </view>
         </view>
         </view>
     </cwg-page-wrapper>
     </cwg-page-wrapper>
@@ -60,13 +41,13 @@ import { useI18n } from 'vue-i18n';
 import useGlobalStore from '@/stores/use-global-store';
 import useGlobalStore from '@/stores/use-global-store';
 import GlobalList from './components/GlobalList.vue';
 import GlobalList from './components/GlobalList.vue';
 import { globalStatusText1 } from '@/utils/dataMap';
 import { globalStatusText1 } from '@/utils/dataMap';
+import useCardStore from "@/stores/use-card-store";
+const cardStore = useCardStore();
 const globalStore = useGlobalStore()
 const globalStore = useGlobalStore()
 const statusBarHeight = computed(() => globalStore.statusBarHeight);
 const statusBarHeight = computed(() => globalStore.statusBarHeight);
 const { t } = useI18n();
 const { t } = useI18n();
 const minDate = ref(new Date(2000, 0, 1).getTime());
 const minDate = ref(new Date(2000, 0, 1).getTime());
 const maxDate = ref(new Date().getTime());
 const maxDate = ref(new Date().getTime());
-
-const activeTab = ref<'recharge' | 'transaction' | 'deduction'>('recharge');
 const cardNo = ref('');
 const cardNo = ref('');
 onLoad((options) => {
 onLoad((options) => {
     cardNo.value = options.cardNo || '';
     cardNo.value = options.cardNo || '';
@@ -75,31 +56,14 @@ onLoad((options) => {
 const statusOptions = computed(() => {
 const statusOptions = computed(() => {
     return globalStatusText1
     return globalStatusText1
 });
 });
-const currentTypeIndex = ref(0);
+const currencyList = computed(() => {
+    const res = cardStore.currencyList.map(item => { return { label: item.payoutCurrency, value: item.payoutCurrency } });
+    return res;
+});
+const payoutCurrency = ref();
 const statusFilterIndex = ref(0);
 const statusFilterIndex = ref(0);
 const dateFilter = ref('');
 const dateFilter = ref('');
 
 
-const rechargeTypeOptions = [t('card.Form.f43'), '银行卡充值', '支付宝充值', '微信充值'];
-const transactionTypeOptions = [t('card.Form.f43'), '商品购买', '提现', '转账', '生活缴费', '话费充值'];
-const deductionTypeOptions = [t('card.Form.f43'), '服务费', '手续费', '罚款'];
-
-const currentTypeOptions = computed(() => {
-    if (activeTab.value === 'recharge') {
-        return rechargeTypeOptions;
-    } else if (activeTab.value === 'transaction') {
-        return transactionTypeOptions;
-    } else {
-        return deductionTypeOptions;
-    }
-});
-
-const onTypeChange = (e: any) => {
-    currentTypeIndex.value = e.detail.value;
-};
-
-const onStatusChange = (e: any) => {
-    statusFilterIndex.value = e.detail.value;
-};
 const show = ref(false)
 const show = ref(false)
 const onDateConfirm = (e: any) => {
 const onDateConfirm = (e: any) => {
     dateFilter.value = e.formatted;
     dateFilter.value = e.formatted;
@@ -107,12 +71,9 @@ const onDateConfirm = (e: any) => {
 function open() {
 function open() {
     show.value = true
     show.value = true
 }
 }
-const onDateChange = (e: any) => {
-    dateFilter.value = e.detail.value;
-};
 
 
 const resetFilters = () => {
 const resetFilters = () => {
-    currentTypeIndex.value = 0;
+    payoutCurrency.value = '';
     statusFilterIndex.value = 0;
     statusFilterIndex.value = 0;
     dateFilter.value = '';
     dateFilter.value = '';
 };
 };

+ 168 - 42
pages/wallet/global-order.vue

@@ -42,7 +42,7 @@
                 </text>
                 </text>
               </text>
               </text>
 
 
-              <cwg-input v-model:value="globalForm.amount" fkey="amount" type="number"
+              <cwg-input v-model:value="globalForm.amount" :required="true" fkey="amount" type="number"
                 :placeholder="t('global.placeholder.p4')" @change="handleAmountChange" />
                 :placeholder="t('global.placeholder.p4')" @change="handleAmountChange" />
 
 
               <text class="form-error" v-if="form__error">{{ form__error }}</text>
               <text class="form-error" v-if="form__error">{{ form__error }}</text>
@@ -55,7 +55,7 @@
             <view class="form-item">
             <view class="form-item">
               <cwg-input
               <cwg-input
                 :label="t('global.fieldName.' + 'transferAmount' + '.fieldTitle') + ' (' + globalForm.payoutCurrency + ')'"
                 :label="t('global.fieldName.' + 'transferAmount' + '.fieldTitle') + ' (' + globalForm.payoutCurrency + ')'"
-                v-model:value="globalForm.transferAmount" fkey="transferAmount" :disabled="true"
+                :required="true" v-model:value="globalForm.transferAmount" fkey="transferAmount" :disabled="true"
                 :placeholder="t('global.fieldName.' + 'transferAmount' + '.fieldDescription')" />
                 :placeholder="t('global.fieldName.' + 'transferAmount' + '.fieldDescription')" />
             </view>
             </view>
           </view>
           </view>
@@ -75,13 +75,15 @@
         <template #submit>
         <template #submit>
           <view class="submit-section cwg-button">
           <view class="submit-section cwg-button">
             <u-button type="primary" @click="saveDlobal" class="submit-btn  prev-btn">
             <u-button type="primary" @click="saveDlobal" class="submit-btn  prev-btn">
-              <text v-if="$i18n.locale === 'es'">Enviar solicitud</text>
-              <text v-else>{{ t('Btn.Submit') }}</text>
+              <text>{{ t('Btn.Submit') }}</text>
             </u-button>
             </u-button>
           </view>
           </view>
         </template>
         </template>
       </DynamicForm>
       </DynamicForm>
     </view>
     </view>
+
+    <cwg-SuccessPrompt v-model:show="showSuccessPrompt" :title="t('global.title1')" :desc="t('Custom.Withdraw.Des1')"
+      :btn-click="btnClick" />
   </cwg-page-wrapper>
   </cwg-page-wrapper>
 </template>
 </template>
 
 
@@ -98,7 +100,7 @@ import useCardStore from "@/stores/use-card-store";
 const cardStore = useCardStore();
 const cardStore = useCardStore();
 import useUserStore from "@/stores/use-user-store";
 import useUserStore from "@/stores/use-user-store";
 const userStore = useUserStore();
 const userStore = useUserStore();
-
+const showSuccessPrompt = ref(false);
 const { t } = useI18n();
 const { t } = useI18n();
 const router = useRouter();
 const router = useRouter();
 const currency = ref()
 const currency = ref()
@@ -134,12 +136,7 @@ const loginOptionsSelect = computed(() => {
   return loginOptions.value
   return loginOptions.value
 });
 });
 
 
-const receiverUserListSelect = computed(() => {
-  return receiverUserList.value.map((item: any) => ({
-    text: `${item.receiverFirstName} ${item.receiverLastName} / ${item.receiverBankAccountNumber}`,
-    value: item.id
-  }));
-});
+
 
 
 const currencyListSelect = computed(() => {
 const currencyListSelect = computed(() => {
   return currencyList.value.map((item: any) => ({
   return currencyList.value.map((item: any) => ({
@@ -181,6 +178,54 @@ const amountDisabled = computed(() => {
   return !payoutCurrency || !payType || !payMethod;
   return !payoutCurrency || !payType || !payMethod;
 });
 });
 
 
+const receiverUserListSelect = computed(() => {
+  const map = new Map();
+  receiverUserList.value.forEach(item => {
+    const cardNumber = item.receiverBankAccountNumber;
+    if (!cardNumber) return;
+    if (!map.has(cardNumber)) {
+      map.set(cardNumber, {
+        cardNumber,
+        firstName: '',
+        lastName: '',
+        nativeFirstName: '',
+        nativeLastName: ''
+      });
+    }
+    const target = map.get(cardNumber);
+    if (!target.firstName && (item.receiverFirstName || item.receiverLastName)) {
+      target.firstName = item.receiverFirstName || '';
+      target.lastName = item.receiverLastName || '';
+    }
+    if (
+      !target.nativeFirstName &&
+      (item.receiverNativeFirstName || item.receiverNativeLastName)
+    ) {
+      target.nativeFirstName = item.receiverNativeFirstName || '';
+      target.nativeLastName = item.receiverNativeLastName || '';
+    }
+  });
+  const result = Array.from(map.values()).map(item => {
+    const enName = `${item.firstName} ${item.lastName}`.trim();
+    const nativeName = `${item.nativeFirstName} ${item.nativeLastName}`.trim();
+    let label = '';
+    if (enName && nativeName) {
+      label = `${enName}(${nativeName}) / ${item.cardNumber}`;
+    } else if (enName) {
+      label = `${enName} / ${item.cardNumber}`;
+    } else if (nativeName) {
+      label = `${nativeName} / ${item.cardNumber}`;
+    } else {
+      label = item.cardNumber;
+    }
+    return {
+      value: item.cardNumber,
+      text: label
+    };
+  });
+  return result
+});
+
 // Methods
 // Methods
 const changeLogin = (value: any) => {
 const changeLogin = (value: any) => {
   globalForm.value.deductionAccount = value.value;
   globalForm.value.deductionAccount = value.value;
@@ -205,17 +250,13 @@ const handlePayMethodChange = (value: any) => {
 };
 };
 
 
 const handleAmountChange = (value: any) => {
 const handleAmountChange = (value: any) => {
-  console.log(value, 'value');
-
   globalForm.value.amount = value.value;
   globalForm.value.amount = value.value;
+  if (!value.value) return globalForm.value.transferAmount = 0
   globalExchangeRate();
   globalExchangeRate();
 };
 };
 async function globalExchangeRate() {
 async function globalExchangeRate() {
   feeNum.value = 0
   feeNum.value = 0
   const amount = Number(globalForm.value.amount)
   const amount = Number(globalForm.value.amount)
-  console.log(amount, globalForm.value.amount);
-
-
   // 校验金额是否填写
   // 校验金额是否填写
   if (!amount) {
   if (!amount) {
     const msg = t("global.validator.v15")
     const msg = t("global.validator.v15")
@@ -274,10 +315,6 @@ async function globalExchangeRate() {
     transferTypeId: businessForm.value.fieldData.transferTypeId,
     transferTypeId: businessForm.value.fieldData.transferTypeId,
     payoutMethodId: businessForm.value.fieldData.payoutMethodId,
     payoutMethodId: businessForm.value.fieldData.payoutMethodId,
   })
   })
-
-  console.log(res, 121212121);
-
-
   if (res.code === 200) {
   if (res.code === 200) {
     businessForm.value.exchangeRate = res.data
     businessForm.value.exchangeRate = res.data
     form__error.value = ''
     form__error.value = ''
@@ -289,7 +326,6 @@ async function globalExchangeRate() {
     )
     )
     // 回显转账金额
     // 回显转账金额
     globalForm.value.transferAmount = res.data.transferAmount
     globalForm.value.transferAmount = res.data.transferAmount
-    console.log(globalForm.value, 121212);
 
 
   } else {
   } else {
     // pigeon.MessageError(res.msg)
     // pigeon.MessageError(res.msg)
@@ -304,7 +340,7 @@ const backActivity = () => {
   // router.push({ path: "/card/index" });
   // router.push({ path: "/card/index" });
 };
 };
 
 
-const selectOption1 = async (type: number) => {
+const selectOption1 = async (type: number, e?: boolean) => {
   if (type === 1 || type === 2) {
   if (type === 1 || type === 2) {
     const list1 = transferTypeList.value;
     const list1 = transferTypeList.value;
     if (list1.length === 1) {
     if (list1.length === 1) {
@@ -323,12 +359,15 @@ const selectOption1 = async (type: number) => {
   globalForm.value.amount = undefined;
   globalForm.value.amount = undefined;
   feeNum.value = undefined;
   feeNum.value = undefined;
 
 
-  fetchExchangeRateDebounced();
+  fetchExchangeRateDebounced(type, e);
 };
 };
 
 
 // 防抖函数,300ms 内多次触发只执行最后一次
 // 防抖函数,300ms 内多次触发只执行最后一次
-const fetchExchangeRateDebounced = _.debounce(async () => {
+const fetchExchangeRateDebounced = _.debounce(async (type, e) => {
   const { payoutCurrency, payType, payMethod } = globalForm.value;
   const { payoutCurrency, payType, payMethod } = globalForm.value;
+  if (globalForm.value.receiver && !e && type === 1) {
+    selectReceiver({ value: globalForm.value.receiver }, true)
+  }
   if (!payoutCurrency || !payType || !payMethod) return;
   if (!payoutCurrency || !payType || !payMethod) return;
 
 
   const row = globalCurrenciesDropdown.value.filter(
   const row = globalCurrenciesDropdown.value.filter(
@@ -395,7 +434,7 @@ const getSenderData = () => {
     senderNationality: businessForm.value.nationality,
     senderNationality: businessForm.value.nationality,
     senderIdIssueCountry: businessForm.value.senderIdIssueCountry,
     senderIdIssueCountry: businessForm.value.senderIdIssueCountry,
     senderDateOfBirth: businessForm.value.birthday,
     senderDateOfBirth: businessForm.value.birthday,
-    senderCountry: businessForm.value.country,
+    senderCountry: businessForm.value.country == "CHN" || businessForm.value.country == "CN" ? '' : businessForm.value.country,
     senderState: businessForm.value.senderState,
     senderState: businessForm.value.senderState,
     senderRegion: businessForm.value.senderRegion,
     senderRegion: businessForm.value.senderRegion,
     senderCity: businessForm.value.townEnName,
     senderCity: businessForm.value.townEnName,
@@ -404,12 +443,16 @@ const getSenderData = () => {
     senderMobileAreaCode: businessForm.value.areaCode,
     senderMobileAreaCode: businessForm.value.areaCode,
     senderMobileNumber: businessForm.value.mobile,
     senderMobileNumber: businessForm.value.mobile,
     senderEmail: businessForm.value.email,
     senderEmail: businessForm.value.email,
+    senderBeneficiaryRelationship: '3', // 付款人关系
     senderOccupation: businessForm.value.occupation,
     senderOccupation: businessForm.value.occupation,
     transferType: businessForm.value.fieldData.transferTypeId,
     transferType: businessForm.value.fieldData.transferTypeId,
     PayoutMethod: businessForm.value.fieldData.payoutMethodId,
     PayoutMethod: businessForm.value.fieldData.payoutMethodId,
   };
   };
 };
 };
-
+function btnClick() {
+  showSuccessPrompt.value = false;
+  router.push({ path: "/pages/wallet/index" })
+}
 // Function to merge dynamic fields and sender data
 // Function to merge dynamic fields and sender data
 const setData = async (data: any) => {
 const setData = async (data: any) => {
   const senderData = getSenderData();
   const senderData = getSenderData();
@@ -419,7 +462,7 @@ const setData = async (data: any) => {
       const key = Object.keys(senderData).find(
       const key = Object.keys(senderData).find(
         (k) => k.toLowerCase() === field.fieldName.toLowerCase()
         (k) => k.toLowerCase() === field.fieldName.toLowerCase()
       );
       );
-      const fixedValue = key ? senderData[key] : field.fixedValue;
+      let fixedValue = key ? senderData[key] : field.fixedValue;
       if (field.fieldName === "receiverBankCity") {
       if (field.fieldName === "receiverBankCity") {
         try {
         try {
           const res = await ucardApi.globalQueryBankCities({
           const res = await ucardApi.globalQueryBankCities({
@@ -437,6 +480,32 @@ const setData = async (data: any) => {
           console.error("Error loading receiverBankCity data:", e);
           console.error("Error loading receiverBankCity data:", e);
         }
         }
       }
       }
+      // 如果币种为 CNY,且字段是 senderIdType,则从下拉数据中移除 valueId 为 "2" 的选项
+      if (
+        field.fieldName === "senderIdType" &&
+        businessForm.value.fieldData &&
+        businessForm.value.fieldData.payoutCurrency === "CNY" &&
+        Array.isArray(field.availableDtos)
+      ) {
+        field.availableDtos = field.availableDtos.filter(
+          (item) => String(item.valueId) !== "2"
+        );
+        // 如果当前固定值是被移除的 valueId,则清空以避免不可用的默认选中
+        if (String(fixedValue) === "2") {
+          fixedValue = null;
+        }
+        if (String(field.fixedValue) === "2") {
+          field.fixedValue = null;
+        }
+      }
+      if (
+        field.fieldName === "senderIdNumber" &&
+        businessForm.value.fieldData &&
+        businessForm.value.fieldData.payoutCurrency === "CNY"
+      ) {
+        // 如果当前固定值是被移除的 valueId,则清空以避免不可用的默认选中
+        fixedValue = ''
+      }
       // Handle select fields
       // Handle select fields
       if (field.fieldType === "select") {
       if (field.fieldType === "select") {
         let rValue = globalForm.value[fieldName];
         let rValue = globalForm.value[fieldName];
@@ -450,21 +519,73 @@ const setData = async (data: any) => {
   );
   );
   globalCurrenciesField.value = mergedFields;
   globalCurrenciesField.value = mergedFields;
 };
 };
-
 // 选择的收款人
 // 选择的收款人
-const selectReceiver = (value: any) => {
-  globalForm.value.receiver = value.value;
-  const data = receiverUserList.value.find((item: any) => item.id === value.value);
-  if (data) {
-    globalForm.value = { ...globalForm.value, ...data };
+const selectReceiver = (a, isCurrencyChange = false) => {
+  const cardNumber = a.value;
+  if (!cardNumber) return;
+  const sameCardList = receiverUserList.value.filter(
+    (item) => item.receiverBankAccountNumber === cardNumber
+  );
+  const receiverFields = [
+    'receiverFirstName', 'receiverLastName', 'receiverNativeFirstName', 'receiverNativeLastName',
+    'receiverBankAccountNumber', 'receiverIdNumber', 'receiverIdType', 'receiverIdTypeValue',
+    'receiverMobileNumber', 'receiverMobileAreaCode', 'receiverBankId', 'receiverBankIdValue',
+    'receiverBankCity', 'receiverBankCityValue', 'receiverBankState', 'receiverBankStateValue',
+    'receiverBankAccountType', 'receiverBankAccountTypeValue', 'receiverBankBranchCode',
+    'receiverGender', 'receiverGenderValue', 'receiverDateOfBirth', 'receiverAddress',
+    'receiverZipCode', 'receiverCity', 'receiverRegion', 'receiverRegionValue',
+    'receiverState', 'receiverStateValue', 'receiverNationality', 'receiverNationalityValue',
+    'receiverOccupation', 'receiverOccupationValue'
+  ];
+
+  if (!sameCardList.length) {
+    receiverFields.forEach(field => {
+      globalForm.value[field] = undefined;
+      const valueKey = field + 'Value';
+      globalForm.value[valueKey] = undefined;
+    });
+    return;
   }
   }
 
 
-  nextTick(() => {
-    // Validation can be triggered here if needed
+  const { payoutCurrency, payType, payMethod } = globalForm.value;
+  let matchingData = null;
+  if (payoutCurrency && payType && payMethod) {
+    matchingData = sameCardList.find(
+      (item) =>
+        item.payoutCurrency === payoutCurrency &&
+        String(item.payoutMethod) === String(payMethod) &&
+        String(item.transferType) === String(payType)
+    );
+  }
+  if (!matchingData) {
+    if (isCurrencyChange) {
+      receiverFields.forEach(field => {
+        globalForm.value[field] = undefined;
+        const valueKey = field + 'Value';
+        globalForm.value[valueKey] = undefined;
+      });
+      return;
+    }
+    matchingData = sameCardList[0];
+    if (matchingData) {
+      if (!isCurrencyChange) {
+        globalForm.value.payoutCurrency = matchingData.payoutCurrency;
+        globalForm.value.payType = String(matchingData.transferType);
+        globalForm.value.payMethod = String(matchingData.payoutMethod);
+        selectOption1(3, true);
+      }
+    }
+  } else {
+    if (!isCurrencyChange) {
+      selectOption1(3, true);
+    }
+  }
+
+  if (!matchingData) return;
+  receiverFields.forEach(field => {
+    globalForm.value[field] = matchingData[field];
   });
   });
 };
 };
-
-// 获取币种列表
 const getGlobalCurrenciesDropdown = () => {
 const getGlobalCurrenciesDropdown = () => {
   const res = cardStore.currencyList;
   const res = cardStore.currencyList;
   globalCurrenciesDropdown.value = res || [];
   globalCurrenciesDropdown.value = res || [];
@@ -492,11 +613,18 @@ const getGlobalCurrenciesDropdown = () => {
 // 提交订单
 // 提交订单
 const saveDlobal = async () => {
 const saveDlobal = async () => {
   const isValid = await globalFormRef.value.validateForm();
   const isValid = await globalFormRef.value.validateForm();
-  console.log(isValid);
   if (!isValid) {
   if (!isValid) {
     return;
     return;
   }
   }
   try {
   try {
+    if (!globalForm.value.amount) {
+      showToast(t("global.validator.v15"));
+      return;
+    }
+    if (form__error.value) {
+      showToast(form__error.value);
+      return
+    }
     if (!globalForm.value.deductionAccount) {
     if (!globalForm.value.deductionAccount) {
       showToast(t('placeholder.choose'));
       showToast(t('placeholder.choose'));
       return;
       return;
@@ -524,11 +652,9 @@ const saveDlobal = async () => {
       uniqueId: businessForm.value.uniqueId,
       uniqueId: businessForm.value.uniqueId,
       ...businessForm.value.exchangeRate,
       ...businessForm.value.exchangeRate,
     };
     };
-
     const res = await ucardApi.globalOrdersCreate({ ...params });
     const res = await ucardApi.globalOrdersCreate({ ...params });
     if (res.code === 200) {
     if (res.code === 200) {
-      showToast(res.msg);
-      backActivity();
+      showSuccessPrompt.value = true;
     } else {
     } else {
       showToast(res.msg);
       showToast(res.msg);
     }
     }
@@ -626,7 +752,7 @@ onMounted(async () => {
   font-size: px2rpx(12);
   font-size: px2rpx(12);
   color: #999;
   color: #999;
   margin-left: px2rpx(5);
   margin-left: px2rpx(5);
-  
+
 }
 }
 
 
 .form-error {
 .form-error {

+ 21 - 33
pages/wallet/index.vue

@@ -7,7 +7,7 @@
           <view class="balance-item">
           <view class="balance-item">
             <view class="r l" @click="setModelValue1">
             <view class="r l" @click="setModelValue1">
               <image :src="imageSrc(balance)" alt="" srcset="" />
               <image :src="imageSrc(balance)" alt="" srcset="" />
-              <text>{{ balance }} {{ t("wallet1.p2") }}</text>
+              <text>{{ balance }}</text>
               <cwg-icon name="icon_dropdown" :size="24" />
               <cwg-icon name="icon_dropdown" :size="24" />
             </view>
             </view>
             <view class="r">
             <view class="r">
@@ -38,22 +38,22 @@
         <view class="cwg-button">
         <view class="cwg-button">
           <u-button type="primary" block @click="goToGlobalRemit">{{
           <u-button type="primary" block @click="goToGlobalRemit">{{
             t("global.title1")
             t("global.title1")
-          }}</u-button>
+            }}</u-button>
         </view>
         </view>
         <view class="trans-header">
         <view class="trans-header">
           <view class="record-title">{{ t("global.title") }} </view>
           <view class="record-title">{{ t("global.title") }} </view>
 
 
           <view class="all" @click="goRechargeRecord">{{
           <view class="all" @click="goRechargeRecord">{{
             t("card.Status.t22")
             t("card.Status.t22")
-          }}</view>
+            }}</view>
 
 
         </view>
         </view>
 
 
 
 
         <view class="transaction-list">
         <view class="transaction-list">
-          <template v-if="transferList.length > 0">
-            <view v-for="item in transferList" :key="item.id" class="transaction-item"
-              @click="goToTransferDetail(item.id)">
+          <template v-if="globalOrdersList.length > 0">
+            <view v-for="item in globalOrdersList" :key="item.id" class="transaction-item"
+              @click="goToDeductionDetail(item)">
               <view class="transaction-left">
               <view class="transaction-left">
                 <view class="transaction-icon">
                 <view class="transaction-icon">
                   <text class="icon-text"><cwg-icon name="icon_transfer" :size="23" color="#1a1a1a" /></text>
                   <text class="icon-text"><cwg-icon name="icon_transfer" :size="23" color="#1a1a1a" /></text>
@@ -69,22 +69,9 @@
               </view>
               </view>
             </view>
             </view>
           </template>
           </template>
-          <cwg-empty-state v-if="transferList.length == 0" :title="t('empty-state.t2')" :text="t('empty-state.c2')" />
+          <cwg-empty-state v-if="globalOrdersList.length == 0" :title="t('empty-state.t2')"
+            :text="t('empty-state.c2')" />
         </view>
         </view>
-        <!-- <view v-if="transferList.length > 0" class="record-list">
-          <view v-for="item in transferList" :key="item.id" class="record-item" @click="goToTransferDetail(item.id)">
-            <cwg-icon name="icon_transfer" :size="23" color="#1a1a1a" />
-            <text>{{ item.deductionMerchantOrderNo }}</text>
-            <view></view>
-            <view class="record-amount-time">
-              <view class="record-amount">{{ item.deductionAmount }} {{ item.sendCurrency }}</view>
-              <view class="record-time">{{ item.addTime }}</view>
-            </view>
-          </view>
-        </view>
-        <view v-else class="record-list">
-          <cwg-empty-state :title="t('empty-state.t1')" :text="t('empty-state.c1')" />
-        </view> -->
       </view>
       </view>
       <cwg-currency-select v-model="modelValue" :show-search="true" :options="globalCurrenciesDropdown"
       <cwg-currency-select v-model="modelValue" :show-search="true" :options="globalCurrenciesDropdown"
         @select="changeSelect" :placeholder="t('common.country')" />
         @select="changeSelect" :placeholder="t('common.country')" />
@@ -135,6 +122,14 @@ async function getBalance() {
 function imageSrc(currency: string) {
 function imageSrc(currency: string) {
   return `/static/images/currency/${currency}.png`;
   return `/static/images/currency/${currency}.png`;
 }
 }
+const goToDeductionDetail = (record: RecordItem) => {
+  console.log(record, 1212);
+  cardStore.saveOrderDetail(record);
+  router.push({
+    path: '/pages/wallet/global-detail',
+    query: { id: record.id }
+  });
+};
 
 
 function splitNumber(n) {
 function splitNumber(n) {
   if (
   if (
@@ -172,13 +167,6 @@ function goToGlobalRemit() {
   router.push(
   router.push(
     `/pages/wallet/global-order?currency=${currency.value}`
     `/pages/wallet/global-order?currency=${currency.value}`
   );
   );
-  // if (allAmount.value >= 100) {
-  //   router.push(
-  //    `/eur/remit?currency=${currency.value}&allAmount=${allAmount.value}&currentStep=1`
-  //  );
-  // } else {
-  //   showToast(t("eur.p9", { max: 100 }));
-  // }
 }
 }
 function changeSelect(e) {
 function changeSelect(e) {
   currency.value = e.value;
   currency.value = e.value;
@@ -198,14 +186,14 @@ const getGlobalCurrenciesDropdown = async () => {
     cardStore.saveCurrencyList(data)
     cardStore.saveCurrencyList(data)
   }
   }
 };
 };
-const transferList = ref<TransferInfo[]>([]);
-async function getTransferList() {
+const globalOrdersList = ref<TransferInfo[]>([]);
+async function getGlobalOrdersList() {
   try {
   try {
     const res = await ucardApi.globalOrdersList({ page: { current: 1, row: 5 } });
     const res = await ucardApi.globalOrdersList({ page: { current: 1, row: 5 } });
     if (res.code === 200) {
     if (res.code === 200) {
-      transferList.value = res.data;
+      globalOrdersList.value = res.data;
     } else {
     } else {
-      transferList.value = [];
+      globalOrdersList.value = [];
     }
     }
   } catch (error) {
   } catch (error) {
     showToast(t("common.error"));
     showToast(t("common.error"));
@@ -216,7 +204,7 @@ function goToTransferDetail(id: string) {
 }
 }
 onMounted(() => {
 onMounted(() => {
   getGlobalCurrenciesDropdown()
   getGlobalCurrenciesDropdown()
-  getTransferList()
+  getGlobalOrdersList()
   getBalance();
   getBalance();
 });
 });
 </script>
 </script>

TEMPAT SAMPAH
static/images/vector2.png


TEMPAT SAMPAH
static/images/vector3.png


+ 22 - 0
stores/use-user-store.ts

@@ -18,10 +18,12 @@ export interface AccountInfo {
 }
 }
 const STORAGE_KEY = "user";
 const STORAGE_KEY = "user";
 const ACCOUNT_INFO_KEY = "accountInfo";
 const ACCOUNT_INFO_KEY = "accountInfo";
+const ID_TYPE_OPTIONS_KEY = "reasonsOptions";
 const useUserStore = defineStore("userStore", () => {
 const useUserStore = defineStore("userStore", () => {
   const userInfo = ref<UserInfo | null>(null);
   const userInfo = ref<UserInfo | null>(null);
   const accountInfo = ref<AccountInfo | null>(null);
   const accountInfo = ref<AccountInfo | null>(null);
   const isLoggedIn = ref(false);
   const isLoggedIn = ref(false);
+  const reasonsOptions = ref<any>(null);
   const initUserInfo = () => {
   const initUserInfo = () => {
     const encryptedInfo = ls.get(STORAGE_KEY);
     const encryptedInfo = ls.get(STORAGE_KEY);
     if (encryptedInfo) {
     if (encryptedInfo) {
@@ -32,6 +34,16 @@ const useUserStore = defineStore("userStore", () => {
       }
       }
     }
     }
   };
   };
+  const initReasonsOptions = () => {
+    const encryptedInfo = ls.get(ID_TYPE_OPTIONS_KEY);
+    if (encryptedInfo) {
+      const decryptedInfo = crypt.decrypt(encryptedInfo);
+      if (decryptedInfo) {
+        reasonsOptions.value = JSON.parse(decryptedInfo);
+        isLoggedIn.value = true;
+      }
+    }
+  };
   const initAccountInfo = () => {
   const initAccountInfo = () => {
     const encryptedInfo = ls.get(ACCOUNT_INFO_KEY);
     const encryptedInfo = ls.get(ACCOUNT_INFO_KEY);
     if (encryptedInfo) {
     if (encryptedInfo) {
@@ -47,6 +59,11 @@ const useUserStore = defineStore("userStore", () => {
     const encryptedInfo = crypt.encrypt(JSON.stringify(info));
     const encryptedInfo = crypt.encrypt(JSON.stringify(info));
     ls.set(STORAGE_KEY, encryptedInfo);
     ls.set(STORAGE_KEY, encryptedInfo);
   };
   };
+  const saveReasonsOptions = (info: any) => {
+    reasonsOptions.value = info;
+    const encryptedInfo = crypt.encrypt(JSON.stringify(info));
+    ls.set(ID_TYPE_OPTIONS_KEY, encryptedInfo);
+  };
   const saveAccountInfo = (info: AccountInfo) => {
   const saveAccountInfo = (info: AccountInfo) => {
     accountInfo.value = info;
     accountInfo.value = info;
     const encryptedInfo = crypt.encrypt(JSON.stringify(info));
     const encryptedInfo = crypt.encrypt(JSON.stringify(info));
@@ -56,14 +73,19 @@ const useUserStore = defineStore("userStore", () => {
     userInfo.value = null;
     userInfo.value = null;
     isLoggedIn.value = false;
     isLoggedIn.value = false;
     userToken.value = "";
     userToken.value = "";
+    reasonsOptions.value = null;
     ls.remove(STORAGE_KEY);
     ls.remove(STORAGE_KEY);
   };
   };
+  initReasonsOptions();
   initUserInfo();
   initUserInfo();
   initAccountInfo();
   initAccountInfo();
   return {
   return {
     userInfo,
     userInfo,
     accountInfo,
     accountInfo,
     isLoggedIn,
     isLoggedIn,
+    reasonsOptions,
+    saveReasonsOptions,
+    initReasonsOptions,
     saveUserInfo,
     saveUserInfo,
     saveAccountInfo,
     saveAccountInfo,
     clearUserInfo,
     clearUserInfo,

+ 3 - 3
utils/dataMap.js

@@ -45,13 +45,13 @@ export const walletBalanceTypeMap = {
   9: 'card.Status.t25'
   9: 'card.Status.t25'
 }
 }
 
 
-//   速汇审批状态
+// 速汇审批状态
 export const globalApprovalText = {
 export const globalApprovalText = {
   1: "global.Status.Pending",
   1: "global.Status.Pending",
   2: "global.Status.Approved",
   2: "global.Status.Approved",
   3: "global.Status.Rejected",
   3: "global.Status.Rejected",
 };
 };
-//   
+// 合规性资料状态
 export const globalComplianceText = {
 export const globalComplianceText = {
   no_process: "global.GlobalOrder.no_process",
   no_process: "global.GlobalOrder.no_process",
   pending_check: "global.GlobalOrder.pending_check",
   pending_check: "global.GlobalOrder.pending_check",
@@ -59,7 +59,7 @@ export const globalComplianceText = {
   approved: "global.GlobalOrder.approved",
   approved: "global.GlobalOrder.approved",
   rejected: "global.GlobalOrder.rejected",
   rejected: "global.GlobalOrder.rejected",
 };
 };
-//   速汇状态
+// 速汇订单状态
 export const globalStatusText = {
 export const globalStatusText = {
   null: "global.GlobalOrder.wait",
   null: "global.GlobalOrder.wait",
   wait_process: "global.GlobalOrder.wait",
   wait_process: "global.GlobalOrder.wait",

+ 5 - 3
utils/request.js

@@ -1,9 +1,11 @@
 // 基础配置
 // 基础配置
 import { removeUserInfo, removeToken } from "./auth.js";
 import { removeUserInfo, removeToken } from "./auth.js";
 import config from "@/config";
 import config from "@/config";
-const { Host85, Host00 } = config;
-const baseUrl = "https://ucard.44a5c8109e4.com";
-// const baseUrl = "http://192.168.0.18:8700";
+const { Host85, Host00 } = config;
+// const baseUrl = "https://ucard.cwgrd.com";
+// const baseUrl = "https://ucard.44a5c8109e4.com";
+// const baseUrl = "http://192.168.0.18:8700";
+const baseUrl = Host85;
 const timeout = 10000;
 const timeout = 10000;
 import { CLIENT, lang, userToken } from "@/composables/config";
 import { CLIENT, lang, userToken } from "@/composables/config";
 const LOGIN_PAGE_PATH = "/pages/login/index";
 const LOGIN_PAGE_PATH = "/pages/login/index";