Files
nxxmdata/backend/models/index.js
2025-09-22 19:09:45 +08:00

565 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 模型索引文件
* @file index.js
* @description 导出所有模型并建立关联关系
*/
const { sequelize } = require('../config/database-simple');
const BaseModel = require('./BaseModel');
const Farm = require('./Farm');
const Animal = require('./Animal');
const Device = require('./Device');
const Alert = require('./Alert');
const User = require('./User');
const Role = require('./Role');
const UserRole = require('./UserRole');
const Product = require('./Product');
const Order = require('./Order');
const OrderItem = require('./OrderItem');
const SensorData = require('./SensorData');
const SystemConfig = require('./SystemConfig');
const MenuPermission = require('./MenuPermission');
const RoleMenuPermission = require('./RoleMenuPermission');
const Permission = require('./Permission');
const IotXqClient = require('./IotXqClient');
const IotJbqServer = require('./IotJbqServer');
const IotJbqClient = require('./IotJbqClient');
const ElectronicFence = require('./ElectronicFence');
const ElectronicFencePoint = require('./ElectronicFencePoint');
const Pen = require('./Pen');
const CattlePen = require('./CattlePen');
const CattleBatch = require('./CattleBatch');
const CattleBatchAnimal = require('./CattleBatchAnimal');
const CattleTransferRecord = require('./CattleTransferRecord');
const CattleExitRecord = require('./CattleExitRecord');
const IotCattle = require('./IotCattle');
const CattleType = require('./CattleType');
const CattleUser = require('./CattleUser');
const FormLog = require('./FormLog');
const OperationLog = require('./OperationLog');
// 注意:模型初始化在各自的模型文件中完成
// 建立模型之间的关联关系
// 养殖场与动物的一对多关系
Farm.hasMany(Animal, {
foreignKey: 'farm_id',
as: 'animals',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
Animal.belongsTo(Farm, {
foreignKey: 'farm_id',
as: 'farm'
});
// 养殖场与牛只的一对多关系
Farm.hasMany(IotCattle, {
foreignKey: 'orgId',
as: 'cattle',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
IotCattle.belongsTo(Farm, {
foreignKey: 'orgId',
as: 'farm'
});
// 牛只品种与牛只的一对多关系(在模型初始化后定义)
// 养殖场与设备的一对多关系
Farm.hasMany(Device, {
foreignKey: 'farm_id',
as: 'devices',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
Device.belongsTo(Farm, {
foreignKey: 'farm_id',
as: 'farm'
});
// 养殖场与预警的一对多关系
Farm.hasMany(Alert, {
foreignKey: 'farm_id',
as: 'alerts',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
Alert.belongsTo(Farm, {
foreignKey: 'farm_id',
as: 'farm'
});
// 设备与预警的一对多关系
Device.hasMany(Alert, {
foreignKey: 'device_id',
as: 'alerts',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
Alert.belongsTo(Device, {
foreignKey: 'device_id',
as: 'device'
});
// 设备与传感器数据的一对多关系
Device.hasMany(SensorData, {
foreignKey: 'device_id',
as: 'sensorData',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
SensorData.belongsTo(Device, {
foreignKey: 'device_id',
as: 'device'
});
// 养殖场与传感器数据的一对多关系
Farm.hasMany(SensorData, {
foreignKey: 'farm_id',
as: 'sensorData',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
SensorData.belongsTo(Farm, {
foreignKey: 'farm_id',
as: 'farm'
});
// 用户与角色的直接关联关系通过roles字段
User.belongsTo(Role, {
foreignKey: 'roles',
as: 'role'
});
Role.hasMany(User, {
foreignKey: 'roles',
as: 'users'
});
// 用户与角色的多对多关系(暂时注释掉,当前使用直接关联)
// User.belongsToMany(Role, {
// through: UserRole,
// foreignKey: 'user_id',
// otherKey: 'role_id',
// as: 'userRoles'
// });
// Role.belongsToMany(User, {
// through: UserRole,
// foreignKey: 'role_id',
// otherKey: 'user_id',
// as: 'roleUsers'
// });
// 用户与订单的一对多关系
User.hasMany(Order, {
foreignKey: 'user_id',
as: 'orders',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
Order.belongsTo(User, {
foreignKey: 'user_id',
as: 'user'
});
// 订单与订单项的一对多关系
Order.hasMany(OrderItem, {
foreignKey: 'order_id',
as: 'orderItems',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
OrderItem.belongsTo(Order, {
foreignKey: 'order_id',
as: 'order'
});
// 产品与订单项的一对多关系
Product.hasMany(OrderItem, {
foreignKey: 'product_id',
as: 'orderItems',
onDelete: 'RESTRICT',
onUpdate: 'CASCADE'
});
OrderItem.belongsTo(Product, {
foreignKey: 'product_id',
as: 'product'
});
// 菜单权限的自关联关系已在associate方法中定义
// 角色与菜单权限的多对多关系
Role.belongsToMany(MenuPermission, {
through: RoleMenuPermission,
foreignKey: 'role_id',
otherKey: 'menu_permission_id',
as: 'menuPermissions'
});
MenuPermission.belongsToMany(Role, {
through: RoleMenuPermission,
foreignKey: 'menu_permission_id',
otherKey: 'role_id',
as: 'roles'
});
// 角色与权限的多对多关系
Role.belongsToMany(Permission, {
through: 'role_permissions',
as: 'permissions',
foreignKey: 'role_id',
otherKey: 'permission_id'
});
Permission.belongsToMany(Role, {
through: 'role_permissions',
as: 'roles',
foreignKey: 'permission_id',
otherKey: 'role_id'
});
// 农场与栏舍的一对多关系
Farm.hasMany(Pen, {
foreignKey: 'farm_id',
as: 'pens',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
Pen.belongsTo(Farm, {
foreignKey: 'farm_id',
as: 'farm'
});
// 农场与电子围栏的一对多关系
Farm.hasMany(ElectronicFence, {
foreignKey: 'farm_id',
as: 'electronicFences',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
ElectronicFence.belongsTo(Farm, {
foreignKey: 'farm_id',
as: 'farm'
});
// 电子围栏与坐标点的一对多关系
ElectronicFence.hasMany(ElectronicFencePoint, {
foreignKey: 'fence_id',
as: 'points',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
ElectronicFencePoint.belongsTo(ElectronicFence, {
foreignKey: 'fence_id',
as: 'fence'
});
// 用户与坐标点的关联关系
User.hasMany(ElectronicFencePoint, {
foreignKey: 'created_by',
as: 'createdFencePoints',
onDelete: 'SET NULL',
onUpdate: 'CASCADE'
});
ElectronicFencePoint.belongsTo(User, {
foreignKey: 'created_by',
as: 'creator'
});
User.hasMany(ElectronicFencePoint, {
foreignKey: 'updated_by',
as: 'updatedFencePoints',
onDelete: 'SET NULL',
onUpdate: 'CASCADE'
});
ElectronicFencePoint.belongsTo(User, {
foreignKey: 'updated_by',
as: 'updater'
});
// 农场与栏舍设置的一对多关系
Farm.hasMany(CattlePen, {
foreignKey: 'farm_id',
as: 'cattlePens',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
CattlePen.belongsTo(Farm, {
foreignKey: 'farm_id',
as: 'farm'
});
// 栏舍设置与动物的一对多关系
CattlePen.hasMany(Animal, {
foreignKey: 'pen_id',
as: 'animals',
onDelete: 'SET NULL',
onUpdate: 'CASCADE'
});
Animal.belongsTo(CattlePen, {
foreignKey: 'pen_id',
as: 'pen'
});
// 农场与批次设置的一对多关系
Farm.hasMany(CattleBatch, {
foreignKey: 'farm_id',
as: 'cattleBatches',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
CattleBatch.belongsTo(Farm, {
foreignKey: 'farm_id',
as: 'farm'
});
// 栏舍设置与牛只的一对多关系
CattlePen.hasMany(IotCattle, {
foreignKey: 'penId',
as: 'cattle',
onDelete: 'SET NULL',
onUpdate: 'CASCADE'
});
IotCattle.belongsTo(CattlePen, {
foreignKey: 'penId',
as: 'pen'
});
// 批次设置与牛只的一对多关系
CattleBatch.hasMany(IotCattle, {
foreignKey: 'batchId',
as: 'cattle',
onDelete: 'SET NULL',
onUpdate: 'CASCADE'
});
IotCattle.belongsTo(CattleBatch, {
foreignKey: 'batchId',
as: 'batch'
});
// 牛只与转栏记录的一对多关系
IotCattle.hasMany(CattleTransferRecord, {
foreignKey: 'animalId',
as: 'transferRecords',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
CattleTransferRecord.belongsTo(IotCattle, {
foreignKey: 'animalId',
as: 'cattle'
});
// 栏舍设置与转栏记录的一对多关系(转出)
CattlePen.hasMany(CattleTransferRecord, {
foreignKey: 'fromPenId',
as: 'fromTransferRecords',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
CattleTransferRecord.belongsTo(CattlePen, {
foreignKey: 'fromPenId',
as: 'fromPen'
});
// 栏舍设置与转栏记录的一对多关系(转入)
CattlePen.hasMany(CattleTransferRecord, {
foreignKey: 'toPenId',
as: 'toTransferRecords',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
CattleTransferRecord.belongsTo(CattlePen, {
foreignKey: 'toPenId',
as: 'toPen'
});
// 农场与转栏记录的一对多关系
Farm.hasMany(CattleTransferRecord, {
foreignKey: 'farmId',
as: 'transferRecords',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
CattleTransferRecord.belongsTo(Farm, {
foreignKey: 'farmId',
as: 'farm'
});
// 牛只与离栏记录的一对多关系
IotCattle.hasMany(CattleExitRecord, {
foreignKey: 'animalId',
as: 'exitRecords',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
CattleExitRecord.belongsTo(IotCattle, {
foreignKey: 'animalId',
as: 'cattle'
});
// 栏舍设置与离栏记录的一对多关系
CattlePen.hasMany(CattleExitRecord, {
foreignKey: 'originalPenId',
as: 'exitRecords',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
CattleExitRecord.belongsTo(CattlePen, {
foreignKey: 'originalPenId',
as: 'originalPen'
});
// 农场与离栏记录的一对多关系
Farm.hasMany(CattleExitRecord, {
foreignKey: 'farmId',
as: 'exitRecords',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
CattleExitRecord.belongsTo(Farm, {
foreignKey: 'farmId',
as: 'farm'
});
// 初始化所有模型
const initModels = () => {
// 初始化CattleType模型
CattleType.init(sequelize);
// 初始化CattleUser模型
CattleUser.init(sequelize);
// 初始化FormLog模型
FormLog.init(sequelize);
// 初始化OperationLog模型
OperationLog.init(sequelize);
};
// 初始化模型
initModels();
// 在模型初始化后定义CattleType的关联关系
CattleType.hasMany(IotCattle, {
foreignKey: 'varieties',
as: 'cattle',
onDelete: 'RESTRICT',
onUpdate: 'CASCADE'
});
IotCattle.belongsTo(CattleType, {
foreignKey: 'varieties',
as: 'cattleType'
});
// 在模型初始化后定义CattleUser的关联关系
CattleUser.hasMany(IotCattle, {
foreignKey: 'strain',
as: 'cattle',
onDelete: 'RESTRICT',
onUpdate: 'CASCADE'
});
IotCattle.belongsTo(CattleUser, {
foreignKey: 'strain',
as: 'cattleUser'
});
// 用户与操作日志的一对多关系
User.hasMany(OperationLog, {
foreignKey: 'user_id',
as: 'operationLogs',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
OperationLog.belongsTo(User, {
foreignKey: 'user_id',
as: 'user'
});
// 同步所有模型
const syncModels = async (options = {}) => {
try {
await sequelize.sync(options);
console.log('所有模型已同步到数据库');
return true;
} catch (error) {
console.error('模型同步失败:', error);
return false;
}
};
module.exports = {
sequelize,
BaseModel,
Farm,
Animal,
Device,
Alert,
User,
Role,
UserRole,
Product,
Order,
OrderItem,
SensorData,
SystemConfig,
MenuPermission,
RoleMenuPermission,
Permission,
IotXqClient,
IotJbqServer,
IotJbqClient,
ElectronicFence,
ElectronicFencePoint,
Pen,
CattlePen,
CattleBatch,
CattleBatchAnimal,
CattleTransferRecord,
CattleExitRecord,
IotCattle,
CattleType,
CattleUser,
FormLog,
OperationLog,
syncModels
};
// 调用模型的associate方法建立关联关系
const models = {
Farm,
Animal,
Device,
Alert,
User,
Role,
UserRole,
Product,
Order,
OrderItem,
SensorData,
SystemConfig,
MenuPermission,
RoleMenuPermission,
Permission,
IotXqClient,
IotJbqServer,
IotJbqClient,
ElectronicFence,
ElectronicFencePoint,
Pen,
CattlePen,
CattleBatch,
CattleBatchAnimal,
CattleTransferRecord,
CattleExitRecord,
IotCattle,
CattleType,
CattleUser,
FormLog,
OperationLog
};
// 建立关联关系
Object.keys(models).forEach(modelName => {
if (models[modelName].associate) {
models[modelName].associate(models);
}
});