feat: 实现ID生成器并重构模型ID生成逻辑

refactor: 统一ID生成方式,使用新的idGenerator模块
refactor: 重构模型ID生成逻辑,允许空ID并在创建前自动生成
fix(roomSchema): 使机房ID字段变为可选并更新前端表单验证
style: 格式化代码并优化导入语句
test: 添加操作日志集成测试文件
docs: 添加错误处理模块文档
This commit is contained in:
zhang1106
2026-04-02 10:34:13 +08:00
parent ea67951dd4
commit 7f1df28858
28 changed files with 451 additions and 91 deletions
+9 -1
View File
@@ -1,6 +1,7 @@
const { DataTypes } = require('sequelize');
const { sequelize } = require('../db');
const Device = require('./Device');
const { generateId } = require('../utils/idGenerator');
const Cable = sequelize.define(
'Cable',
@@ -8,7 +9,7 @@ const Cable = sequelize.define(
cableId: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
allowNull: true,
unique: true,
},
sourceDeviceId: {
@@ -90,6 +91,13 @@ const Cable = sequelize.define(
{ fields: ['sourceDeviceId', 'targetDeviceId'] },
{ fields: ['cableLabel'] },
],
hooks: {
beforeCreate: (cable) => {
if (!cable.cableId) {
cable.cableId = generateId({ prefix: 'CBL' });
}
},
},
}
);
+9 -1
View File
@@ -1,5 +1,6 @@
const { DataTypes } = require('sequelize');
const { sequelize } = require('../db');
const { generateId } = require('../utils/idGenerator');
const Consumable = sequelize.define(
'Consumable',
@@ -7,7 +8,7 @@ const Consumable = sequelize.define(
consumableId: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
allowNull: true,
},
name: {
type: DataTypes.STRING,
@@ -79,6 +80,13 @@ const Consumable = sequelize.define(
{ fields: ['category', 'status'] },
{ fields: ['updatedAt'] },
],
hooks: {
beforeCreate: (consumable) => {
if (!consumable.consumableId) {
consumable.consumableId = generateId({ prefix: 'CON' });
}
},
},
}
);
+9 -1
View File
@@ -1,5 +1,6 @@
const { DataTypes } = require('sequelize');
const { sequelize } = require('../db');
const { generateId } = require('../utils/idGenerator');
const Rack = require('./Rack');
const Warehouse = require('./Warehouse');
@@ -9,7 +10,7 @@ const Device = sequelize.define(
deviceId: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
allowNull: true,
unique: true,
},
name: {
@@ -107,6 +108,13 @@ const Device = sequelize.define(
{ fields: ['rackId', 'position'] },
{ fields: ['rackId', 'position', 'isIdle'] },
],
hooks: {
beforeCreate: (device) => {
if (!device.deviceId) {
device.deviceId = generateId({ prefix: 'DEV' });
}
},
},
}
);
+9 -1
View File
@@ -1,5 +1,6 @@
const { DataTypes } = require('sequelize');
const { sequelize } = require('../db');
const { generateId } = require('../utils/idGenerator');
const Room = require('./Room');
const Rack = sequelize.define(
@@ -8,7 +9,7 @@ const Rack = sequelize.define(
rackId: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
allowNull: true,
unique: true,
},
name: {
@@ -45,6 +46,13 @@ const Rack = sequelize.define(
tableName: 'racks',
timestamps: true,
indexes: [{ fields: ['roomId'] }, { fields: ['status'] }, { fields: ['roomId', 'status'] }],
hooks: {
beforeCreate: (rack) => {
if (!rack.rackId) {
rack.rackId = generateId({ prefix: 'RCK' });
}
},
},
}
);
+9 -1
View File
@@ -1,5 +1,6 @@
const { DataTypes } = require('sequelize');
const { sequelize } = require('../db');
const { generateId } = require('../utils/idGenerator');
const Role = sequelize.define(
'Role',
@@ -7,7 +8,7 @@ const Role = sequelize.define(
roleId: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
allowNull: true,
},
roleName: {
type: DataTypes.STRING,
@@ -38,6 +39,13 @@ const Role = sequelize.define(
{
tableName: 'roles',
timestamps: true,
hooks: {
beforeCreate: (role) => {
if (!role.roleId) {
role.roleId = generateId({ prefix: 'ROLE' });
}
},
},
}
);
+40 -1
View File
@@ -1,13 +1,45 @@
const { DataTypes } = require('sequelize');
const { sequelize } = require('../db');
async function generateRoomSequenceId() {
const RoomModel = require('./Room');
const prefix = 'ROOM';
const paddingLength = 6;
try {
const latestRoom = await RoomModel.findOne({
attributes: ['roomId'],
where: {
roomId: {
[require('sequelize').Op.like]: `${prefix}%`,
},
},
order: [['roomId', 'DESC']],
});
let nextNumber = 1;
if (latestRoom && latestRoom.roomId) {
const numStr = latestRoom.roomId.replace(prefix, '');
const currentNum = parseInt(numStr, 10);
if (!isNaN(currentNum)) {
nextNumber = currentNum + 1;
}
}
return `${prefix}${nextNumber.toString().padStart(paddingLength, '0')}`;
} catch (error) {
const fallbackId = `${prefix}${Date.now().toString().slice(-6)}`;
return fallbackId;
}
}
const Room = sequelize.define(
'Room',
{
roomId: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
allowNull: true,
unique: true,
},
name: {
@@ -38,6 +70,13 @@ const Room = sequelize.define(
tableName: 'rooms',
timestamps: true,
indexes: [{ fields: ['status'] }, { fields: ['name'] }],
hooks: {
beforeCreate: async (room) => {
if (!room.roomId) {
room.roomId = await generateRoomSequenceId();
}
},
},
}
);
+9 -1
View File
@@ -2,6 +2,7 @@ const { DataTypes } = require('sequelize');
const { sequelize } = require('../db');
const User = require('./User');
const Device = require('./Device');
const { generateId } = require('../utils/idGenerator');
const Ticket = sequelize.define(
'Ticket',
@@ -9,7 +10,7 @@ const Ticket = sequelize.define(
ticketId: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
allowNull: true,
unique: true,
},
title: {
@@ -128,6 +129,13 @@ const Ticket = sequelize.define(
{ fields: ['assigneeId'] },
{ fields: ['createdAt'] },
],
hooks: {
beforeCreate: (ticket) => {
if (!ticket.ticketId) {
ticket.ticketId = generateId({ prefix: 'TKT' });
}
},
},
}
);
+9 -1
View File
@@ -1,5 +1,6 @@
const { DataTypes } = require('sequelize');
const { sequelize } = require('../db');
const { generateId } = require('../utils/idGenerator');
const User = sequelize.define(
'User',
@@ -7,7 +8,7 @@ const User = sequelize.define(
userId: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
allowNull: true,
},
username: {
type: DataTypes.STRING,
@@ -62,6 +63,13 @@ const User = sequelize.define(
tableName: 'users',
timestamps: true,
indexes: [{ fields: ['status'] }, { fields: ['username'] }, { fields: ['email'] }],
hooks: {
beforeCreate: (user) => {
if (!user.userId) {
user.userId = generateId({ prefix: 'USR' });
}
},
},
}
);
+9 -1
View File
@@ -1,5 +1,6 @@
const { DataTypes } = require('sequelize');
const { sequelize } = require('../db');
const { generateId } = require('../utils/idGenerator');
const Warehouse = sequelize.define(
'Warehouse',
@@ -7,7 +8,7 @@ const Warehouse = sequelize.define(
warehouseId: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
allowNull: true,
unique: true,
},
name: {
@@ -36,6 +37,13 @@ const Warehouse = sequelize.define(
tableName: 'warehouses',
timestamps: true,
indexes: [{ fields: ['status'] }, { fields: ['name'] }],
hooks: {
beforeCreate: (warehouse) => {
if (!warehouse.warehouseId) {
warehouse.warehouseId = generateId({ prefix: 'WH' });
}
},
},
}
);