JudgeServiceImpl.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package cn.seecoder.ojserver.service.impl;
  2. import cn.seecoder.codejudge.client.CodeJudgeException;
  3. import cn.seecoder.codejudge.client.JudgeDTO;
  4. import cn.seecoder.codejudge.client.JudgeResult;
  5. import cn.seecoder.codejudge.client.JudgeResultType;
  6. import cn.seecoder.ojserver.dao.CommitDAO;
  7. import cn.seecoder.ojserver.dao.entity.Commit;
  8. import cn.seecoder.ojserver.dao.entity.Problem;
  9. import cn.seecoder.ojserver.dao.entity.TestCase;
  10. import cn.seecoder.ojserver.enums.CodeJudgeResultType;
  11. import cn.seecoder.ojserver.exception.ThirdPartyServiceException;
  12. import cn.seecoder.ojserver.manager.JudgeManager;
  13. import cn.seecoder.ojserver.manager.QuestionManager;
  14. import cn.seecoder.ojserver.model.dto.CodeJudgeDTO;
  15. import cn.seecoder.ojserver.model.vo.CodeJudgeVO;
  16. import cn.seecoder.ojserver.service.JudgeService;
  17. import okhttp3.*;
  18. import org.springframework.amqp.rabbit.core.RabbitTemplate;
  19. import org.springframework.stereotype.Service;
  20. import java.util.Date;
  21. import java.util.List;
  22. import java.util.concurrent.TimeUnit;
  23. import java.util.stream.Collectors;
  24. @Service
  25. public class JudgeServiceImpl implements JudgeService {
  26. private final QuestionManager questionManager;
  27. private final JudgeManager judgeManager;
  28. private final OkHttpClient client;
  29. private final RabbitTemplate rabbitTemplate;
  30. private final CommitDAO commitDAO;
  31. public JudgeServiceImpl(QuestionManager questionManager, JudgeManager judgeManager, RabbitTemplate rabbitTemplate, CommitDAO commitDAO) {
  32. this.questionManager = questionManager;
  33. this.judgeManager = judgeManager;
  34. this.client = new OkHttpClient()
  35. .newBuilder()
  36. .connectTimeout(60000, TimeUnit.MILLISECONDS)
  37. .readTimeout(60000, TimeUnit.MILLISECONDS)
  38. .build();
  39. this.rabbitTemplate = rabbitTemplate;
  40. this.commitDAO = commitDAO;
  41. }
  42. @Override
  43. public JudgeResult judgeCode(Integer questionId, CodeJudgeVO codeJudgeVO) {
  44. try {
  45. JudgeDTO judgeDTO = new JudgeDTO();
  46. judgeDTO.setCode(codeJudgeVO.getCode());
  47. judgeDTO.setLanguage(codeJudgeVO.getLanguage());
  48. Problem problem = questionManager.getProblemById(questionId).get();
  49. List<TestCase> testCaseList = questionManager.getTestCaseByProblemId(questionId);
  50. judgeDTO.setMemoryLimit(problem.getMemoryLimit());
  51. judgeDTO.setTimeLimit(problem.getTimeLimit());
  52. List<String> inputList = testCaseList.stream().map(TestCase::getInput).collect(Collectors.toList());
  53. List<String> outputList = testCaseList.stream().map(TestCase::getOutput).collect(Collectors.toList());
  54. judgeDTO.setInputList(inputList);
  55. judgeDTO.setOutputList(outputList);
  56. return judgeManager.judgeCodeQuestionAnswers(judgeDTO);
  57. } catch (ThirdPartyServiceException exception) {
  58. throw exception;
  59. }
  60. }
  61. @Override
  62. public JudgeResult asyncJudgeCode(Integer questionId, CodeJudgeVO codeJudgeVO) {
  63. Commit commit = new Commit();
  64. commit.setUserId(0);
  65. commit.setProblemId(questionId);
  66. commit.setCode(codeJudgeVO.getCode());
  67. commit.setLanguage(codeJudgeVO.getLanguage());
  68. commit.setCommitTime(new Date());
  69. commitDAO.save(commit);
  70. CodeJudgeDTO codeJudgeDTO = new CodeJudgeDTO(commit.getId(), questionId, codeJudgeVO);
  71. rabbitTemplate.convertAndSend("notice_queue", codeJudgeDTO);
  72. return null;
  73. }
  74. @Override
  75. public JudgeResult syncJudgeCode(Integer questionId, CodeJudgeVO codeJudgeVO) {
  76. Commit commit = new Commit();
  77. commit.setUserId(0);
  78. commit.setProblemId(questionId);
  79. commit.setCode(codeJudgeVO.getCode());
  80. commit.setLanguage(codeJudgeVO.getLanguage());
  81. commit.setCommitTime(new Date());
  82. JudgeResult judgeResult = judgeCode(questionId, codeJudgeVO);
  83. CodeJudgeResultType message = CodeJudgeResultType.values()[JudgeResultType.ACCEPT.ordinal()];
  84. for (JudgeResult.Item item : judgeResult.getResultList()) {
  85. if (item.getResult() != JudgeResultType.ACCEPT) {
  86. message = CodeJudgeResultType.values()[item.getResult().ordinal()];
  87. break;
  88. }
  89. }
  90. int acNum = 0;
  91. for (JudgeResult.Item item : judgeResult.getResultList()) {
  92. if (item.getResult() == JudgeResultType.ACCEPT) {
  93. acNum++;
  94. }
  95. }
  96. int score = (acNum / judgeResult.getResultList().size()) * 100;
  97. commit.setResult(message.name());
  98. commit.setScore(score);
  99. commit.setJudgeTime(new Date());
  100. commitDAO.save(commit);
  101. return judgeResult;
  102. }
  103. @Override
  104. public JudgeResult rabbit(Integer questionId, CodeJudgeVO codeJudgeVO) {
  105. CodeJudgeDTO codeJudgeDTO = new CodeJudgeDTO(1, questionId, codeJudgeVO);
  106. rabbitTemplate.convertAndSend("test_queue", codeJudgeDTO);
  107. return null;
  108. }
  109. @Override
  110. public JudgeResult mysqlAndMQ(Integer questionId, CodeJudgeVO codeJudgeVO) {
  111. Commit commit = new Commit();
  112. commit.setUserId(0);
  113. commit.setProblemId(questionId);
  114. commit.setCode(codeJudgeVO.getCode());
  115. commit.setLanguage(codeJudgeVO.getLanguage());
  116. commit.setCommitTime(new Date());
  117. commitDAO.save(commit);
  118. CodeJudgeDTO codeJudgeDTO = new CodeJudgeDTO(commit.getId(), questionId, codeJudgeVO);
  119. rabbitTemplate.convertAndSend("test_queue", codeJudgeDTO);
  120. return null;
  121. }
  122. }