Version: 0.1.2.dev.260207
feat: ⚠️ 批量导入课程接口支持冲突预检测与冲突提示 - 批量导入课程接口支持预先检测冲突 - 返回并展示具体发生冲突的课程信息 📚💥 - 补全此前规划的冲突提示功能(把大饼补上了 🍞) refactor: 🧱 使用工作单元模式管理 dao 层事务 - 引入工作单元模式(Unit of Work)统一管理 dao 层 - 新建全局事务,使跨 repo 的 gorm 事务管理更加方便 🔁 fix: 🐛 修复将任务块添加进日程接口的多个问题 - 修复核心逻辑 bug(费了老大劲 😵💫) - 补充并覆盖该接口的多种异常与错误场景测试 🧪
This commit is contained in:
61
backend/conv/schedule.go
Normal file
61
backend/conv/schedule.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package conv
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/LoveLosita/smartflow/backend/model"
|
||||
)
|
||||
|
||||
import "sort"
|
||||
|
||||
func SchedulesToScheduleConflictDetail(schedules []model.Schedule) []model.ScheduleConflictDetail {
|
||||
if len(schedules) == 0 {
|
||||
return []model.ScheduleConflictDetail{}
|
||||
}
|
||||
// 1. 使用 Map 进行逻辑分组
|
||||
// Key 格式: EventID-Week-Day (防止同一事件在不同天出现时被混为一谈)
|
||||
groups := make(map[string]*model.ScheduleConflictDetail)
|
||||
for _, s := range schedules {
|
||||
key := fmt.Sprintf("%d-%d-%d", s.EventID, s.Week, s.DayOfWeek)
|
||||
|
||||
if _, ok := groups[key]; !ok {
|
||||
// 初始化该分组
|
||||
groups[key] = &model.ScheduleConflictDetail{
|
||||
EventID: s.EventID,
|
||||
Name: s.Event.Name,
|
||||
Location: *s.Event.Location, // 假设字段是 *string
|
||||
Type: s.Event.Type,
|
||||
Week: s.Week,
|
||||
DayOfWeek: s.DayOfWeek,
|
||||
}
|
||||
}
|
||||
// 将当前节次加入数组
|
||||
groups[key].Sections = append(groups[key].Sections, s.Section)
|
||||
}
|
||||
|
||||
// 2. 处理每个分组的区间逻辑
|
||||
res := make([]model.ScheduleConflictDetail, 0, len(groups))
|
||||
for _, detail := range groups {
|
||||
// 排序节次,例如把 [3, 1, 2] 变成 [1, 2, 3]
|
||||
sort.Ints(detail.Sections)
|
||||
|
||||
// 最小值即起始,最大值即结束
|
||||
detail.StartSection = detail.Sections[0]
|
||||
detail.EndSection = detail.Sections[len(detail.Sections)-1]
|
||||
|
||||
res = append(res, *detail)
|
||||
}
|
||||
|
||||
// 3. 可选:对结果集按时间排序,让前端收到的 DTO 也是有序的
|
||||
sort.Slice(res, func(i, j int) bool {
|
||||
if res[i].Week != res[j].Week {
|
||||
return res[i].Week < res[j].Week
|
||||
}
|
||||
if res[i].DayOfWeek != res[j].DayOfWeek {
|
||||
return res[i].DayOfWeek < res[j].DayOfWeek
|
||||
}
|
||||
return res[i].StartSection < res[j].StartSection
|
||||
})
|
||||
|
||||
return res
|
||||
}
|
||||
@@ -137,12 +137,12 @@ func ProcessUserGetCompleteTaskClassRequest(taskClass *model.TaskClass) (*model.
|
||||
}
|
||||
|
||||
// UserInsertTaskItemRequestToModel 用于将填入空闲时段日程的请求转换为 Schedule 模型
|
||||
func UserInsertTaskItemRequestToModel(req *model.UserInsertTaskClassItemToScheduleRequest, item *model.TaskClassItem, taskID, userID, startSection, endSection int) ([]model.Schedule, *model.ScheduleEvent) {
|
||||
func UserInsertTaskItemRequestToModel(req *model.UserInsertTaskClassItemToScheduleRequest, item *model.TaskClassItem, taskID *int, userID, startSection, endSection int) ([]model.Schedule, *model.ScheduleEvent) {
|
||||
var schedules []model.Schedule
|
||||
for section := startSection; section <= endSection; section++ {
|
||||
req1 := &model.Schedule{
|
||||
UserID: userID, // 由调用方填充
|
||||
EmbeddedTaskID: &taskID,
|
||||
UserID: userID,
|
||||
EmbeddedTaskID: taskID,
|
||||
Week: req.Week,
|
||||
DayOfWeek: req.DayOfWeek,
|
||||
Section: section,
|
||||
|
||||
Reference in New Issue
Block a user