Просмотр исходного кода

调整精准组卷规则,按照来源大题来组

宋悦 7 лет назад
Родитель
Сommit
173d3caa2c

+ 22 - 2
cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/service/GenPaperService.java

@@ -74,7 +74,9 @@ public class GenPaperService {
         for (Paper oldPaper : papers) {
             List<PaperDetailUnit> unitList = unitRepo.findByPaper(oldPaper);
             for (PaperDetailUnit unit : unitList) {
-                questions.add(unit.getQuestion());
+                Question question = unit.getQuestion();
+                question.setQuesName(unit.getPaperDetail().getName());
+                questions.add(question);
             }
 
         }
@@ -88,7 +90,7 @@ public class GenPaperService {
             boolean structTypeMatch = false;
             boolean selected = false;
             for (UnitContext uc : unitContexts) {
-                if (uc.getUnitStruct().getQuestionType() == question.getQuestionType() && !uc.finish()) {
+                if (checkQuesType(uc,question)) {
                     structTypeMatch = true;
                     if (uc.check(question)) {
                         uc.select(question);
@@ -118,6 +120,8 @@ public class GenPaperService {
             paper.setName(genPaperDto.getPaperName());
             paper.setCourseNo(genPaperDto.getCourseNo());
             paper.setCourseName(genPaperDto.getCourseName());
+            Course course = courseRepo.findFirstByCodeAndOrgId(genPaperDto.getCourseNo(),genPaperDto.getOrgId());
+            paper.setCourse(course);
             paper.setCreator(genPaperDto.getCreator());
             paper.setOrgId(genPaperDto.getOrgId());
             paper.setLevel(genPaperDto.getLevel());
@@ -133,6 +137,22 @@ public class GenPaperService {
         return paperMsgMap;
     }
 
+    /**
+     * 校验来源大题名称
+     * @param uc
+     * @param question
+     * @return
+     */
+    private boolean checkQuesType(UnitContext uc,Question question){
+        List<String> quesNames = uc.getUnitStruct().getQuesNames();
+        if(quesNames != null && quesNames.size() > 0){
+            if(quesNames.contains(question.getQuesName()) && !uc.finish()){
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * 按分数在选定的试卷中随机抽取题,组成一套新的试卷
      */

+ 2 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/dao/PaperDetailUnitRepo.java

@@ -1,5 +1,6 @@
 package com.qmth.cqb.paper.dao;
 
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 import com.qmth.cqb.paper.model.Paper;
 import com.qmth.cqb.paper.model.PaperDetail;
 import org.springframework.data.mongodb.repository.MongoRepository;
@@ -17,4 +18,5 @@ public interface PaperDetailUnitRepo extends MongoRepository<PaperDetailUnit, St
     List<PaperDetailUnit> findByQuestion(Question question);
     List<PaperDetailUnit> findByQuestionIn(List<Question> questionList);
     PaperDetailUnit findById(String id);
+    List<PaperDetailUnit> findByQuestionType(QuesStructType quesType);
 }

+ 20 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/dao/QuesTypeNameRepo.java

@@ -0,0 +1,20 @@
+package com.qmth.cqb.paper.dao;
+
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+import com.qmth.cqb.paper.model.QuesTypeName;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.mongodb.repository.Query;
+
+import java.util.List;
+
+/**
+ * Created by songyue on 17/8/22.
+ */
+public interface QuesTypeNameRepo extends MongoRepository<QuesTypeName,String>{
+
+    @Query(value = "{\"orgId\":?0,\"courseNo\":?1,\"questionType\":?2}")
+    List<QuesTypeName> findQuesName(String orgId, String courseNo, QuesStructType quesType);
+
+    @Query(value = "{\"orgId\":?0,\"questionType\":?1}")
+    List<QuesTypeName> findQuesName(String orgId, QuesStructType quesType);
+}

+ 11 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/dto/PaperDetailUnitStructDto.java

@@ -3,6 +3,7 @@ package com.qmth.cqb.paper.dto;
 import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * Created by songyue on 17/3/21.
@@ -21,6 +22,8 @@ public class PaperDetailUnitStructDto implements Serializable {
 
     private QuesStructType questionType;//小题类型
 
+    private List<String> quesNames;//来源大题
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -64,4 +67,12 @@ public class PaperDetailUnitStructDto implements Serializable {
     public void setQuestionType(QuesStructType questionType) {
         this.questionType = questionType;
     }
+
+    public List<String> getQuesNames() {
+        return quesNames;
+    }
+
+    public void setQuesNames(List<String> quesNames) {
+        this.quesNames = quesNames;
+    }
 }

+ 39 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/dto/QuesNameDto.java

@@ -0,0 +1,39 @@
+package com.qmth.cqb.paper.dto;
+
+import java.io.Serializable;
+
+/**
+ * Created by songyue on 17/8/22.
+ */
+public class QuesNameDto implements Serializable{
+
+    private static final long serialVersionUID = -2720739626681442382L;
+
+    private String code;
+
+    private String name;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public QuesNameDto(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public QuesNameDto() {
+    }
+}

+ 2 - 2
cqb-paper/src/main/java/com/qmth/cqb/paper/model/ImportPaperMsg.java

@@ -133,11 +133,11 @@ public class ImportPaperMsg {
     /**
      * 题干不能包含有序列
      */
-    public static final String errMsg_10 = "题干不能包含有序列";
+    public static final String errMsg_10 = "题干不能包含有自动编号";
     /**
      * 选项不能包含有序列
      */
-    public static final String errMsg_11 = "选项不能包含有序列";
+    public static final String errMsg_11 = "选项不能包含有自动编号";
     /**
      * 一般校验
      */

+ 11 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailUnitStruct.java

@@ -1,6 +1,7 @@
 package com.qmth.cqb.paper.model;
 
 import java.io.Serializable;
+import java.util.List;
 
 import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
@@ -19,6 +20,8 @@ public class PaperDetailUnitStruct implements Serializable {
 
     private QuesStructType questionType;//小题类型
 
+    private List<String> quesNames;//来源大题
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -54,4 +57,12 @@ public class PaperDetailUnitStruct implements Serializable {
     public void setQuestionType(QuesStructType questionType) {
         this.questionType = questionType;
     }
+
+    public List<String> getQuesNames() {
+        return quesNames;
+    }
+
+    public void setQuesNames(List<String> quesNames) {
+        this.quesNames = quesNames;
+    }
 }

+ 9 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperStruct.java

@@ -37,6 +37,8 @@ public class PaperStruct implements Serializable {
 
     private String orgId;// 机构ID
 
+    private String courseNo;
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -117,4 +119,11 @@ public class PaperStruct implements Serializable {
         this.orgId = orgId;
     }
 
+    public String getCourseNo() {
+        return courseNo;
+    }
+
+    public void setCourseNo(String courseNo) {
+        this.courseNo = courseNo;
+    }
 }

+ 9 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperStructSearchInfo.java

@@ -17,6 +17,8 @@ public class PaperStructSearchInfo implements Serializable {
 
     private String orgId;
 
+    private String courseNo;
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -53,4 +55,11 @@ public class PaperStructSearchInfo implements Serializable {
         this.orgId = orgId;
     }
 
+    public String getCourseNo() {
+        return courseNo;
+    }
+
+    public void setCourseNo(String courseNo) {
+        this.courseNo = courseNo;
+    }
 }

+ 69 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/model/QuesTypeName.java

@@ -0,0 +1,69 @@
+package com.qmth.cqb.paper.model;
+
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+import org.springframework.data.annotation.Id;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by songyue on 17/8/22.
+ */
+public class QuesTypeName implements Serializable{
+
+    private static final long serialVersionUID = 2084601289212420962L;
+
+    @Id
+    private String id;
+
+    private String orgId;
+
+    private String courseNo;
+
+    private QuesStructType questionType;
+
+    private List<String> quesNames;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(String orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getCourseNo() {
+        return courseNo;
+    }
+
+    public void setCourseNo(String courseNo) {
+        this.courseNo = courseNo;
+    }
+
+    public List<String> getQuesNames() {
+        return quesNames;
+    }
+
+    public void setQuesNames(List<String> quesNames) {
+        this.quesNames = quesNames;
+    }
+
+    public QuesStructType getQuestionType() {
+        return questionType;
+    }
+
+    public void setQuestionType(QuesStructType questionType) {
+        this.questionType = questionType;
+    }
+
+    public QuesTypeName() {
+    }
+}

+ 4 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java

@@ -76,6 +76,9 @@ public class ImportPaperService {
     @Autowired
     CourseRepo courseRepo;
 
+    @Autowired
+    QuesTypeNameService quesTypeNameService;
+
     /**
      * 获取上传文件
      *
@@ -139,6 +142,7 @@ public class ImportPaperService {
         }
         if (paperDetailUnits.size() > 0) {
             paperDetailUnitRepo.save(paperDetailUnits);
+            quesTypeNameService.saveQuesTypeName(paperDetailUnits);
         }
         paperService.formatPaper(tempPaper, null);
         return tempPaper;

+ 52 - 17
cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperStructService.java

@@ -1,22 +1,26 @@
 package com.qmth.cqb.paper.service;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
+import java.util.stream.Collectors;
 
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+import com.qmth.cqb.paper.dao.PaperDetailUnitRepo;
+import com.qmth.cqb.paper.dao.QuesTypeNameRepo;
+import com.qmth.cqb.paper.dto.QuesNameDto;
+import com.qmth.cqb.paper.model.*;
+import com.qmth.cqb.utils.enums.PaperType;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Example;
-import org.springframework.data.domain.ExampleMatcher;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.*;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 
 import com.qmth.cqb.paper.dao.PaperStructRepo;
 import com.qmth.cqb.paper.dto.PaperDetailUnitStructDto;
-import com.qmth.cqb.paper.model.PaperDetailStruct;
-import com.qmth.cqb.paper.model.PaperDetailUnitStruct;
-import com.qmth.cqb.paper.model.PaperStruct;
-import com.qmth.cqb.paper.model.PaperStructSearchInfo;
 import com.qmth.cqb.utils.BeanCopierUtil;
 import com.qmth.cqb.utils.CommonUtils;
 
@@ -34,6 +38,12 @@ public class PaperStructService {
     @Autowired
     PaperStructRepo paperStructRepo;
 
+    @Autowired
+    QuesTypeNameRepo quesTypeNameRepo;
+
+    @Autowired
+    MongoTemplate mongoTemplate;
+
     /**
      * 获取所有试卷结构(分页)
      * 
@@ -60,15 +70,15 @@ public class PaperStructService {
      * @return
      */
     public List<PaperStruct> getPaperStructs(PaperStructSearchInfo searchInfo) {
-        formatSearchInfo(searchInfo);
-        PaperStruct paperStruct = BeanCopierUtil.copyProperties(searchInfo, PaperStruct.class);
-        formatPaperStruct(paperStruct);
-        ExampleMatcher matcher = ExampleMatcher.matching()
-                .withMatcher("name",contains())
-                .withMatcher("creator",contains())
-                .withMatcher("orgId",exact())
-                .withIgnoreNullValues();
-        return paperStructRepo.findAll(Example.of(paperStruct, matcher));
+        Query query = new Query();
+        if(StringUtils.isNotBlank(searchInfo.getCourseNo())){
+            query.addCriteria(Criteria.where("courseNo")
+                    .in("",searchInfo.getCourseNo()));
+        }
+        query.addCriteria(Criteria.where("orgId").is(searchInfo.getOrgId()));
+        query.with(new Sort(new Sort.Order(Sort.Direction.DESC,"createTime")));
+        List<PaperStruct> paperList = this.mongoTemplate.find(query, PaperStruct.class);
+        return paperList;
     }
 
     public void formatSearchInfo(PaperStructSearchInfo searchInfo) {
@@ -118,6 +128,7 @@ public class PaperStructService {
                     unitStruct.setId(String.valueOf(number));
                     unitStruct.setNumber(number);
                     unitStruct.setQuestionType(unitStructDto.getQuestionType());
+                    unitStruct.setQuesNames(unitStructDto.getQuesNames());
                     unitStructs.add(unitStruct);
                 }
             }
@@ -139,4 +150,28 @@ public class PaperStructService {
         return paperStruct;
     }
 
+    public List<QuesNameDto> getQuesNameList(String orgId,
+                                             String courseNo,
+                                             QuesStructType quesType) {
+        List<QuesNameDto> quesNameList = new ArrayList<>();
+        List<QuesTypeName> quesTypeNames = new ArrayList<>();
+        if (StringUtils.isEmpty(courseNo)) {
+            quesTypeNames = quesTypeNameRepo.findQuesName(orgId, quesType);
+        } else {
+            quesTypeNames = quesTypeNameRepo.findQuesName(orgId, courseNo, quesType);
+        }
+
+        quesNameList = quesTypeNames.stream()
+                .map(QuesTypeName::getQuesNames)
+                .flatMap(Collection::stream)
+                .distinct()
+                .map(this::getQuesName)
+                .collect(Collectors.toList());
+        return quesNameList;
+    }
+
+    private QuesNameDto getQuesName(String name){
+        return new QuesNameDto(name,name);
+    }
+
 }

+ 61 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/QuesTypeNameService.java

@@ -0,0 +1,61 @@
+package com.qmth.cqb.paper.service;
+
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+import com.qmth.cqb.paper.dao.QuesTypeNameRepo;
+import com.qmth.cqb.paper.model.PaperDetailUnit;
+import com.qmth.cqb.paper.model.QuesTypeName;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by songyue on 17/8/23.
+ */
+@Service
+public class QuesTypeNameService {
+
+    @Autowired
+    private QuesTypeNameRepo quesTypeRepo;
+
+    /**
+     * 保存来源大题名称
+     * @param detailUnitList
+     */
+    public void saveQuesTypeName(List<PaperDetailUnit> detailUnitList){
+
+        for(PaperDetailUnit paperDetailUnit:detailUnitList){
+            String orgId = paperDetailUnit.getPaper().getOrgId();
+            String courseNo = paperDetailUnit.getPaper().getCourseNo();
+            QuesStructType questionType = paperDetailUnit.getQuestionType();
+            String detailName = paperDetailUnit.getPaperDetail().getName();
+            List<QuesTypeName> quesTypeNames = quesTypeRepo.findQuesName(orgId,courseNo,questionType);
+            if(quesTypeNames != null && quesTypeNames.size() > 0){
+                QuesTypeName quesTypeName = quesTypeNames.get(0);
+                List<String> quesNames = quesTypeName.getQuesNames();
+                if(quesNames != null && quesNames.size() > 0 ){
+                    if(quesNames.contains(detailName)){
+                        continue;
+                    }else{
+                        quesNames.add(detailName);
+                    }
+                }else{
+                    quesNames = new ArrayList<>();
+                    quesNames.add(detailName);
+                }
+                quesTypeName.setQuesNames(quesNames);
+                quesTypeRepo.save(quesTypeName);
+            }else{
+                QuesTypeName quesTypeName = new QuesTypeName();
+                List<String> quesNames = new ArrayList<>();
+                quesNames.add(detailName);
+                quesTypeName.setOrgId(orgId);
+                quesTypeName.setCourseNo(courseNo);
+                quesTypeName.setQuestionType(questionType);
+                quesTypeName.setQuesNames(quesNames);
+                quesTypeRepo.save(quesTypeName);
+            }
+        }
+    }
+}

+ 24 - 9
cqb-paper/src/main/java/com/qmth/cqb/paper/web/PaperStructController.java

@@ -1,24 +1,19 @@
 package com.qmth.cqb.paper.web;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.servlet.http.HttpServletRequest;
 
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+import com.qmth.cqb.paper.dto.QuesNameDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import com.qmth.cqb.paper.dao.PaperStructRepo;
 import com.qmth.cqb.paper.model.PaperStruct;
@@ -148,4 +143,24 @@ public class PaperStructController {
         paperStructRepo.delete(paperStructRepo.findAll(paperList));
         return new ResponseEntity(HttpStatus.OK);
     }
+
+    /**
+     * 根据题型获取来源大题
+     *
+     * @param
+     * @return
+     */
+    @ApiOperation(value = "获取来源大题", notes = "获取来源大题")
+    @Uac(roles={RoleMeta.QUESTION_ADMIN,RoleMeta.SUPER_ADMIN},policy=UacPolicy.IN)
+    @GetMapping(value = "/paperStruct/quesNames")
+    public ResponseEntity getPaperStructById(HttpServletRequest request,
+                                             @RequestParam(required = false) String courseNo,
+                                             @RequestParam QuesStructType quesType) {
+        List<QuesNameDto> quesNameDtos = new ArrayList<>();
+        AccessUser user = (AccessUser) request.getAttribute("accessUser");
+        if(user != null){
+            quesNameDtos = paperStructService.getQuesNameList(user.getOrgId().toString(),courseNo,quesType);
+        }
+        return new ResponseEntity(quesNameDtos, HttpStatus.OK);
+    }
 }

+ 10 - 0
cqb-question-resource/src/main/java/com/qmth/cqb/question/model/Question.java

@@ -75,6 +75,8 @@ public class Question implements Serializable {
     private Boolean hasAudio;
 
     private List<QuestionAudio> questionAudios;
+
+    private String quesName;//来源大题
     
     public static long getSerialVersionUID() {
         return serialVersionUID;
@@ -284,4 +286,12 @@ public class Question implements Serializable {
     public void setCourse(Course course) {
         this.course = course;
     }
+
+    public String getQuesName() {
+        return quesName;
+    }
+
+    public void setQuesName(String quesName) {
+        this.quesName = quesName;
+    }
 }