package com.ots.project.exam.restcontroller; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSON; import com.ots.common.constant.Constants; import com.ots.common.exception.user.UserException; import com.ots.common.utils.MessageUtils; import com.ots.common.utils.StringUtils; import com.ots.common.utils.Threads; import com.ots.framework.manager.AsyncManager; import com.ots.framework.manager.factory.AsyncFactory; import com.ots.project.common.BaseApiController; import com.ots.project.exam.domain.TExamPaper; import com.ots.project.exam.domain.TExamReport; import com.ots.project.exam.dto.ExamPaperTitleItem; import com.ots.project.exam.dto.QuestionPart; import com.ots.project.exam.dto.RelatedParty; import com.ots.project.exam.dto.RestResponse; import com.ots.project.exam.dto.SignalObject; import com.ots.project.exam.service.IExamPaperService; import com.ots.project.exam.service.ITExamReportService; import com.ots.project.exam.service.MemberService; import com.ots.project.exam.service.impl.TExamPaperServiceImpl; import com.ots.project.exam.viewmodel.ExamItemOrderAndContent; import com.ots.project.exam.viewmodel.ExamPaperEditRequestVM; import com.ots.project.exam.viewmodel.ExamResultRequestVM; import com.ots.project.tool.exam.ExamUtil; import com.ots.project.tool.exam.JsonUtil; import com.ots.project.tool.report.reportCalculation.response.ReportAPIResult; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @RestController("StudentExamPaperController") @RequestMapping(value = "/api/exam/paper") @AllArgsConstructor @Slf4j public class ExamPaperController extends BaseApiController { @Autowired private IExamPaperService examPaperService; @Autowired private TExamPaperServiceImpl itExamPaperService; @Autowired private ITExamReportService examReportService; @Autowired MemberService memberService; private static final Logger logger = LoggerFactory.getLogger(Threads.class); @RequestMapping(value = "/select/{tokenId}/{langType}", method = RequestMethod.POST) public RestResponse select(@PathVariable String tokenId, @PathVariable String langType) { RelatedParty relatedParty = memberService.queryProdidByToken(tokenId); ExamPaperEditRequestVM vm = examPaperService.examPaperToVM(relatedParty, tokenId, langType); return RestResponse.ok(vm); } @RequestMapping(value = "/selectTokenId/{selectTokenId}", method = RequestMethod.POST) public RestResponse selectTokenId(@PathVariable String selectTokenId) { try { TExamReport tExamReport = new TExamReport(); TExamReport tExamReportTemp = null; tExamReport.setTokenId(selectTokenId); List tExamReportList = examReportService.selectTExamReportList(tExamReport); ExamResultRequestVM examResultRequestVM = new ExamResultRequestVM(); TExamPaper tExamPaper = itExamPaperService.selectTExamPaperById(memberService.queryProdidByToken(selectTokenId).getProdId()); examResultRequestVM.setDoUrl(tExamPaper.getQuestionTemplateId()); examResultRequestVM.setReportTemplateId(tExamPaper.getReportTemplateId()); RelatedParty relatedParty = memberService.queryProdidByToken(selectTokenId); examResultRequestVM.setStatus(relatedParty.getStatus()); TExamReport tExamReportResult = null; if (tExamReportList.size() > 0) { tExamReportResult = tExamReportList.get(0); tExamReportTemp = tExamReportResult; examResultRequestVM.setDoTime(tExamReportTemp.getDoTime()); examResultRequestVM.setFinish(tExamReportTemp.getFinish()); Integer remainTimeResult = getRemainTimeResult(tExamReportTemp); examResultRequestVM.setRemainTime(remainTimeResult); } else { return RestResponse.ok(examResultRequestVM); } LinkedHashMap answerMap = JSON.parseObject(tExamReportTemp.getChoice(), LinkedHashMap.class); examResultRequestVM.setExamItemOrderAndContentList(new ArrayList<>()); if (!Objects.isNull(answerMap)) { answerMap.forEach((k, v) -> { ExamItemOrderAndContent examItemOrderAndContent = new ExamItemOrderAndContent(); examItemOrderAndContent.setItemOrder(k); examItemOrderAndContent.setContent(v); examResultRequestVM.getExamItemOrderAndContentList().add(examItemOrderAndContent); }); } getSignalObject(examResultRequestVM, tExamPaper, tExamReportResult); return RestResponse.ok(examResultRequestVM); } catch (Exception e) { logger.error("{}", e.getMessage(), e); return RestResponse.fail(new UserException("jsp.exam.product.noProduct", new String[]{})); } } private Integer getRemainTimeResult(TExamReport tExamReportTemp) { Map remainPartTimeMap = JsonUtil.parseObject(tExamReportTemp.getRemainPartTime(), HashMap.class); if (Objects.isNull(remainPartTimeMap)) { return 999999; } Set remainPartTimeKeySet = remainPartTimeMap.keySet(); Object[] remainPartTimeKeys = remainPartTimeKeySet.toArray(); Arrays.sort(remainPartTimeKeys); return remainPartTimeMap.get(remainPartTimeKeys[remainPartTimeKeys.length - 1]); } private void getSignalObject(ExamResultRequestVM examResultRequestVM, TExamPaper tExamPaper, TExamReport tExamReportResult) { List examPaperTitleItemList = JsonUtil.parseArray(tExamPaper.getContent(), ExamPaperTitleItem.class); List parts = examPaperTitleItemList.get(0).getParts(); if (CollUtil.isEmpty(parts)) { return; } QuestionPart questionPart = parts.get(0); List signals = questionPart.getSignals(); List reportAPIResultList = JsonUtil.parseArray(tExamReportResult.getInterfaceContent(), ReportAPIResult.class); if (Objects.isNull(reportAPIResultList)) { return; } for (SignalObject signalObject : signals) { if (Objects.equals(reportAPIResultList.get(0).getSignal(), signalObject.getSignal())) { signalObject.setSignalDescription(ExamUtil.getLangString(tExamReportResult.getLangType(), signalObject.getSignalDescription())); String name = examReportService.getDemographicName(tExamReportResult); signalObject.setSignalDescription(signalObject.getSignalDescription().replaceAll("%%fullName%%", StringUtils.isNotEmpty(name) ? name : tExamReportResult.getMemberName())); signalObject.setCode(reportAPIResultList.get(0).getCode()); signalObject.setMessage(reportAPIResultList.get(0).getMessage()); examResultRequestVM.setSignalObject(signalObject); break; } } } @RequestMapping(value = "/recordLogininfor/{selectTokenId}", method = RequestMethod.POST) public RestResponse recordLogininfor(@PathVariable String selectTokenId) { AsyncManager.me().execute(AsyncFactory.recordLogininfor(memberService.queryProdidByToken(selectTokenId).getMemberId().toString(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); return RestResponse.ok(); } }