From 169e2e4a511766d8c1551d103360f2914c4c0dae Mon Sep 17 00:00:00 2001 From: zhangyibo95 <690096405@qq.com> Date: Wed, 23 Sep 2026 15:36:39 +0800 Subject: [PATCH] =?UTF-8?q?update=EF=BC=9A=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/composables/useDeviceStatus.js | 28 ++++++++++--- src/pages/device/my-device.vue | 38 ++++++++++++++---- src/static/home-device/device-bow.png | Bin 19652 -> 17809 bytes src/store.js | 31 ++++++++++++++ 4 files changed, 85 insertions(+), 12 deletions(-) diff --git a/src/pages/device/composables/useDeviceStatus.js b/src/pages/device/composables/useDeviceStatus.js index d7b8dd6..d99eefb 100644 --- a/src/pages/device/composables/useDeviceStatus.js +++ b/src/pages/device/composables/useDeviceStatus.js @@ -11,8 +11,10 @@ export function useDeviceStatus({ user, device, deviceStatus, + deviceUsageDuration, online, updateDevice, + updateDeviceUsageDuration, clearDevice, unbindDialogVisible, }) { @@ -41,14 +43,28 @@ export function useDeviceStatus({ const batteryText = computed(() => battery.value === null ? "暂无数据" : `${battery.value}%` ); + const normalizeDuration = (value) => { + if (value == null || String(value).trim() === "") return null; + const seconds = Number(value); + return Number.isFinite(seconds) && seconds >= 0 ? seconds : null; + }; + const onlineDurationText = computed(() => { - const rawDuration = deviceStatus.value.onlineDuration; - if (rawDuration == null || String(rawDuration).trim() === "") return "--"; + const currentDeviceId = String(device.value.deviceId || ""); + const cachedDuration = + String(deviceUsageDuration.value.deviceId || "") === currentDeviceId + ? normalizeDuration(deviceUsageDuration.value.seconds) + : null; + const durations = [ + normalizeDuration(deviceStatus.value.onlineDuration), + normalizeDuration(deviceDetails.value.onlineDuration), + cachedDuration, + ].filter((value) => value !== null); - const seconds = Number(rawDuration); - if (!Number.isFinite(seconds) || seconds < 0) return "--"; + if (!durations.length) return "--"; + const seconds = Math.max(...durations); - // WS 推送秒数,页面按完整分钟展示累计使用时间。 + // 累计时长应单调递增,页面按完整分钟展示当前已知最大值。 const totalMinutes = Math.floor(seconds / 60); const hours = Math.floor(totalMinutes / 60); const minutes = totalMinutes % 60; @@ -109,6 +125,7 @@ export function useDeviceStatus({ detail.qrCodeUrl ?? deviceDetails.value.qrCodeUrl ?? "" ).trim(), }; + updateDeviceUsageDuration(detail.onlineDuration, deviceId); } catch (error) { // 实时刷新失败时保留当前页面数据,等待下次通知或页面重新显示。 console.log("刷新设备详情失败", error); @@ -158,6 +175,7 @@ export function useDeviceStatus({ latestDevice.name || "我的智能弓" ); + updateDeviceUsageDuration(latestDevice.onlineDuration, latestDevice.deviceId); return; } clearDevice(); diff --git a/src/pages/device/my-device.vue b/src/pages/device/my-device.vue index 596acd0..01ccfe9 100644 --- a/src/pages/device/my-device.vue +++ b/src/pages/device/my-device.vue @@ -22,8 +22,8 @@ import { import { useOtaUpdate } from "@/composables/useOtaUpdate"; const store = useStore(); -const { updateDevice, clearDevice } = store; -const { user, device, deviceStatus, online } = storeToRefs(store); +const { updateDevice, updateDeviceUsageDuration, clearDevice } = store; +const { user, device, deviceStatus, deviceUsageDuration, online } = storeToRefs(store); const DEVICE_NAME_MAX_LENGTH = 10; const formatBindingDate = (value) => { @@ -97,8 +97,10 @@ const { user, device, deviceStatus, + deviceUsageDuration, online, updateDevice, + updateDeviceUsageDuration, clearDevice, unbindDialogVisible, }); @@ -112,6 +114,28 @@ const bindingDateText = computed(() => formatBindingDate(deviceDetails.value.bindTime) ); +// 固件版本统一以大写 V 开头,避免接口返回格式不一致影响弹窗展示。 +const formatFirmwareVersion = (value) => { + const version = String(value ?? "").trim(); + if (!version) return ""; + return /^v/i.test(version) ? `V${version.slice(1)}` : `V${version}`; +}; + +const firmwareConfirmContent = computed(() => { + const currentVersion = formatFirmwareVersion(deviceStatus.value.version); + const latestVersion = formatFirmwareVersion( + pendingOtaInfo.value?.versionNumber + ); + + if (currentVersion && latestVersion) { + return `当前固件版本为 ${currentVersion},发现新固件版本 ${latestVersion},是否立即更新固件?`; + } + if (latestVersion) { + return `发现新固件版本 ${latestVersion},是否立即更新固件?`; + } + return "发现新固件版本,是否立即更新固件?"; +}); + const deviceIdText = computed(() => showDeviceId.value && device.value.deviceName ? device.value.deviceName @@ -519,7 +543,7 @@ onShow(async () => { class="device-bow" :class="{ 'device-bow--online': isDeviceOnline }" :src="isDeviceOnline - ? 'https://static.shelingxingqiu.com/shootmini/static/home-device/device-bow--online.png' + ? 'https://static.shelingxingqiu.com/shootmini/static/home-device/device-bow.png' : 'https://static.shelingxingqiu.com/shootmini/static/home-device/device-bow.png'" :mode="isDeviceOnline ? 'aspectFit' : 'widthFix'" /> @@ -697,9 +721,9 @@ onShow(async () => { @@ -975,7 +999,7 @@ onShow(async () => { .device-bow { position: absolute; - top: 0; + top: -2rpx; left: 50%; z-index: 4; width: 562rpx; diff --git a/src/static/home-device/device-bow.png b/src/static/home-device/device-bow.png index c5b5db3892ce23cdd3e509c5582fb74387c6433a..d94ea856ac8752dd7c88e1cf357f985b960e2094 100644 GIT binary patch literal 17809 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 FV1fX+9-aUI literal 19652 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 LNkvXXu0mjfUI;W2 diff --git a/src/store.js b/src/store.js index d75639a..3774d66 100644 --- a/src/store.js +++ b/src/store.js @@ -27,6 +27,11 @@ const getDefaultDeviceStatus = () => ({ receivedAt: 0, }); +const getDefaultDeviceUsageDuration = () => ({ + deviceId: "", + seconds: null, +}); + const getDefaultGame = () => ({ roomID: "", inBattle: false, @@ -114,6 +119,8 @@ export default defineStore("store", { deviceBattery: null, // WebSocket 实时推送的设备状态,不参与持久化。 deviceStatus: getDefaultDeviceStatus(), + // 按设备记录本次运行期间已知的最大累计使用时长,离线时保持数值不回退。 + deviceUsageDuration: getDefaultDeviceUsageDuration(), game: { roomID: "", inBattle: false, @@ -183,6 +190,27 @@ export default defineStore("store", { this.deviceStatus = nextStatus; this.online = online; this.deviceBattery = online ? nextStatus.battery : null; + this.updateDeviceUsageDuration(nextStatus.onlineDuration); + }, + updateDeviceUsageDuration(value, deviceId = this.device.deviceId) { + if (value === null || value === undefined || String(value).trim() === "") return; + + const seconds = Number(value); + const normalizedDeviceId = String(deviceId || ""); + if (!normalizedDeviceId || !Number.isFinite(seconds) || seconds < 0) return; + + const cachedDeviceId = String(this.deviceUsageDuration.deviceId || ""); + const cachedSeconds = Number(this.deviceUsageDuration.seconds); + this.deviceUsageDuration = { + deviceId: normalizedDeviceId, + seconds: + cachedDeviceId === normalizedDeviceId && Number.isFinite(cachedSeconds) + ? Math.max(cachedSeconds, seconds) + : seconds, + }; + }, + clearDeviceUsageDuration() { + this.deviceUsageDuration = getDefaultDeviceUsageDuration(); }, setDeviceOnline(online) { const nextOnline = online === true; @@ -210,6 +238,7 @@ export default defineStore("store", { updateDevice(deviceId, deviceName) { if (String(this.device.deviceId || "") !== String(deviceId || "")) { this.clearDeviceStatus(); + this.clearDeviceUsageDuration(); } this.device.deviceId = deviceId; this.device.deviceName = deviceName; @@ -217,6 +246,7 @@ export default defineStore("store", { clearDevice() { this.device = getDefaultDevice(); this.clearDeviceStatus(); + this.clearDeviceUsageDuration(); }, async updateConfig(config) { this.config = config; @@ -267,6 +297,7 @@ export default defineStore("store", { online: false, deviceBattery: null, deviceStatus: getDefaultDeviceStatus(), + deviceUsageDuration: getDefaultDeviceUsageDuration(), game: getDefaultGame(), dailyCount: getDefaultDailyCount(), deviceChargingDialogVisible: false,