From b035105f802fd3400e54be4a1851596bcf06ed44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E8=BF=9B?= Date: Sat, 7 Nov 2026 21:21:57 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B2=89=E9=BB=98=E6=9C=9F=E5=B7=B2?= =?UTF-8?q?=E8=BF=87=E6=9C=9F=E6=9C=AA=E5=BB=B6=E6=9C=9F=E6=97=B6=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E5=9B=9E=E9=A6=96=E9=A1=B5=E9=83=BD=E5=BC=B9=E6=8F=90?= =?UTF-8?q?=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 已过期(含有未支付延期订单)不再限频,直到支付或延期;待实名临近截止仍为每次登录一次 --- pages/index/index.vue | 9 ++++++--- tests/october-h5.test.mjs | 6 ++++-- tests/silence.test.mjs | 9 +++++++++ utils/silence.js | 3 +++ 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/pages/index/index.vue b/pages/index/index.vue index d6bb2a8..1e81be1 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -161,7 +161,7 @@ import { consumePendingPaymentRefresh, PAYMENT_REFRESH_TARGETS } from '@/utils/payment.js'; import { getSessionContext, isCurrentSession } from '@/utils/session-context.js'; import { getShanghaiDay } from '@/utils/expiry-reminder.js'; - import { pickSilenceReminder, silenceReminderKey } from '@/utils/silence.js'; + import { pickSilenceReminder, silenceReminderKey, silenceReminderRepeats } from '@/utils/silence.js'; const userStore = useUserStore(); const assetStore = useAssetStore(); @@ -202,7 +202,8 @@ const data = await assetApi.getPackageHistory(identifier, 1, 20, { status: 0 }); if (entryId !== homeEntryId || !homeActive.value || identifier !== String(userStore.state.identifier || '').trim()) return; const reminder = pickSilenceReminder(data?.items); - if (!reminder || uni.getStorageSync(silenceReminderKey(identifier, reminder, getSessionContext().token))) return; + if (!reminder) return; + if (!silenceReminderRepeats(reminder) && uni.getStorageSync(silenceReminderKey(identifier, reminder, getSessionContext().token))) return; // 已过期的套餐再查一次延期资格:有未支付的延期订单时,弹窗改为提醒去支付或作废 if (reminder.kind === 'expired') { try { @@ -228,7 +229,9 @@ silenceReminder.value = null; return false; } - uni.setStorageSync(silenceReminderKey(silenceReminderIdentifier, reminder, getSessionContext().token), 1); + if (!silenceReminderRepeats(reminder)) { + uni.setStorageSync(silenceReminderKey(silenceReminderIdentifier, reminder, getSessionContext().token), 1); + } silenceReminderShow.value = true; return true; }; diff --git a/tests/october-h5.test.mjs b/tests/october-h5.test.mjs index e3b522c..4e94e09 100644 --- a/tests/october-h5.test.mjs +++ b/tests/october-h5.test.mjs @@ -934,7 +934,7 @@ test('order completion and payment return reread actual asset state, not a presu assert.equal(reads, 4); }); -test('home shows the silence reminder after other popups, once per login, and opens the extension page', async () => { +test('home shows the expired silence reminder on every return until paid, after other popups', async () => { const r = runtime(); r.api.assetApi = { getInfo: async () => ({ identifier: 'A' }), @@ -960,9 +960,11 @@ test('home shows the silence reminder after other popups, once per login, and op assert.equal(page.silenceReminderShow.value, false); assert.equal(r.calls.at(-1).kind, 'navigateTo'); assert.equal(r.calls.at(-1).url, '/pages/silence-extension/silence-extension?package_usage_id=44961'); - // 同一次登录内再回到首页不重复弹 + // 已过期未支付:同一次登录内每次回到首页都要再弹 r.hidden[0](); await r.shown[0](); await settle(); page.onPopupCandidateClose('empty'); await settle(); + assert.equal(page.silenceReminderShow.value, true); + page.closeSilenceReminder(); assert.equal(page.silenceReminderShow.value, false); // 重新登录(凭证变化)后再次提醒;有未支付延期订单时提示去支付或作废 pendingOrderNo = 'SE20261107200004975908'; diff --git a/tests/silence.test.mjs b/tests/silence.test.mjs index 78f3dc2..07b6d50 100644 --- a/tests/silence.test.mjs +++ b/tests/silence.test.mjs @@ -11,6 +11,7 @@ import { isSilenceOrderFinal, pickSilenceReminder, silenceReminderKey, + silenceReminderRepeats, validateExtensionDays } from '../utils/silence.js'; @@ -95,3 +96,11 @@ test('首页沉默期提醒:优先已过期可延期,其次 7 天内到期 assert.equal(keyA, silenceReminderKey('A', { packageUsageId: 3, kind: 'expired' }, 'token-1')); assert.notEqual(keyA, silenceReminderKey('A', { packageUsageId: 3, kind: 'expired' }, 'token-2')); }); + +test('只有已过期未延期的提醒每次回首页都弹,待实名提醒每次登录一次', () => { + assert.equal(silenceReminderRepeats({ kind: 'expired' }), true); + assert.equal(silenceReminderRepeats({ kind: 'expired', pendingOrderNo: 'SE1' }), true); + assert.equal(silenceReminderRepeats({ kind: 'waiting' }), false); + assert.equal(silenceReminderRepeats(null), false); +}); + diff --git a/utils/silence.js b/utils/silence.js index d15fd6e..b2ebacd 100644 --- a/utils/silence.js +++ b/utils/silence.js @@ -177,5 +177,8 @@ const shortHash = (value) => { * 每次登录、每个资产、每笔套餐、每种提醒最多弹一次的存储键: * 带上登录凭证摘要,重新登录后会再次提醒;同一次登录内反复回首页不重复弹。 */ +/** 已过期未延期(含有未支付延期订单)每次回首页都要提醒;只有"待实名临近截止"按每次登录一次 */ +export const silenceReminderRepeats = (reminder) => reminder?.kind === 'expired'; + export const silenceReminderKey = (identifier, reminder, sessionToken) => `silence_reminder:${identifier}:${reminder.packageUsageId}:${reminder.kind}:${shortHash(sessionToken)}`;