package repository import ( "sort" "git.huangwc.com/pig/pig-farm-controller/internal/model" "gorm.io/gorm" ) // FeedPlanRepo 饲喂管理接口 type FeedPlanRepo interface { // ListAllPlanIntroduction 获取所有计划简介 ListAllPlanIntroduction() ([]*model.FeedingPlan, error) // FindFeedingPlanByID 根据ID获取计划详情 FindFeedingPlanByID(id uint) (*model.FeedingPlan, error) // CreateFeedingPlan 创建饲料计划 CreateFeedingPlan(feedingPlan *model.FeedingPlan) error } type feedPlanRepo struct { db *gorm.DB } func NewFeedPlanRepo(db *gorm.DB) FeedPlanRepo { return &feedPlanRepo{ db: db, } } // ListAllPlanIntroduction 获取所有计划简介 func (f *feedPlanRepo) ListAllPlanIntroduction() ([]*model.FeedingPlan, error) { var plans []*model.FeedingPlan err := f.db.Model(&model.FeedingPlan{}). Select("id, name, description, type, enabled, schedule_cron"). Find(&plans).Error return plans, err } // FindFeedingPlanByID 根据ID获取计划详情 func (f *feedPlanRepo) FindFeedingPlanByID(feedingPlanID uint) (*model.FeedingPlan, error) { var plan model.FeedingPlan err := f.db.Where("id = ?", feedingPlanID). Preload("Steps"). Preload("SubPlans"). First(&plan).Error if err != nil { return nil, err } return &plan, nil } // CreateFeedingPlan 创建饲料计划,包括步骤和子计划 func (f *feedPlanRepo) CreateFeedingPlan(feedingPlan *model.FeedingPlan) error { return f.db.Transaction(func(tx *gorm.DB) error { return f.createFeedingPlanWithTx(tx, feedingPlan) }) } // createFeedingPlanWithTx 在事务中递归创建饲料计划 func (f *feedPlanRepo) createFeedingPlanWithTx(tx *gorm.DB, feedingPlan *model.FeedingPlan) error { // 先创建计划主体 if err := tx.Create(feedingPlan).Error; err != nil { return err } // 处理步骤 - 先按现有顺序排序,再重新分配从0开始的连续编号 sort.Slice(feedingPlan.Steps, func(i, j int) bool { return feedingPlan.Steps[i].StepOrder < feedingPlan.Steps[j].StepOrder }) // 重新填充步骤编号 for i := range feedingPlan.Steps { feedingPlan.Steps[i].StepOrder = i feedingPlan.Steps[i].PlanID = feedingPlan.ID } // 如果有步骤,批量创建步骤 if len(feedingPlan.Steps) > 0 { if err := tx.Create(&feedingPlan.Steps).Error; err != nil { return err } } // 处理子计划 - 重新填充子计划编号 sort.Slice(feedingPlan.SubPlans, func(i, j int) bool { // 如果OrderInParent为nil,放在最后 if feedingPlan.SubPlans[i].OrderInParent == nil { return false } if feedingPlan.SubPlans[j].OrderInParent == nil { return true } return *feedingPlan.SubPlans[i].OrderInParent < *feedingPlan.SubPlans[j].OrderInParent }) // 重新填充子计划编号和父ID for i := range feedingPlan.SubPlans { order := i feedingPlan.SubPlans[i].OrderInParent = &order feedingPlan.SubPlans[i].ParentID = &feedingPlan.ID // 递归创建子计划 if err := f.createFeedingPlanWithTx(tx, &feedingPlan.SubPlans[i]); err != nil { return err } } return nil }