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;