package repository import ( "time" "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" "gorm.io/gorm" ) // PigTransferLogListOptions 定义了查询猪只迁移日志时的可选参数 type PigTransferLogListOptions struct { PigBatchID *uint PenID *uint TransferType *models.PigTransferType // 迁移类型 OperatorID *uint CorrelationID *string StartTime *time.Time // 基于 transfer_time 字段 EndTime *time.Time // 基于 transfer_time 字段 OrderBy string // 例如 "transfer_time desc" } // PigTransferLogRepository 定义了猪只迁移日志数据持久化的接口。 type PigTransferLogRepository interface { // CreatePigTransferLog 在数据库中创建一条猪只迁移日志记录。 CreatePigTransferLog(tx *gorm.DB, log *models.PigTransferLog) error // GetLogsForPenSince 获取指定猪栏自特定时间点以来的所有迁移日志,按时间倒序排列。 GetLogsForPenSince(tx *gorm.DB, penID uint, since time.Time) ([]*models.PigTransferLog, error) // ListPigTransferLogs 支持分页和过滤的猪只迁移日志列表查询 ListPigTransferLogs(opts PigTransferLogListOptions, page, pageSize int) ([]models.PigTransferLog, int64, error) } // gormPigTransferLogRepository 是 PigTransferLogRepository 接口的 GORM 实现。 type gormPigTransferLogRepository struct { db *gorm.DB } // NewGormPigTransferLogRepository 创建一个新的 PigTransferLogRepository GORM 实现实例。 func NewGormPigTransferLogRepository(db *gorm.DB) PigTransferLogRepository { return &gormPigTransferLogRepository{db: db} } // CreatePigTransferLog 实现了在数据库中创建猪只迁移日志记录的逻辑。 func (r *gormPigTransferLogRepository) CreatePigTransferLog(tx *gorm.DB, log *models.PigTransferLog) error { return tx.Create(log).Error } // GetLogsForPenSince 实现了获取猪栏自特定时间点以来所有迁移日志的逻辑。 func (r *gormPigTransferLogRepository) GetLogsForPenSince(tx *gorm.DB, penID uint, since time.Time) ([]*models.PigTransferLog, error) { var logs []*models.PigTransferLog err := tx.Where("pen_id = ? AND transfer_time >= ?", penID, since).Order("transfer_time DESC").Find(&logs).Error return logs, err } // ListPigTransferLogs 实现了分页和过滤查询猪只迁移日志的功能 func (r *gormPigTransferLogRepository) ListPigTransferLogs(opts PigTransferLogListOptions, page, pageSize int) ([]models.PigTransferLog, int64, error) { if page <= 0 || pageSize <= 0 { return nil, 0, ErrInvalidPagination } var results []models.PigTransferLog var total int64 query := r.db.Model(&models.PigTransferLog{}) if opts.PigBatchID != nil { query = query.Where("pig_batch_id = ?", *opts.PigBatchID) } if opts.PenID != nil { query = query.Where("pen_id = ?", *opts.PenID) } if opts.TransferType != nil { query = query.Where("type = ?", *opts.TransferType) } if opts.OperatorID != nil { query = query.Where("operator_id = ?", *opts.OperatorID) } if opts.CorrelationID != nil { query = query.Where("correlation_id = ?", *opts.CorrelationID) } if opts.StartTime != nil { query = query.Where("transfer_time >= ?", *opts.StartTime) } if opts.EndTime != nil { query = query.Where("transfer_time <= ?", *opts.EndTime) } if err := query.Count(&total).Error; err != nil { return nil, 0, err } orderBy := "transfer_time DESC" if opts.OrderBy != "" { orderBy = opts.OrderBy } query = query.Order(orderBy) offset := (page - 1) * pageSize err := query.Limit(pageSize).Offset(offset).Find(&results).Error return results, total, err }