QuestionSubmitServiceImpl.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package com.example.onlinejudge.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.example.onlinejudge.constant.CommonConstant;
  6. import com.example.onlinejudge.exception.BusinessException;
  7. import com.example.onlinejudge.judge.JudgeService;
  8. import com.example.onlinejudge.mapper.QuestionSubmitMapper;
  9. import com.example.onlinejudge.model.VO.QuestionSubmitVO;
  10. import com.example.onlinejudge.model.dto.questionSubmit.QuestionSubmitAddRequest;
  11. import com.example.onlinejudge.model.dto.questionSubmit.QuestionSubmitQueryRequest;
  12. import com.example.onlinejudge.model.entity.Question;
  13. import com.example.onlinejudge.model.entity.QuestionSubmit;
  14. import com.example.onlinejudge.model.entity.User;
  15. import com.example.onlinejudge.model.entity.result.ResultCode;
  16. import com.example.onlinejudge.model.enums.QuestionSubmitLanguageEnum;
  17. import com.example.onlinejudge.model.enums.QuestionSubmitStatusEnum;
  18. import com.example.onlinejudge.service.QuestionService;
  19. import com.example.onlinejudge.service.QuestionSubmitService;
  20. import com.example.onlinejudge.service.UserService;
  21. import com.example.onlinejudge.utils.SqlUtils;
  22. import org.apache.commons.collections4.CollectionUtils;
  23. import org.apache.commons.lang3.ObjectUtils;
  24. import org.apache.commons.lang3.StringUtils;
  25. import org.springframework.context.annotation.Lazy;
  26. import org.springframework.stereotype.Service;
  27. import javax.annotation.Resource;
  28. import java.util.List;
  29. import java.util.concurrent.CompletableFuture;
  30. import java.util.stream.Collectors;
  31. @Service
  32. public class QuestionSubmitServiceImpl extends ServiceImpl<QuestionSubmitMapper, QuestionSubmit>
  33. implements QuestionSubmitService {
  34. @Resource
  35. private QuestionService questionService;
  36. @Resource
  37. private UserService userService;
  38. @Resource
  39. @Lazy
  40. private JudgeService judgeService;
  41. /**
  42. * 提交题目
  43. *
  44. * @param questionSubmitAddRequest
  45. * @param loginUser
  46. * @return
  47. */
  48. @Override
  49. public long doQuestionSubmit(QuestionSubmitAddRequest questionSubmitAddRequest, Long loginUserId) {
  50. // 校验编程语言是否合法
  51. String language = questionSubmitAddRequest.getLanguage();
  52. QuestionSubmitLanguageEnum languageEnum = QuestionSubmitLanguageEnum.getEnumByValue(language);
  53. if (languageEnum == null) {
  54. throw new BusinessException(ResultCode.PARAM_IS_INVALID, "编程语言错误");
  55. }
  56. long questionId = questionSubmitAddRequest.getQuestionId();
  57. // 判断实体是否存在,根据类别获取实体
  58. Question question = questionService.getById(questionId);
  59. if (question == null) {
  60. throw new BusinessException(ResultCode.NOT_FOUND_ERROR);
  61. }
  62. // 是否已提交题目
  63. // 每个用户串行提交题目
  64. QuestionSubmit questionSubmit = new QuestionSubmit();
  65. questionSubmit.setUserId(loginUserId);
  66. questionSubmit.setQuestionId(questionId);
  67. questionSubmit.setCode(questionSubmitAddRequest.getCode());
  68. questionSubmit.setLanguage(language);
  69. // 设置初始状态
  70. questionSubmit.setStatus(QuestionSubmitStatusEnum.WAITING.getValue());
  71. questionSubmit.setJudgeInfo("{}");
  72. boolean save = this.save(questionSubmit);
  73. if (!save){
  74. throw new BusinessException(ResultCode.SYSTEM_ERROR, "数据插入失败");
  75. }
  76. Long questionSubmitId = questionSubmit.getId();
  77. // 执行判题服务
  78. CompletableFuture.runAsync(() -> {
  79. judgeService.doJudge(questionSubmitId);
  80. });
  81. return questionSubmitId;
  82. }
  83. /**
  84. * 获取查询包装类(用户根据哪些字段查询,根据前端传来的请求对象,得到 mybatis 框架支持的查询 QueryWrapper 类)
  85. *
  86. * @param questionSubmitQueryRequest
  87. * @return
  88. */
  89. @Override
  90. public QueryWrapper<QuestionSubmit> getQueryWrapper(QuestionSubmitQueryRequest questionSubmitQueryRequest) {
  91. QueryWrapper<QuestionSubmit> queryWrapper = new QueryWrapper<>();
  92. if (questionSubmitQueryRequest == null) {
  93. return queryWrapper;
  94. }
  95. String language = questionSubmitQueryRequest.getLanguage();
  96. Integer status = questionSubmitQueryRequest.getStatus();
  97. Long questionId = questionSubmitQueryRequest.getQuestionId();
  98. Long userId = questionSubmitQueryRequest.getUserId();
  99. String sortField = questionSubmitQueryRequest.getSortField();
  100. String sortOrder = questionSubmitQueryRequest.getSortOrder();
  101. // 拼接查询条件
  102. queryWrapper.eq(StringUtils.isNotBlank(language), "language", language);
  103. queryWrapper.eq(ObjectUtils.isNotEmpty(userId), "userId", userId);
  104. queryWrapper.eq(ObjectUtils.isNotEmpty(questionId), "questionId", questionId);
  105. queryWrapper.eq(QuestionSubmitStatusEnum.getEnumByValue(status) != null, "status", status);
  106. queryWrapper.eq("isDelete", false);
  107. queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC),
  108. sortField);
  109. return queryWrapper;
  110. }
  111. @Override
  112. public QuestionSubmitVO getQuestionSubmitVO(QuestionSubmit questionSubmit, User loginUser) {
  113. QuestionSubmitVO questionSubmitVO = QuestionSubmitVO.objToVo(questionSubmit);
  114. // 脱敏:仅本人和管理员能看见自己(提交 userId 和登录用户 id 不同)提交的代码
  115. long userId = loginUser.getId();
  116. // 处理脱敏
  117. //TODO && !userService.isAdmin(loginUser)
  118. if (userId != questionSubmit.getUserId() ) {
  119. questionSubmitVO.setCode(null);
  120. }
  121. return questionSubmitVO;
  122. }
  123. @Override
  124. public Page<QuestionSubmitVO> getQuestionSubmitVOPage(Page<QuestionSubmit> questionSubmitPage, User loginUser) {
  125. List<QuestionSubmit> questionSubmitList = questionSubmitPage.getRecords();
  126. Page<QuestionSubmitVO> questionSubmitVOPage = new Page<>(questionSubmitPage.getCurrent(), questionSubmitPage.getSize(), questionSubmitPage.getTotal());
  127. if (CollectionUtils.isEmpty(questionSubmitList)) {
  128. return questionSubmitVOPage;
  129. }
  130. List<QuestionSubmitVO> questionSubmitVOList = questionSubmitList.stream()
  131. .map(questionSubmit -> getQuestionSubmitVO(questionSubmit, loginUser))
  132. .collect(Collectors.toList());
  133. questionSubmitVOPage.setRecords(questionSubmitVOList);
  134. return questionSubmitVOPage;
  135. }
  136. }