fix(device): 在线状态改为非阻塞补齐,恢复表单文本自动去空格

列表先渲染,批量在线状态返回后再更新;新增/编辑提交前 trim 文本字段,SN 与昵称拒绝纯空白。
This commit is contained in:
2026-11-05 09:50:29 +08:00
parent e85456f0a5
commit daca252cb9
3 changed files with 33 additions and 19 deletions

View File

@@ -2,6 +2,24 @@ import DeviceAPI from "@/api/device";
import type { DeviceForm } from "@/api/device/types";
import type { CrudFormConfig } from "@/components/Crud/types";
/** 表单不再自动 trim,提交前去掉文本字段首尾空格 */
function trimText(data: DeviceForm): DeviceForm {
const payload = { ...data };
for (const key of [
"serialno",
"snModel",
"snName",
"snMobile",
"snImei",
"deviceType",
"source",
] as const) {
const value = payload[key];
if (typeof value === "string") payload[key] = value.trim();
}
return payload;
}
const addFormConfig: CrudFormConfig<DeviceForm> = {
component: "dialog",
dialog: {
@@ -12,12 +30,12 @@ const addFormConfig: CrudFormConfig<DeviceForm> = {
form: {
labelWidth: 100,
},
submitForm: (data) => DeviceAPI.create(data),
submitForm: (data) => DeviceAPI.create(trimText(data)),
fields: [
{
label: "设备SN",
prop: "serialno",
rules: [{ required: true, message: "设备SN不能为空", trigger: "blur" }],
rules: [{ required: true, whitespace: true, message: "设备SN不能为空", trigger: "blur" }],
type: "input",
attrs: {
placeholder: "请输入设备序列号",

View File

@@ -1,7 +1,7 @@
import DeviceAPI from "@/api/device";
import type { DeviceItem, DeviceQueryParams } from "@/api/device/types";
import type { CrudTableConfig } from "@/components/Crud/types";
import { onlineStatus, syncOnlineStatus } from "./online";
import { syncOnlineStatus, updateOnlineStatus } from "./online";
/** 列表接口不保证带在线状态,加载后批量补齐 */
async function fetchDevices(params: DeviceQueryParams) {
@@ -9,12 +9,9 @@ async function fetchDevices(params: DeviceQueryParams) {
syncOnlineStatus(page.list);
const sns = page.list.map((item) => item.serialno).filter((sn): sn is string => !!sn);
if (sns.length) {
await DeviceAPI.getOnlineStatusBatch(sns)
.then((onlineMap) => {
Object.values(onlineMap ?? {}).forEach((info) => {
if (info?.serialno) onlineStatus[info.serialno] = info.online ?? 0;
});
})
// 在线状态后补,不阻塞列表首屏
void DeviceAPI.getOnlineStatusBatch(sns)
.then((onlineMap) => Object.values(onlineMap ?? {}).forEach(updateOnlineStatus))
.catch(() => undefined);
}
return page;

View File

@@ -15,15 +15,14 @@ const editFormConfig: CrudFormConfig<DeviceForm> = {
labelWidth: 100,
},
// 编辑只回传可修改字段(仅设备昵称与状态)
submitForm: (data) =>
DeviceAPI.update(
data.id as string,
{
id: data.id,
snName: data.snName,
status: data.status,
} as DeviceForm,
),
submitForm: (data) => {
const payload = {
id: data.id,
snName: data.snName?.trim(),
status: data.status,
} as DeviceForm;
return DeviceAPI.update(payload.id as string, payload);
},
fields: [
{
label: "设备SN",
@@ -38,7 +37,7 @@ const editFormConfig: CrudFormConfig<DeviceForm> = {
{
label: "设备昵称",
prop: "snName",
rules: [{ required: true, message: "设备昵称不能为空", trigger: "blur" }],
rules: [{ required: true, whitespace: true, message: "设备昵称不能为空", trigger: "blur" }],
type: "input",
attrs: {
placeholder: "请输入设备昵称",