package dal import ( "eai_agentplatform/backend/internal/model" ) // Position 岗位仓库。 type PositionDAO struct{ *QueryBuilder } // List 获取岗位列表。 func (r PositionDAO) List(status string) []model.Position { q := r.Type(&model.Position{}) if status != "" { q = q.Where("status = ?", status) } else { q = q.Where("status = ?", "active") } var items []model.Position if q.Order("id ASC").Find(&items) { return items } return nil } // GetByID 按 ID 获取。 func (r PositionDAO) GetByID(id uint) (model.Position, bool) { var p model.Position if r.Type(&p).Where("id = ?", id).First(&p) { return p, true } return model.Position{}, false } // GetByName 按名称获取。 func (r PositionDAO) GetByName(name string) (model.Position, bool) { var p model.Position if r.Type(&p).Where("name = ?", name).First(&p) { return p, true } return model.Position{}, false } // Insert 创建岗位。 func (r PositionDAO) Insert(p *model.Position) bool { return r.QueryBuilder.Insert(p) } // Update 更新岗位。 func (r PositionDAO) Update(p *model.Position) bool { return r.Save(p) } // Delete 软删除。 func (r PositionDAO) Delete(id uint) bool { return r.Type(&model.Position{}).Where("id = ?", id).Updates(map[string]any{"status": "inactive"}) } // CountByDepartment 统计某部门的岗位数。 func (r PositionDAO) CountByDepartment(departmentID uint) int64 { var c int64 r.Inner().Model(&model.Position{}).Where("department_id = ?", departmentID).Count(&c) return c } // CountByName 按名称统计(唯一性检查)。 func (r PositionDAO) CountByName(name string, excludeID *uint) int64 { q := r.Inner().Model(&model.Position{}).Where("name = ?", name) if excludeID != nil { q = q.Where("id <> ?", *excludeID) } var c int64 q.Count(&c) return c } // ============ 岗位知识映射(PositionKnowledge) ============ // Knowledge 取岗位知识映射(按 id ASC)。学员应学清单与管理员编辑页共用。 func (r PositionDAO) Knowledge(positionID uint) []model.PositionKnowledge { var items []model.PositionKnowledge if r.Type(&items).Where("position_id = ?", positionID).Order("id ASC").Find(&items) { return items } return nil } // ReplaceKnowledge 整表覆盖岗位知识映射(先删旧、再批量插入)。 // 两步非原子:调用方若需强一致,应在事务中执行。 func (r PositionDAO) ReplaceKnowledge(positionID uint, rows []model.PositionKnowledge) bool { if !r.Type(&model.PositionKnowledge{}).Where("position_id = ?", positionID). Delete(&model.PositionKnowledge{}) { return false } if len(rows) == 0 { return true } return r.Type(&rows).Create(&rows) } // CountKnowledge 统计岗位知识映射条数。 func (r PositionDAO) CountKnowledge(positionID uint) int64 { var c int64 r.Inner().Model(&model.PositionKnowledge{}).Where("position_id = ?", positionID).Count(&c) return c } // ============ 岗位考试蓝图(PositionExamBlueprint) ============ // Blueprints 取岗位考试蓝图(按 id ASC)。 func (r PositionDAO) Blueprints(positionID uint) []model.PositionExamBlueprint { var items []model.PositionExamBlueprint if r.Type(&items).Where("position_id = ?", positionID).Order("id ASC").Find(&items) { return items } return nil } // ReplaceBlueprints 整表覆盖岗位考试蓝图(先删旧、再批量插入)。 func (r PositionDAO) ReplaceBlueprints(positionID uint, rows []model.PositionExamBlueprint) bool { if !r.Type(&model.PositionExamBlueprint{}).Where("position_id = ?", positionID). Delete(&model.PositionExamBlueprint{}) { return false } if len(rows) == 0 { return true } return r.Type(&rows).Create(&rows) }