|
@@ -294,85 +294,66 @@ public class WebQuestionGatewayImpl implements WebQuestionGateway {
|
|
|
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);
|
|
|
+@Override
|
|
|
+public PageRecord<UserQuestionnaireListDTO> queryUserQuestionnaireList(UserQuestionnaireListParam query) {
|
|
|
|
|
|
- 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);
|
|
|
+ // 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);
|
|
|
+ }
|
|
|
|
|
|
- // 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());
|
|
|
+ // 2. 使用自定义SQL进行去重分页查询
|
|
|
+ Page<Answer> pageRequest = new Page<>(query.getPageNo(), query.getPageSize());
|
|
|
+ Page<Answer> pageResult = answerService.selectDistinctUserQuestionnaires(pageRequest, userId, query.getQuestionnaireId());
|
|
|
+ List<Answer> pageAnswers = pageResult.getRecords();
|
|
|
+
|
|
|
+ // 3. 查询问卷信息
|
|
|
+ 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);
|
|
|
+
|
|
|
+ // 3.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);
|
|
|
+
|
|
|
+ // 4. 组装 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);
|
|
|
+
|
|
|
+ // 5. 封装分页结果
|
|
|
+ PageRecord<UserQuestionnaireListDTO> result = new PageRecord<>();
|
|
|
+ result.setRows(dtoList);
|
|
|
+ result.setTotal(pageResult.getTotal());
|
|
|
+ result.setPageNum(query.getPageNo());
|
|
|
+ result.setPageSize(query.getPageSize());
|
|
|
+ result.setOutTotalPageNum(true);
|
|
|
+ result.setTotalPageNum((int) ((pageResult.getTotal() + query.getPageSize() - 1) / query.getPageSize()));
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
|
|
|
- return result;
|
|
|
- }
|
|
|
|
|
|
@Override
|
|
|
public UserQuestionnaireDetailsDTO queryUserQuestionnaireDetails(UserQuestionnaireDetailsParam param) {
|