|
|
@@ -1,18 +1,32 @@
|
|
|
package cn.iocoder.byzs.module.web.service.questionnaire;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import cn.iocoder.byzs.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
|
import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaire.vo.ConfigQuestionRespVO;
|
|
|
+import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaireresult.vo.QuestionnaireResultSaveReqVO;
|
|
|
+import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaireresultdetails.vo.QuestionnaireResultDetailsSaveReqVO;
|
|
|
+import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursequestion.CourseQuestionDO;
|
|
|
import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursequestoption.CourseQuestOptionDO;
|
|
|
import cn.iocoder.byzs.module.bjdx.dal.dataobject.questionnaire.QuestionnaireDO;
|
|
|
+import cn.iocoder.byzs.module.bjdx.dal.dataobject.questionnaireresult.QuestionnaireResultDO;
|
|
|
+import cn.iocoder.byzs.module.bjdx.dal.dataobject.questionnaireresultdetails.QuestionnaireResultDetailsDO;
|
|
|
import cn.iocoder.byzs.module.bjdx.dal.mysql.coursequestion.CourseQuestionMapper;
|
|
|
import cn.iocoder.byzs.module.bjdx.dal.mysql.coursequestoption.CourseQuestOptionMapper;
|
|
|
import cn.iocoder.byzs.module.bjdx.dal.mysql.questionnaire.QuestionnaireMapper;
|
|
|
+import cn.iocoder.byzs.module.bjdx.dal.mysql.questionnaireresult.QuestionnaireResultMapper;
|
|
|
+import cn.iocoder.byzs.module.bjdx.dal.mysql.questionnaireresultdetails.QuestionnaireResultDetailsMapper;
|
|
|
import cn.iocoder.byzs.module.bjdx.service.questionnaire.QuestionnaireService;
|
|
|
+import cn.iocoder.byzs.module.web.controller.admin.questionnaire.vo.WebQuestionnaireResultVo;
|
|
|
+import cn.iocoder.byzs.module.web.controller.admin.questionnaire.vo.WebQuestionnaireShowVo;
|
|
|
import cn.iocoder.byzs.module.web.controller.admin.questionnaire.vo.WebQuestionnaireVo;
|
|
|
import jakarta.annotation.Resource;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
+import java.time.Duration;
|
|
|
+import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -33,9 +47,25 @@ public class WebQuestionnaireServiceImpl {
|
|
|
private CourseQuestionMapper courseQuestionMapper;
|
|
|
@Resource
|
|
|
private CourseQuestOptionMapper courseQuestOptionMapper;
|
|
|
+ @Resource
|
|
|
+ private QuestionnaireResultMapper questionnaireResultMapper;
|
|
|
+ @Resource
|
|
|
+ private QuestionnaireResultDetailsMapper questionnaireResultDetailsMapper;
|
|
|
|
|
|
- public WebQuestionnaireVo getQuestionVoList(Long qrId) {
|
|
|
- // 问卷信息填充(未修改部分)
|
|
|
+ public WebQuestionnaireShowVo getQuestionVoList(Long qrId, Long userId) {
|
|
|
+ // 结果主表插入(关键修改:时间类型转换)
|
|
|
+ LocalDateTime startTime = LocalDateTime.now(); // 直接使用 LocalDateTime
|
|
|
+ QuestionnaireResultDO questionnaireResult = new QuestionnaireResultDO()
|
|
|
+ .setBqrUserId(userId)
|
|
|
+ .setBqrQuestionnaireId(qrId)
|
|
|
+ .setBqrStartTime(startTime) // 改为 LocalDateTime 类型
|
|
|
+ .setBqrStatus("1");
|
|
|
+ questionnaireResultMapper.insert(questionnaireResult);
|
|
|
+ // 问卷信息填充
|
|
|
+ WebQuestionnaireShowVo webQuestionnaireShowVo = new WebQuestionnaireShowVo();
|
|
|
+ webQuestionnaireShowVo.setQrResultId(questionnaireResult.getId());
|
|
|
+
|
|
|
+ //问卷信息
|
|
|
QuestionnaireDO questionnaire = questionnaireService.getQuestionnaire(qrId);
|
|
|
WebQuestionnaireVo questionnaireVo = new WebQuestionnaireVo();
|
|
|
questionnaireVo.setQrId(questionnaire.getId());
|
|
|
@@ -59,11 +89,11 @@ public class WebQuestionnaireServiceImpl {
|
|
|
List<WebQuestionnaireVo.WebQuestion> questionList = new ArrayList<>();
|
|
|
configQuestionRespVOList.forEach(configQuestionRespVO -> {
|
|
|
WebQuestionnaireVo.WebQuestion webQuestion = new WebQuestionnaireVo.WebQuestion();
|
|
|
- webQuestion.setQId(configQuestionRespVO.getId());
|
|
|
- webQuestion.setQType(configQuestionRespVO.getCqQuestType());
|
|
|
- webQuestion.setQContent(configQuestionRespVO.getCqQuestion());
|
|
|
- webQuestion.setQAnalysis(configQuestionRespVO.getCqQuestAnalysis());
|
|
|
- webQuestion.setQOrder(configQuestionRespVO.getBqOrder());
|
|
|
+ webQuestion.setQId(configQuestionRespVO.getId())
|
|
|
+ .setQType(configQuestionRespVO.getCqQuestType())
|
|
|
+ .setQContent(configQuestionRespVO.getCqQuestion())
|
|
|
+ .setQAnalysis(configQuestionRespVO.getCqQuestAnalysis())
|
|
|
+ .setQOrder(configQuestionRespVO.getBqOrder());
|
|
|
|
|
|
List<CourseQuestOptionDO> questOptionDOMapList = questionOptionMap.get(webQuestion.getQId());
|
|
|
if (CollUtil.isNotEmpty(questOptionDOMapList)) {
|
|
|
@@ -88,6 +118,64 @@ public class WebQuestionnaireServiceImpl {
|
|
|
questionnaireVo.setQuestionList(questionList);
|
|
|
}
|
|
|
}
|
|
|
- return questionnaireVo;
|
|
|
+ webQuestionnaireShowVo.setQuestionnaire(questionnaireVo);
|
|
|
+ return webQuestionnaireShowVo;
|
|
|
}
|
|
|
+
|
|
|
+ public Boolean saveQuestionResult(WebQuestionnaireResultVo questionnaireResultVo) {
|
|
|
+ // 问卷结果更新状态(关键修改:时间类型统一)
|
|
|
+ LocalDateTime endDateTime = LocalDateTime.now(); // 直接使用 LocalDateTime
|
|
|
+ QuestionnaireResultDO questionnaireResult = questionnaireResultMapper.selectById(questionnaireResultVo.getQrResultId());
|
|
|
+
|
|
|
+ LocalDateTime startTime = questionnaireResult.getBqrStartTime(); // 直接获取 LocalDateTime 类型
|
|
|
+ Long questTime = Duration.between(startTime, endDateTime).getSeconds(); // 无需额外转换
|
|
|
+
|
|
|
+ QuestionnaireResultDO updateResultDO = new QuestionnaireResultDO()
|
|
|
+ .setId(questionnaireResultVo.getQrResultId())
|
|
|
+ .setBqrEndTime(endDateTime) // 改为 LocalDateTime 类型
|
|
|
+ .setBqrQuestTime(questTime)
|
|
|
+ .setBqrStatus("2");
|
|
|
+ questionnaireResultMapper.updateById(updateResultDO);
|
|
|
+
|
|
|
+ // 问题列表答案
|
|
|
+ List<WebQuestionnaireResultVo.WebQuestion> questionList = questionnaireResultVo.getQuestionList();
|
|
|
+
|
|
|
+ List<ConfigQuestionRespVO> configQuestionRespVOList = questionnaireMapper.selectConfigQuestionList(new ConfigQuestionRespVO().setQuestionnaireId(questionnaireResultVo.getQrId()));
|
|
|
+ // 关键修改:将问题列表转换为ID到问题的映射(方便快速查找)
|
|
|
+ Map<Long, ConfigQuestionRespVO> questionIdMap = configQuestionRespVOList.stream()
|
|
|
+ .collect(Collectors.toMap(ConfigQuestionRespVO::getId, q -> q, (k1, k2) -> k1));
|
|
|
+
|
|
|
+ // 试题答案(新增:获取正确答案逻辑)
|
|
|
+ List<QuestionnaireResultDetailsDO> saveDetailsVOList = new ArrayList<>();
|
|
|
+ questionList.forEach(webQuestion -> {
|
|
|
+ QuestionnaireResultDetailsDO saveDetailsVO = new QuestionnaireResultDetailsDO();
|
|
|
+ saveDetailsVO.setBqrdUserId(questionnaireResult.getBqrUserId())
|
|
|
+ .setBqrdQuestionnaireId(questionnaireResultVo.getQrId())
|
|
|
+ .setBqrdQuestionnaireResultId(questionnaireResultVo.getQrId())
|
|
|
+ .setBqrdQuestionId(webQuestion.getQId())
|
|
|
+ .setBqrdQuestOptionId(webQuestion.getOId())
|
|
|
+ .setBqrdQuestOptionVId(webQuestion.getOVId());
|
|
|
+
|
|
|
+ // 从configQuestionRespVOList中匹配当前试题的答案
|
|
|
+ ConfigQuestionRespVO currentQuestion = questionIdMap.get(webQuestion.getQId());
|
|
|
+ if (currentQuestion != null && currentQuestion.getCqQuestAnswerId() != null) {
|
|
|
+ boolean isCorrect = Objects.equals(currentQuestion.getCqQuestAnswerId(), webQuestion.getOId());
|
|
|
+ saveDetailsVO.setBqrdIsCorrect(isCorrect ? "1" : "2");
|
|
|
+ saveDetailsVO.setBqrdQuestScore(isCorrect ? currentQuestion.getCqQuestScore() : 0);
|
|
|
+ }
|
|
|
+ saveDetailsVOList.add(saveDetailsVO);
|
|
|
+ });
|
|
|
+
|
|
|
+ //答题详情保存
|
|
|
+ questionnaireResultDetailsMapper.insertBatch(saveDetailsVOList);
|
|
|
+
|
|
|
+ // 问卷结果更新状态
|
|
|
+ Double score = saveDetailsVOList.stream().mapToDouble(QuestionnaireResultDetailsDO::getBqrdQuestScore).sum();
|
|
|
+ questionnaireResultMapper.updateById(new QuestionnaireResultDO()
|
|
|
+ .setId(questionnaireResultVo.getQrResultId())
|
|
|
+ .setBqrStatus("3")
|
|
|
+ .setBqrScore(score));
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
}
|