实现交易子服务
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
46
internal/domain/pig/pig_trade_manager.go
Normal file
46
internal/domain/pig/pig_trade_manager.go
Normal 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)
|
||||||
|
}
|
||||||
36
internal/infra/repository/pig_trade_repository.go
Normal file
36
internal/infra/repository/pig_trade_repository.go
Normal 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
|
||||||
|
}
|
||||||
27
internal/infra/repository/pig_transfer_log_repository.go
Normal file
27
internal/infra/repository/pig_transfer_log_repository.go
Normal 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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user