2025-10-03 23:42:14 +08:00
|
|
|
|
package service
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/app/dto"
|
2025-10-05 16:37:12 +08:00
|
|
|
|
domain_pig "git.huangwc.com/pig/pig-farm-controller/internal/domain/pig"
|
2025-10-03 23:42:14 +08:00
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
|
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// PigBatchService 接口定义保持不变,继续作为应用层对外的契约。
|
2025-10-03 23:42:14 +08:00
|
|
|
|
type PigBatchService interface {
|
|
|
|
|
|
CreatePigBatch(dto *dto.PigBatchCreateDTO) (*dto.PigBatchResponseDTO, error)
|
|
|
|
|
|
GetPigBatch(id uint) (*dto.PigBatchResponseDTO, error)
|
|
|
|
|
|
UpdatePigBatch(id uint, dto *dto.PigBatchUpdateDTO) (*dto.PigBatchResponseDTO, error)
|
|
|
|
|
|
DeletePigBatch(id uint) error
|
|
|
|
|
|
ListPigBatches(isActive *bool) ([]*dto.PigBatchResponseDTO, error)
|
2025-10-04 00:47:27 +08:00
|
|
|
|
UpdatePigBatchPens(batchID uint, desiredPenIDs []uint) error
|
2025-10-03 23:42:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// pigBatchService 的实现现在依赖于领域服务接口。
|
2025-10-03 23:42:14 +08:00
|
|
|
|
type pigBatchService struct {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
logger *logs.Logger
|
|
|
|
|
|
domainService domain_pig.PigBatchService // 依赖注入领域服务
|
2025-10-03 23:42:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// NewPigBatchService 构造函数被修改,以注入领域服务。
|
|
|
|
|
|
func NewPigBatchService(domainService domain_pig.PigBatchService, logger *logs.Logger) PigBatchService {
|
2025-10-03 23:42:14 +08:00
|
|
|
|
return &pigBatchService{
|
2025-10-05 16:37:12 +08:00
|
|
|
|
logger: logger,
|
|
|
|
|
|
domainService: domainService,
|
2025-10-03 23:42:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// toPigBatchResponseDTO 负责将领域模型转换为应用层DTO,这个职责保留在应用层。
|
2025-10-03 23:42:14 +08:00
|
|
|
|
func (s *pigBatchService) toPigBatchResponseDTO(batch *models.PigBatch) *dto.PigBatchResponseDTO {
|
|
|
|
|
|
if batch == nil {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return &dto.PigBatchResponseDTO{
|
|
|
|
|
|
ID: batch.ID,
|
|
|
|
|
|
BatchNumber: batch.BatchNumber,
|
|
|
|
|
|
OriginType: batch.OriginType,
|
|
|
|
|
|
StartDate: batch.StartDate,
|
|
|
|
|
|
EndDate: batch.EndDate,
|
|
|
|
|
|
InitialCount: batch.InitialCount,
|
|
|
|
|
|
Status: batch.Status,
|
2025-10-05 16:37:12 +08:00
|
|
|
|
IsActive: batch.IsActive(),
|
2025-10-03 23:42:14 +08:00
|
|
|
|
CreateTime: batch.CreatedAt,
|
|
|
|
|
|
UpdateTime: batch.UpdatedAt,
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// CreatePigBatch 现在将请求委托给领域服务处理。
|
2025-10-03 23:42:14 +08:00
|
|
|
|
func (s *pigBatchService) CreatePigBatch(dto *dto.PigBatchCreateDTO) (*dto.PigBatchResponseDTO, error) {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// 1. DTO -> 领域模型
|
2025-10-03 23:42:14 +08:00
|
|
|
|
batch := &models.PigBatch{
|
|
|
|
|
|
BatchNumber: dto.BatchNumber,
|
|
|
|
|
|
OriginType: dto.OriginType,
|
|
|
|
|
|
StartDate: dto.StartDate,
|
|
|
|
|
|
InitialCount: dto.InitialCount,
|
|
|
|
|
|
Status: dto.Status,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// 2. 调用领域服务
|
|
|
|
|
|
createdBatch, err := s.domainService.CreatePigBatch(batch)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
if err != nil {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
s.logger.Errorf("应用层: 创建猪批次失败: %v", err)
|
2025-10-05 17:30:39 +08:00
|
|
|
|
return nil, mapDomainError(err)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// 3. 领域模型 -> DTO
|
2025-10-03 23:42:14 +08:00
|
|
|
|
return s.toPigBatchResponseDTO(createdBatch), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 17:30:39 +08:00
|
|
|
|
// GetPigBatch 从领域服务获取数据并转换为DTO,同时处理错误转换。
|
2025-10-03 23:42:14 +08:00
|
|
|
|
func (s *pigBatchService) GetPigBatch(id uint) (*dto.PigBatchResponseDTO, error) {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
batch, err := s.domainService.GetPigBatch(id)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
if err != nil {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
s.logger.Warnf("应用层: 获取猪批次失败, ID: %d, 错误: %v", id, err)
|
2025-10-05 17:30:39 +08:00
|
|
|
|
return nil, mapDomainError(err)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return s.toPigBatchResponseDTO(batch), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 17:30:39 +08:00
|
|
|
|
// UpdatePigBatch 协调获取、更新和保存的流程,并处理错误转换。
|
2025-10-03 23:42:14 +08:00
|
|
|
|
func (s *pigBatchService) UpdatePigBatch(id uint, dto *dto.PigBatchUpdateDTO) (*dto.PigBatchResponseDTO, error) {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// 1. 先获取最新的领域模型
|
|
|
|
|
|
existingBatch, err := s.domainService.GetPigBatch(id)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
if err != nil {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
s.logger.Warnf("应用层: 更新猪批次失败,获取原批次信息错误, ID: %d, 错误: %v", id, err)
|
2025-10-05 17:30:39 +08:00
|
|
|
|
return nil, mapDomainError(err)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// 2. 将DTO中的变更应用到模型上
|
2025-10-03 23:42:14 +08:00
|
|
|
|
if dto.BatchNumber != nil {
|
|
|
|
|
|
existingBatch.BatchNumber = *dto.BatchNumber
|
|
|
|
|
|
}
|
|
|
|
|
|
if dto.OriginType != nil {
|
|
|
|
|
|
existingBatch.OriginType = *dto.OriginType
|
|
|
|
|
|
}
|
|
|
|
|
|
if dto.StartDate != nil {
|
|
|
|
|
|
existingBatch.StartDate = *dto.StartDate
|
|
|
|
|
|
}
|
|
|
|
|
|
if dto.EndDate != nil {
|
|
|
|
|
|
existingBatch.EndDate = *dto.EndDate
|
|
|
|
|
|
}
|
|
|
|
|
|
if dto.InitialCount != nil {
|
|
|
|
|
|
existingBatch.InitialCount = *dto.InitialCount
|
|
|
|
|
|
}
|
|
|
|
|
|
if dto.Status != nil {
|
|
|
|
|
|
existingBatch.Status = *dto.Status
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// 3. 调用领域服务执行更新
|
|
|
|
|
|
updatedBatch, err := s.domainService.UpdatePigBatch(existingBatch)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
if err != nil {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
s.logger.Errorf("应用层: 更新猪批次失败, ID: %d, 错误: %v", id, err)
|
2025-10-05 17:30:39 +08:00
|
|
|
|
return nil, mapDomainError(err)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// 4. 转换并返回结果
|
2025-10-03 23:42:14 +08:00
|
|
|
|
return s.toPigBatchResponseDTO(updatedBatch), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 17:30:39 +08:00
|
|
|
|
// DeletePigBatch 将删除操作委托给领域服务,并转换领域错误为应用层错误。
|
2025-10-03 23:42:14 +08:00
|
|
|
|
func (s *pigBatchService) DeletePigBatch(id uint) error {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
err := s.domainService.DeletePigBatch(id)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
if err != nil {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
s.logger.Errorf("应用层: 删除猪批次失败, ID: %d, 错误: %v", id, err)
|
2025-10-05 17:30:39 +08:00
|
|
|
|
return mapDomainError(err)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-05 16:37:12 +08:00
|
|
|
|
// ListPigBatches 从领域服务获取列表并进行转换。
|
2025-10-03 23:42:14 +08:00
|
|
|
|
func (s *pigBatchService) ListPigBatches(isActive *bool) ([]*dto.PigBatchResponseDTO, error) {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
batches, err := s.domainService.ListPigBatches(isActive)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
if err != nil {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
s.logger.Errorf("应用层: 批量查询猪批次失败: %v", err)
|
2025-10-05 17:30:39 +08:00
|
|
|
|
return nil, mapDomainError(err)
|
2025-10-03 23:42:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var responseDTOs []*dto.PigBatchResponseDTO
|
|
|
|
|
|
for _, batch := range batches {
|
|
|
|
|
|
responseDTOs = append(responseDTOs, s.toPigBatchResponseDTO(batch))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return responseDTOs, nil
|
|
|
|
|
|
}
|
2025-10-04 00:47:27 +08:00
|
|
|
|
|
2025-10-05 17:30:39 +08:00
|
|
|
|
// UpdatePigBatchPens 将关联猪栏的复杂操作委托给领域服务,并处理错误转换。
|
2025-10-04 00:47:27 +08:00
|
|
|
|
func (s *pigBatchService) UpdatePigBatchPens(batchID uint, desiredPenIDs []uint) error {
|
2025-10-05 16:37:12 +08:00
|
|
|
|
err := s.domainService.UpdatePigBatchPens(batchID, desiredPenIDs)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
s.logger.Errorf("应用层: 更新猪批次猪栏关联失败, 批次ID: %d, 错误: %v", batchID, err)
|
2025-10-05 17:30:39 +08:00
|
|
|
|
return mapDomainError(err)
|
2025-10-05 16:37:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
return nil
|
2025-10-04 00:47:27 +08:00
|
|
|
|
}
|