issue_29 #32

Merged
huang merged 65 commits from issue_29 into main 2025-10-07 13:33:25 +08:00
7 changed files with 138 additions and 20 deletions
Showing only changes of commit 759b31bce3 - Show all commits

View File

@@ -76,13 +76,16 @@ func NewApplication(configPath string) (*Application, error) {
pigBatchLogRepo := repository.NewGormPigBatchLogRepository(storage.GetDB()) pigBatchLogRepo := repository.NewGormPigBatchLogRepository(storage.GetDB())
pigFarmRepo := repository.NewGormPigFarmRepository(storage.GetDB()) pigFarmRepo := repository.NewGormPigFarmRepository(storage.GetDB())
pigPenRepo := repository.NewGormPigPenRepository(storage.GetDB()) pigPenRepo := repository.NewGormPigPenRepository(storage.GetDB())
pigTransferLogRepo := repository.NewGormPigTransferLogRepository(storage.GetDB())
pigTradeRepo := repository.NewGormPigTradeRepository(storage.GetDB())
// 初始化事务管理器 // 初始化事务管理器
unitOfWork := repository.NewGormUnitOfWork(storage.GetDB(), logger) unitOfWork := repository.NewGormUnitOfWork(storage.GetDB(), logger)
// 初始化猪群管理领域 // 初始化猪群管理领域
penTransferManager := pig.NewPenTransferManager(pigPenRepo) pigPenTransferManager := pig.NewPigPenTransferManager(pigPenRepo, pigTransferLogRepo)
pigBatchDomain := pig.NewPigBatchService(pigBatchRepo, pigBatchLogRepo, unitOfWork, penTransferManager) pigTradeManager := pig.NewPigTradeManager(pigTradeRepo)
pigBatchDomain := pig.NewPigBatchService(pigBatchRepo, pigBatchLogRepo, unitOfWork, pigPenTransferManager, pigTradeManager)
// --- 业务逻辑处理器初始化 --- // --- 业务逻辑处理器初始化 ---
pigFarmService := service.NewPigFarmService(pigFarmRepo, pigPenRepo, pigBatchRepo, unitOfWork, logger) pigFarmService := service.NewPigFarmService(pigFarmRepo, pigPenRepo, pigBatchRepo, unitOfWork, logger)

View File

@@ -6,9 +6,9 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
) )
// PenTransferManager 定义了与猪只位置转移相关的底层数据库操作。 // PigPenTransferManager 定义了与猪只位置转移相关的底层数据库操作。
// 它是一个内部服务,被主服务 PigBatchService 调用。 // 它是一个内部服务,被主服务 PigBatchService 调用。
type PenTransferManager interface { type PigPenTransferManager interface {
// LogTransfer 在数据库中创建一条猪只迁移日志。 // LogTransfer 在数据库中创建一条猪只迁移日志。
LogTransfer(tx *gorm.DB, log *models.PigTransferLog) error 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 UpdatePenFields(tx *gorm.DB, penID uint, updates map[string]interface{}) error
} }
// penTransferManager 是 PenTransferManager 接口的具体实现。 // pigPenTransferManager 是 PigPenTransferManager 接口的具体实现。
// 它作为调栏管理器,处理底层的数据库交互。 // 它作为调栏管理器,处理底层的数据库交互。
type penTransferManager struct { type pigPenTransferManager struct {
penRepo repository.PigPenRepository penRepo repository.PigPenRepository
logRepo repository.PigTransferLogRepository
} }
// NewPenTransferManager 是 penTransferManager 的构造函数。 // NewPigPenTransferManager 是 pigPenTransferManager 的构造函数。
func NewPenTransferManager(penRepo repository.PigPenRepository) PenTransferManager { // 修改构造函数以接收 PigTransferLogRepository 依赖
return &penTransferManager{ func NewPigPenTransferManager(penRepo repository.PigPenRepository, logRepo repository.PigTransferLogRepository) PigPenTransferManager {
return &pigPenTransferManager{
penRepo: penRepo, penRepo: penRepo,
logRepo: logRepo,
} }
} }
// LogTransfer 实现了在数据库中创建迁移日志的逻辑。 // LogTransfer 实现了在数据库中创建迁移日志的逻辑。
func (s *penTransferManager) LogTransfer(tx *gorm.DB, log *models.PigTransferLog) error { func (s *pigPenTransferManager) LogTransfer(tx *gorm.DB, log *models.PigTransferLog) error {
// 直接使用事务对象创建记录。 // 使用新的仓库接口进行操作
return tx.Create(log).Error return s.logRepo.CreatePigTransferLog(tx, log)
} }
// GetPenByID 实现了获取猪栏信息的逻辑。 // GetPenByID 实现了获取猪栏信息的逻辑。
// 注意: 此处调用了一个假设存在的方法 GetPenByIDTx。 // 注意: 此处调用了一个假设存在的方法 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) return s.penRepo.GetPenByIDTx(tx, penID)
} }
// GetPensByBatchID 实现了获取猪群关联猪栏列表的逻辑。 // GetPensByBatchID 实现了获取猪群关联猪栏列表的逻辑。
// 注意: 此处调用了一个假设存在的方法 GetPensByBatchIDTx。 // 注意: 此处调用了一个假设存在的方法 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) return s.penRepo.GetPensByBatchIDTx(tx, batchID)
} }
// UpdatePenFields 实现了更新猪栏字段的逻辑。 // UpdatePenFields 实现了更新猪栏字段的逻辑。
// 注意: 此处调用了一个假设存在的方法 UpdatePenFieldsTx。 // 注意: 此处调用了一个假设存在的方法 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) return s.penRepo.UpdatePenFieldsTx(tx, penID, updates)
} }

View File

@@ -19,7 +19,8 @@ type pigBatchService struct {
pigBatchRepo repository.PigBatchRepository // 猪批次仓库 pigBatchRepo repository.PigBatchRepository // 猪批次仓库
pigBatchLogRepo repository.PigBatchLogRepository // 猪批次日志仓库 pigBatchLogRepo repository.PigBatchLogRepository // 猪批次日志仓库
uow repository.UnitOfWork // 工作单元,用于管理事务 uow repository.UnitOfWork // 工作单元,用于管理事务
transferSvc PenTransferManager // 调栏子服务 transferSvc PigPenTransferManager // 调栏子服务
tradeSvc PigTradeManager // 交易子服务
} }
// NewPigBatchService 是 pigBatchService 的构造函数。 // NewPigBatchService 是 pigBatchService 的构造函数。
@@ -28,13 +29,15 @@ func NewPigBatchService(
pigBatchRepo repository.PigBatchRepository, pigBatchRepo repository.PigBatchRepository,
pigBatchLogRepo repository.PigBatchLogRepository, pigBatchLogRepo repository.PigBatchLogRepository,
uow repository.UnitOfWork, uow repository.UnitOfWork,
transferSvc PenTransferManager, transferSvc PigPenTransferManager,
tradeSvc PigTradeManager,
) PigBatchService { ) PigBatchService {
return &pigBatchService{ return &pigBatchService{
pigBatchRepo: pigBatchRepo, pigBatchRepo: pigBatchRepo,
pigBatchLogRepo: pigBatchLogRepo, pigBatchLogRepo: pigBatchLogRepo,
uow: uow, uow: uow,
transferSvc: transferSvc, transferSvc: transferSvc,
tradeSvc: tradeSvc,
} }
} }
@@ -60,8 +63,8 @@ func (s *pigBatchService) CreatePigBatch(operatorID uint, batch *models.PigBatch
ChangeCount: createdBatch.InitialCount, ChangeCount: createdBatch.InitialCount,
Reason: fmt.Sprintf("创建了新的猪批次 %s初始数量 %d", createdBatch.BatchNumber, createdBatch.InitialCount), Reason: fmt.Sprintf("创建了新的猪批次 %s初始数量 %d", createdBatch.BatchNumber, createdBatch.InitialCount),
BeforeCount: 0, // 初始创建前数量为0 BeforeCount: 0, // 初始创建前数量为0
AfterCount: int(createdBatch.InitialCount), AfterCount: createdBatch.InitialCount,
OperatorID: 0, // 假设初始创建没有特定操作员ID或需要从上下文传入 OperatorID: operatorID,
} }
// 3. 记录批次日志 // 3. 记录批次日志
@@ -135,7 +138,7 @@ func (s *pigBatchService) ListPigBatches(isActive *bool) ([]*models.PigBatch, er
} }
// UpdatePigBatchPens 实现了在事务中更新猪批次关联猪栏的复杂逻辑。 // UpdatePigBatchPens 实现了在事务中更新猪批次关联猪栏的复杂逻辑。
// 它通过调用底层的 PenTransferManager 来执行数据库操作,从而保持了职责的清晰。 // 它通过调用底层的 PigPenTransferManager 来执行数据库操作,从而保持了职责的清晰。
func (s *pigBatchService) UpdatePigBatchPens(batchID uint, desiredPenIDs []uint) error { func (s *pigBatchService) UpdatePigBatchPens(batchID uint, desiredPenIDs []uint) error {
// 使用工作单元来确保操作的原子性 // 使用工作单元来确保操作的原子性
return s.uow.ExecuteInTransaction(func(tx *gorm.DB) 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)
}

View File

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

View File

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