From 609aee25137a2cef20ad8a4e819a90df460a66d6 Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Fri, 3 Oct 2025 16:56:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=AF=B9=E5=BA=94model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/infra/models/farm_asset.go | 39 ++++++++++++++++ internal/infra/models/medication.go | 23 ++++++++++ internal/infra/models/pig.go | 71 ++++++++++++++++++++++++++++- 3 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 internal/infra/models/farm_asset.go diff --git a/internal/infra/models/farm_asset.go b/internal/infra/models/farm_asset.go new file mode 100644 index 0000000..90266ed --- /dev/null +++ b/internal/infra/models/farm_asset.go @@ -0,0 +1,39 @@ +package models + +import ( + "gorm.io/gorm" +) + +/* + 猪场固定资产相关模型 +*/ + +// PigHouse 定义了猪舍,是猪栏的集合 +type PigHouse struct { + gorm.Model + Name string `gorm:"size:100;not null;unique;comment:猪舍名称, 如 '育肥舍A栋'"` + Description string `gorm:"size:255;comment:描述信息"` + Pens []Pen `gorm:"foreignKey:HouseID"` // 一个猪舍包含多个猪栏 +} + +// PenStatus 定义了猪栏的当前状态 +type PenStatus string + +const ( + PenStatusEmpty PenStatus = "空闲" + PenStatusOccupied PenStatus = "占用" + PenStatusSickPen PenStatus = "病猪栏" + PenStatusRecovering PenStatus = "康复栏" + PenStatusCleaning PenStatus = "清洗消毒" + PenStatusUnderMaint PenStatus = "维修中" +) + +// Pen 是猪栏的物理实体模型, 是所有空间相关数据的“锚点” +type Pen struct { + gorm.Model + PenNumber string `gorm:"not null;comment:猪栏的唯一编号, 如 A-01"` + HouseID uint `gorm:"index;comment:所属猪舍ID"` + PigBatchID uint `gorm:"index;comment:关联的猪批次ID"` + Capacity int `gorm:"not null;comment:设计容量 (头)"` + Status PenStatus `gorm:"not null;index;comment:猪栏当前状态"` +} diff --git a/internal/infra/models/medication.go b/internal/infra/models/medication.go index 05dcbce..aa914b6 100644 --- a/internal/infra/models/medication.go +++ b/internal/infra/models/medication.go @@ -66,3 +66,26 @@ type Medication struct { Manufacturer string `gorm:"size:100;comment:生产厂家" json:"manufacturer"` Instructions datatypes.JSON `gorm:"type:jsonb;comment:使用说明" json:"instructions"` } + +// MedicationReasonType 定义了用药原因 +type MedicationReasonType string + +const ( + ReasonTypePreventive MedicationReasonType = "预防" + ReasonTypeTreatment MedicationReasonType = "治疗" + ReasonTypeHealthCare MedicationReasonType = "保健" +) + +// GroupMedicationLog 记录了对整个猪批次的用药情况 +type GroupMedicationLog struct { + gorm.Model + PigBatchID uint `gorm:"not null;index;comment:关联的猪批次ID"` + MedicationID uint `gorm:"not null;index;comment:关联的药品ID"` + Medication Medication `gorm:"foreignKey:MedicationID"` // 预加载药品信息 + DosageUsed float64 `gorm:"not null;comment:使用的总剂量 (单位由药品决定,如g或ml)"` + TargetCount int `gorm:"not null;comment:用药对象数量"` + Reason MedicationReasonType `gorm:"size:20;not null;comment:用药原因"` + Description string `gorm:"size:255;comment:具体描述,如'治疗呼吸道病'"` + Operator string `gorm:"size:50;comment:操作员"` + HappenedAt time.Time `gorm:"not null;default:CURRENT_TIMESTAMP;comment:用药时间"` +} diff --git a/internal/infra/models/pig.go b/internal/infra/models/pig.go index 1579859..caf51a0 100644 --- a/internal/infra/models/pig.go +++ b/internal/infra/models/pig.go @@ -1,5 +1,74 @@ 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:批次开始日期 (如转入日或购买日)"` + InitialCount int `gorm:"not null;comment:初始数量"` + CurrentCount int `gorm:"not null;comment:当前存栏数量"` + CurrentSickCount int `gorm:"not null;default:0;comment:当前病猪数量"` + AverageWeight float64 `gorm:"comment:平均体重 (kg)"` + Status PigBatchStatus `gorm:"size:20;not null;index;comment:批次状态"` + Pens []Pen `gorm:"foreignKey:PigBatchID;comment:所在圈舍ID"` +} + +// 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:变更后总数"` + BeforeSickCount int `gorm:"not null;comment:变更前病猪数"` + AfterSickCount int `gorm:"not null;comment:变更后病猪数"` + Operator string `gorm:"size:50;comment:操作员"` + HappenedAt time.Time `gorm:"not null;default:CURRENT_TIMESTAMP;comment:事件发生时间"` +}