Version: 0.3.9.dev.260226
fix: 🐛 修复智能排程接口任务块信息缺失与数据插入错误 * 修复智能排程接口返回的任务块信息缺失问题,确保任务数据完整返回 * 修复 `UserInsertTaskItemRequestToModel` DTO 函数未填入起始时间字段的问题,解决多个接口插入数据时出现 500 错误 * 错误源自上次更新“获取最近完成动态任务接口”时,未同步更改数据库字段对应逻辑 * 将智能排程接口的 `ctx` 超时恢复为 1 秒,优化接口响应性能 feat: 🎯 新增正式应用日程接口 * 新增正式应用日程接口,并完成功能测试,确保业务流程无异常
This commit is contained in:
@@ -573,3 +573,55 @@ func (d *ScheduleDAO) GetUserSchedulesByTimeRange(ctx context.Context, userID in
|
||||
}
|
||||
return schedules, nil
|
||||
}
|
||||
|
||||
func (d *ScheduleDAO) BatchEmbedTaskIntoSchedule(ctx context.Context, eventIDs, taskItemIDs []int) error {
|
||||
if len(eventIDs) == 0 {
|
||||
return nil
|
||||
}
|
||||
if len(eventIDs) != len(taskItemIDs) {
|
||||
return fmt.Errorf("eventIDs length != taskItemIDs length")
|
||||
}
|
||||
|
||||
db := d.db.WithContext(ctx)
|
||||
|
||||
for i, eventID := range eventIDs {
|
||||
taskItemID := taskItemIDs[i]
|
||||
|
||||
// 1) 校验该 event 是否为 course
|
||||
var typ string
|
||||
if err := db.
|
||||
Table("schedule_events").
|
||||
Select("type").
|
||||
Where("id = ?", eventID).
|
||||
Scan(&typ).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if typ != "course" {
|
||||
continue
|
||||
}
|
||||
|
||||
// 2) 一 event 对多 schedules:批量写入 embedded_task_id
|
||||
if err := db.
|
||||
Table("schedules").
|
||||
Where("event_id = ?", eventID).
|
||||
Update("embedded_task_id", taskItemID).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *ScheduleDAO) InsertScheduleEvents(ctx context.Context, events []model.ScheduleEvent) ([]int, error) {
|
||||
if len(events) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
if err := d.db.WithContext(ctx).Create(&events).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ids := make([]int, len(events))
|
||||
for i, e := range events {
|
||||
ids[i] = e.ID
|
||||
}
|
||||
return ids, nil
|
||||
}
|
||||
|
||||
@@ -212,6 +212,21 @@ func (dao *TaskClassDAO) IfTaskClassItemArranged(ctx context.Context, taskID int
|
||||
return item.EmbeddedTime != nil, nil
|
||||
}
|
||||
|
||||
func (dao *TaskClassDAO) BatchCheckIfTaskClassItemsArranged(ctx context.Context, itemIDs []int) (bool, error) {
|
||||
if len(itemIDs) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
var count int64
|
||||
err := dao.db.WithContext(ctx).
|
||||
Model(&model.TaskClassItem{}).
|
||||
Where("id IN ? AND embedded_time IS NOT NULL", itemIDs).
|
||||
Count(&count).Error
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
return count > 0, nil
|
||||
}
|
||||
|
||||
func (dao *TaskClassDAO) DeleteTaskClassItemByID(ctx context.Context, id int) error {
|
||||
err := dao.db.WithContext(ctx).
|
||||
Where("id = ?", id).
|
||||
@@ -231,3 +246,55 @@ func (dao *TaskClassDAO) DeleteTaskClassByID(ctx context.Context, id int) error
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (dao *TaskClassDAO) BatchUpdateTaskClassItemEmbeddedTime(ctx context.Context, itemIDs []int, updates []*model.TargetTime) error {
|
||||
if len(itemIDs) == 0 {
|
||||
return nil
|
||||
}
|
||||
if len(itemIDs) != len(updates) {
|
||||
return errors.New("itemIDs length mismatch updates length")
|
||||
}
|
||||
|
||||
// 单条 SQL 批量更新:UPDATE ... SET embedded_time = CASE id WHEN ? THEN ? ... END WHERE id IN (?)
|
||||
caseSQL := "CASE id"
|
||||
args := make([]any, 0, len(itemIDs)*2)
|
||||
for i, id := range itemIDs {
|
||||
caseSQL += " WHEN ? THEN ?"
|
||||
args = append(args, id, updates[i])
|
||||
}
|
||||
caseSQL += " END"
|
||||
|
||||
res := dao.db.WithContext(ctx).
|
||||
Model(&model.TaskClassItem{}).
|
||||
Where("id IN ?", itemIDs).
|
||||
Update("embedded_time", gorm.Expr(caseSQL, args...))
|
||||
|
||||
return res.Error
|
||||
}
|
||||
|
||||
func (dao *TaskClassDAO) ValidateTaskItemIDsBelongToTaskClass(ctx context.Context, taskClassID int, itemIDs []int) (bool, error) {
|
||||
if len(itemIDs) == 0 {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
var count int64
|
||||
err := dao.db.WithContext(ctx).
|
||||
Model(&model.TaskClassItem{}).
|
||||
Where("id IN ? AND category_id = ?", itemIDs, taskClassID).
|
||||
Count(&count).Error
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
return count == int64(len(itemIDs)), nil
|
||||
}
|
||||
|
||||
func (dao *TaskClassDAO) GetTaskClassItemsByIDs(ctx context.Context, itemIDs []int) ([]model.TaskClassItem, error) {
|
||||
var items []model.TaskClassItem
|
||||
err := dao.db.WithContext(ctx).
|
||||
Where("id IN ?", itemIDs).
|
||||
Find(&items).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user