Files
pig-farm-controller/internal/infra/models/pig.go

110 lines
4.0 KiB
Go

package models
import (
"time"
"gorm.io/gorm"
)
/*
和猪只、猪群本身相关的模型
*/
// PigBatchStatus 定义了猪批次所处的不同阶段或状态
type PigBatchStatus string
const (
BatchStatusWeaning PigBatchStatus = "保育" // 从断奶到保育结束
BatchStatusGrowing PigBatchStatus = "生长" // 生长育肥阶段
BatchStatusFinishing PigBatchStatus = "育肥" // 最后的育肥阶段
BatchStatusForSale PigBatchStatus = "待售" // 达到出栏标准
BatchStatusSold PigBatchStatus = "已出售"
BatchStatusArchived PigBatchStatus = "已归档" // 批次结束(如全群淘汰等)
)
// PigBatchOriginType 定义了猪批次的来源
type PigBatchOriginType string
const (
OriginTypeSelfFarrowed PigBatchOriginType = "自繁"
OriginTypePurchased PigBatchOriginType = "外购"
)
// PigBatch 是猪批次的核心模型,代表了一群被共同管理的猪
type PigBatch struct {
gorm.Model
BatchNumber string `gorm:"size:50;not null;uniqueIndex;comment:批次编号,如 2024-W25-A01"`
OriginType PigBatchOriginType `gorm:"size:20;not null;comment:批次来源 (自繁, 外购)"`
StartDate time.Time `gorm:"not null;comment:批次开始日期 (如转入日或购买日)"`
EndDate time.Time `gorm:"not null;comment:批次结束日期 (全部淘汰或售出)"`
InitialCount int `gorm:"not null;comment:初始数量"`
Status PigBatchStatus `gorm:"size:20;not null;index;comment:批次状态"`
}
func (PigBatch) TableName() string {
return "pig_batches"
}
// IsActive 判断猪批次是否处于活跃状态
func (pb PigBatch) IsActive() bool {
return pb.Status != BatchStatusSold && pb.Status != BatchStatusArchived
}
// LogChangeType 定义了猪批次数量变更的类型
type LogChangeType string
const (
ChangeTypeDeath LogChangeType = "死亡"
ChangeTypeCull LogChangeType = "淘汰"
ChangeTypeSale LogChangeType = "销售"
ChangeTypeTransferIn LogChangeType = "转入"
ChangeTypeTransferOut LogChangeType = "转出"
ChangeTypeTreatment LogChangeType = "治疗" // 仅改变健康状态,不改变总数
ChangeTypeRecovering LogChangeType = "康复" // 仅改变健康状态,不改变总数
ChangeTypeCorrection LogChangeType = "盘点校正"
)
// PigBatchLog 记录了猪批次数量或状态的每一次变更
type PigBatchLog struct {
gorm.Model
PigBatchID uint `gorm:"not null;index;comment:关联的猪批次ID"`
ChangeType LogChangeType `gorm:"size:20;not null;comment:变更类型"`
ChangeCount int `gorm:"not null;comment:数量变化,负数表示减少"`
Reason string `gorm:"size:255;comment:变更原因描述"`
BeforeCount int `gorm:"not null;comment:变更前总数"`
AfterCount int `gorm:"not null;comment:变更后总数"`
OperatorID uint `gorm:"comment:操作员ID"`
HappenedAt time.Time `gorm:"primaryKey;comment:事件发生时间"`
}
func (PigBatchLog) TableName() string {
return "pig_batch_logs"
}
// WeighingBatch 记录了一次批次称重的信息
type WeighingBatch struct {
gorm.Model
WeighingTime time.Time `gorm:"primaryKey;comment:称重时间"`
Description string `gorm:"size:255;comment:批次称重描述"`
PigBatchID uint `gorm:"not null;index;comment:关联的猪批次ID"`
}
func (WeighingBatch) TableName() string {
return "weighing_batches"
}
// WeighingRecord 记录了单次称重信息
type WeighingRecord struct {
gorm.Model
Weight float64 `gorm:"not null;comment:单只猪重量 (kg)"`
WeighingBatchID uint `gorm:"not null;index;comment:关联的批次称重ID"`
PenID uint `gorm:"not null;index;comment:所在猪圈ID"`
OperatorID uint `gorm:"not null;comment:操作员ID"`
Remark string `gorm:"size:255;comment:备注"`
WeighingTime time.Time `gorm:"primaryKey;comment:称重时间"`
}
func (WeighingRecord) TableName() string {
return "weighing_records"
}