From a9132acd98b03d3b6bf7b57eb827da6a43aa161d Mon Sep 17 00:00:00 2001 From: Austin Date: Sun, 12 Jul 2026 22:43:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/cashier/index.vue | 125 ++++++++++++++++++++++++++++------------ 1 file changed, 88 insertions(+), 37 deletions(-) diff --git a/pages/cashier/index.vue b/pages/cashier/index.vue index 3099060..2d466f6 100644 --- a/pages/cashier/index.vue +++ b/pages/cashier/index.vue @@ -41,9 +41,12 @@ 请输入付款金额 - - {{ benefitTitle }} - ¥ {{ accumulationAmount }} + + + {{ benefitTitle }} + ¥ {{ accumulationAmount }} + + 绑定物业:{{ propertyName }} @@ -137,6 +140,7 @@ const remark = ref(''); const paying = ref(false); const activeMerchantUrl = ref(''); const scoreName = ref('物业公积金'); +const propertyName = ref(''); const scanning = ref(false); const numberKeys = ['1', '2', '3', '4', '5', '6', '7', '8', '9']; @@ -149,6 +153,20 @@ const accumulationAmount = computed(() => { const showBenefitTip = computed(() => Number(merchant.value.accumulationRate) > 0); const benefitTitle = computed(() => `预计获得${scoreName.value || '物业公积金'}`); +interface PropertyBindingCache { + merchant_id?: string; + merchant_name?: string; + score_name?: string; + fee_rate?: string | number; +} + +interface SupplierCache { + supplier_id?: string | number; + supplier_name?: string; + logo?: string; + fee_rate?: string | number; +} + const parseFeeRate = (feeRate: unknown) => { if (feeRate === undefined || feeRate === null || feeRate === '') return 0; const rate = Number(feeRate); @@ -156,6 +174,42 @@ const parseFeeRate = (feeRate: unknown) => { return rate / 100; }; +const hasFeeRate = (feeRate: unknown) => feeRate !== undefined && feeRate !== null && feeRate !== ''; + +const resolveFeeRateFromPayload = (payload: Record = {}) => { + const supplierData = payload.supplier || {}; + return supplierData.fee_rate ?? payload.fee_rate; +}; + +const resolvePropertyFromPayload = (payload: Record = {}) => { + const merchantData = payload.merchant || payload; + return { + merchant_id: merchantData.merchant_id, + merchant_name: merchantData.merchant_name, + score_name: merchantData.config?.score_name + }; +}; + +const applyPropertyInfo = (property?: { merchant_name?: string; score_name?: string }) => { + if (!property) return; + if (property.merchant_name) { + propertyName.value = property.merchant_name; + } + if (property.score_name) { + scoreName.value = property.score_name; + } +}; + +const buildSupplierCache = (payload: Record = {}, previous?: SupplierCache | null): SupplierCache => { + const supplierData = payload.supplier || {}; + return { + supplier_id: supplierData.supplier_id ?? payload.supplier_id ?? previous?.supplier_id, + supplier_name: supplierData.supplier_name ?? payload.supplier_name ?? previous?.supplier_name, + logo: supplierData.logo ?? payload.logo ?? previous?.logo, + fee_rate: resolveFeeRateFromPayload(payload) ?? previous?.fee_rate + }; +}; + const applyMerchantInfo = (data: any = {}) => { const name = data.name || data.merchant_name || data.title; const background = data.background || data.banner || data.cover || data.bg; @@ -170,39 +224,29 @@ const applyMerchantInfo = (data: any = {}) => { }; }; -interface PropertyBindingCache { - merchant_id?: string; - merchant_name?: string; - score_name?: string; - fee_rate?: string | number; -} - -interface SupplierCache { - supplier_id?: string | number; - supplier_name?: string; - logo?: string; - fee_rate?: string | number; -} - const applyBindingInfo = (binding?: PropertyBindingCache | null) => { if (!binding) return; - applyMerchantInfo({ + const updates: Record = { merchant_id: binding.merchant_id, - merchant_name: binding.merchant_name, - accumulationRate: parseFeeRate(binding.fee_rate) - }); - if (binding.score_name) { - scoreName.value = binding.score_name; + merchant_name: binding.merchant_name + }; + if (hasFeeRate(binding.fee_rate)) { + updates.accumulationRate = parseFeeRate(binding.fee_rate); } + applyMerchantInfo(updates); + applyPropertyInfo(binding); }; const applySupplierInfo = (supplier?: SupplierCache | null) => { if (!supplier) return; - applyMerchantInfo({ + const updates: Record = { name: supplier.supplier_name, - background: supplier.logo, - accumulationRate: parseFeeRate(supplier.fee_rate) - }); + background: supplier.logo + }; + if (hasFeeRate(supplier.fee_rate)) { + updates.accumulationRate = parseFeeRate(supplier.fee_rate); + } + applyMerchantInfo(updates); }; const syncBindingCacheForUrl = (merchantUrl: string) => { @@ -218,6 +262,8 @@ const syncBindingCacheForUrl = (merchantUrl: string) => { const initWithMerchantUrl = async (merchantUrl: string) => { hasMerchantUrl.value = true; activeMerchantUrl.value = merchantUrl; + propertyName.value = ''; + scoreName.value = '物业公积金'; await loadPropertyBinding(merchantUrl); await loadSupplier(merchantUrl); }; @@ -286,12 +332,11 @@ const loadPropertyBinding = async (merchantUrl: string) => { const payload = response.data || {}; const merchantData = payload.merchant || payload; - const supplierData = payload.supplier || {}; const latestBinding: PropertyBindingCache = { merchant_id: merchantData.merchant_id, merchant_name: merchantData.merchant_name, score_name: merchantData.config?.score_name, - fee_rate: supplierData.fee_rate ?? payload.fee_rate + fee_rate: resolveFeeRateFromPayload(payload) }; applyBindingInfo(latestBinding); encryptedStorage.set(cacheKey, latestBinding, PROPERTY_CACHE_TTL_SECONDS); @@ -312,13 +357,8 @@ const loadSupplier = async (merchantUrl: string) => { if (Number(response?.code) !== 200 || !response?.data) return; const payload = response.data || {}; - const supplierData = payload.supplier || payload; - const latestSupplier: SupplierCache = { - supplier_id: supplierData.supplier_id, - supplier_name: supplierData.supplier_name, - logo: supplierData.logo, - fee_rate: supplierData.fee_rate - }; + const latestSupplier = buildSupplierCache(payload, cached); + applyPropertyInfo(resolvePropertyFromPayload(payload)); applySupplierInfo(latestSupplier); encryptedStorage.set(cacheKey, latestSupplier, SUPPLIER_CACHE_TTL_SECONDS); } catch (error) { @@ -676,14 +716,25 @@ onLoad((options: any) => { font-size: 26rpx; } -.benefit-tip { +.benefit-block { margin-top: 20rpx; padding-left: 4rpx; +} + +.benefit-tip { color: #8B929E; font-size: 26rpx; line-height: 1.5; } +.benefit-property { + display: block; + margin-top: 8rpx; + color: #AEB4BE; + font-size: 24rpx; + line-height: 1.5; +} + .benefit-value { margin-left: 8rpx; color: #4B6CB7;