diff --git a/api/modules/asset.js b/api/modules/asset.js
index a9bff8f..ade50d8 100644
--- a/api/modules/asset.js
+++ b/api/modules/asset.js
@@ -3,24 +3,30 @@ import { useAssetStore } from '@/store/asset.js';
import { useUserStore } from '@/store/user.js';
import { getSessionContext, isCurrentSession } from '@/utils/session-context.js';
-export const normalizeAssetInfo = (data = {}) => ({
- ...data,
- allowed_payment_methods: Array.isArray(data.allowed_payment_methods)
- ? data.allowed_payment_methods
- : [],
- real_name_status: data.real_name_status === undefined || data.real_name_status === null
- ? data.real_name_status
- : Number(data.real_name_status),
- realname_required: data.realname_required === undefined || data.realname_required === null
- ? data.realname_required
- : data.realname_required === true || data.realname_required === 1,
- days_until_final_expiry: data.days_until_final_expiry === null || data.days_until_final_expiry === undefined
- ? data.days_until_final_expiry
- : Number(data.days_until_final_expiry),
- is_expiring: data.is_expiring === undefined || data.is_expiring === null
- ? data.is_expiring
- : data.is_expiring === true || data.is_expiring === 1
-});
+let assetInfoRequestId = 0;
+
+export const normalizeAssetInfo = (data = {}) => {
+ // 保护期已下线:不向展示和业务判断透传废弃字段,兼容 none 或字段缺失。
+ const { device_protect_status, ...info } = data;
+ return {
+ ...info,
+ allowed_payment_methods: Array.isArray(data.allowed_payment_methods)
+ ? data.allowed_payment_methods
+ : [],
+ real_name_status: data.real_name_status === undefined || data.real_name_status === null
+ ? data.real_name_status
+ : Number(data.real_name_status),
+ realname_required: data.realname_required === undefined || data.realname_required === null
+ ? data.realname_required
+ : data.realname_required === true || data.realname_required === 1,
+ days_until_final_expiry: data.days_until_final_expiry === null || data.days_until_final_expiry === undefined
+ ? data.days_until_final_expiry
+ : Number(data.days_until_final_expiry),
+ is_expiring: data.is_expiring === undefined || data.is_expiring === null
+ ? data.is_expiring
+ : data.is_expiring === true || data.is_expiring === 1
+ };
+};
const normalizePackageHistoryNode = (node = {}) => ({
...node,
@@ -69,6 +75,7 @@ export const assetApi = {
return Promise.reject({ msg: '登录和微信配置尚未完成,请稍后重试' });
}
const phoneRevision = userStore.state.phoneRevision;
+ const requestId = identifier === context.identifier ? ++assetInfoRequestId : null;
return request({
url: '/api/c/v1/asset/info',
method: 'GET',
@@ -76,7 +83,10 @@ export const assetApi = {
}).then((response) => {
const data = normalizeAssetInfo(response);
if (identifier === context.identifier && isCurrentSession(context)) {
- useAssetStore().receiveExpiryReminder(context, data.expiry_reminder);
+ const assetStore = useAssetStore();
+ // 替换整个快照,不合并旧轮询开关;迟到的旧请求不得覆盖新状态。
+ if (requestId === assetInfoRequestId) assetStore.setAssetInfo(data);
+ assetStore.receiveExpiryReminder(context, data.expiry_reminder);
if (phoneRevision === userStore.state.phoneRevision && typeof data.bound_phone === 'string') {
userStore.setCustomerPhone(data.bound_phone);
}
diff --git a/components/TrafficCard.vue b/components/TrafficCard.vue
index 3f1297f..7193908 100644
--- a/components/TrafficCard.vue
+++ b/components/TrafficCard.vue
@@ -40,32 +40,23 @@