diff --git a/internal/app/service/pig.go b/internal/app/service/pig.go new file mode 100644 index 0000000..6d43c33 --- /dev/null +++ b/internal/app/service/pig.go @@ -0,0 +1 @@ +package service diff --git a/internal/infra/database/postgres.go b/internal/infra/database/postgres.go index 5cb9ef6..04058ff 100644 --- a/internal/infra/database/postgres.go +++ b/internal/infra/database/postgres.go @@ -165,11 +165,13 @@ func (ps *PostgresStorage) creatingHyperTable() error { {models.FeedUsageRecord{}, "recorded_at"}, {models.GroupMedicationLog{}, "happened_at"}, {models.PigBatchLog{}, "happened_at"}, + {models.WeighingBatch{}, "weighing_time"}, + {models.WeighingRecord{}, "weighing_time"}, } for _, table := range tablesToConvert { tableName := table.model.TableName() - chunkInterval := "7 days" // 统一设置为7天 + chunkInterval := "1 days" // 统一设置为1天 ps.logger.Infow("准备将表转换为超表", "table", tableName, "chunk_interval", chunkInterval) sql := fmt.Sprintf("SELECT create_hypertable('%s', '%s', chunk_time_interval => INTERVAL '%s', if_not_exists => TRUE);", tableName, table.timeColumn, chunkInterval) if err := ps.db.Exec(sql).Error; err != nil { @@ -194,11 +196,18 @@ func (ps *PostgresStorage) applyCompressionPolicies() error { {models.TaskExecutionLog{}, "task_id"}, {models.PendingCollection{}, "device_id"}, {models.UserActionLog{}, "user_id"}, + {models.RawMaterialPurchase{}, "raw_material_id"}, + {models.RawMaterialStockLog{}, "raw_material_id"}, + {models.FeedUsageRecord{}, "pen_id"}, + {models.GroupMedicationLog{}, "pig_batch_id"}, + {models.PigBatchLog{}, "pig_batch_id"}, + {models.WeighingBatch{}, "pig_batch_id"}, + {models.WeighingRecord{}, "weighing_batch_id"}, } for _, policy := range policies { tableName := policy.model.TableName() - compressAfter := "15 days" // 统一设置为15天后开始压缩 + compressAfter := "3 days" // 统一设置为2天后(即进入第3天)开始压缩 // 1. 开启表的压缩设置,并指定分段列 ps.logger.Infow("为表启用压缩设置", "table", tableName, "segment_by", policy.segmentColumn) diff --git a/internal/infra/models/feed.go b/internal/infra/models/feed.go index 5a51699..a16378f 100644 --- a/internal/infra/models/feed.go +++ b/internal/infra/models/feed.go @@ -25,7 +25,7 @@ func (RawMaterial) TableName() string { // RawMaterialPurchase 记录了原料的每一次采购。 type RawMaterialPurchase struct { - ID uint `gorm:"primaryKey"` + gorm.Model RawMaterialID uint `gorm:"not null;index;comment:关联的原料ID"` RawMaterial RawMaterial `gorm:"foreignKey:RawMaterialID"` Supplier string `gorm:"size:100;comment:供应商"` @@ -34,8 +34,6 @@ type RawMaterialPurchase struct { 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 { @@ -56,16 +54,13 @@ const ( // RawMaterialStockLog 记录了原料库存的所有变动,提供了完整的追溯链。 type RawMaterialStockLog struct { - ID uint `gorm:"primaryKey"` + 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:备注, 如主动领取的理由等"` - CreatedAt time.Time - UpdatedAt time.Time - DeletedAt gorm.DeletedAt `gorm:"index"` } func (RawMaterialStockLog) TableName() string { @@ -102,7 +97,7 @@ func (FeedFormulaComponent) TableName() string { // 应用层逻辑:当一条使用记录被创建时,应根据其使用的 FeedFormula, // 计算出每种 RawMaterial 的消耗量,并在 RawMaterialStockLog 中创建对应的出库记录。 type FeedUsageRecord struct { - ID uint `gorm:"primaryKey"` + gorm.Model PenID uint `gorm:"not null;index;comment:关联的猪栏ID"` Pen Pen `gorm:"foreignKey:PenID"` FeedFormulaID uint `gorm:"not null;index;comment:使用的饲料配方ID"` @@ -111,9 +106,6 @@ type FeedUsageRecord struct { 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 { diff --git a/internal/infra/models/medication.go b/internal/infra/models/medication.go index 395ecdf..1f0b752 100644 --- a/internal/infra/models/medication.go +++ b/internal/infra/models/medication.go @@ -82,7 +82,7 @@ const ( // GroupMedicationLog 记录了对整个猪批次的用药情况 type GroupMedicationLog struct { - ID uint `gorm:"primaryKey"` + gorm.Model PigBatchID uint `gorm:"not null;index;comment:关联的猪批次ID"` MedicationID uint `gorm:"not null;index;comment:关联的药品ID"` Medication Medication `gorm:"foreignKey:MedicationID"` // 预加载药品信息 @@ -92,9 +92,6 @@ type GroupMedicationLog struct { Description string `gorm:"size:255;comment:具体描述,如'治疗呼吸道病'"` Operator string `gorm:"size:50;comment:操作员"` HappenedAt time.Time `gorm:"primaryKey;comment:用药时间"` - CreatedAt time.Time - UpdatedAt time.Time - DeletedAt gorm.DeletedAt `gorm:"index"` } func (GroupMedicationLog) TableName() string { diff --git a/internal/infra/models/models.go b/internal/infra/models/models.go index a2f9b07..1e6c116 100644 --- a/internal/infra/models/models.go +++ b/internal/infra/models/models.go @@ -39,6 +39,8 @@ func GetAllModels() []interface{} { // Pig & Batch Models &PigBatch{}, &PigBatchLog{}, + &WeighingBatch{}, + &WeighingRecord{}, // Feed Models &RawMaterial{}, diff --git a/internal/infra/models/pig.go b/internal/infra/models/pig.go index 0ee4e76..4c5586f 100644 --- a/internal/infra/models/pig.go +++ b/internal/infra/models/pig.go @@ -39,7 +39,6 @@ type PigBatch struct { 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"` } @@ -64,7 +63,7 @@ const ( // PigBatchLog 记录了猪批次数量或状态的每一次变更 type PigBatchLog struct { - ID uint `gorm:"primaryKey"` + gorm.Model PigBatchID uint `gorm:"not null;index;comment:关联的猪批次ID"` ChangeType LogChangeType `gorm:"size:20;not null;comment:变更类型"` ChangeCount int `gorm:"not null;comment:数量变化,负数表示减少"` @@ -75,11 +74,35 @@ type PigBatchLog struct { AfterSickCount int `gorm:"not null;comment:变更后病猪数"` Operator string `gorm:"size:50;comment:操作员"` HappenedAt time.Time `gorm:"primaryKey;comment:事件发生时间"` - CreatedAt time.Time - UpdatedAt time.Time - DeletedAt gorm.DeletedAt `gorm:"index"` } 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" +}