package service import ( "errors" "knowledge/api/dao" "knowledge/api/dto" "knowledge/api/requests" "sort" "time" ) type ShareService struct { } func (r *ShareService) GetShare(req requests.GetShare) (g *dto.ShareDto, err error) { questionQaDao := dao.QuestionQaDao{} questionQaItemDao := dao.QuestionQaItemDao{} questionDao := dao.QuestionDao{} // 获取题库数据 maps := make(map[string]interface{}) maps["qa_share_id"] = req.QaShareId questionQa, err := questionQaDao.GetQuestionQa(maps) if err != nil || questionQa == nil { return nil, errors.New("题库不存在") } if questionQa.QaStatus == 2 { return nil, errors.New("题库已失效") } if questionQa.QaPassword != req.QaPassword { return nil, errors.New("密码错误") } // 检测过期时间 now := time.Now() qaExpireTime := time.Time(questionQa.QaExpireTime) if qaExpireTime.Before(now) { return nil, errors.New("题库已失效") } // 加载题库数据 g = &dto.ShareDto{} g.QuestionQa = dto.GetQuestionQaDto(questionQa) // 获取题库明细数据-必备选中 maps = make(map[string]interface{}) maps["qa_id"] = questionQa.QaId maps["is_must_select"] = 1 questionQaItems, err := questionQaItemDao.GetQuestionQaItemList(maps) if err == nil && len(questionQaItems) > 0 { shareQuestionDtos := make([]*dto.ShareQuestionDto, len(questionQaItems)) for i, item := range questionQaItems { // 获取题目数据 question, err := questionDao.GetQuestionById(item.QuestionId) if err != nil { return nil, errors.New("题目错误") } shareQuestionDto := dto.GetShareQuestionDto(question) shareQuestionDto.IsMustSelect = item.IsMustSelect // 将转换后的结构体添加到新切片中 shareQuestionDtos[i] = shareQuestionDto } g.Question = shareQuestionDtos } // 计算剩余题目数量 remainingQuantity := questionQa.QaQuantity - len(questionQaItems) if remainingQuantity > 0 { // 随机获取剩余题目 maps = make(map[string]interface{}) maps["qa_id"] = questionQa.QaId maps["is_must_select"] = 0 questionQaItems, err = questionQaItemDao.GetQuestionQaItemListRand(maps, 1) if err == nil && len(questionQaItems) > 0 { for _, item := range questionQaItems { // 获取题目数据 question, err := questionDao.GetQuestionById(item.QuestionId) if err != nil { return nil, errors.New("题目错误") } shareQuestionDto := dto.GetShareQuestionDto(question) shareQuestionDto.IsMustSelect = item.IsMustSelect // 将转换后的结构体添加到新切片中 g.Question = append(g.Question, shareQuestionDto) } } } // 按照难度重新排序题目顺序 sort.SliceStable(g.Question, func(i, j int) bool { return g.Question[i].Difficulty < g.Question[j].Difficulty }) return g, nil }