113 lines
3.0 KiB
Go
113 lines
3.0 KiB
Go
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
|
||
}
|