瀏覽代碼

3.3.0 试卷结构接口

xiaofei 1 年之前
父節點
當前提交
58a0f4ba50

+ 23 - 15
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQuestionController.java

@@ -2,20 +2,19 @@ package com.qmth.distributed.print.api.mark;
 
 
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.teachcloud.common.bean.params.mark.setting.MarkQuestionParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
+import com.qmth.teachcloud.common.service.MarkQuestionService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <p>
@@ -30,18 +29,27 @@ import javax.validation.constraints.Min;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/question")
 public class MarkQuestionController {
 
+    @Resource
+    MarkQuestionService markQuestionService;
+
     /**
-     * 评卷入口数据列表
+     * 评卷结构查询
      */
     @ApiOperation(value = "查询")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                       @ApiParam(value = "课程代码") @RequestParam(required = false) String courseCode,
-                       @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
-                       @ApiParam(value = "提交状态") @RequestParam(required = false) String groupStatus,
-                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-//        IPage<MarkEntranceDto> markEntranceDtoIPage = markUserGroupService.listEntranceGroup(examId, courseCode, paperNumber, pageNumber, pageSize);
-        return ResultUtil.ok();
+                       @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+        List<MarkQuestion> markQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumber(examId, paperNumber);
+        return ResultUtil.ok(markQuestionList);
+    }
+
+    /**
+     * 评卷结构保存
+     */
+    @ApiOperation(value = "提交")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    public Result save(@RequestBody MarkQuestionParams markQuestionParams) {
+        markQuestionService.saveQuestions(markQuestionParams);
+        return ResultUtil.ok(true);
     }
 }

+ 42 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/params/mark/setting/MarkQuestionParams.java

@@ -0,0 +1,42 @@
+package com.qmth.teachcloud.common.bean.params.mark.setting;
+
+import com.qmth.teachcloud.common.entity.MarkQuestion;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 试卷结构保存请求参数
+ */
+public class MarkQuestionParams implements Serializable {
+
+    private Long examId;
+
+    private String paperNumber;
+
+    private List<MarkQuestion> questions;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public List<MarkQuestion> getQuestions() {
+        return questions;
+    }
+
+    public void setQuestions(List<MarkQuestion> questions) {
+        this.questions = questions;
+    }
+}

+ 7 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/MarkQuestionService.java

@@ -1,8 +1,11 @@
 package com.qmth.teachcloud.common.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.bean.params.mark.setting.MarkQuestionParams;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 
+import java.util.List;
+
 /**
  * <p>
  * 小题信息表 服务类
@@ -21,4 +24,8 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
      * @param groupNumber 分组号
      */
     String groupQuestionsByExamIdAndPaperNumberAndNumber(Long examId, String paperNumber, Integer groupNumber);
+
+    List<MarkQuestion> listQuestionByExamIdAndPaperNumber(Long examId, String paperNumber);
+
+    void saveQuestions(MarkQuestionParams markQuestionParams);
 }

+ 80 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/MarkQuestionServiceImpl.java

@@ -1,10 +1,18 @@
 package com.qmth.teachcloud.common.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.bean.params.mark.setting.MarkQuestionParams;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.mapper.MarkQuestionMapper;
 import com.qmth.teachcloud.common.service.MarkQuestionService;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -21,4 +29,76 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
     public String groupQuestionsByExamIdAndPaperNumberAndNumber(Long examId, String paperNumber, Integer groupNumber) {
         return this.baseMapper.groupQuestionsByExamIdAndPaperNumberAndNumber(examId, paperNumber, groupNumber);
     }
+
+    @Override
+    public List<MarkQuestion> listQuestionByExamIdAndPaperNumber(Long examId, String paperNumber) {
+        QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkQuestion::getExamId, examId)
+                .eq(MarkQuestion::getPaperNumber, paperNumber)
+                .orderByAsc(MarkQuestion::getMainNumber)
+                .orderByAsc(MarkQuestion::getSubNumber);
+        return this.list(queryWrapper);
+    }
+
+    @Transactional
+    @Override
+    public void saveQuestions(MarkQuestionParams markQuestionParams) {
+        Long examId = markQuestionParams.getExamId();
+        String paperNumber = markQuestionParams.getPaperNumber();
+        List<MarkQuestion> questions = markQuestionParams.getQuestions();
+        if (CollectionUtils.isEmpty(questions)) {
+            throw ExceptionResultEnum.ERROR.exception("没有可保存的结构数据");
+        }
+
+        // 校验题号不能重复
+        Map<String, Long> longMap = questions.stream().collect(Collectors.groupingBy(m -> m.getMainNumber() + m.getSubNumber(), Collectors.counting()));
+        long count = longMap.entrySet().stream().filter(m -> m.getValue().intValue() > 1).count();
+        if (count > 0) {
+            throw ExceptionResultEnum.ERROR.exception("大题号+小题号有重复数据");
+        }
+
+        // 查询已有结构信息
+        List<MarkQuestion> markQuestionList = this.listQuestionByExamIdAndPaperNumber(examId, paperNumber);
+        if (CollectionUtils.isEmpty(markQuestionList)) {
+            for (MarkQuestion question : questions) {
+                if (question.getTotalScore() <= 0) {
+                    throw ExceptionResultEnum.ERROR.exception("小题满分必须大于0");
+                }
+                if (question.getIntervalScore() <= 0) {
+                    throw ExceptionResultEnum.ERROR.exception("间隔分必须大于0");
+                }
+                question.setExamId(examId);
+                question.setPaperNumber(paperNumber);
+            }
+            this.saveBatch(questions);
+        } else {
+            List<MarkQuestion> saveOrUpdateList = new ArrayList<>();
+            for (MarkQuestion question : questions) {
+                if (Objects.isNull(question.getId())) {
+                    saveOrUpdateList.add(question);
+                } else {
+                    Optional<MarkQuestion> questionOptional = markQuestionList.stream().filter(m -> m.getId().equals(question.getId())).findFirst();
+                    if (questionOptional.isPresent()) {
+                        MarkQuestion markQuestion = questionOptional.get();
+                        if (markQuestion.getGroupNumber() != null && markQuestion.getGroupNumber().intValue() > 0 && markQuestion.getTotalScore().doubleValue() - question.getTotalScore().doubleValue() != 0) {
+                            throw ExceptionResultEnum.ERROR.exception("大题号" + markQuestion.getMainNumber() + "小题号" + markQuestion.getSubNumber() + "已分组,不能修改小题满分");
+                        }
+                        markQuestion.setTotalScore(question.getTotalScore());
+                        saveOrUpdateList.add(markQuestion);
+                        markQuestionList.remove(markQuestion);
+                    } else {
+                        throw ExceptionResultEnum.ERROR.exception("数据异常,请刷新页面后重新操作");
+                    }
+                }
+            }
+            // 已删除的结构
+            if (CollectionUtils.isNotEmpty(markQuestionList)) {
+                List<Long> deleteIds = markQuestionList.stream().map(MarkQuestion::getId).collect(Collectors.toList());
+                this.removeByIds(deleteIds);
+            }
+            this.saveOrUpdateBatch(saveOrUpdateList);
+
+        }
+
+    }
 }