Search in sources :

Example 1 with TrainingRankVo

use of top.hcode.hoj.pojo.vo.TrainingRankVo in project HOJ by HimitZH.

the class TrainingRecordServiceImpl method getTrainingRank.

@Override
public IPage<TrainingRankVo> getTrainingRank(Long tid, String username, int currentPage, int limit) {
    Map<Long, String> tpIdMapDisplayId = getTPIdMapDisplayId(tid);
    List<TrainingRecordVo> trainingRecordVoList = trainingRecordMapper.getTrainingRecord(tid);
    List<UserInfo> superAdminList = userInfoMapper.getSuperAdminList();
    List<String> superAdminUidList = superAdminList.stream().map(UserInfo::getUuid).collect(Collectors.toList());
    List<TrainingRankVo> result = new ArrayList<>();
    HashMap<String, Integer> uidMapIndex = new HashMap<>();
    int pos = 0;
    for (TrainingRecordVo trainingRecordVo : trainingRecordVoList) {
        // 超级管理员和训练创建者的提交不入排行榜
        if (username.equals(trainingRecordVo.getUsername()) || superAdminUidList.contains(trainingRecordVo.getUid())) {
            continue;
        }
        TrainingRankVo trainingRankVo;
        Integer index = uidMapIndex.get(trainingRecordVo.getUid());
        if (index == null) {
            trainingRankVo = new TrainingRankVo();
            trainingRankVo.setRealname(trainingRecordVo.getRealname()).setAvatar(trainingRecordVo.getAvatar()).setSchool(trainingRecordVo.getSchool()).setGender(trainingRecordVo.getGender()).setUid(trainingRecordVo.getUid()).setUsername(trainingRecordVo.getUsername()).setNickname(trainingRecordVo.getNickname()).setAc(0).setTotalRunTime(0);
            HashMap<String, HashMap<String, Object>> submissionInfo = new HashMap<>();
            trainingRankVo.setSubmissionInfo(submissionInfo);
            result.add(trainingRankVo);
            uidMapIndex.put(trainingRecordVo.getUid(), pos);
            pos++;
        } else {
            trainingRankVo = result.get(index);
        }
        String displayId = tpIdMapDisplayId.get(trainingRecordVo.getTpid());
        HashMap<String, Object> problemSubmissionInfo = trainingRankVo.getSubmissionInfo().getOrDefault(displayId, new HashMap<>());
        // 如果该题目已经AC过了,只比较运行时间取最小
        if ((Boolean) problemSubmissionInfo.getOrDefault("isAC", false)) {
            if (trainingRecordVo.getStatus().intValue() == Constants.Judge.STATUS_ACCEPTED.getStatus()) {
                int runTime = (int) problemSubmissionInfo.getOrDefault("runTime", 0);
                if (runTime > trainingRecordVo.getUseTime()) {
                    trainingRankVo.setTotalRunTime(trainingRankVo.getTotalRunTime() - runTime + trainingRecordVo.getUseTime());
                    problemSubmissionInfo.put("runTime", trainingRecordVo.getUseTime());
                }
            }
            continue;
        }
        problemSubmissionInfo.put("status", trainingRecordVo.getStatus());
        problemSubmissionInfo.put("score", trainingRecordVo.getScore());
        // 通过的话
        if (trainingRecordVo.getStatus().intValue() == Constants.Judge.STATUS_ACCEPTED.getStatus()) {
            // 总解决题目次数ac+1
            trainingRankVo.setAc(trainingRankVo.getAc() + 1);
            problemSubmissionInfo.put("isAC", true);
            problemSubmissionInfo.put("runTime", trainingRecordVo.getUseTime());
            trainingRankVo.setTotalRunTime(trainingRankVo.getTotalRunTime() + trainingRecordVo.getUseTime());
        }
        trainingRankVo.getSubmissionInfo().put(displayId, problemSubmissionInfo);
    }
    List<TrainingRankVo> orderResultList = result.stream().sorted(// 先以总ac数降序
    Comparator.comparing(TrainingRankVo::getAc, Comparator.reverseOrder()).thenComparing(// 再以总耗时升序
    TrainingRankVo::getTotalRunTime)).collect(Collectors.toList());
    // 计算好排行榜,然后进行分页
    Page<TrainingRankVo> page = new Page<>(currentPage, limit);
    int count = orderResultList.size();
    List<TrainingRankVo> pageList = new ArrayList<>();
    // 计算当前页第一条数据的下标
    int currId = currentPage > 1 ? (currentPage - 1) * limit : 0;
    for (int i = 0; i < limit && i < count - currId; i++) {
        pageList.add(orderResultList.get(currId + i));
    }
    page.setSize(limit);
    page.setCurrent(currentPage);
    page.setTotal(count);
    page.setRecords(pageList);
    return page;
}
Also used : TrainingRankVo(top.hcode.hoj.pojo.vo.TrainingRankVo) UserInfo(top.hcode.hoj.pojo.entity.user.UserInfo) Page(com.baomidou.mybatisplus.extension.plugins.pagination.Page) IPage(com.baomidou.mybatisplus.core.metadata.IPage) TrainingRecordVo(top.hcode.hoj.pojo.vo.TrainingRecordVo)

Example 2 with TrainingRankVo

use of top.hcode.hoj.pojo.vo.TrainingRankVo in project HOJ by HimitZH.

the class TrainingController method getTrainingRank.

/**
 * @param tid
 * @param limit
 * @param currentPage
 * @param request
 * @MethodName getTrainingRank
 * @Description 获取训练的排行榜分页
 * @Return
 * @Since 2021/11/22
 */
@GetMapping("/get-training-rank")
@RequiresAuthentication
public CommonResult getTrainingRank(@RequestParam(value = "tid", required = true) Long tid, @RequestParam(value = "limit", required = false) Integer limit, @RequestParam(value = "currentPage", required = false) Integer currentPage, HttpServletRequest request) {
    Training training = trainingService.getById(tid);
    if (training == null || !training.getStatus()) {
        return CommonResult.errorResponse("该训练不存在或不允许显示!");
    }
    CommonResult result = trainingRegisterService.checkTrainingAuth(training, request);
    if (result != null) {
        return result;
    }
    // 页数,每页数若为空,设置默认值
    if (currentPage == null || currentPage < 1)
        currentPage = 1;
    if (limit == null || limit < 1)
        limit = 30;
    IPage<TrainingRankVo> trainingRankPager = trainingRecordService.getTrainingRank(tid, training.getAuthor(), currentPage, limit);
    return CommonResult.successResponse(trainingRankPager, "success");
}
Also used : Training(top.hcode.hoj.pojo.entity.training.Training) TrainingRankVo(top.hcode.hoj.pojo.vo.TrainingRankVo) CommonResult(top.hcode.hoj.common.result.CommonResult) RequiresAuthentication(org.apache.shiro.authz.annotation.RequiresAuthentication)

Aggregations

TrainingRankVo (top.hcode.hoj.pojo.vo.TrainingRankVo)2 IPage (com.baomidou.mybatisplus.core.metadata.IPage)1 Page (com.baomidou.mybatisplus.extension.plugins.pagination.Page)1 RequiresAuthentication (org.apache.shiro.authz.annotation.RequiresAuthentication)1 CommonResult (top.hcode.hoj.common.result.CommonResult)1 Training (top.hcode.hoj.pojo.entity.training.Training)1 UserInfo (top.hcode.hoj.pojo.entity.user.UserInfo)1 TrainingRecordVo (top.hcode.hoj.pojo.vo.TrainingRecordVo)1