1. 调整之前的Feed数据库查询方法
2. 实现CreateFeedingPlan
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sort"
|
||||||
|
|
||||||
"git.huangwc.com/pig/pig-farm-controller/internal/model"
|
"git.huangwc.com/pig/pig-farm-controller/internal/model"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
@@ -9,7 +11,13 @@ import (
|
|||||||
type FeedPlanRepo interface {
|
type FeedPlanRepo interface {
|
||||||
|
|
||||||
// ListAllPlanIntroduction 获取所有计划简介
|
// 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 {
|
type feedPlanRepo struct {
|
||||||
@@ -23,10 +31,82 @@ func NewFeedPlanRepo(db *gorm.DB) FeedPlanRepo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ListAllPlanIntroduction 获取所有计划简介
|
// ListAllPlanIntroduction 获取所有计划简介
|
||||||
func (f *feedPlanRepo) ListAllPlanIntroduction() ([]model.FeedingPlan, error) {
|
func (f *feedPlanRepo) ListAllPlanIntroduction() ([]*model.FeedingPlan, error) {
|
||||||
var plans []model.FeedingPlan
|
var plans []*model.FeedingPlan
|
||||||
err := f.db.Model(&model.FeedingPlan{}).
|
err := f.db.Model(&model.FeedingPlan{}).
|
||||||
Select("id, name, description, type, enabled, schedule_cron").
|
Select("id, name, description, type, enabled, schedule_cron").
|
||||||
Find(&plans).Error
|
Find(&plans).Error
|
||||||
return plans, err
|
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