ExerciseDictServiceImpl.java 5.26 KB
package com.subsidy.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.common.exception.HttpException;
import com.subsidy.dto.exercise.GetPaperExerciseDTO;
import com.subsidy.dto.exercise.SubmitDTO;
import com.subsidy.mapper.ExerciseDictMapper;
import com.subsidy.mapper.ExerciseDoneHistoryMapper;
import com.subsidy.mapper.ExerciseDoneResultMapper;
import com.subsidy.model.ExerciseDictDO;
import com.subsidy.model.ExerciseDoneHistoryDO;
import com.subsidy.model.ExerciseDoneResultDO;
import com.subsidy.service.ExerciseDictService;
import com.subsidy.util.ConstantUtils;
import com.subsidy.util.MathUtil;
import com.subsidy.vo.exercise.GetPaperExerciseVO;
import com.subsidy.vo.exercise.MemberExerciseVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 习题库 服务实现类
 * </p>
 *
 * @author DengMin
 * @since 2021-10-12
 */
@Service
public class ExerciseDictServiceImpl extends ServiceImpl<ExerciseDictMapper, ExerciseDictDO> implements ExerciseDictService {

    @Autowired
    private ExerciseDoneResultMapper exerciseDoneResultMapper;

    @Autowired
    private ExerciseDoneHistoryMapper exerciseDoneHistoryMapper;

    public String addExercise(ExerciseDictDO exerciseDictDO) {

        Integer orderNoTmp = this.baseMapper.getMaximumNo(exerciseDictDO.getPaperId());

        int orderNo = 1;

        if (null != orderNoTmp) {
            orderNo = orderNoTmp + 1;
        }
        exerciseDictDO.setOrderNo(orderNo);
        this.baseMapper.insert(exerciseDictDO);
        return ConstantUtils.ADD_SUCCESS;
    }

    public String deleteExercise(ExerciseDictDO exerciseDictDO) {
        this.baseMapper.deleteById(exerciseDictDO.getId());
        return ConstantUtils.DELETE_SUCCESS;
    }

    public String updateExercise(ExerciseDictDO exerciseDictDO) {
        this.baseMapper.updateById(exerciseDictDO);
        return ConstantUtils.SET_SUCCESS;
    }

    @Transactional(rollbackFor = Exception.class)
    public Long submit(SubmitDTO submitDTO) {

        ExerciseDoneResultDO exerciseDoneResultDO = new ExerciseDoneResultDO();

        List<MemberExerciseVO> memberExerciseVOS = submitDTO.getMemberExerciseVOS();

        SimpleDateFormat startDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date startDate = startDateFormat1.parse(submitDTO.getStartDate());

            if (new Date().getTime() - startDate.getTime() < 180 * 1000L) {
                throw new HttpException(20003);
            }
        } catch (ParseException e) {

        }

        int rightCounts = 0;

        for (MemberExerciseVO exerciseVO : memberExerciseVOS) {
            ExerciseDictDO exerciseDictDO = this.baseMapper.selectById(exerciseVO.getId());
            if (exerciseDictDO.getRightAnswer().equals(exerciseVO.getSelectAnswer())) {
                exerciseVO.setResult(1);
                rightCounts++;
            } else {
                exerciseVO.setResult(0);
            }
        }


        exerciseDoneResultDO.setClassId(submitDTO.getClassId());
        exerciseDoneResultDO.setRightCounts(rightCounts);
        exerciseDoneResultDO.setTotalCounts(memberExerciseVOS.size());
        exerciseDoneResultDO.setCourseId(submitDTO.getCourseId());
        exerciseDoneResultDO.setMemberId(submitDTO.getMemberId());
        exerciseDoneResultDO.setPaperId(submitDTO.getPaperId());
        exerciseDoneResultDO.setLength(submitDTO.getLength());
        exerciseDoneResultDO.setStartDate(submitDTO.getStartDate());
        int score = MathUtil.intDivFloorPercent(rightCounts, memberExerciseVOS.size());
        exerciseDoneResultDO.setScore(score);
        exerciseDoneResultDO.setResult(score >= 60 ? "合格" : "不合格");

        exerciseDoneResultMapper.insert(exerciseDoneResultDO);

        for (MemberExerciseVO memberExerciseVO : memberExerciseVOS) {

            ExerciseDoneHistoryDO exerciseDoneHistoryDO = new ExerciseDoneHistoryDO();
            exerciseDoneHistoryDO.setPaperId(submitDTO.getPaperId());
            exerciseDoneHistoryDO.setDoneId(exerciseDoneResultDO.getId());
            exerciseDoneHistoryDO.setMemberId(submitDTO.getMemberId());
            exerciseDoneHistoryDO.setClassId(submitDTO.getClassId());
            exerciseDoneHistoryDO.setExerciseId(memberExerciseVO.getId());
            exerciseDoneHistoryDO.setAnswer(memberExerciseVO.getSelectAnswer());
            exerciseDoneHistoryDO.setResult(memberExerciseVO.getResult());
            exerciseDoneHistoryMapper.insert(exerciseDoneHistoryDO);
        }

        return exerciseDoneResultDO.getId();
    }

    public IPage<GetPaperExerciseVO> getPaperExercise(GetPaperExerciseDTO getPaperExerciseDTO) {
        Page pager = new Page(getPaperExerciseDTO.getPageNum(), getPaperExerciseDTO.getPageSize());
        return this.baseMapper.getPaperExercise(pager, getPaperExerciseDTO.getPaperId(), getPaperExerciseDTO.getDifficulty(), getPaperExerciseDTO.getExerciseType(), getPaperExerciseDTO.getTitle());
    }

}