93 lines
1.9 KiB
JavaScript
93 lines
1.9 KiB
JavaScript
const { DataTypes } = require('sequelize');
|
|
const sequelize = require('../config/database');
|
|
|
|
const Material = sequelize.define('Material', {
|
|
id: {
|
|
type: DataTypes.UUID,
|
|
defaultValue: DataTypes.UUIDV4,
|
|
primaryKey: true,
|
|
},
|
|
code: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
unique: true,
|
|
comment: '物资编号'
|
|
},
|
|
name: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
comment: '物资名称'
|
|
},
|
|
category: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
comment: '物资类别',
|
|
validate: {
|
|
isIn: [['feed', 'medicine', 'equipment', 'other']]
|
|
}
|
|
},
|
|
unit: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
comment: '单位'
|
|
},
|
|
stockQuantity: {
|
|
type: DataTypes.INTEGER,
|
|
allowNull: false,
|
|
defaultValue: 0,
|
|
comment: '库存数量'
|
|
},
|
|
warningQuantity: {
|
|
type: DataTypes.INTEGER,
|
|
allowNull: false,
|
|
defaultValue: 0,
|
|
comment: '预警数量'
|
|
},
|
|
status: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
defaultValue: 'normal',
|
|
comment: '状态',
|
|
validate: {
|
|
isIn: [['normal', 'low', 'out']]
|
|
}
|
|
},
|
|
supplier: {
|
|
type: DataTypes.STRING,
|
|
allowNull: true,
|
|
comment: '供应商'
|
|
},
|
|
remark: {
|
|
type: DataTypes.TEXT,
|
|
allowNull: true,
|
|
comment: '备注'
|
|
},
|
|
updateTime: {
|
|
type: DataTypes.DATE,
|
|
allowNull: false,
|
|
defaultValue: DataTypes.NOW,
|
|
comment: '更新时间'
|
|
}
|
|
}, {
|
|
tableName: 'materials',
|
|
timestamps: true,
|
|
paranoid: true,
|
|
underscored: true,
|
|
freezeTableName: true
|
|
});
|
|
|
|
// 钩子函数,在保存前更新状态和更新时间
|
|
Material.beforeSave((material) => {
|
|
material.updateTime = new Date();
|
|
|
|
// 根据库存数量和预警数量更新状态
|
|
if (material.stockQuantity <= 0) {
|
|
material.status = 'out';
|
|
} else if (material.stockQuantity <= material.warningQuantity) {
|
|
material.status = 'low';
|
|
} else {
|
|
material.status = 'normal';
|
|
}
|
|
});
|
|
|
|
module.exports = Material; |