Version: 0.3.2.dev.260214

feat:  新增获取当前正在进行的任务接口并完成测试

- 若当前为上课时间,返回当前任务 📚
- 若当前为下课/空闲时间,返回下一个任务 ➡️
- 若存在嵌入任务,支持嵌套返回结构 🧩
- 接口已测试通过 🧪

docs: 📝 小幅更新 README

fix: 🐛 修复获取最近已完成任务列表接口的遗漏问题

- 修复无法获取嵌入在课程中的任务问题 🔧

fix: 🐛 修复删除日程接口的字段遗漏问题

- 若删除的是单独任务块,补充删除 task_item 表的 embedded_time 字段
- 避免数据残留与状态异常 
This commit is contained in:
LoveLosita
2026-02-14 21:46:02 +08:00
parent 63500b3b2a
commit dad1eade93
11 changed files with 347 additions and 48 deletions

View File

@@ -256,9 +256,9 @@ func SchedulesToUserWeeklySchedule(schedules []model.Schedule) *model.UserWeekSc
return weekDTO
}
func SchedulesToRecentCompletedSchedules(schedules []model.Schedule) model.UserRecentCompletedScheduleResponse {
// 1. 初始化结果集
result := model.UserRecentCompletedScheduleResponse{
func SchedulesToRecentCompletedSchedules(schedules []model.Schedule) *model.UserRecentCompletedScheduleResponse {
// 1. 初始化结果集,确保即使为空也返回空数组而非 nil
result := &model.UserRecentCompletedScheduleResponse{
Events: make([]model.RecentCompletedEventBrief, 0),
}
@@ -270,29 +270,55 @@ func SchedulesToRecentCompletedSchedules(schedules []model.Schedule) model.UserR
seen := make(map[int]bool)
for _, s := range schedules {
// 2. 检查这个逻辑事件是否已经添加
// 2. 检查这个逻辑事件(课程或任务块)是否已经处理
if seen[s.EventID] {
continue
}
// 3. 格式化结束时间
// 3. 确定显示的“名分”和“类型”
displayName := s.Event.Name
displayType := s.Event.Type
// 🚀 关键逻辑:如果存在嵌入任务,则“鸠占鹊巢”
// 即使载体是 course只要里面塞了任务我们就对外宣称这是一个 task
if s.EmbeddedTask != nil && s.EmbeddedTask.Content != nil {
displayName = *s.EmbeddedTask.Content
displayType = "embedded_task"
}
// 4. 格式化结束时间 (即完成时间)
strTime := s.Event.EndTime.Format("2006-01-02 15:04:05")
// 4. 构造 Brief
// 5. 构造 Brief
temp := model.RecentCompletedEventBrief{
// 注意:这里 ID 必须改用 s.EventID (逻辑事件ID)
// 否则如果你传 s.ID前端拿到的是原子槽位的ID依然不唯一
// ID 统一使用 EventID确保唯一性且方便前端追踪逻辑块
ID: s.EventID,
Name: s.Event.Name,
Type: s.Event.Type,
Name: displayName,
Type: displayType,
CompletedTime: strTime,
}
result.Events = append(result.Events, temp)
// 5. 标记该事件已处理
// 6. 标记该事件已处理
seen[s.EventID] = true
}
return result
}
func SchedulesToUserOngoingSchedule(schedules []model.Schedule) *model.OngoingSchedule {
if len(schedules) == 0 {
return nil
}
//取第一个 Schedule 的 Event 作为正在进行的事件
ongoing := schedules[0]
return &model.OngoingSchedule{
ID: ongoing.EventID,
Name: ongoing.Event.Name,
Type: ongoing.Event.Type,
Location: *ongoing.Event.Location,
StartTime: ongoing.Event.StartTime,
EndTime: ongoing.Event.EndTime,
}
}