1. 调整之前的Feed数据库查询方法
2. 实现CreateFeedingPlan
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user