package service import ( "git.huangwc.com/pig/pig-farm-controller/internal/app/dto" "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" "git.huangwc.com/pig/pig-farm-controller/internal/infra/repository" ) // MonitorService 定义了监控相关的业务逻辑服务接口 type MonitorService interface { ListSensorData(req *dto.ListSensorDataRequest) (*dto.ListSensorDataResponse, error) ListDeviceCommandLogs(req *dto.ListDeviceCommandLogRequest) (*dto.ListDeviceCommandLogResponse, error) ListPlanExecutionLogs(req *dto.ListPlanExecutionLogRequest) (*dto.ListPlanExecutionLogResponse, error) ListTaskExecutionLogs(req *dto.ListTaskExecutionLogRequest) (*dto.ListTaskExecutionLogResponse, error) ListPendingCollections(req *dto.ListPendingCollectionRequest) (*dto.ListPendingCollectionResponse, error) ListUserActionLogs(req *dto.ListUserActionLogRequest) (*dto.ListUserActionLogResponse, error) ListRawMaterialPurchases(req *dto.ListRawMaterialPurchaseRequest) (*dto.ListRawMaterialPurchaseResponse, error) ListRawMaterialStockLogs(req *dto.ListRawMaterialStockLogRequest) (*dto.ListRawMaterialStockLogResponse, error) ListFeedUsageRecords(req *dto.ListFeedUsageRecordRequest) (*dto.ListFeedUsageRecordResponse, error) ListMedicationLogs(req *dto.ListMedicationLogRequest) (*dto.ListMedicationLogResponse, error) ListPigBatchLogs(req *dto.ListPigBatchLogRequest) (*dto.ListPigBatchLogResponse, error) ListWeighingBatches(req *dto.ListWeighingBatchRequest) (*dto.ListWeighingBatchResponse, error) ListWeighingRecords(req *dto.ListWeighingRecordRequest) (*dto.ListWeighingRecordResponse, error) ListPigTransferLogs(req *dto.ListPigTransferLogRequest) (*dto.ListPigTransferLogResponse, error) ListPigSickLogs(req *dto.ListPigSickLogRequest) (*dto.ListPigSickLogResponse, error) ListPigPurchases(req *dto.ListPigPurchaseRequest) (*dto.ListPigPurchaseResponse, error) ListPigSales(req *dto.ListPigSaleRequest) (*dto.ListPigSaleResponse, error) ListNotifications(req *dto.ListNotificationRequest) (*dto.ListNotificationResponse, error) } // monitorService 是 MonitorService 接口的具体实现 type monitorService struct { sensorDataRepo repository.SensorDataRepository deviceCommandLogRepo repository.DeviceCommandLogRepository executionLogRepo repository.ExecutionLogRepository planRepository repository.PlanRepository pendingCollectionRepo repository.PendingCollectionRepository userActionLogRepo repository.UserActionLogRepository rawMaterialRepo repository.RawMaterialRepository medicationRepo repository.MedicationLogRepository pigBatchRepo repository.PigBatchRepository pigBatchLogRepo repository.PigBatchLogRepository pigTransferLogRepo repository.PigTransferLogRepository pigSickLogRepo repository.PigSickLogRepository pigTradeRepo repository.PigTradeRepository notificationRepo repository.NotificationRepository } // NewMonitorService 创建一个新的 MonitorService 实例 func NewMonitorService( sensorDataRepo repository.SensorDataRepository, deviceCommandLogRepo repository.DeviceCommandLogRepository, executionLogRepo repository.ExecutionLogRepository, planRepository repository.PlanRepository, pendingCollectionRepo repository.PendingCollectionRepository, userActionLogRepo repository.UserActionLogRepository, rawMaterialRepo repository.RawMaterialRepository, medicationRepo repository.MedicationLogRepository, pigBatchRepo repository.PigBatchRepository, pigBatchLogRepo repository.PigBatchLogRepository, pigTransferLogRepo repository.PigTransferLogRepository, pigSickLogRepo repository.PigSickLogRepository, pigTradeRepo repository.PigTradeRepository, notificationRepo repository.NotificationRepository, ) MonitorService { return &monitorService{ sensorDataRepo: sensorDataRepo, deviceCommandLogRepo: deviceCommandLogRepo, executionLogRepo: executionLogRepo, planRepository: planRepository, pendingCollectionRepo: pendingCollectionRepo, userActionLogRepo: userActionLogRepo, rawMaterialRepo: rawMaterialRepo, medicationRepo: medicationRepo, pigBatchRepo: pigBatchRepo, pigBatchLogRepo: pigBatchLogRepo, pigTransferLogRepo: pigTransferLogRepo, pigSickLogRepo: pigSickLogRepo, pigTradeRepo: pigTradeRepo, notificationRepo: notificationRepo, } } // ListSensorData 负责处理查询传感器数据列表的业务逻辑 func (s *monitorService) ListSensorData(req *dto.ListSensorDataRequest) (*dto.ListSensorDataResponse, error) { opts := repository.SensorDataListOptions{ DeviceID: req.DeviceID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } if req.SensorType != nil { sensorType := models.SensorType(*req.SensorType) opts.SensorType = &sensorType } data, total, err := s.sensorDataRepo.List(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListSensorDataResponse(data, total, req.Page, req.PageSize), nil } // ListDeviceCommandLogs 负责处理查询设备命令日志列表的业务逻辑 func (s *monitorService) ListDeviceCommandLogs(req *dto.ListDeviceCommandLogRequest) (*dto.ListDeviceCommandLogResponse, error) { opts := repository.DeviceCommandLogListOptions{ DeviceID: req.DeviceID, ReceivedSuccess: req.ReceivedSuccess, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } data, total, err := s.deviceCommandLogRepo.List(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListDeviceCommandLogResponse(data, total, req.Page, req.PageSize), nil } // ListPlanExecutionLogs 负责处理查询计划执行日志列表的业务逻辑 func (s *monitorService) ListPlanExecutionLogs(req *dto.ListPlanExecutionLogRequest) (*dto.ListPlanExecutionLogResponse, error) { opts := repository.PlanExecutionLogListOptions{ PlanID: req.PlanID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } if req.Status != nil { status := models.ExecutionStatus(*req.Status) opts.Status = &status } planLogs, total, err := s.executionLogRepo.ListPlanExecutionLogs(opts, req.Page, req.PageSize) if err != nil { return nil, err } planIds := make([]uint, 0, len(planLogs)) for _, datum := range planLogs { has := false for _, id := range planIds { if id == datum.PlanID { has = true break } } if !has { planIds = append(planIds, datum.PlanID) } } plans, err := s.planRepository.GetPlansByIDs(planIds) if err != nil { return nil, err } return dto.NewListPlanExecutionLogResponse(planLogs, plans, total, req.Page, req.PageSize), nil } // ListTaskExecutionLogs 负责处理查询任务执行日志列表的业务逻辑 func (s *monitorService) ListTaskExecutionLogs(req *dto.ListTaskExecutionLogRequest) (*dto.ListTaskExecutionLogResponse, error) { opts := repository.TaskExecutionLogListOptions{ PlanExecutionLogID: req.PlanExecutionLogID, TaskID: req.TaskID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } if req.Status != nil { status := models.ExecutionStatus(*req.Status) opts.Status = &status } data, total, err := s.executionLogRepo.ListTaskExecutionLogs(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListTaskExecutionLogResponse(data, total, req.Page, req.PageSize), nil } // ListPendingCollections 负责处理查询待采集请求列表的业务逻辑 func (s *monitorService) ListPendingCollections(req *dto.ListPendingCollectionRequest) (*dto.ListPendingCollectionResponse, error) { opts := repository.PendingCollectionListOptions{ DeviceID: req.DeviceID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } if req.Status != nil { status := models.PendingCollectionStatus(*req.Status) opts.Status = &status } data, total, err := s.pendingCollectionRepo.List(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListPendingCollectionResponse(data, total, req.Page, req.PageSize), nil } // ListUserActionLogs 负责处理查询用户操作日志列表的业务逻辑 func (s *monitorService) ListUserActionLogs(req *dto.ListUserActionLogRequest) (*dto.ListUserActionLogResponse, error) { opts := repository.UserActionLogListOptions{ UserID: req.UserID, Username: req.Username, ActionType: req.ActionType, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } if req.Status != nil { status := models.AuditStatus(*req.Status) opts.Status = &status } data, total, err := s.userActionLogRepo.List(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListUserActionLogResponse(data, total, req.Page, req.PageSize), nil } // ListRawMaterialPurchases 负责处理查询原料采购记录列表的业务逻辑 func (s *monitorService) ListRawMaterialPurchases(req *dto.ListRawMaterialPurchaseRequest) (*dto.ListRawMaterialPurchaseResponse, error) { opts := repository.RawMaterialPurchaseListOptions{ RawMaterialID: req.RawMaterialID, Supplier: req.Supplier, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } data, total, err := s.rawMaterialRepo.ListRawMaterialPurchases(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListRawMaterialPurchaseResponse(data, total, req.Page, req.PageSize), nil } // ListRawMaterialStockLogs 负责处理查询原料库存日志列表的业务逻辑 func (s *monitorService) ListRawMaterialStockLogs(req *dto.ListRawMaterialStockLogRequest) (*dto.ListRawMaterialStockLogResponse, error) { opts := repository.RawMaterialStockLogListOptions{ RawMaterialID: req.RawMaterialID, SourceID: req.SourceID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } if req.SourceType != nil { sourceType := models.StockLogSourceType(*req.SourceType) opts.SourceType = &sourceType } data, total, err := s.rawMaterialRepo.ListRawMaterialStockLogs(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListRawMaterialStockLogResponse(data, total, req.Page, req.PageSize), nil } // ListFeedUsageRecords 负责处理查询饲料使用记录列表的业务逻辑 func (s *monitorService) ListFeedUsageRecords(req *dto.ListFeedUsageRecordRequest) (*dto.ListFeedUsageRecordResponse, error) { opts := repository.FeedUsageRecordListOptions{ PenID: req.PenID, FeedFormulaID: req.FeedFormulaID, OperatorID: req.OperatorID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } data, total, err := s.rawMaterialRepo.ListFeedUsageRecords(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListFeedUsageRecordResponse(data, total, req.Page, req.PageSize), nil } // ListMedicationLogs 负责处理查询用药记录列表的业务逻辑 func (s *monitorService) ListMedicationLogs(req *dto.ListMedicationLogRequest) (*dto.ListMedicationLogResponse, error) { opts := repository.MedicationLogListOptions{ PigBatchID: req.PigBatchID, MedicationID: req.MedicationID, OperatorID: req.OperatorID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } if req.Reason != nil { reason := models.MedicationReasonType(*req.Reason) opts.Reason = &reason } data, total, err := s.medicationRepo.ListMedicationLogs(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListMedicationLogResponse(data, total, req.Page, req.PageSize), nil } // ListPigBatchLogs 负责处理查询猪批次日志列表的业务逻辑 func (s *monitorService) ListPigBatchLogs(req *dto.ListPigBatchLogRequest) (*dto.ListPigBatchLogResponse, error) { opts := repository.PigBatchLogListOptions{ PigBatchID: req.PigBatchID, OperatorID: req.OperatorID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } if req.ChangeType != nil { changeType := models.LogChangeType(*req.ChangeType) opts.ChangeType = &changeType } data, total, err := s.pigBatchLogRepo.List(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListPigBatchLogResponse(data, total, req.Page, req.PageSize), nil } // ListWeighingBatches 负责处理查询批次称重记录列表的业务逻辑 func (s *monitorService) ListWeighingBatches(req *dto.ListWeighingBatchRequest) (*dto.ListWeighingBatchResponse, error) { opts := repository.WeighingBatchListOptions{ PigBatchID: req.PigBatchID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } data, total, err := s.pigBatchRepo.ListWeighingBatches(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListWeighingBatchResponse(data, total, req.Page, req.PageSize), nil } // ListWeighingRecords 负责处理查询单次称重记录列表的业务逻辑 func (s *monitorService) ListWeighingRecords(req *dto.ListWeighingRecordRequest) (*dto.ListWeighingRecordResponse, error) { opts := repository.WeighingRecordListOptions{ WeighingBatchID: req.WeighingBatchID, PenID: req.PenID, OperatorID: req.OperatorID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } data, total, err := s.pigBatchRepo.ListWeighingRecords(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListWeighingRecordResponse(data, total, req.Page, req.PageSize), nil } // ListPigTransferLogs 负责处理查询猪只迁移日志列表的业务逻辑 func (s *monitorService) ListPigTransferLogs(req *dto.ListPigTransferLogRequest) (*dto.ListPigTransferLogResponse, error) { opts := repository.PigTransferLogListOptions{ PigBatchID: req.PigBatchID, PenID: req.PenID, OperatorID: req.OperatorID, CorrelationID: req.CorrelationID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } if req.TransferType != nil { transferType := models.PigTransferType(*req.TransferType) opts.TransferType = &transferType } data, total, err := s.pigTransferLogRepo.ListPigTransferLogs(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListPigTransferLogResponse(data, total, req.Page, req.PageSize), nil } // ListPigSickLogs 负责处理查询病猪日志列表的业务逻辑 func (s *monitorService) ListPigSickLogs(req *dto.ListPigSickLogRequest) (*dto.ListPigSickLogResponse, error) { opts := repository.PigSickLogListOptions{ PigBatchID: req.PigBatchID, PenID: req.PenID, OperatorID: req.OperatorID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } if req.Reason != nil { reason := models.PigBatchSickPigReasonType(*req.Reason) opts.Reason = &reason } if req.TreatmentLocation != nil { treatmentLocation := models.PigBatchSickPigTreatmentLocation(*req.TreatmentLocation) opts.TreatmentLocation = &treatmentLocation } data, total, err := s.pigSickLogRepo.ListPigSickLogs(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListPigSickLogResponse(data, total, req.Page, req.PageSize), nil } // ListPigPurchases 负责处理查询猪只采购记录列表的业务逻辑 func (s *monitorService) ListPigPurchases(req *dto.ListPigPurchaseRequest) (*dto.ListPigPurchaseResponse, error) { opts := repository.PigPurchaseListOptions{ PigBatchID: req.PigBatchID, Supplier: req.Supplier, OperatorID: req.OperatorID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } data, total, err := s.pigTradeRepo.ListPigPurchases(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListPigPurchaseResponse(data, total, req.Page, req.PageSize), nil } // ListPigSales 负责处理查询猪只销售记录列表的业务逻辑 func (s *monitorService) ListPigSales(req *dto.ListPigSaleRequest) (*dto.ListPigSaleResponse, error) { opts := repository.PigSaleListOptions{ PigBatchID: req.PigBatchID, Buyer: req.Buyer, OperatorID: req.OperatorID, OrderBy: req.OrderBy, StartTime: req.StartTime, EndTime: req.EndTime, } data, total, err := s.pigTradeRepo.ListPigSales(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListPigSaleResponse(data, total, req.Page, req.PageSize), nil } // ListNotifications 负责处理查询通知列表的业务逻辑 func (s *monitorService) ListNotifications(req *dto.ListNotificationRequest) (*dto.ListNotificationResponse, error) { opts := repository.NotificationListOptions{ UserID: req.UserID, NotifierType: req.NotifierType, Level: req.Level, StartTime: req.StartTime, EndTime: req.EndTime, OrderBy: req.OrderBy, Status: req.Status, } data, total, err := s.notificationRepo.List(opts, req.Page, req.PageSize) if err != nil { return nil, err } return dto.NewListNotificationResponse(data, total, req.Page, req.PageSize), nil }