实现交易子服务

This commit is contained in:
2025-10-06 11:42:56 +08:00
parent c76c976cc8
commit 759b31bce3
7 changed files with 138 additions and 20 deletions

View File

@@ -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)
}

View File

@@ -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 {

View File

@@ -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)
}