package models import ( "time" "gorm.io/gorm" ) /* 饲料和饲喂相关的模型 */ // RawMaterial 代表饲料的原料。 // 建议:所有重量单位统一存储 (例如, 全部使用 'g'),便于计算和避免转换错误。 type RawMaterial struct { gorm.Model Name string `gorm:"size:100;unique;not null;comment:原料名称"` Description string `gorm:"size:255;comment:描述"` Quantity float64 `gorm:"not null;comment:库存总量, 单位: g"` } func (RawMaterial) TableName() string { return "raw_materials" } // RawMaterialPurchase 记录了原料的每一次采购。 type RawMaterialPurchase struct { ID uint `gorm:"primaryKey"` RawMaterialID uint `gorm:"not null;index;comment:关联的原料ID"` RawMaterial RawMaterial `gorm:"foreignKey:RawMaterialID"` Supplier string `gorm:"size:100;comment:供应商"` Amount float64 `gorm:"not null;comment:采购数量, 单位: g"` UnitPrice float64 `gorm:"comment:单价"` TotalPrice float64 `gorm:"comment:总价"` PurchaseDate time.Time `gorm:"primaryKey;comment:采购日期"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` } func (RawMaterialPurchase) TableName() string { return "raw_material_purchases" } // StockLogSourceType 定义了库存日志来源的类型 type StockLogSourceType string const ( StockLogSourcePurchase StockLogSourceType = "采购入库" StockLogSourceFeeding StockLogSourceType = "饲喂出库" StockLogSourceDeteriorate StockLogSourceType = "变质出库" StockLogSourceSale StockLogSourceType = "售卖出库" StockLogSourceMiscellaneous StockLogSourceType = "杂用领取" StockLogSourceManual StockLogSourceType = "手动盘点" ) // RawMaterialStockLog 记录了原料库存的所有变动,提供了完整的追溯链。 type RawMaterialStockLog struct { ID uint `gorm:"primaryKey"` RawMaterialID uint `gorm:"not null;index;comment:关联的原料ID"` ChangeAmount float64 `gorm:"not null;comment:变动数量, 正数为入库, 负数为出库"` SourceType StockLogSourceType `gorm:"size:50;not null;index;comment:库存变动来源类型"` SourceID uint `gorm:"not null;index;comment:来源记录的ID (如 RawMaterialPurchase.ID 或 FeedUsageRecord.ID)"` HappenedAt time.Time `gorm:"primaryKey;comment:业务发生时间"` Remarks string `gorm:"comment:备注, 如主动领取的理由等"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` } func (RawMaterialStockLog) TableName() string { return "raw_material_stock_logs" } // FeedFormula 代表饲料配方。 // 对于没有配方的外购饲料,可以将其视为一种特殊的 RawMaterial, 并为其创建一个仅包含它自己的 FeedFormula。 type FeedFormula struct { gorm.Model Name string `gorm:"size:100;unique;not null;comment:配方名称"` Description string `gorm:"size:255;comment:描述"` Components []FeedFormulaComponent `gorm:"foreignKey:FeedFormulaID"` } func (FeedFormula) TableName() string { return "feed_formulas" } // FeedFormulaComponent 代表配方中的一种原料及其占比。 type FeedFormulaComponent struct { gorm.Model FeedFormulaID uint `gorm:"not null;index;comment:外键到 FeedFormula"` RawMaterialID uint `gorm:"not null;index;comment:外键到 RawMaterial"` RawMaterial RawMaterial `gorm:"foreignKey:RawMaterialID"` Percentage float64 `gorm:"not null;comment:该原料在配方中的百分比 (0-1.0)"` } func (FeedFormulaComponent) TableName() string { return "feed_formula_components" } // FeedUsageRecord 代表饲料使用记录。 // 应用层逻辑:当一条使用记录被创建时,应根据其使用的 FeedFormula, // 计算出每种 RawMaterial 的消耗量,并在 RawMaterialStockLog 中创建对应的出库记录。 type FeedUsageRecord struct { ID uint `gorm:"primaryKey"` PenID uint `gorm:"not null;index;comment:关联的猪栏ID"` Pen Pen `gorm:"foreignKey:PenID"` FeedFormulaID uint `gorm:"not null;index;comment:使用的饲料配方ID"` FeedFormula FeedFormula `gorm:"foreignKey:FeedFormulaID"` Amount float64 `gorm:"not null;comment:使用数量, 单位: g"` RecordedAt time.Time `gorm:"primaryKey;comment:记录时间"` OperatorID uint `gorm:"not null;comment:操作员"` Remarks string `gorm:"comment:备注, 如 '例行喂料, 弱猪补料' 等"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` } func (FeedUsageRecord) TableName() string { return "feed_usage_records" }