src/main/java/com/ycl/jxkg/controller/admin/ExamPaperController.java
@@ -3,6 +3,10 @@ import com.ycl.jxkg.base.BaseApiController; import com.ycl.jxkg.base.Result; import com.ycl.jxkg.domain.entity.ExamPaper; import com.ycl.jxkg.domain.form.ExamPaperForm; import com.ycl.jxkg.enums.VisibilityEnum; import com.ycl.jxkg.group.Add; import com.ycl.jxkg.group.Update; import com.ycl.jxkg.mapper.ExamPaperMapper; import com.ycl.jxkg.service.ExamPaperService; import com.ycl.jxkg.utils.DateTimeUtil; @@ -12,25 +16,30 @@ import com.ycl.jxkg.domain.vo.admin.exam.ExamResponseVO; import com.github.pagehelper.PageInfo; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.Date; @Validated @RequiredArgsConstructor @RestController("AdminExamPaperController") @RequestMapping(value = "/api/admin/exam/paper") public class ExamPaperController extends BaseApiController { private final ExamPaperService examPaperService; private final ExamPaperService examPaperService; private final ExamPaperMapper baseMapper; @RequestMapping(value = "/page", method = RequestMethod.POST) public Result<PageInfo<ExamResponseVO>> pageList(@RequestBody ExamPaperPageRequestVO model) { PageInfo<ExamPaper> pageInfo = examPaperService.page(model); PageInfo<ExamResponseVO> page = PageInfoHelper.copyMap(pageInfo, e -> { ExamResponseVO vo = new ExamResponseVO(); BeanUtils.copyProperties(e, vo); vo.setVisibility(VisibilityEnum.valueOf(vo.getVisibility()).getCode()+""); vo.setCreateTime(DateTimeUtil.dateFormat(e.getCreateTime())); return vo; }); @@ -38,26 +47,27 @@ } @RequestMapping(value = "/taskExamPage", method = RequestMethod.POST) public Result<PageInfo<ExamResponseVO>> taskExamPageList(@RequestBody ExamPaperPageRequestVO model) { PageInfo<ExamPaper> pageInfo = examPaperService.taskExamPage(model); PageInfo<ExamResponseVO> page = PageInfoHelper.copyMap(pageInfo, e -> { ExamResponseVO vo = new ExamResponseVO(); BeanUtils.copyProperties(e, vo); vo.setCreateTime(DateTimeUtil.dateFormat(e.getCreateTime())); return vo; }); return Result.ok(page); @RequestMapping(value = "/addPaper", method = RequestMethod.POST) public Result taskExamPageList(@RequestBody @Validated(Add.class) ExamPaperForm form) { if (!StringUtils.isBlank(form.getVisibility())) { form.setVisibility(VisibilityEnum.fromCode(form.getVisibility()).getName()); } form.setCreateUser(getCurrentUser().getId()); form.setCreateTime(new Date()); ExamPaper entity = ExamPaperForm.getEntityByForm(form,null); examPaperService.save(entity); return Result.ok(); } @RequestMapping(value = "/edit", method = RequestMethod.POST) public Result<ExamPaperEditRequestVO> edit(@RequestBody @Valid ExamPaperEditRequestVO model) { ExamPaper examPaper = examPaperService.savePaperFromVM(model, getCurrentUser()); ExamPaperEditRequestVO newVM = examPaperService.examPaperToVM(examPaper.getId()); return Result.ok(newVM); public Result edit(@RequestBody @Validated(Update.class) ExamPaperForm form) { if (!StringUtils.isBlank(form.getVisibility())) { form.setVisibility(VisibilityEnum.fromCode(form.getVisibility()).getName()); } ExamPaper entity = ExamPaperForm.getEntityByForm(form,null); examPaperService.updateById(entity); return Result.ok(); } @RequestMapping(value = "/select/{id}", method = RequestMethod.POST) src/main/java/com/ycl/jxkg/controller/admin/ExamTemplateController.java
@@ -50,6 +50,10 @@ @PutMapping @ApiOperation(value = "修改", notes = "修改") public Result update(@RequestBody @Validated(Update.class) ExamTemplateForm form) { //参数校验 if(form.getDeductType()!=null && (form.getDeductType() ==PartCorrect.getCode() || form.getDeductType() == EachCorrect.getCode()) && (form.getDeductTypeScore() ==null || form.getDeductTypeScore().compareTo(BigDecimal.ZERO) <= 0)){ return Result.fail(SystemCode.ParameterValidError.getCode(),"多选评分不能为0或空"); } return examTemplateService.update(form); } src/main/java/com/ycl/jxkg/domain/entity/ExamPaper.java
@@ -2,10 +2,12 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ycl.jxkg.domain.base.AbsEntity; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; @Data @@ -36,7 +38,7 @@ * 试卷总分 */ @TableField("score") private Integer score; private BigDecimal score; /** * 题目数量 @@ -54,6 +56,7 @@ private Integer createUser; @TableField("create_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; /** @@ -63,8 +66,14 @@ private String visibility; /** * 扣分类型 * 多选扣分类型 * */ @TableField("deduct_type") private String deductType; private Integer deductType; /** * 多选评分分数 * */ @TableField("deduct_type_score") private BigDecimal deductTypeScore; } src/main/java/com/ycl/jxkg/domain/form/ExamPaperForm.java
New file @@ -0,0 +1,87 @@ package com.ycl.jxkg.domain.form; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ycl.jxkg.domain.base.AbsEntity; import com.ycl.jxkg.domain.base.AbsForm; import com.ycl.jxkg.domain.entity.ExamPaper; import com.ycl.jxkg.domain.entity.ExamTemplate; import com.ycl.jxkg.group.Add; import com.ycl.jxkg.group.Update; import lombok.Data; import org.springframework.beans.BeanUtils; import org.springframework.lang.NonNull; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.Date; @Data @TableName("t_exam_paper") public class ExamPaperForm extends AbsForm { /** * 试卷名称 */ @NotBlank(message = "试卷名称不能为空", groups = {Add.class, Update.class}) private String name; /** * 学科 */ @NotNull(message = "学科不能为空", groups = {Add.class, Update.class}) private Integer subjectId; /** * 试卷类型( 1固定试卷 2.随即试卷 3.随序试卷) */ @NotNull (message = "试卷类型不能为空", groups = {Add.class, Update.class}) private Integer paperType; /** * 试卷总分 */ private BigDecimal score; /** * 题目数量 */ private Integer questionCount; /** * 建议时长(分钟) */ @Min(value = 1,message = "建议时间必须大于0",groups = {Add.class, Update.class}) private Integer suggestTime; private Integer createUser; @JsonFormat(pattern = "yyyy-mm-dd HH:mm:ss") private Date createTime; /** * 可见性,公开/私有 * */ private String visibility; /** * 多选扣分类型 * */ private Integer deductType; /** * 多选评分分数 * */ private BigDecimal deductTypeScore; public static ExamPaper getEntityByForm(@NonNull ExamPaperForm form, ExamPaper entity) { if(entity == null) { entity = new ExamPaper(); } BeanUtils.copyProperties(form, entity); return entity; } } src/main/java/com/ycl/jxkg/domain/form/ExamTemplateForm.java
@@ -1,5 +1,6 @@ package com.ycl.jxkg.domain.form; import com.fasterxml.jackson.annotation.JsonFormat; import com.ycl.jxkg.domain.base.AbsForm; import com.ycl.jxkg.domain.entity.ExamTemplate; import com.ycl.jxkg.domain.question.TemplateQuestionDTO; @@ -15,6 +16,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** @@ -31,7 +33,7 @@ @ApiModelProperty("模板名") private String name; @NotNull(message = "学科id不能为空", groups = {Add.class, Update.class}) @NotNull (message = "学科id不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("学科id") private Integer subjectId; @@ -54,6 +56,9 @@ @ApiModelProperty("题目模板") private List<TemplateQuestionDTO> questionList; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:dd") private Date createTime; private Integer createUser; public static ExamTemplate getEntityByForm(@NonNull ExamTemplateForm form, ExamTemplate entity) { if(entity == null) { entity = new ExamTemplate(); src/main/java/com/ycl/jxkg/domain/vo/ExamTemplateVO.java
@@ -1,11 +1,14 @@ package com.ycl.jxkg.domain.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ycl.jxkg.domain.base.AbsVo; import com.ycl.jxkg.domain.entity.ExamTemplate; import java.math.BigDecimal; import java.util.Date; import java.util.List; import com.ycl.jxkg.domain.question.TemplateQuestionDTO; import org.springframework.lang.NonNull; import org.springframework.beans.BeanUtils; import io.swagger.annotations.ApiModel; @@ -28,7 +31,7 @@ private Integer subjectId; /** 总分 */ private Integer score; private BigDecimal score; /** 是否私有 */ private String visibility; @@ -42,46 +45,14 @@ /** 多选评分 */ private BigDecimal deductTypeScore; /** 单选题数量 */ private Integer singleChoice; /** 多选题数量 */ private Integer multipleChoice; /** 填空题数量 */ private Integer gapFilling; /** 判断数量 */ private Integer trueFalse; /** 简答题数量 */ private Integer shortAnswer; /** 计算题数量 */ private Integer calculation; /** 单选每题分数 */ private BigDecimal singleScore; /** 多选每题分数 */ private BigDecimal multipleScore; /** 填空每题分数 */ private BigDecimal gapScore; /** 判断每题分数 */ private BigDecimal trueFalseScore; /** 简答每题分数 */ private BigDecimal shortAnswerScore; /** 计算每题分数 */ private BigDecimal calculationScore; /** 题目配置 */ private List<TemplateQuestionDTO> questionList; /** */ private Integer createUser; /** */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; public static ExamTemplateVO getVoByEntity(@NonNull ExamTemplate entity, ExamTemplateVO vo) { src/main/java/com/ycl/jxkg/domain/vo/admin/exam/ExamPaperPageRequestVO.java
@@ -3,6 +3,8 @@ import com.ycl.jxkg.base.BasePage; import lombok.Data; import java.math.BigDecimal; @Data public class ExamPaperPageRequestVO extends BasePage { @@ -13,10 +15,10 @@ private Integer subjectId; private Integer level; private Integer paperType; private Integer taskExamId; private Integer suggestTime; private BigDecimal score; } src/main/java/com/ycl/jxkg/domain/vo/admin/exam/ExamResponseVO.java
@@ -3,6 +3,7 @@ import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @@ -25,4 +26,10 @@ private Integer paperType; private Integer suggestTime; private Integer deductType; private BigDecimal deductTypeScore; private String visibility; } src/main/java/com/ycl/jxkg/enums/VisibilityEnum.java
@@ -4,13 +4,13 @@ import java.util.Map; public enum VisibilityEnum { Private(1,"PRIVATE", "只有老师自己能看"), Public(2,"PUBLIC", "所有人能看"); Integer code; Private("1","Private", "只有老师自己能看"), Public("2","Public", "所有人能看"); String code; String name; String description; VisibilityEnum(Integer code,String name, String description) { VisibilityEnum(String code,String name, String description) { this.code = code; this.name = name; this.description = description; @@ -32,22 +32,22 @@ this.name = name; } public Integer getCode() { public String getCode() { return code; } public void setCode(Integer code) { public void setCode(String code) { this.code = code; } private static final Map<Integer, VisibilityEnum> keyMap = new HashMap<>(); private static final Map<String, VisibilityEnum> keyMap = new HashMap<>(); static { for (VisibilityEnum item : VisibilityEnum.values()) { keyMap.put(item.getCode(), item); } } public static VisibilityEnum fromCode(Integer code) { public static VisibilityEnum fromCode(String code) { return keyMap.get(code); } src/main/java/com/ycl/jxkg/mapper/ExamTemplateMapper.java
@@ -31,4 +31,5 @@ */ IPage getPage(IPage page, @Param("query") ExamTemplateQuery query); void removeById(Integer id); } src/main/java/com/ycl/jxkg/service/impl/ExamTemplateServiceImpl.java
@@ -23,11 +23,13 @@ import lombok.RequiredArgsConstructor; import com.ycl.jxkg.utils.PageUtil; import org.springframework.beans.BeanUtils; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.security.Security; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -59,7 +61,7 @@ entity.setCreateUser(currentUser.getId()); entity.setCreateTime(new Date()); if(!StringUtils.isEmpty(entity.getVisibility())) { entity.setVisibility(VisibilityEnum.fromCode(Integer.parseInt(entity.getVisibility())).getName()); entity.setVisibility(VisibilityEnum.fromCode(entity.getVisibility()).getName()); } List<TemplateQuestionDTO> questionList = form.getQuestionList(); BigDecimal score = BigDecimal.ZERO; @@ -111,13 +113,54 @@ * @return */ @Override @Transactional(rollbackFor = Exception.class) public Result update(ExamTemplateForm form) { ExamTemplate entity = baseMapper.selectById(form.getId()); // 为空抛IllegalArgumentException,做全局异常处理 Assert.notNull(entity, "记录不存在"); BeanUtils.copyProperties(form, entity); baseMapper.updateById(entity); ExamTemplate entity = ExamTemplateForm.getEntityByForm(form, null); if(!StringUtils.isEmpty(entity.getVisibility())) { entity.setVisibility(VisibilityEnum.fromCode(entity.getVisibility()).getName()); } List<TemplateQuestionDTO> questionList = form.getQuestionList(); BigDecimal score = BigDecimal.ZERO; //设置题目信息 for (TemplateQuestionDTO dto : questionList) { score = score.add(dto.getScore().multiply(BigDecimal.valueOf(dto.getNum()))); Integer questionType = dto.getQuestionType(); switch (QuestionTypeEnum.fromCode(questionType)){ //单选 case SingleChoice: entity.setSingleChoice(dto.getNum()); entity.setSingleScore(dto.getScore()); break; //多选 case MultipleChoice: entity.setMultipleChoice(dto.getNum()); entity.setMultipleScore(dto.getScore()); break; //判断 case TrueFalse: entity.setTrueFalse(dto.getNum()); entity.setTrueFalseScore(dto.getScore()); break; //填空 case GapFilling: entity.setGapFilling(dto.getNum()); entity.setGapScore(dto.getScore()); break; //简答 case ShortAnswer: entity.setShortAnswer(dto.getNum()); entity.setShortAnswerScore(dto.getScore()); break; //计算 case Calculation: entity.setCalculation(dto.getNum()); entity.setCalculationScore(dto.getScore()); break; } } entity.setScore(score); examTemplateMapper.removeById(entity.getId()); baseMapper.insert(entity); return Result.ok("修改成功"); } @@ -150,9 +193,35 @@ */ @Override public Result page(ExamTemplateQuery query) { IPage<ExamTemplateVO> page = PageUtil.getPage(query, ExamTemplateVO.class); IPage<ExamTemplate> page = PageUtil.getPage(query, ExamTemplate.class); baseMapper.getPage(page, query); return Result.ok().data(page.getRecords()).total(page.getTotal()); List<ExamTemplate> records = page.getRecords(); List<ExamTemplateVO> vos = new ArrayList<>(); for (ExamTemplate examTemplate : records) { ExamTemplateVO vo = new ExamTemplateVO(); BeanUtils.copyProperties(examTemplate,vo); String visibility = vo.getVisibility(); vo.setVisibility(VisibilityEnum.valueOf(visibility).getCode()+""); //整理题目信息为集合 List<TemplateQuestionDTO> questionList = new ArrayList<>(); addQuestionList(questionList,QuestionTypeEnum.SingleChoice.getCode(),examTemplate.getSingleScore(),examTemplate.getSingleChoice()); addQuestionList(questionList,QuestionTypeEnum.MultipleChoice.getCode(),examTemplate.getMultipleScore(),examTemplate.getMultipleChoice()); addQuestionList(questionList,QuestionTypeEnum.TrueFalse.getCode(),examTemplate.getTrueFalseScore(),examTemplate.getTrueFalse()); addQuestionList(questionList,QuestionTypeEnum.GapFilling.getCode(),examTemplate.getGapScore(),examTemplate.getGapFilling()); addQuestionList(questionList,QuestionTypeEnum.ShortAnswer.getCode(),examTemplate.getShortAnswerScore(),examTemplate.getShortAnswer()); addQuestionList(questionList,QuestionTypeEnum.Calculation.getCode(),examTemplate.getCalculationScore(),examTemplate.getCalculation()); vo.setQuestionList(questionList); vos.add(vo); } return Result.ok().data(vos).total(page.getTotal()); } private void addQuestionList(List<TemplateQuestionDTO> questionList, Integer code,BigDecimal score,Integer num) { TemplateQuestionDTO questionDTO = new TemplateQuestionDTO(); questionDTO.setQuestionType(code); questionDTO.setScore(score); questionDTO.setNum(num); questionList.add(questionDTO); } /** src/main/resources/mapper/ExamPaperMapper.xml
@@ -2,23 +2,24 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ycl.jxkg.mapper.ExamPaperMapper"> <resultMap id="BaseResultMap" type="com.ycl.jxkg.domain.entity.ExamPaper"> <id column="id" jdbcType="INTEGER" property="id"/> <result column="name" jdbcType="VARCHAR" property="name"/> <result column="subject_id" jdbcType="INTEGER" property="subjectId"/> <result column="paper_type" jdbcType="INTEGER" property="paperType"/> <result column="score" jdbcType="INTEGER" property="score"/> <result column="question_count" jdbcType="INTEGER" property="questionCount"/> <result column="suggest_time" jdbcType="INTEGER" property="suggestTime"/> <result column="visibility" jdbcType="INTEGER" property="visibility"/> <result column="deduct_type" jdbcType="INTEGER" property="deductType"/> <result column="create_user" jdbcType="INTEGER" property="createUser"/> <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/> <result column="deleted" jdbcType="BIT" property="deleted"/> <id column="id" property="id"/> <result column="name" property="name"/> <result column="subject_id" property="subjectId"/> <result column="paper_type" property="paperType"/> <result column="score" property="score"/> <result column="question_count" property="questionCount"/> <result column="suggest_time" property="suggestTime"/> <result column="visibility" property="visibility"/> <result column="deduct_type" property="deductType"/> <result column="deduct_type_score" property="deductTypeScore"/> <result column="create_user" property="createUser"/> <result column="create_time" property="createTime"/> <result column="deleted" property="deleted"/> </resultMap> <sql id="Base_Column_List"> id, name, subject_id, paper_type, score, question_count, suggest_time,visibility ,deduct_type,create_user, create_time,deleted ,deduct_type,deduct_type_score,create_user, create_time,deleted </sql> <resultMap id="PaperInfoResultMap" type="com.ycl.jxkg.domain.vo.student.dashboard.PaperInfo"> src/main/resources/mapper/ExamTemplateMapper.xml
@@ -3,7 +3,7 @@ <mapper namespace="com.ycl.jxkg.mapper.ExamTemplateMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ycl.jxkg.domain.vo.ExamTemplateVO"> <resultMap id="BaseResultMap" type="com.ycl.jxkg.domain.entity.ExamTemplate"> <result column="name" property="name" /> <result column="subject_id" property="subjectId" /> <result column="score" property="score" /> @@ -26,10 +26,6 @@ <result column="create_user" property="createUser" /> <result column="create_time" property="createTime" /> </resultMap> @@ -101,4 +97,7 @@ </where> </select> <delete id="removeById"> delete from t_exam_template where id = #{id} </delete> </mapper>