update:提交我的设备改版

This commit is contained in:
2026-09-17 18:23:41 +08:00
parent 46cbd37102
commit b060d8f987
50 changed files with 897 additions and 590 deletions
+96 -25
View File
@@ -1,19 +1,23 @@
import { computed, ref } from "vue";
import { getDeviceBatteryAPI, getMyDevicesAPI, unbindDeviceAPI } from "@/apis";
import {
getDeviceDetailAPI,
getMyDevicesAPI,
unbindDeviceAPI,
} from "@/apis";
export const DEVICE_NAME_STORAGE_KEY = "device_name_overrides";
export function useDeviceStatus({
user,
device,
deviceStatus,
online,
updateDevice,
updateOnline,
clearDevice,
unbindDialogVisible,
}) {
const deviceStatus = ref({});
const deviceDetails = ref({});
let deviceDetailRequestVersion = 0;
const isDeviceOnline = computed(
() => deviceStatus.value.online === true || online.value === true
@@ -23,16 +27,32 @@ export function useDeviceStatus({
isDeviceOnline.value ? "device-status--online" : "device-status--offline"
);
const battery = computed(() => {
const value = Number(
deviceStatus.value.battery ?? deviceStatus.value.power ?? 0
);
return Number.isFinite(value) && value > 0 ? Math.min(100, value) : 0;
const rawValue = deviceStatus.value.battery ?? deviceStatus.value.power;
if (rawValue === null || rawValue === undefined || rawValue === "") return null;
const value = Number(rawValue);
return Number.isFinite(value) ? Math.min(100, Math.max(0, value)) : null;
});
const batteryText = computed(() =>
battery.value ? `${battery.value}%` : "暂无数据"
battery.value === null ? "暂无数据" : `${battery.value}%`
);
const onlineDurationText = computed(() => {
const rawDuration = deviceStatus.value.onlineDuration;
if (rawDuration == null || String(rawDuration).trim() === "") return "--";
const seconds = Number(rawDuration);
if (!Number.isFinite(seconds) || seconds < 0) return "--";
// WS 推送秒数,页面按完整分钟展示累计使用时间。
const totalMinutes = Math.floor(seconds / 60);
const hours = Math.floor(totalMinutes / 60);
const minutes = totalMinutes % 60;
return hours > 0 ? `${hours}小时${minutes}分钟` : `${minutes}分钟`;
});
const networkType = computed(() =>
String(deviceStatus.value.netType ?? "").trim().toLowerCase()
);
const networkText = computed(() => {
const netType = String(deviceStatus.value.netType || "").toLowerCase();
const netType = networkType.value;
if (netType === "wifi") return "WiFi";
if (netType === "4g") return "4G";
return isDeviceOnline.value ? "在线" : "未连接";
@@ -55,15 +75,37 @@ export function useDeviceStatus({
return value && typeof value === "object" ? value : {};
};
const refreshDeviceStatus = async () => {
if (!device.value.deviceId) return;
const refreshDeviceDetails = async () => {
const deviceId = device.value.deviceId;
if (!deviceId) return;
const requestVersion = ++deviceDetailRequestVersion;
try {
const result = await getDeviceBatteryAPI();
deviceStatus.value = result || {};
updateOnline(result?.online === true);
const detailResponse = await getDeviceDetailAPI(deviceId);
const detail = detailResponse?.detail || detailResponse?.data?.detail;
if (
!detail ||
typeof detail !== "object" ||
requestVersion !== deviceDetailRequestVersion ||
device.value.deviceId !== deviceId
) {
return;
}
deviceDetails.value = {
...deviceDetails.value,
...detail,
deviceModelName: detail.deviceModelName ?? "",
bindTime: String(
detail.bindTime ?? deviceDetails.value.bindTime ?? ""
).trim(),
qrCodeUrl: String(
detail.qrCodeUrl ?? deviceDetails.value.qrCodeUrl ?? ""
).trim(),
};
} catch (error) {
deviceStatus.value = {};
console.log("获取设备状态失败", error);
// 实时刷新失败时保留当前页面数据,等待下次通知或页面重新显示。
console.log("刷新设备详情失败", error);
}
};
@@ -74,19 +116,46 @@ export function useDeviceStatus({
if (Array.isArray(devices?.bindings) && devices.bindings.length > 0) {
const currentDevice = devices.bindings[0];
const nameOverrides = getDeviceNameOverrides();
deviceDetails.value = currentDevice;
// 二维码和绑定时间仅取详情接口,绑定列表不能作为这两项的回退数据。
let latestDevice = {
...currentDevice,
deviceModelName: "",
bindTime: "",
qrCodeUrl: "",
};
try {
const detailResponse = await getDeviceDetailAPI(currentDevice.deviceId);
const detail = detailResponse?.detail || detailResponse?.data?.detail;
if (detail && typeof detail === "object") {
latestDevice = {
...currentDevice,
...detail,
deviceModelName: detail.deviceModelName ?? "",
bindTime: String(detail.bindTime ?? "").trim(),
qrCodeUrl: String(detail.qrCodeUrl ?? "").trim(),
deviceName:
detail.deviceAlias || detail.deviceName || currentDevice.deviceName,
};
}
} catch (error) {
// 详情接口失败时保留绑定关系,二维码和绑定时间仍保持为空。
console.log("获取设备详情失败", error);
}
deviceDetails.value = latestDevice;
updateDevice(
currentDevice.deviceId,
nameOverrides[currentDevice.deviceId] ||
currentDevice.deviceName ||
currentDevice.name ||
latestDevice.deviceId,
nameOverrides[latestDevice.deviceId] ||
latestDevice.deviceAlias ||
latestDevice.deviceName ||
latestDevice.name ||
"我的智能弓"
);
await refreshDeviceStatus();
return;
}
clearDevice();
deviceStatus.value = {};
deviceDetailRequestVersion += 1;
deviceDetails.value = {};
} catch (error) {
console.log("同步设备绑定失败", error);
@@ -99,7 +168,7 @@ export function useDeviceStatus({
await unbindDeviceAPI(device.value.deviceId);
uni.setStorageSync("calibration", false);
clearDevice();
deviceStatus.value = {};
deviceDetailRequestVersion += 1;
deviceDetails.value = {};
unbindDialogVisible.value = false;
uni.showToast({ title: "解绑成功", icon: "success" });
@@ -120,7 +189,9 @@ export function useDeviceStatus({
isDeviceOnline,
maskedDeviceId,
networkText,
refreshDeviceStatus,
networkType,
onlineDurationText,
refreshDeviceDetails,
statusClass,
statusText,
syncDeviceBinding,