package questionnaire_template import ( "fmt" "surveyService/model" "surveyService/response" "surveyService/service/questionnaire_subject" "surveyService/validators" "github.com/samber/lo" "gorm.io/gorm" ) // 获取问题模板下的问题库列表 func ListSubjects(templateId int64) []*model.QuestionnaireTemplateSubject { var subjects []*model.QuestionnaireTemplateSubject // 获取问题模板下的问题库列表 model.DB.Where("template_id = ?", templateId).Preload("Subject").Order("sort asc").Order("id asc").Find(&subjects) return subjects } // 删除问题模板下的问题库 func DeleteSubject(templateId int64, subjectIds []int64) *response.ErrCode { model.DB.Where("template_id = ?", templateId).Where("id in (?)", subjectIds).Delete(&model.QuestionnaireTemplateSubject{}) return nil } // 添加问题模板下的问题库 func AddSubject(templateId int64, subjectIds []int64) *response.ErrCode { // 检查模板是否存在 _, findErr := Find(templateId) if findErr != nil { return findErr } if len(subjectIds) > 0 { // 检查问题是否都存在 existsSubjects := questionnaire_subject.ListByIds(subjectIds) if len(existsSubjects) < len(subjectIds) { return &response.ErrCode{ Code: response.ERROR, Msg: fmt.Sprintf("有%d个问题无效或不存在", len(subjectIds)-len(existsSubjects)), } } // 将已经存在的问题模板下的问题过滤掉 var existsSubjectIds []int64 model.DB.Model(&model.QuestionnaireTemplateSubject{}).Where("template_id = ?", templateId).Where("subject_id in (?)", subjectIds).Pluck("subject_id", &existsSubjectIds) // 取差集 diffSubjectIds, _ := lo.Difference(subjectIds, existsSubjectIds) if len(diffSubjectIds) > 0 { var templateSubjects []*model.QuestionnaireTemplateSubject for _, subjectId := range diffSubjectIds { templateSubjects = append(templateSubjects, &model.QuestionnaireTemplateSubject{ TemplateID: templateId, SubjectID: subjectId, Sort: 999, }) } // 批量插入 model.DB.CreateInBatches(&templateSubjects, 100) } } return nil } // 批量修改排序 func UpdateSort(templateId int64, templateSubjectIds []int64) *response.ErrCode { // 检查模板是否存在 _, findErr := Find(templateId) if findErr != nil { return findErr } if len(templateSubjectIds) > 0 { sqlExpr := "case id" for templateSubjectIndex, templateSubjectId := range templateSubjectIds { sqlExpr += " when " + fmt.Sprint(templateSubjectId) + " then " + fmt.Sprint(templateSubjectIndex+1) } sqlExpr += " else sort end" model.DB.Model(&model.QuestionnaireTemplateSubject{}).Where("template_id = ?", templateId).Update("sort", gorm.Expr(sqlExpr)) } return nil } // 格式化 func FormatTemplateSubject(templateSubject *model.QuestionnaireTemplateSubject) *validators.QuestionnaireTemplateSubject { return &validators.QuestionnaireTemplateSubject{ ID: templateSubject.ID, Sort: templateSubject.Sort, QuestionnaireSubject: questionnaire_subject.Format(&templateSubject.Subject), } }