1. 增加重复顺序校验

2. 增加测试用例
This commit is contained in:
2025-09-13 21:14:22 +08:00
parent 287c27a5ab
commit 9fc9cda08e
4 changed files with 414 additions and 28 deletions

View File

@@ -125,6 +125,11 @@ func (r *gormPlanRepository) Create(plan *models.Plan) error {
return ErrMixedContent
}
// 检查是否有重复的执行顺序
if err := plan.ValidateExecutionOrder(); err != nil {
return fmt.Errorf("计划 (ID: %d) 的执行顺序无效: %w", plan.ID, err)
}
// 如果是子计划类型验证所有子计划是否存在且ID不为0
if plan.ContentType == models.PlanContentTypeSubPlans {
childIDsToValidate := make(map[uint]bool)
@@ -156,28 +161,6 @@ func (r *gormPlanRepository) Create(plan *models.Plan) error {
if err := tx.Create(plan).Error; err != nil {
return err
}
// 3. 处理子计划关联 (如果 ContentType 是 sub_plans)
// GORM 不会自动创建 SubPlan 关联记录,需要手动处理
if plan.ContentType == models.PlanContentTypeSubPlans {
// 收集所有 SubPlan 关联,设置 ParentPlanID
var subPlanLinksToCreate []models.SubPlan
for i := range plan.SubPlans {
plan.SubPlans[i].ParentPlanID = plan.ID // 设置父计划ID
// 确保 ChildPlanID 被正确设置,因为 ChildPlan 对象可能只在内存中
if plan.SubPlans[i].ChildPlanID == 0 && plan.SubPlans[i].ChildPlan != nil {
plan.SubPlans[i].ChildPlanID = plan.SubPlans[i].ChildPlan.ID
}
subPlanLinksToCreate = append(subPlanLinksToCreate, plan.SubPlans[i])
}
// 批量创建 SubPlan 关联记录
if len(subPlanLinksToCreate) > 0 {
if err := tx.CreateInBatches(subPlanLinksToCreate, 100).Error; err != nil { // 批量大小100
return err
}
}
}
return nil
})
}
@@ -214,7 +197,12 @@ func (r *gormPlanRepository) validatePlanTree(tx *gorm.DB, plan *models.Plan) er
return err
}
// 3. 一次性数据库存在性校验
// 3. 检查是否有重复的执行顺序
if err := plan.ValidateExecutionOrder(); err != nil {
return fmt.Errorf("计划 (ID: %d) 的执行顺序无效: %w", plan.ID, err)
}
// 4. 一次性数据库存在性校验
var idsToCheck []uint
for id := range allIDs {
idsToCheck = append(idsToCheck, id)
@@ -229,7 +217,6 @@ func (r *gormPlanRepository) validatePlanTree(tx *gorm.DB, plan *models.Plan) er
return ErrNodeDoesNotExist
}
}
return nil
}