questionnaire_template_subject.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package questionnaire_template
  2. import (
  3. "fmt"
  4. "surveyService/model"
  5. "surveyService/response"
  6. "surveyService/service/questionnaire_subject"
  7. "surveyService/validators"
  8. "github.com/samber/lo"
  9. "gorm.io/gorm"
  10. )
  11. // 获取问题模板下的问题库列表
  12. func ListSubjects(templateId int64) []*model.QuestionnaireTemplateSubject {
  13. var subjects []*model.QuestionnaireTemplateSubject
  14. // 获取问题模板下的问题库列表
  15. model.DB.Where("template_id = ?", templateId).Preload("Subject").Order("sort asc").Order("id asc").Find(&subjects)
  16. return subjects
  17. }
  18. // 删除问题模板下的问题库
  19. func DeleteSubject(templateId int64, subjectIds []int64) *response.ErrCode {
  20. model.DB.Where("template_id = ?", templateId).Where("id in (?)", subjectIds).Delete(&model.QuestionnaireTemplateSubject{})
  21. return nil
  22. }
  23. // 添加问题模板下的问题库
  24. func AddSubject(templateId int64, subjectIds []int64) *response.ErrCode {
  25. // 检查模板是否存在
  26. _, findErr := Find(templateId)
  27. if findErr != nil {
  28. return findErr
  29. }
  30. if len(subjectIds) > 0 {
  31. // 检查问题是否都存在
  32. existsSubjects := questionnaire_subject.ListByIds(subjectIds)
  33. if len(existsSubjects) < len(subjectIds) {
  34. return &response.ErrCode{
  35. Code: response.ERROR,
  36. Msg: fmt.Sprintf("有%d个问题无效或不存在", len(subjectIds)-len(existsSubjects)),
  37. }
  38. }
  39. // 将已经存在的问题模板下的问题过滤掉
  40. var existsSubjectIds []int64
  41. model.DB.Model(&model.QuestionnaireTemplateSubject{}).Where("template_id = ?", templateId).Where("subject_id in (?)", subjectIds).Pluck("subject_id", &existsSubjectIds)
  42. // 取差集
  43. diffSubjectIds, _ := lo.Difference(subjectIds, existsSubjectIds)
  44. if len(diffSubjectIds) > 0 {
  45. var templateSubjects []*model.QuestionnaireTemplateSubject
  46. for _, subjectId := range diffSubjectIds {
  47. templateSubjects = append(templateSubjects, &model.QuestionnaireTemplateSubject{
  48. TemplateID: templateId,
  49. SubjectID: subjectId,
  50. Sort: 999,
  51. })
  52. }
  53. // 批量插入
  54. model.DB.CreateInBatches(&templateSubjects, 100)
  55. }
  56. }
  57. return nil
  58. }
  59. // 批量修改排序
  60. func UpdateSort(templateId int64, templateSubjectIds []int64) *response.ErrCode {
  61. // 检查模板是否存在
  62. _, findErr := Find(templateId)
  63. if findErr != nil {
  64. return findErr
  65. }
  66. if len(templateSubjectIds) > 0 {
  67. sqlExpr := "case id"
  68. for templateSubjectIndex, templateSubjectId := range templateSubjectIds {
  69. sqlExpr += " when " + fmt.Sprint(templateSubjectId) + " then " + fmt.Sprint(templateSubjectIndex+1)
  70. }
  71. sqlExpr += " else sort end"
  72. model.DB.Model(&model.QuestionnaireTemplateSubject{}).Where("template_id = ?", templateId).Update("sort", gorm.Expr(sqlExpr))
  73. }
  74. return nil
  75. }
  76. // 格式化
  77. func FormatTemplateSubject(templateSubject *model.QuestionnaireTemplateSubject) *validators.QuestionnaireTemplateSubject {
  78. return &validators.QuestionnaireTemplateSubject{
  79. ID: templateSubject.ID,
  80. Sort: templateSubject.Sort,
  81. QuestionnaireSubject: questionnaire_subject.Format(&templateSubject.Subject),
  82. }
  83. }