114 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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 {
 | |
| 	gorm.Model
 | |
| 	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
 | |
| }
 | |
| 
 | |
| 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 {
 | |
| 	gorm.Model
 | |
| 	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:备注, 如主动领取的理由等"`
 | |
| }
 | |
| 
 | |
| 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 {
 | |
| 	gorm.Model
 | |
| 	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:备注, 如 '例行喂料, 弱猪补料' 等"`
 | |
| }
 | |
| 
 | |
| func (FeedUsageRecord) TableName() string {
 | |
| 	return "feed_usage_records"
 | |
| }
 |