diff --git a/internal/core/application.go b/internal/core/application.go index f11b397..618b39a 100644 --- a/internal/core/application.go +++ b/internal/core/application.go @@ -76,13 +76,16 @@ func NewApplication(configPath string) (*Application, error) { pigBatchLogRepo := repository.NewGormPigBatchLogRepository(storage.GetDB()) pigFarmRepo := repository.NewGormPigFarmRepository(storage.GetDB()) pigPenRepo := repository.NewGormPigPenRepository(storage.GetDB()) + pigTransferLogRepo := repository.NewGormPigTransferLogRepository(storage.GetDB()) + pigTradeRepo := repository.NewGormPigTradeRepository(storage.GetDB()) // 初始化事务管理器 unitOfWork := repository.NewGormUnitOfWork(storage.GetDB(), logger) // 初始化猪群管理领域 - penTransferManager := pig.NewPenTransferManager(pigPenRepo) - pigBatchDomain := pig.NewPigBatchService(pigBatchRepo, pigBatchLogRepo, unitOfWork, penTransferManager) + pigPenTransferManager := pig.NewPigPenTransferManager(pigPenRepo, pigTransferLogRepo) + pigTradeManager := pig.NewPigTradeManager(pigTradeRepo) + pigBatchDomain := pig.NewPigBatchService(pigBatchRepo, pigBatchLogRepo, unitOfWork, pigPenTransferManager, pigTradeManager) // --- 业务逻辑处理器初始化 --- pigFarmService := service.NewPigFarmService(pigFarmRepo, pigPenRepo, pigBatchRepo, unitOfWork, logger) diff --git a/internal/domain/pig/pen_transfer_manager.go b/internal/domain/pig/pen_transfer_manager.go index a277354..ed16b62 100644 --- a/internal/domain/pig/pen_transfer_manager.go +++ b/internal/domain/pig/pen_transfer_manager.go @@ -6,9 +6,9 @@ import ( "gorm.io/gorm" ) -// PenTransferManager 定义了与猪只位置转移相关的底层数据库操作。 +// PigPenTransferManager 定义了与猪只位置转移相关的底层数据库操作。 // 它是一个内部服务,被主服务 PigBatchService 调用。 -type PenTransferManager interface { +type PigPenTransferManager interface { // LogTransfer 在数据库中创建一条猪只迁移日志。 LogTransfer(tx *gorm.DB, log *models.PigTransferLog) error @@ -25,39 +25,42 @@ type PenTransferManager interface { UpdatePenFields(tx *gorm.DB, penID uint, updates map[string]interface{}) error } -// penTransferManager 是 PenTransferManager 接口的具体实现。 +// pigPenTransferManager 是 PigPenTransferManager 接口的具体实现。 // 它作为调栏管理器,处理底层的数据库交互。 -type penTransferManager struct { +type pigPenTransferManager struct { penRepo repository.PigPenRepository + logRepo repository.PigTransferLogRepository } -// NewPenTransferManager 是 penTransferManager 的构造函数。 -func NewPenTransferManager(penRepo repository.PigPenRepository) PenTransferManager { - return &penTransferManager{ +// NewPigPenTransferManager 是 pigPenTransferManager 的构造函数。 +// 修改构造函数以接收 PigTransferLogRepository 依赖 +func NewPigPenTransferManager(penRepo repository.PigPenRepository, logRepo repository.PigTransferLogRepository) PigPenTransferManager { + return &pigPenTransferManager{ penRepo: penRepo, + logRepo: logRepo, } } // LogTransfer 实现了在数据库中创建迁移日志的逻辑。 -func (s *penTransferManager) LogTransfer(tx *gorm.DB, log *models.PigTransferLog) error { - // 直接使用事务对象创建记录。 - return tx.Create(log).Error +func (s *pigPenTransferManager) LogTransfer(tx *gorm.DB, log *models.PigTransferLog) error { + // 使用新的仓库接口进行操作 + return s.logRepo.CreatePigTransferLog(tx, log) } // GetPenByID 实现了获取猪栏信息的逻辑。 // 注意: 此处调用了一个假设存在的方法 GetPenByIDTx。 -func (s *penTransferManager) GetPenByID(tx *gorm.DB, penID uint) (*models.Pen, error) { +func (s *pigPenTransferManager) GetPenByID(tx *gorm.DB, penID uint) (*models.Pen, error) { return s.penRepo.GetPenByIDTx(tx, penID) } // GetPensByBatchID 实现了获取猪群关联猪栏列表的逻辑。 // 注意: 此处调用了一个假设存在的方法 GetPensByBatchIDTx。 -func (s *penTransferManager) GetPensByBatchID(tx *gorm.DB, batchID uint) ([]*models.Pen, error) { +func (s *pigPenTransferManager) GetPensByBatchID(tx *gorm.DB, batchID uint) ([]*models.Pen, error) { return s.penRepo.GetPensByBatchIDTx(tx, batchID) } // UpdatePenFields 实现了更新猪栏字段的逻辑。 // 注意: 此处调用了一个假设存在的方法 UpdatePenFieldsTx。 -func (s *penTransferManager) UpdatePenFields(tx *gorm.DB, penID uint, updates map[string]interface{}) error { +func (s *pigPenTransferManager) UpdatePenFields(tx *gorm.DB, penID uint, updates map[string]interface{}) error { return s.penRepo.UpdatePenFieldsTx(tx, penID, updates) } diff --git a/internal/domain/pig/pig_batch_service.go b/internal/domain/pig/pig_batch_service.go index cdc03b7..5688971 100644 --- a/internal/domain/pig/pig_batch_service.go +++ b/internal/domain/pig/pig_batch_service.go @@ -19,7 +19,8 @@ type pigBatchService struct { pigBatchRepo repository.PigBatchRepository // 猪批次仓库 pigBatchLogRepo repository.PigBatchLogRepository // 猪批次日志仓库 uow repository.UnitOfWork // 工作单元,用于管理事务 - transferSvc PenTransferManager // 调栏子服务 + transferSvc PigPenTransferManager // 调栏子服务 + tradeSvc PigTradeManager // 交易子服务 } // NewPigBatchService 是 pigBatchService 的构造函数。 @@ -28,13 +29,15 @@ func NewPigBatchService( pigBatchRepo repository.PigBatchRepository, pigBatchLogRepo repository.PigBatchLogRepository, uow repository.UnitOfWork, - transferSvc PenTransferManager, + transferSvc PigPenTransferManager, + tradeSvc PigTradeManager, ) PigBatchService { return &pigBatchService{ pigBatchRepo: pigBatchRepo, pigBatchLogRepo: pigBatchLogRepo, uow: uow, transferSvc: transferSvc, + tradeSvc: tradeSvc, } } @@ -60,8 +63,8 @@ func (s *pigBatchService) CreatePigBatch(operatorID uint, batch *models.PigBatch ChangeCount: createdBatch.InitialCount, Reason: fmt.Sprintf("创建了新的猪批次 %s,初始数量 %d", createdBatch.BatchNumber, createdBatch.InitialCount), BeforeCount: 0, // 初始创建前数量为0 - AfterCount: int(createdBatch.InitialCount), - OperatorID: 0, // 假设初始创建没有特定操作员ID,或需要从上下文传入 + AfterCount: createdBatch.InitialCount, + OperatorID: operatorID, } // 3. 记录批次日志 @@ -135,7 +138,7 @@ func (s *pigBatchService) ListPigBatches(isActive *bool) ([]*models.PigBatch, er } // UpdatePigBatchPens 实现了在事务中更新猪批次关联猪栏的复杂逻辑。 -// 它通过调用底层的 PenTransferManager 来执行数据库操作,从而保持了职责的清晰。 +// 它通过调用底层的 PigPenTransferManager 来执行数据库操作,从而保持了职责的清晰。 func (s *pigBatchService) UpdatePigBatchPens(batchID uint, desiredPenIDs []uint) error { // 使用工作单元来确保操作的原子性 return s.uow.ExecuteInTransaction(func(tx *gorm.DB) error { diff --git a/internal/domain/pig/pig_trade_manager.go b/internal/domain/pig/pig_trade_manager.go new file mode 100644 index 0000000..394b411 --- /dev/null +++ b/internal/domain/pig/pig_trade_manager.go @@ -0,0 +1,46 @@ +package pig + +import ( + "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" + "git.huangwc.com/pig/pig-farm-controller/internal/infra/repository" // 引入基础设施层的仓库接口 + "gorm.io/gorm" +) + +// PigTradeManager 定义了与猪只交易相关的操作接口。 +// 这是一个领域服务,负责协调业务逻辑。 +type PigTradeManager interface { + // SellPig 处理卖猪的业务逻辑,通过仓库接口创建 PigSale 记录。 + SellPig(tx *gorm.DB, sale *models.PigSale) error + + // BuyPig 处理买猪的业务逻辑,通过仓库接口创建 PigPurchase 记录。 + BuyPig(tx *gorm.DB, purchase *models.PigPurchase) error +} + +// pigTradeManager 是 PigTradeManager 接口的具体实现。 +// 它依赖于 repository.PigTradeRepository 接口来执行数据持久化操作。 +type pigTradeManager struct { + tradeRepo repository.PigTradeRepository // 依赖于基础设施层定义的仓库接口 +} + +// NewPigTradeManager 是 pigTradeManager 的构造函数。 +func NewPigTradeManager(tradeRepo repository.PigTradeRepository) PigTradeManager { + return &pigTradeManager{ + tradeRepo: tradeRepo, + } +} + +// SellPig 实现了卖猪的逻辑。 +// 它通过调用 tradeRepo 来持久化销售记录。 +func (s *pigTradeManager) SellPig(tx *gorm.DB, sale *models.PigSale) error { + // 在此处可以添加更复杂的卖猪前置校验或业务逻辑 + // 例如:检查猪只库存、更新猪只状态等。 + return s.tradeRepo.CreatePigSaleTx(tx, sale) +} + +// BuyPig 实现了买猪的逻辑。 +// 它通过调用 tradeRepo 来持久化采购记录。 +func (s *pigTradeManager) BuyPig(tx *gorm.DB, purchase *models.PigPurchase) error { + // 在此处可以添加更复杂的买猪前置校验或业务逻辑 + // 例如:检查资金、更新猪只状态等。 + return s.tradeRepo.CreatePigPurchaseTx(tx, purchase) +} diff --git a/internal/infra/models/pig_buy_sell.go b/internal/infra/models/pig_trade.go similarity index 100% rename from internal/infra/models/pig_buy_sell.go rename to internal/infra/models/pig_trade.go diff --git a/internal/infra/repository/pig_trade_repository.go b/internal/infra/repository/pig_trade_repository.go new file mode 100644 index 0000000..a1d7b68 --- /dev/null +++ b/internal/infra/repository/pig_trade_repository.go @@ -0,0 +1,36 @@ +package repository + +import ( + "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" + "gorm.io/gorm" +) + +// PigTradeRepository 定义了猪只交易数据持久化的接口。 +// 领域服务通过此接口与数据层交互,实现解耦。 +type PigTradeRepository interface { + // CreatePigSaleTx 在数据库中创建一条猪只销售记录。 + CreatePigSaleTx(tx *gorm.DB, sale *models.PigSale) error + + // CreatePigPurchaseTx 在数据库中创建一条猪只采购记录。 + CreatePigPurchaseTx(tx *gorm.DB, purchase *models.PigPurchase) error +} + +// gormPigTradeRepository 是 PigTradeRepository 接口的 GORM 实现。 +type gormPigTradeRepository struct { + db *gorm.DB +} + +// NewGormPigTradeRepository 创建一个新的 PigTradeRepository GORM 实现实例。 +func NewGormPigTradeRepository(db *gorm.DB) PigTradeRepository { + return &gormPigTradeRepository{db: db} +} + +// CreatePigSaleTx 实现了在数据库中创建猪只销售记录的逻辑。 +func (r *gormPigTradeRepository) CreatePigSaleTx(tx *gorm.DB, sale *models.PigSale) error { + return tx.Create(sale).Error +} + +// CreatePigPurchaseTx 实现了在数据库中创建猪只采购记录的逻辑。 +func (r *gormPigTradeRepository) CreatePigPurchaseTx(tx *gorm.DB, purchase *models.PigPurchase) error { + return tx.Create(purchase).Error +} diff --git a/internal/infra/repository/pig_transfer_log_repository.go b/internal/infra/repository/pig_transfer_log_repository.go new file mode 100644 index 0000000..7854717 --- /dev/null +++ b/internal/infra/repository/pig_transfer_log_repository.go @@ -0,0 +1,27 @@ +package repository + +import ( + "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" + "gorm.io/gorm" +) + +// PigTransferLogRepository 定义了猪只迁移日志数据持久化的接口。 +type PigTransferLogRepository interface { + // CreatePigTransferLog 在数据库中创建一条猪只迁移日志记录。 + CreatePigTransferLog(tx *gorm.DB, log *models.PigTransferLog) 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 +}