From 1a14aec19b7a0c7292bc2f6a276f0b0960d35f8a Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Wed, 10 Sep 2025 14:15:03 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E8=B0=83=E6=95=B4=E4=B9=8B=E5=89=8D?= =?UTF-8?q?=E7=9A=84Feed=E6=95=B0=E6=8D=AE=E5=BA=93=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=96=B9=E6=B3=95=202.=20=E5=AE=9E=E7=8E=B0CreateFeedingPlan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/storage/repository/feed.go | 86 ++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 3 deletions(-) diff --git a/internal/storage/repository/feed.go b/internal/storage/repository/feed.go index d92897f..d5083fb 100644 --- a/internal/storage/repository/feed.go +++ b/internal/storage/repository/feed.go @@ -1,6 +1,8 @@ package repository import ( + "sort" + "git.huangwc.com/pig/pig-farm-controller/internal/model" "gorm.io/gorm" ) @@ -9,7 +11,13 @@ import ( type FeedPlanRepo interface { // ListAllPlanIntroduction 获取所有计划简介 - ListAllPlanIntroduction() ([]model.FeedingPlan, error) + ListAllPlanIntroduction() ([]*model.FeedingPlan, error) + + // FindFeedingPlanByID 根据ID获取计划详情 + FindFeedingPlanByID(id uint) (*model.FeedingPlan, error) + + // CreateFeedingPlan 创建饲料计划 + CreateFeedingPlan(feedingPlan *model.FeedingPlan) error } type feedPlanRepo struct { @@ -23,10 +31,82 @@ func NewFeedPlanRepo(db *gorm.DB) FeedPlanRepo { } // ListAllPlanIntroduction 获取所有计划简介 -func (f *feedPlanRepo) ListAllPlanIntroduction() ([]model.FeedingPlan, error) { - var plans []model.FeedingPlan +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 +}