93 lines
4.1 KiB
Go
93 lines
4.1 KiB
Go
package models
|
||
|
||
import (
|
||
"time"
|
||
)
|
||
|
||
// StockLogSourceType 定义了库存日志来源的类型
|
||
type StockLogSourceType string
|
||
|
||
const (
|
||
StockLogSourcePurchase StockLogSourceType = "采购入库"
|
||
StockLogSourceFeeding StockLogSourceType = "饲喂出库"
|
||
StockLogSourceDeteriorate StockLogSourceType = "变质出库"
|
||
StockLogSourceSale StockLogSourceType = "售卖出库"
|
||
StockLogSourceMiscellaneous StockLogSourceType = "杂用领取"
|
||
StockLogSourceManual StockLogSourceType = "手动盘点"
|
||
StockLogSourceFermentStart StockLogSourceType = "发酵出库" // 原料投入发酵,从库存中扣除
|
||
StockLogSourceFermentEnd StockLogSourceType = "发酵入库" // 发酵料产出,作为新原料计入库存
|
||
)
|
||
|
||
// NutrientType 定义了营养素的分类,用于配方优化和成本控制。
|
||
type NutrientType string
|
||
|
||
const (
|
||
PositiveNutrient NutrientType = "正面营养" // 希望在配方中最大化的营养素,如蛋白质、能量
|
||
NegativeNutrient NutrientType = "负面营养" // 需要控制上限的营养素,如粗纤维、霉菌毒素
|
||
)
|
||
|
||
// RawMaterial 代表一种原料的静态定义,是系统中的原料字典。
|
||
type RawMaterial struct {
|
||
Model
|
||
Name string `gorm:"size:100;unique;not null;comment:原料名称"`
|
||
Description string `gorm:"size:255;comment:描述"`
|
||
// Quantity 是当前库存的快照值,用于提供高性能的库存查询。
|
||
// 注意:此字段的值必须在数据库事务中与 RawMaterialStockLog 同步更新,以保证数据一致性。
|
||
Quantity float32 `gorm:"not null;default:0;comment:当前库存快照, 单位: g"`
|
||
}
|
||
|
||
func (RawMaterial) TableName() string {
|
||
return "raw_materials"
|
||
}
|
||
|
||
// Nutrient 代表一种营养素的静态定义,是系统中的营养素字典。
|
||
// 注意:本系统强制统一营养单位,不再单独设置Unit字段。
|
||
// 约定:宏量营养素(粗蛋白等)单位为百分比(%),微量元素(氨基酸等)单位为毫克/千克(mg/kg)。
|
||
type Nutrient struct {
|
||
Model
|
||
Name string `gorm:"size:100;unique;not null;comment:营养素名称"`
|
||
Type NutrientType `gorm:"size:50;not null;comment:营养素类型 (正面营养/负面营养)"`
|
||
Description string `gorm:"size:255;comment:描述"`
|
||
}
|
||
|
||
func (Nutrient) TableName() string {
|
||
return "nutrients"
|
||
}
|
||
|
||
// RawMaterialNutrient 存储了特定原料的特定营养素的含量值。
|
||
// 这是连接原料和营养素的“营养价值表”。
|
||
// 注意:其唯一性由 postgres.go 中的部分唯一索引保证,以兼容软删除。
|
||
type RawMaterialNutrient struct {
|
||
Model
|
||
RawMaterialID uint32 `gorm:"not null;comment:关联的原料ID"`
|
||
RawMaterial RawMaterial `gorm:"foreignKey:RawMaterialID"`
|
||
NutrientID uint32 `gorm:"not null;comment:关联的营养素ID"`
|
||
Nutrient Nutrient `gorm:"foreignKey:NutrientID"`
|
||
// Value 存储营养价值含量。单位遵循 Nutrient 表中定义的系统级约定。
|
||
Value float32 `gorm:"not null;comment:营养价值含量"`
|
||
}
|
||
|
||
func (RawMaterialNutrient) TableName() string {
|
||
return "raw_material_nutrients"
|
||
}
|
||
|
||
// RawMaterialStockLog 记录了原料库存的所有变动,提供了完整的追溯链。
|
||
// 它是保证数据一致性和可审计性的核心。
|
||
type RawMaterialStockLog struct {
|
||
Model
|
||
RawMaterialID uint32 `gorm:"not null;index;comment:关联的原料ID"`
|
||
RawMaterial RawMaterial `gorm:"foreignKey:RawMaterialID"`
|
||
ChangeAmount float32 `gorm:"not null;comment:变动数量, 正数为入库, 负数为出库, 单位: g"`
|
||
// SourceType 告知 SourceID 关联的是哪种类型的业务单据。
|
||
SourceType StockLogSourceType `gorm:"size:50;not null;index;comment:库存变动来源类型"`
|
||
// SourceID 是一个多态外键,关联到触发此次变动的业务单据ID (如采购单ID)。
|
||
// 对于无单据的业务(如手动盘点),此字段可为NULL。
|
||
SourceID *uint32 `gorm:"index;comment:来源业务单据的ID"`
|
||
HappenedAt time.Time `gorm:"primaryKey;comment:业务发生时间"`
|
||
Remarks string `gorm:"comment:备注"`
|
||
}
|
||
|
||
func (RawMaterialStockLog) TableName() string {
|
||
return "raw_material_stock_logs"
|
||
}
|