|
@@ -0,0 +1,460 @@
|
|
|
|
|
+package com.hfln.portal.infrastructure.gateway.impl;
|
|
|
|
|
+
|
|
|
|
|
+import cn.hfln.framework.extension.BizException;
|
|
|
|
|
+import com.alibaba.excel.util.StringUtils;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
+import com.hfln.portal.common.dto.data.question.*;
|
|
|
|
|
+import com.hfln.portal.common.request.web.*;
|
|
|
|
|
+import com.hfln.portal.common.vo.PageRecord;
|
|
|
|
|
+import com.hfln.portal.domain.customer.util.CopyUtils;
|
|
|
|
|
+import com.hfln.portal.domain.exception.ErrorEnum;
|
|
|
|
|
+import com.hfln.portal.domain.gateway.WebQuestionGateway;
|
|
|
|
|
+import com.hfln.portal.infrastructure.po.Answer;
|
|
|
|
|
+import com.hfln.portal.infrastructure.po.Question;
|
|
|
|
|
+import com.hfln.portal.infrastructure.po.Questionnaire;
|
|
|
|
|
+import com.hfln.portal.infrastructure.po.UserInfo;
|
|
|
|
|
+import com.hfln.portal.infrastructure.service.AnswerService;
|
|
|
|
|
+import com.hfln.portal.infrastructure.service.QuestionService;
|
|
|
|
|
+import com.hfln.portal.infrastructure.service.QuestionnaireService;
|
|
|
|
|
+import com.hfln.portal.infrastructure.service.UserService;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
+
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@Slf4j
|
|
|
|
|
+@Service
|
|
|
|
|
+public class WebQuestionGatewayImpl implements WebQuestionGateway {
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private QuestionnaireService questionnaireService;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private QuestionService questionService;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private AnswerService answerService;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private UserService userService;
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public QuestionnaireDTO saveQuestionnaire(QuestionnaireSaveParam param) {
|
|
|
|
|
+
|
|
|
|
|
+ Questionnaire questionnaire;
|
|
|
|
|
+
|
|
|
|
|
+ if (param.getQuestionnaireId() != null) {
|
|
|
|
|
+ // 编辑
|
|
|
|
|
+ questionnaire = questionnaireService.getById(param.getQuestionnaireId());
|
|
|
|
|
+ if (questionnaire == null) {
|
|
|
|
|
+ throw new BizException(ErrorEnum.QUESTIONNAIRE_NOT_EXIST.getErrorCode(), ErrorEnum.QUESTIONNAIRE_NOT_EXIST.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ // 只更新允许修改的字段
|
|
|
|
|
+ BeanUtils.copyProperties(param, questionnaire, "questionnaireId");
|
|
|
|
|
+ questionnaire.setUpdateTime(LocalDateTime.now());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 新增
|
|
|
|
|
+ questionnaire = new Questionnaire();
|
|
|
|
|
+ BeanUtils.copyProperties(param, questionnaire, "questionnaireId");
|
|
|
|
|
+ questionnaire.setCreateTime(LocalDateTime.now());
|
|
|
|
|
+ questionnaire.setUpdateTime(LocalDateTime.now());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ questionnaireService.saveOrUpdate(questionnaire);
|
|
|
|
|
+
|
|
|
|
|
+ return CopyUtils.copy(questionnaire, QuestionnaireDTO.class);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void deleteQuestionnaire(Long questionnaireId) {
|
|
|
|
|
+ // 1. 检查问卷是否存在
|
|
|
|
|
+ Questionnaire questionnaire = questionnaireService.getById(questionnaireId);
|
|
|
|
|
+ if (questionnaire == null) {
|
|
|
|
|
+ throw new BizException(ErrorEnum.QUESTIONNAIRE_NOT_EXIST.getErrorCode(),
|
|
|
|
|
+ ErrorEnum.QUESTIONNAIRE_NOT_EXIST.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 查询问卷下的所有问题
|
|
|
|
|
+ List<Question> questions = questionService.list(
|
|
|
|
|
+ new LambdaQueryWrapper<Question>()
|
|
|
|
|
+ .eq(Question::getQuestionnaireId, questionnaireId)
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ if (!questions.isEmpty()) {
|
|
|
|
|
+ // 3. 删除问题对应的所有答案
|
|
|
|
|
+ List<Long> questionIds = questions.stream()
|
|
|
|
|
+ .map(Question::getQuestionId)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ answerService.remove(
|
|
|
|
|
+ new LambdaQueryWrapper<Answer>()
|
|
|
|
|
+ .in(Answer::getQuestionId, questionIds)
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 删除问题
|
|
|
|
|
+ questionService.remove(
|
|
|
|
|
+ new LambdaQueryWrapper<Question>()
|
|
|
|
|
+ .eq(Question::getQuestionnaireId, questionnaireId)
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 删除问卷
|
|
|
|
|
+ boolean removed = questionnaireService.removeById(questionnaireId);
|
|
|
|
|
+ if (!removed) {
|
|
|
|
|
+ throw new BizException(ErrorEnum.DELETE_QUESTIONNAIRE_FAIL.getErrorCode(), ErrorEnum.DELETE_QUESTIONNAIRE_FAIL.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public PageRecord<QuestionnaireDTO> queryQuestionnaire(QuestionnaireQueryParam param) {
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 构建分页对象
|
|
|
|
|
+ Page<Questionnaire> pageRequest = new Page<>(param.getPageNo(), param.getPageSize());
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 构建查询条件
|
|
|
|
|
+ LambdaQueryWrapper<Questionnaire> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+
|
|
|
|
|
+ if (param.getTitle() != null && !param.getTitle().isEmpty()) {
|
|
|
|
|
+ queryWrapper.like(Questionnaire::getTitle, param.getTitle());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (param.getEnable() != null) {
|
|
|
|
|
+ queryWrapper.eq(Questionnaire::getEnable, param.getEnable());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (param.getCreateTimeStart() != null) {
|
|
|
|
|
+ queryWrapper.ge(Questionnaire::getCreateTime, param.getCreateTimeStart().atStartOfDay());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (param.getCreateTimeEnd() != null) {
|
|
|
|
|
+ queryWrapper.le(Questionnaire::getCreateTime, param.getCreateTimeEnd().atTime(23, 59, 59));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 按创建时间倒序,可根据业务调整
|
|
|
|
|
+ queryWrapper.orderByDesc(Questionnaire::getCreateTime);
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 执行分页查询
|
|
|
|
|
+ Page<Questionnaire> pageResult = questionnaireService.page(pageRequest, queryWrapper);
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 转 DTO
|
|
|
|
|
+ List<QuestionnaireDTO> dtoList = pageResult.getRecords().stream()
|
|
|
|
|
+ .map(q -> CopyUtils.copy(q, QuestionnaireDTO.class))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 封装分页结果
|
|
|
|
|
+ PageRecord<QuestionnaireDTO> result = new PageRecord<>();
|
|
|
|
|
+ result.setRows(dtoList);
|
|
|
|
|
+ result.setTotal(pageResult.getTotal());
|
|
|
|
|
+ result.setPageNum((int) pageResult.getCurrent());
|
|
|
|
|
+ result.setPageSize((int) pageResult.getSize());
|
|
|
|
|
+ result.setTotalPageNum((int) pageResult.getPages());
|
|
|
|
|
+ result.setOutTotalPageNum(false); // 按需设置
|
|
|
|
|
+
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public QuestionnaireDetailsDTO queryQuestionnaireDetails(Long questionnaireId) {
|
|
|
|
|
+ if (questionnaireId == null) {
|
|
|
|
|
+ throw new BizException(
|
|
|
|
|
+ ErrorEnum.QUESTIONNAIRE_ID_IS_NULL.getErrorCode(), ErrorEnum.QUESTIONNAIRE_ID_IS_NULL.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 查询问卷信息
|
|
|
|
|
+ Questionnaire questionnaire = questionnaireService.getById(questionnaireId);
|
|
|
|
|
+ if (questionnaire == null) {
|
|
|
|
|
+ throw new BizException(
|
|
|
|
|
+ ErrorEnum.QUESTIONNAIRE_NOT_EXIST.getErrorCode(), ErrorEnum.QUESTIONNAIRE_NOT_EXIST.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 查询问卷下的问题,按 sort 升序
|
|
|
|
|
+ List<Question> questions = questionService.list(
|
|
|
|
|
+ new LambdaQueryWrapper<Question>()
|
|
|
|
|
+ .eq(Question::getQuestionnaireId, questionnaireId)
|
|
|
|
|
+ .orderByAsc(Question::getSort)
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 转换为 QuestionDTO
|
|
|
|
|
+ List<QuestionDTO> questionDTOList = questions.stream()
|
|
|
|
|
+ .map(q -> {
|
|
|
|
|
+ QuestionDTO dto = new QuestionDTO();
|
|
|
|
|
+ BeanUtils.copyProperties(q, dto);
|
|
|
|
|
+ return dto;
|
|
|
|
|
+ })
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 封装 QuestionnaireDetailsDTO
|
|
|
|
|
+ QuestionnaireDetailsDTO detailsDTO = new QuestionnaireDetailsDTO();
|
|
|
|
|
+ detailsDTO.setQuestionnaireId(questionnaire.getQuestionnaireId());
|
|
|
|
|
+ detailsDTO.setTitle(questionnaire.getTitle());
|
|
|
|
|
+ detailsDTO.setDescription(questionnaire.getDescription());
|
|
|
|
|
+ detailsDTO.setQuestionList(questionDTOList);
|
|
|
|
|
+
|
|
|
|
|
+ return detailsDTO;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<QuestionDTO> saveQuestion(List<QuestionSaveParam> params) {
|
|
|
|
|
+ if (params == null || params.isEmpty()) {
|
|
|
|
|
+ throw new BizException(ErrorEnum.QUESTION_LIST_NOT_EXIST.getErrorCode(), ErrorEnum.QUESTION_LIST_NOT_EXIST.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 假设前端保证同一次提交的都是同一份问卷里的问题
|
|
|
|
|
+ Long questionnaireId = params.get(0).getQuestionnaireId();
|
|
|
|
|
+ if (questionnaireId == null) {
|
|
|
|
|
+ throw new BizException(ErrorEnum.QUESTIONNAIRE_ID_IS_NULL.getErrorCode(), ErrorEnum.QUESTIONNAIRE_ID_IS_NULL.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 查出该问卷下现有的问题
|
|
|
|
|
+ List<Question> existingQuestions = questionService.list(
|
|
|
|
|
+ new LambdaQueryWrapper<Question>()
|
|
|
|
|
+ .eq(Question::getQuestionnaireId, questionnaireId)
|
|
|
|
|
+ );
|
|
|
|
|
+ Set<Long> existingIds = existingQuestions.stream()
|
|
|
|
|
+ .map(Question::getQuestionId)
|
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
|
+
|
|
|
|
|
+ List<Question> toSaveOrUpdate = new ArrayList<>();
|
|
|
|
|
+ Set<Long> incomingIds = new HashSet<>();
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 遍历入参,组装需要保存/更新的问题
|
|
|
|
|
+ for (QuestionSaveParam param : params) {
|
|
|
|
|
+ Question question;
|
|
|
|
|
+ if (param.getQuestionId() != null) {
|
|
|
|
|
+ // 编辑
|
|
|
|
|
+ question = questionService.getById(param.getQuestionId());
|
|
|
|
|
+ if (question == null) {
|
|
|
|
|
+ throw new BizException(ErrorEnum.QUESTION_NOT_EXIST.getErrorCode(),
|
|
|
|
|
+ ErrorEnum.QUESTION_NOT_EXIST.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ BeanUtils.copyProperties(param, question, "questionId", "createTime");
|
|
|
|
|
+ question.setUpdateTime(LocalDateTime.now());
|
|
|
|
|
+ incomingIds.add(question.getQuestionId());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 新增
|
|
|
|
|
+ question = new Question();
|
|
|
|
|
+ BeanUtils.copyProperties(param, question, "questionId");
|
|
|
|
|
+ question.setQuestionnaireId(questionnaireId);
|
|
|
|
|
+ question.setCreateTime(LocalDateTime.now());
|
|
|
|
|
+ question.setUpdateTime(LocalDateTime.now());
|
|
|
|
|
+ }
|
|
|
|
|
+ toSaveOrUpdate.add(question);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 删除数据库有但入参没传的
|
|
|
|
|
+ List<Long> toDeleteIds = existingIds.stream()
|
|
|
|
|
+ .filter(id -> !incomingIds.contains(id))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ if (!toDeleteIds.isEmpty()) {
|
|
|
|
|
+ // 先删答案
|
|
|
|
|
+ answerService.remove(new LambdaQueryWrapper<Answer>()
|
|
|
|
|
+ .in(Answer::getQuestionId, toDeleteIds));
|
|
|
|
|
+ // 再删问题
|
|
|
|
|
+ questionService.removeByIds(toDeleteIds);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 保存或更新当前入参的问题
|
|
|
|
|
+ questionService.saveOrUpdateBatch(toSaveOrUpdate);
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 返回最新问题集合
|
|
|
|
|
+ List<Question> latestQuestions = questionService.list(
|
|
|
|
|
+ new LambdaQueryWrapper<Question>()
|
|
|
|
|
+ .eq(Question::getQuestionnaireId, questionnaireId)
|
|
|
|
|
+ .orderByAsc(Question::getCreateTime)
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ return latestQuestions.stream()
|
|
|
|
|
+ .map(q -> CopyUtils.copy(q, QuestionDTO.class))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void saveAnswer(List<AnswerSaveParam> params) {
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 校验入参是否为空
|
|
|
|
|
+ if (params == null || params.isEmpty()) {
|
|
|
|
|
+ throw new BizException(ErrorEnum.ANSWER_LIST_IS_NOT_NULL.getErrorCode(), ErrorEnum.ANSWER_LIST_IS_NOT_NULL.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2.遍历答案集合
|
|
|
|
|
+ List<Answer> answers = new ArrayList<>();
|
|
|
|
|
+ for (AnswerSaveParam param : params) {
|
|
|
|
|
+ if (param.getQuestionnaireId() == null || param.getQuestionId() == null || param.getUserId() == null) {
|
|
|
|
|
+ throw new BizException(ErrorEnum.QUESTIONNAIRE_QUESTION_ANSWER_NULL.getErrorCode(), ErrorEnum.QUESTIONNAIRE_QUESTION_ANSWER_NULL.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Answer answer = new Answer();
|
|
|
|
|
+ BeanUtils.copyProperties(param, answer); // 直接拷贝字段
|
|
|
|
|
+ answers.add(answer);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3.直接批量插入,自动填充字段
|
|
|
|
|
+ answerService.saveBatch(answers);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public PageRecord<UserQuestionnaireListDTO> queryUserQuestionnaireList(UserQuestionnaireListParam query) {
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 查用户ID(如果传了手机号才查)
|
|
|
|
|
+ Long userId = null;
|
|
|
|
|
+ if (StringUtils.isNotBlank(query.getUserPhone())) {
|
|
|
|
|
+ UserInfo user = userService.getOne(
|
|
|
|
|
+ new LambdaQueryWrapper<UserInfo>().eq(UserInfo::getPhone, query.getUserPhone())
|
|
|
|
|
+ );
|
|
|
|
|
+ if (user == null) return emptyPage(query);
|
|
|
|
|
+ userId = user.getUserId();
|
|
|
|
|
+ log.info("用户ID: {}", userId);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 查询答案表,按时间倒序
|
|
|
|
|
+ LambdaQueryWrapper<Answer> wrapper = new LambdaQueryWrapper<Answer>()
|
|
|
|
|
+ .eq(userId != null, Answer::getUserId, userId)
|
|
|
|
|
+ .eq(query.getQuestionnaireId() != null, Answer::getQuestionnaireId, query.getQuestionnaireId())
|
|
|
|
|
+ .orderByDesc(Answer::getCreateTime);
|
|
|
|
|
+
|
|
|
|
|
+ List<Answer> allAnswers = answerService.list(wrapper);
|
|
|
|
|
+ log.info("答案表: {}", allAnswers);
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 每个用户每份问卷只保留一条记录
|
|
|
|
|
+ Map<String, Answer> oneAnswerPerUserQuestionnaire = new LinkedHashMap<>();
|
|
|
|
|
+ for (Answer ans : allAnswers) {
|
|
|
|
|
+ String key = ans.getUserId() + "-" + ans.getQuestionnaireId();
|
|
|
|
|
+ oneAnswerPerUserQuestionnaire.putIfAbsent(key, ans);
|
|
|
|
|
+ }
|
|
|
|
|
+ log.info("去重后答案表: {}", oneAnswerPerUserQuestionnaire);
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 分页处理
|
|
|
|
|
+ List<Answer> pageAnswers = new ArrayList<>(oneAnswerPerUserQuestionnaire.values());
|
|
|
|
|
+ int total = pageAnswers.size();
|
|
|
|
|
+ int fromIndex = (query.getPageNo() - 1) * query.getPageSize();
|
|
|
|
|
+ int toIndex = Math.min(fromIndex + query.getPageSize(), total);
|
|
|
|
|
+ if (fromIndex >= total) return emptyPage(query);
|
|
|
|
|
+ pageAnswers = pageAnswers.subList(fromIndex, toIndex);
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 查询问卷信息
|
|
|
|
|
+ Set<Long> questionnaireIds = pageAnswers.stream()
|
|
|
|
|
+ .map(Answer::getQuestionnaireId).collect(Collectors.toSet());
|
|
|
|
|
+ Map<Long, Questionnaire> questionnaireMap = questionnaireService.listByIds(questionnaireIds)
|
|
|
|
|
+ .stream().collect(Collectors.toMap(Questionnaire::getQuestionnaireId, q -> q));
|
|
|
|
|
+ log.info("问卷信息: {}", questionnaireMap);
|
|
|
|
|
+
|
|
|
|
|
+ // 5.1 查询用户信息(所有答题用户)
|
|
|
|
|
+ Set<Long> userIds = pageAnswers.stream().map(Answer::getUserId).collect(Collectors.toSet());
|
|
|
|
|
+ Map<Long, UserInfo> userMap = userService.listByIds(userIds)
|
|
|
|
|
+ .stream().collect(Collectors.toMap(UserInfo::getUserId, u -> u));
|
|
|
|
|
+ log.info("用户信息: {}", userMap);
|
|
|
|
|
+
|
|
|
|
|
+ // 6. 组装 DTO
|
|
|
|
|
+ List<UserQuestionnaireListDTO> dtoList = pageAnswers.stream().map(ans -> {
|
|
|
|
|
+ UserQuestionnaireListDTO dto = new UserQuestionnaireListDTO();
|
|
|
|
|
+ dto.setQuestionnaireId(ans.getQuestionnaireId());
|
|
|
|
|
+ dto.setQuestionnaireTitle(
|
|
|
|
|
+ questionnaireMap.get(ans.getQuestionnaireId()) != null
|
|
|
|
|
+ ? questionnaireMap.get(ans.getQuestionnaireId()).getTitle()
|
|
|
|
|
+ : null
|
|
|
|
|
+ );
|
|
|
|
|
+ UserInfo ansUser = userMap.get(ans.getUserId());
|
|
|
|
|
+ dto.setUserPhone(ansUser != null ? ansUser.getPhone() : null);
|
|
|
|
|
+ dto.setAnswerTime(ans.getCreateTime());
|
|
|
|
|
+ return dto;
|
|
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
|
+ log.info("DTO: {}", dtoList);
|
|
|
|
|
+
|
|
|
|
|
+ // 7. 封装分页结果
|
|
|
|
|
+ PageRecord<UserQuestionnaireListDTO> result = new PageRecord<>();
|
|
|
|
|
+ result.setRows(dtoList);
|
|
|
|
|
+ result.setTotal((long) total);
|
|
|
|
|
+ result.setPageNum(query.getPageNo());
|
|
|
|
|
+ result.setPageSize(query.getPageSize());
|
|
|
|
|
+ result.setOutTotalPageNum(true);
|
|
|
|
|
+ result.setTotalPageNum((total + query.getPageSize() - 1) / query.getPageSize());
|
|
|
|
|
+
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public UserQuestionnaireDetailsDTO queryUserQuestionnaireDetails(UserQuestionnaireDetailsParam param) {
|
|
|
|
|
+ // 1. 根据手机号查用户
|
|
|
|
|
+ UserInfo user = userService.getOne(
|
|
|
|
|
+ new LambdaQueryWrapper<UserInfo>().eq(UserInfo::getPhone, param.getUserPhone())
|
|
|
|
|
+ );
|
|
|
|
|
+ if (user == null) {
|
|
|
|
|
+ throw new BizException(ErrorEnum.USER_IS_NOT_EXIST.getErrorCode(),ErrorEnum.USER_IS_NOT_EXIST.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ Long userId = user.getUserId();
|
|
|
|
|
+ log.info("用户ID: {}", userId);
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 查问卷信息
|
|
|
|
|
+ Questionnaire questionnaire = questionnaireService.getById(param.getQuestionnaireId());
|
|
|
|
|
+ if (questionnaire == null) {
|
|
|
|
|
+ throw new BizException(ErrorEnum.QUESTIONNAIRE_NOT_EXIST.getErrorCode(),ErrorEnum.QUESTIONNAIRE_NOT_EXIST.getErrorMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ log.info("问卷信息: {}", questionnaire);
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 查该问卷下的问题
|
|
|
|
|
+ List<Question> questions = questionService.list(
|
|
|
|
|
+ new LambdaQueryWrapper<Question>()
|
|
|
|
|
+ .eq(Question::getQuestionnaireId, param.getQuestionnaireId())
|
|
|
|
|
+ .orderByAsc(Question::getSort)
|
|
|
|
|
+ );
|
|
|
|
|
+ log.info("问题信息: {}", questions);
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 查该用户在该问卷下的答案
|
|
|
|
|
+ List<Answer> answers = answerService.list(
|
|
|
|
|
+ new LambdaQueryWrapper<Answer>()
|
|
|
|
|
+ .eq(Answer::getQuestionnaireId, param.getQuestionnaireId())
|
|
|
|
|
+ .eq(Answer::getUserId, userId)
|
|
|
|
|
+ );
|
|
|
|
|
+ Map<Long, String> answerMap = answers.stream()
|
|
|
|
|
+ .collect(Collectors.toMap(Answer::getQuestionId, Answer::getAnswer));
|
|
|
|
|
+ log.info("用户答案: {}", answerMap);
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 组装问题集合 DTO
|
|
|
|
|
+ List<UserQuestionDetailsDTO> questionDTOList = questions.stream().map(q -> {
|
|
|
|
|
+ UserQuestionDetailsDTO dto = new UserQuestionDetailsDTO();
|
|
|
|
|
+ dto.setQuestionId(q.getQuestionId());
|
|
|
|
|
+ dto.setQuestionType(q.getQuestionType());
|
|
|
|
|
+ dto.setContent(q.getContent());
|
|
|
|
|
+ dto.setConfig(q.getConfig());
|
|
|
|
|
+ dto.setSort(q.getSort());
|
|
|
|
|
+ dto.setAnswer(answerMap.get(q.getQuestionId())); // 用户答案
|
|
|
|
|
+ return dto;
|
|
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
|
+ log.info("问题集合 DTO: {}", questionDTOList);
|
|
|
|
|
+
|
|
|
|
|
+ // 6. 封装最终返回 DTO
|
|
|
|
|
+ UserQuestionnaireDetailsDTO result = new UserQuestionnaireDetailsDTO();
|
|
|
|
|
+ result.setQuestionnaireId(questionnaire.getQuestionnaireId());
|
|
|
|
|
+ result.setTitle(questionnaire.getTitle());
|
|
|
|
|
+ result.setUserPhone(user.getPhone());
|
|
|
|
|
+ result.setUserId(userId);
|
|
|
|
|
+ result.setQuestionList(questionDTOList);
|
|
|
|
|
+
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 空分页方法
|
|
|
|
|
+ private PageRecord<UserQuestionnaireListDTO> emptyPage(UserQuestionnaireListParam query) {
|
|
|
|
|
+ PageRecord<UserQuestionnaireListDTO> empty = new PageRecord<>();
|
|
|
|
|
+ empty.setRows(Collections.emptyList());
|
|
|
|
|
+ empty.setTotal(0L);
|
|
|
|
|
+ empty.setPageNum(query.getPageNo());
|
|
|
|
|
+ empty.setPageSize(query.getPageSize());
|
|
|
|
|
+ empty.setOutTotalPageNum(true);
|
|
|
|
|
+ empty.setTotalPageNum((int) ((0 + query.getPageSize() - 1) / query.getPageSize())); // 计算总页数
|
|
|
|
|
+ return empty;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|