Version: 0.2.2.dev.260210

feat: 🗑️ 新增删除任务块接口

- 实现 schedules、schedule_events 与 task_items 三表的联动删除
- 保证数据一致性,避免遗留脏数据 
This commit is contained in:
LoveLosita
2026-02-10 22:05:59 +08:00
parent d5f0b8da63
commit 0bc06963ee
7 changed files with 142 additions and 6 deletions

View File

@@ -397,3 +397,50 @@ func (d *ScheduleDAO) SetScheduleEmbeddedTaskIDToNull(ctx context.Context, event
}
return embeddedTaskID, nil
}
func (d *ScheduleDAO) FindEmbeddedTaskIDAndDeleteIt(ctx context.Context, taskID int) (int, error) {
// 1. 先找到 schedules 表中 embedded_task_id = taskID 的记录,获取对应的 event_id
type row struct {
EventID *int `gorm:"column:event_id"`
}
var r row
err := d.db.WithContext(ctx).
Table("schedules").
Select("event_id").
Where("embedded_task_id = ?", taskID).
Order("id ASC").
Limit(1).
Scan(&r).Error
if err != nil {
return 0, err
}
if r.EventID == nil {
return 0, respond.TargetTaskNotEmbeddedInAnySchedule
}
eventID := *r.EventID
// 2. 删除该 event_id 对应的课程事件(通过级联删除实现)
res := d.db.WithContext(ctx).
Table("schedule_events").
Where("id = ?", eventID).
Delete(&model.ScheduleEvent{})
if res.Error != nil {
return 0, res.Error
}
if res.RowsAffected == 0 {
return 0, respond.TargetTaskNotEmbeddedInAnySchedule
}
return eventID, nil
}
func (d *ScheduleDAO) DeleteScheduleEventByTaskItemID(ctx context.Context, taskItemID int) error {
//直接找schedule_events表中type=task且rel_id=taskItemID的记录删除它级联删schedules
res := d.db.WithContext(ctx).
Table("schedule_events").
Where("type = ? AND rel_id = ?", "task", taskItemID).
Delete(&model.ScheduleEvent{})
if res.Error != nil {
return res.Error
}
return nil
}

View File

@@ -2,6 +2,7 @@ package dao
import (
"context"
"errors"
"github.com/LoveLosita/smartflow/backend/model"
"github.com/LoveLosita/smartflow/backend/respond"
@@ -158,12 +159,15 @@ func (dao *TaskClassDAO) GetTaskClassItemByID(ctx context.Context, id int) (*mod
func (dao *TaskClassDAO) GetTaskClassIDByTaskItemID(ctx context.Context, itemID int) (int, error) {
var item model.TaskClassItem
err := dao.db.WithContext(ctx).
res := dao.db.WithContext(ctx).
Select("category_id").
Where("id = ?", itemID).
First(&item).Error
if err != nil {
return 0, err
First(&item)
if res.Error != nil {
if errors.Is(res.Error, gorm.ErrRecordNotFound) {
return 0, respond.TaskClassItemNotFound
}
return 0, res.Error
}
return *item.CategoryID, nil
}
@@ -207,3 +211,10 @@ func (dao *TaskClassDAO) IfTaskClassItemArranged(ctx context.Context, taskID int
}
return item.EmbeddedTime != nil, nil
}
func (dao *TaskClassDAO) DeleteTaskClassItemByID(ctx context.Context, id int) error {
err := dao.db.WithContext(ctx).
Where("id = ?", id).
Delete(&model.TaskClassItem{}).Error
return err
}