fix(device): 修复添加设备时设备类型/状态下拉框为空

前端:DeviceManagement.jsx 中补充 options 的判断条件
- 原条件 !field.options 对空数组 [] 判定为 false,导致
  数据库里 options 被清空时下拉框没有选项
- 改为同时检查 null/undefined 和空数组,确保本地默认值
  能正确兜底(type、status 字段同步修复)

后端:initDeviceFields.js 加固系统字段 options 兜底逻辑
- 系统字段(isSystem: true)的 options 永远不应为空
- 启动时如果检测到系统字段 options 为空,强制重置为默认
  值,这样即使前端修复后 options 仍为空,后端重启时也能自愈
- 仅作用于系统字段,不影响用户自定义字段
This commit is contained in:
zhang1106
2026-06-11 11:26:31 +08:00
parent e7a0cbb9d1
commit a29e77156e
2 changed files with 15 additions and 3 deletions
+11 -1
View File
@@ -184,7 +184,17 @@ async function initDeviceFields() {
}
}
if (field.options && !existingOptions) {
// 加固:系统字段(isSystem: true)的 options 永远不应为空
// 如果用户在"字段管理"页面误清空了系统字段的 options(如设备类型/状态),
// 启动时强制重置为默认值,避免前端拿到空 options 导致下拉框无选项
if (
existingField.isSystem &&
field.options &&
(!existingOptions || existingOptions.length === 0)
) {
await existingField.update({ options: field.options });
console.log(`系统字段 options 为空,已重置为默认值: ${field.displayName}`);
} else if (field.options && !existingOptions) {
await existingField.update({ options: field.options });
console.log(`更新字段 options: ${field.displayName}`);
} else if (field.options && Array.isArray(existingOptions)) {
+4 -2
View File
@@ -164,12 +164,14 @@ function DeviceManagement() {
let fields = response.data.sort((a, b) => a.order - b.order);
// 补充缺失的 options(状态和设备类型)
// 修复:原条件 !field.options 对空数组 [] 判定为 false,导致 options 被清空时下拉框无选项
// 改为同时检查 null/undefined 和空数组,确保本地默认值能正确兜底
fields = fields.map(field => {
if (field.fieldName === 'type' && !field.options) {
if (field.fieldName === 'type' && (!field.options || field.options.length === 0)) {
const defaultTypeField = DEFAULT_DEVICE_FIELDS_LOCAL.find(f => f.fieldName === 'type');
return { ...field, options: defaultTypeField?.options || [] };
}
if (field.fieldName === 'status' && !field.options) {
if (field.fieldName === 'status' && (!field.options || field.options.length === 0)) {
const defaultStatusField = DEFAULT_DEVICE_FIELDS_LOCAL.find(
f => f.fieldName === 'status'
);