feat: 🚀 新增智能编排日程接口与算法模块 * 新增智能编排日程接口,实现自动生成周维度课程安排 * 抽离核心算法至 `Logic` 包,统一存放调度与排课相关算法逻辑,优化项目结构分层 * 大多数用例测试通过,当前存在少量边界用例下“排课时间是否充足”的误判问题 * 返回的周视图数据在极端场景下存在数量偏差,待进一步完善边界控制 fix: 🐛 修复批量导入课程接口 500 错误 * 修复批量导入课程接口中未在 `event` 结构体填写时间字段的问题 * 解决因时间字段为空导致的服务端 500 错误,保证数据完整性 refactor: ♻️ 新增入参校验逻辑保障调度稳定性 * 在添加任务类时新增入参校验逻辑 * 避免非法数据进入调度流程,确保自动编排日程接口执行稳定 docs: 📚 更新 README 智能编排算法说明 * 补充智能编排日程算法的设计思路与实现说明 undo: ⚠️ 追加导入课程后缓存未自动失效 * 追加导入课程后未自动删除对应周安排缓存,存在数据不一致风险 * 当前未能稳定复现,计划后续定位缓存失效时序与触发条件问题
51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
package dao
|
||
|
||
import (
|
||
"context"
|
||
|
||
"github.com/LoveLosita/smartflow/backend/model"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
type CourseDAO struct {
|
||
db *gorm.DB
|
||
}
|
||
|
||
// NewCourseDAO 创建ScheduleDAO实例
|
||
func NewCourseDAO(db *gorm.DB) *CourseDAO {
|
||
return &CourseDAO{
|
||
db: db,
|
||
}
|
||
}
|
||
|
||
func (r *CourseDAO) WithTx(tx *gorm.DB) *CourseDAO {
|
||
return &CourseDAO{db: tx}
|
||
}
|
||
|
||
func (r *CourseDAO) AddUserCoursesIntoSchedule(ctx context.Context, courses []model.Schedule) error {
|
||
if err := r.db.WithContext(ctx).Create(&courses).Error; err != nil {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func (r *CourseDAO) AddUserCoursesIntoScheduleEvents(ctx context.Context, events []model.ScheduleEvent) ([]int, error) {
|
||
if err := r.db.WithContext(ctx).Create(&events).Error; err != nil {
|
||
return nil, err
|
||
}
|
||
ids := make([]int, 0, len(events))
|
||
for i := range events {
|
||
ids = append(ids, events[i].ID)
|
||
}
|
||
return ids, nil
|
||
}
|
||
|
||
// Transaction 在同一个数据库事务中执行传入的函数,供 service 层复用(自动提交/回滚)
|
||
// 规则:fn 返回 nil \-\> 提交;fn 返回 error 或发生 panic \-\> 回滚
|
||
// 说明:gorm\.\(\\\*DB\)\.Transaction 会在 fn 返回 error 时回滚,并在发生 panic 时自动回滚后继续向上抛出 panic
|
||
func (r *CourseDAO) Transaction(fn func(txDAO *CourseDAO) error) error {
|
||
return r.db.Transaction(func(tx *gorm.DB) error {
|
||
return fn(NewCourseDAO(tx))
|
||
})
|
||
}
|