xiatian 4 år sedan
förälder
incheckning
6b9ab31dbe

+ 215 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/bean/MarkItemBean.java

@@ -0,0 +1,215 @@
+package cn.com.qmth.dp.examcloud.oe.bean;
+
+
+import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+
+/**
+ * @ClassName MarkItemBean
+ * @Description TODO
+ * @Author nikang
+ * @Date 2018/11/27 11:07
+ * @Version 3.0
+ */
+public class MarkItemBean implements JsonSerializable {
+    private static final long serialVersionUID = -7730711644410595809L;
+    private long id;
+    enum ScoringType{
+        /**
+         * 根据给分间隔
+         */
+        INTERVAL,
+        /**
+         * 人工指定给分列表
+         */
+        MANUAL
+    }
+
+    private String basePaperId;
+
+    private Long workId;
+
+    private Long markRangeId;
+
+    /**
+     * 大题号
+     */
+    private int mainNumber;
+
+    /**
+     * 小题号
+     */
+    private int subNumber;
+
+    /**
+     * 全卷范围内排序
+     */
+    private int orders;
+
+    /**
+     * 分值
+     */
+    private double maxScore;
+
+    /**
+     * 题Id
+     */
+    private String questionId;
+
+    /**
+     * 给分方式
+     */
+    private MarkItemBean.ScoringType scoringType;
+
+    /**
+     * 给分间隔
+     */
+    private Double scoreInterval;
+
+    /**
+     * 给分列表
+     */
+    private String socreList;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getBasePaperId() {
+        return basePaperId;
+    }
+
+    public void setBasePaperId(String basePaperId) {
+        this.basePaperId = basePaperId;
+    }
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public Long getMarkRangeId() {
+        return markRangeId;
+    }
+
+    public void setMarkRangeId(Long markRangeId) {
+        this.markRangeId = markRangeId;
+    }
+
+    public int getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(int mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public int getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(int subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public int getOrders() {
+        return orders;
+    }
+
+    public void setOrders(int orders) {
+        this.orders = orders;
+    }
+
+    public double getMaxScore() {
+        return maxScore;
+    }
+
+    public void setMaxScore(double maxScore) {
+        this.maxScore = maxScore;
+    }
+
+    public String getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(String questionId) {
+        this.questionId = questionId;
+    }
+
+    public ScoringType getScoringType() {
+        return scoringType;
+    }
+
+    public void setScoringType(ScoringType scoringType) {
+        this.scoringType = scoringType;
+    }
+
+    public Double getScoreInterval() {
+        return scoreInterval;
+    }
+
+    public void setScoreInterval(Double scoreInterval) {
+        this.scoreInterval = scoreInterval;
+    }
+
+    public String getSocreList() {
+        return socreList;
+    }
+
+    public void setSocreList(String socreList) {
+        this.socreList = socreList;
+    }
+
+    public MarkItemBean() {
+    }
+
+    public MarkItemBean(String basePaperId, int mainNumber, int subNumber, double maxScore, Double scoreInterval, int orders, String questionId) {
+        this.basePaperId = basePaperId;
+        this.mainNumber = mainNumber;
+        this.subNumber = subNumber;
+        this.maxScore = maxScore;
+        this.scoreInterval = scoreInterval == null ? 1 : scoreInterval;
+        this.scoringType = MarkItemBean.ScoringType.INTERVAL;
+        this.orders = orders;
+        this.questionId = questionId;
+    }
+
+    public MarkItemBean(String basePaperId, int mainNumber,int subNumber,double maxScore,String socreList) {
+        this.basePaperId = basePaperId;
+        this.mainNumber = mainNumber;
+        this.subNumber = subNumber;
+        this.maxScore = maxScore;
+        this.socreList = socreList == null ? String.valueOf(this.maxScore) : socreList;
+        this.scoringType = MarkItemBean.ScoringType.MANUAL;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        MarkItemBean markItem = (MarkItemBean) o;
+
+        if (getMainNumber() != markItem.getMainNumber()) return false;
+        if (getSubNumber() != markItem.getSubNumber()) return false;
+        if (getBasePaperId() != null ? !getBasePaperId().equals(markItem.getBasePaperId()) : markItem.getBasePaperId() != null)
+            return false;
+        return getWorkId() != null ? getWorkId().equals(markItem.getWorkId()) : markItem.getWorkId() == null;
+
+    }
+
+    @Override
+    public int hashCode() {
+        int result = getBasePaperId() != null ? getBasePaperId().hashCode() : 0;
+        result = 31 * result + (getWorkId() != null ? getWorkId().hashCode() : 0);
+        result = 31 * result + getMainNumber();
+        result = 31 * result + getSubNumber();
+        return result;
+    }
+}

+ 18 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/dao/MarkItemRepo.java

@@ -0,0 +1,18 @@
+package cn.com.qmth.dp.examcloud.oe.dao;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import cn.com.qmth.dp.examcloud.oe.entity.marking.MarkItemEntity;
+
+/**
+ * Created by dizhi on 2016/12/21.
+ */
+public interface MarkItemRepo extends JpaRepository<MarkItemEntity, Long> {
+
+    @Query(value = "delete from ec_m_mark_item where work_id =?1 and base_paper_id=?2", nativeQuery = true)
+    @Modifying
+    void deleteByWorkIdPaperId(Long id,String paperId);
+
+}

+ 15 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/dao/MarkRangeRepo.java

@@ -0,0 +1,15 @@
+package cn.com.qmth.dp.examcloud.oe.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import cn.com.qmth.dp.examcloud.oe.entity.marking.MarkRangeEntity;
+
+/**
+ * Created by dizhi on 2016/12/21.
+ */
+public interface MarkRangeRepo extends JpaRepository<MarkRangeEntity,Long>{
+
+	List<MarkRangeEntity> findByWorkIdAndBasePaperId(Long workId, String basePaperId);
+}

+ 13 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/dao/MarkWorkRepo.java

@@ -0,0 +1,13 @@
+package cn.com.qmth.dp.examcloud.oe.dao;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import cn.com.qmth.dp.examcloud.oe.entity.marking.MarkWorkEntity;
+
+/**
+ * Created by zhengmin on 2016/12/22.
+ */
+public interface MarkWorkRepo extends JpaRepository<MarkWorkEntity, Long>, JpaSpecificationExecutor<MarkWorkEntity> {
+
+}

+ 15 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/dao/PaperDetailRepo.java

@@ -0,0 +1,15 @@
+package cn.com.qmth.dp.examcloud.oe.dao;
+
+import java.util.List;
+
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.repository.query.QueryByExampleExecutor;
+
+import cn.com.qmth.dp.examcloud.oe.entity.question.Paper;
+import cn.com.qmth.dp.examcloud.oe.entity.question.PaperDetail;
+
+public interface PaperDetailRepo extends MongoRepository<PaperDetail, String>, QueryByExampleExecutor<PaperDetail> {
+    List<PaperDetail> findByPaperOrderByNumber(Paper paper);
+
+    List<PaperDetail> findByPaper(Paper paper);
+}

+ 63 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/dao/PaperDetailUnitRepo.java

@@ -0,0 +1,63 @@
+package cn.com.qmth.dp.examcloud.oe.dao;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.repository.query.QueryByExampleExecutor;
+
+import cn.com.qmth.dp.examcloud.oe.entity.question.Paper;
+import cn.com.qmth.dp.examcloud.oe.entity.question.PaperDetail;
+import cn.com.qmth.dp.examcloud.oe.entity.question.PaperDetailUnit;
+import cn.com.qmth.dp.examcloud.oe.entity.question.Question;
+import cn.com.qmth.dp.examcloud.oe.enums.question.QuesStructType;
+
+
+public interface PaperDetailUnitRepo extends MongoRepository<PaperDetailUnit, String>, QueryByExampleExecutor<PaperDetailUnit> {
+    List<PaperDetailUnit> findByPaperDetailOrderByNumber(PaperDetail paperDetail);
+
+    List<PaperDetailUnit> findByPaperOrderByNumber(Paper paper);
+
+    List<PaperDetailUnit> findByPaper(Paper paper);
+
+    List<PaperDetailUnit> findByPaperId(String paperId);
+
+    List<PaperDetailUnit> findByPaperIdOrderByNumber(String paperId);
+
+    List<PaperDetailUnit> findByQuestion(Question question);
+
+    List<PaperDetailUnit> findByQuestionIn(List<Question> questionList);
+
+    Optional<PaperDetailUnit> findById(String id);
+
+    List<PaperDetailUnit> findByQuestionType(QuesStructType quesType);
+
+    Long countByPaperDetail(PaperDetail paperDetail);
+
+    /**
+     * 查询大题下的小题
+     * 按number降序排列,取第一个,也就是number最大那个
+     *
+     * @param paperDetail
+     * @return
+     */
+    PaperDetailUnit findTopByPaperDetailOrderByNumberDesc(PaperDetail paperDetail);
+
+    /**
+     * 查询大题下的小题
+     * 按number升序排列,取第一个,也就是number最小那个
+     *
+     * @param paperDetail
+     * @return
+     */
+    PaperDetailUnit findTopByPaperDetailOrderByNumberAsc(PaperDetail paperDetail);
+
+    /**
+     * 查询试卷中的第几个试题
+     *
+     * @param paper
+     * @param number
+     * @return
+     */
+    PaperDetailUnit findByPaperAndNumber(Paper paper, Integer number);
+}

+ 39 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/dao/PaperRepo.java

@@ -0,0 +1,39 @@
+package cn.com.qmth.dp.examcloud.oe.dao;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.repository.query.QueryByExampleExecutor;
+
+import cn.com.qmth.dp.examcloud.oe.entity.question.Paper;
+import cn.com.qmth.dp.examcloud.oe.enums.question.PaperStatus;
+import cn.com.qmth.dp.examcloud.oe.enums.question.PaperType;
+
+public interface PaperRepo extends MongoRepository<Paper, String>, QueryByExampleExecutor<Paper> {
+
+    List<Paper> findByParams(Map<String, String> params);
+
+    Page<Paper> findByPaperType(PaperType paperType, Pageable pageable);
+
+    Page<Paper> findByPaperStatus(PaperStatus paperStatus, Pageable pageable);
+
+    List<Paper> findByNameAndOrgId(String name, String orgId);
+
+    Page<Paper> findByIdNotInAndCourseNoAndOrgIdAndPaperType(Set<String> idSet, String courseNo, String orgId,
+                                                             PaperType paperType, Pageable page);
+
+    List<Paper> findByCourseNoAndOrgId(String courseNo, String orgId);
+
+    List<Paper> findByIdIn(List<String> paperIds);
+
+    List<Paper> findBySpecialtyCodeAndOrgId(String specialtyCode, String orgId);
+
+    Paper findByNameAndOrgIdAndPaperType(String name, String orgId, PaperType paperType);
+
+    List<Paper> findByPaperType(PaperType paperType);
+
+}

+ 27 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/entity/marking/IdEntity.java

@@ -0,0 +1,27 @@
+package cn.com.qmth.dp.examcloud.oe.entity.marking;
+
+import java.io.Serializable;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * Created by zhengmin on 2016/12/15.
+ */
+@MappedSuperclass
+public abstract class IdEntity implements Serializable{
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private long id;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+}

+ 236 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/entity/marking/MarkItemEntity.java

@@ -0,0 +1,236 @@
+package cn.com.qmth.dp.examcloud.oe.entity.marking;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Index;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 评卷项 Created by zhengmin on 2016/12/12.
+ */
+@Entity
+@Table(name = "ec_m_mark_item", indexes = {
+        @Index(name = "IDX_M_MARK_ITEM_001", columnList = "workId,basePaperId,questionId,mainNumber,subNumber,orders", unique = false) })
+public class MarkItemEntity extends IdEntity implements Comparable {
+
+    enum ScoringType {
+        /**
+         * 根据给分间隔
+         */
+        INTERVAL,
+        /**
+         * 人工指定给分列表
+         */
+        MANUAL
+    }
+
+    private static final long serialVersionUID = -3730733150694463597L;
+
+    @NotNull
+    private String basePaperId;
+
+    @NotNull
+    private Long workId;
+
+    private Long markRangeId;
+
+    /**
+     * 大题号
+     */
+    private int mainNumber;
+
+    /**
+     * 小题号
+     */
+    private int subNumber;
+
+    /**
+     * 全试卷范围内题号顺序
+     */
+    private int orders;
+
+    /**
+     * 分值
+     */
+    private double maxScore;
+
+    /**
+     * 给分方式
+     */
+    @Enumerated(EnumType.STRING)
+    private ScoringType scoringType;
+
+    /**
+     * 给分间隔
+     */
+    private Double scoreInterval;
+
+    /**
+     * 给分列表
+     */
+    private String socreList;
+
+    /**
+     * 题Id
+     */
+    private String questionId;
+
+    public MarkItemEntity() {
+    }
+
+    public MarkItemEntity(String basePaperId, int mainNumber, int subNumber, double maxScore, Double scoreInterval,
+            int orders, String questionId) {
+        this.basePaperId = basePaperId;
+        this.mainNumber = mainNumber;
+        this.subNumber = subNumber;
+        this.maxScore = maxScore;
+        this.scoreInterval = scoreInterval == null ? 1 : scoreInterval;
+        this.scoringType = ScoringType.INTERVAL;
+        this.orders = orders;
+        this.questionId = questionId;
+    }
+
+    public MarkItemEntity(String basePaperId, int mainNumber, int subNumber, double maxScore, String socreList) {
+        this.basePaperId = basePaperId;
+        this.mainNumber = mainNumber;
+        this.subNumber = subNumber;
+        this.maxScore = maxScore;
+        this.socreList = socreList == null ? String.valueOf(this.maxScore) : socreList;
+        this.scoringType = ScoringType.MANUAL;
+    }
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public int getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(int mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public int getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(int subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public double getMaxScore() {
+        return maxScore;
+    }
+
+    public void setMaxScore(double maxScore) {
+        this.maxScore = maxScore;
+    }
+
+    public ScoringType getScoringType() {
+        return scoringType;
+    }
+
+    public void setScoringType(ScoringType scoringType) {
+        this.scoringType = scoringType;
+    }
+
+    public Double getScoreInterval() {
+        return scoreInterval;
+    }
+
+    public void setScoreInterval(Double scoreInterval) {
+        this.scoreInterval = scoreInterval;
+    }
+
+    public String getSocreList() {
+        return socreList;
+    }
+
+    public void setSocreList(String socreList) {
+        this.socreList = socreList;
+    }
+
+    @NotNull
+    public String getBasePaperId() {
+        return basePaperId;
+    }
+
+    public void setBasePaperId(@NotNull String basePaperId) {
+        this.basePaperId = basePaperId;
+    }
+
+    public Long getMarkRangeId() {
+        return markRangeId;
+    }
+
+    public void setMarkRangeId(Long markRangeId) {
+        this.markRangeId = markRangeId;
+    }
+
+    public int getOrders() {
+        return orders;
+    }
+
+    public void setOrders(int orders) {
+        this.orders = orders;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+
+        MarkItemEntity markItem = (MarkItemEntity) o;
+
+        if (getMainNumber() != markItem.getMainNumber())
+            return false;
+        if (getSubNumber() != markItem.getSubNumber())
+            return false;
+        if (getOrders() != markItem.getOrders())
+            return false;
+        if (getBasePaperId() != null ? !getBasePaperId().equals(markItem.getBasePaperId())
+                : markItem.getBasePaperId() != null)
+            return false;
+        return getWorkId() != null ? getWorkId().equals(markItem.getWorkId()) : markItem.getWorkId() == null;
+
+    }
+
+    @Override
+    public int hashCode() {
+        int result = getBasePaperId() != null ? getBasePaperId().hashCode() : 0;
+        result = 31 * result + (getWorkId() != null ? getWorkId().hashCode() : 0);
+        result = 31 * result + getMainNumber();
+        result = 31 * result + getSubNumber();
+        result = 31 * result + getOrders();
+        return result;
+    }
+
+    @Override
+    public int compareTo(Object o) {
+        MarkItemEntity markItem = (MarkItemEntity) o;
+        if (markItem.getOrders() < this.getOrders()) {
+            return 1;
+        } else if (markItem.getOrders() > this.getOrders()) {
+            return -1;
+        } else {
+            return 0;
+        }
+    }
+
+    public String getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(String questionId) {
+        this.questionId = questionId;
+    }
+}

+ 92 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/entity/marking/MarkRangeEntity.java

@@ -0,0 +1,92 @@
+package cn.com.qmth.dp.examcloud.oe.entity.marking;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Index;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+import cn.com.qmth.dp.examcloud.oe.enums.marking.MarkModeType;
+
+
+/**
+ * update by nikang on 2018/09/23.
+ */
+@Entity
+@Table(name = "ec_m_mark_range",indexes = {
+		@Index(name = "IDX_M_MARK_RANGE_01", columnList = "basePaperId,workId", unique = true)})
+public class MarkRangeEntity extends IdEntity {
+
+
+    private static final long serialVersionUID = -1475233351987693246L;
+
+    @NotNull
+    private String basePaperId;
+
+    @NotNull
+    private Long workId;
+    /**
+     * 基础试卷名称
+     */
+    private String name;
+
+    @Enumerated(value = EnumType.STRING)
+    private MarkModeType markMode;
+
+    @OneToMany(cascade = CascadeType.REFRESH)
+    @JoinColumn(name = "markRangeId")
+    private Set<MarkItemEntity> markItems = new HashSet<>();
+
+
+    public MarkRangeEntity(){}
+
+
+    @NotNull
+    public String getBasePaperId() {
+        return basePaperId;
+    }
+
+    public void setBasePaperId(@NotNull String basePaperId) {
+        this.basePaperId = basePaperId;
+    }
+
+    public MarkModeType getMarkMode() {
+        return markMode;
+    }
+
+    public void setMarkMode(MarkModeType markMode) {
+        this.markMode = markMode;
+    }
+
+    public Set<MarkItemEntity> getMarkItems() {
+        return markItems;
+    }
+
+    public void setMarkItems(Set<MarkItemEntity> markItems) {
+        this.markItems = markItems;
+    }
+
+
+	public Long getWorkId() {
+		return workId;
+	}
+
+	public void setWorkId(Long workId) {
+		this.workId = workId;
+	}
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 122 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/entity/marking/MarkWorkEntity.java

@@ -0,0 +1,122 @@
+package cn.com.qmth.dp.examcloud.oe.entity.marking;
+
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.Index;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.validation.constraints.NotNull;
+
+/**
+ * update by nikang on 2018/09/23.
+ */
+@Entity
+@Table(name = "ec_m_mark_work", indexes = {
+        @Index(name = "IDX_M_MARK_WORK_001", columnList = "rootOrgId,examId", unique = false) })
+public class MarkWorkEntity extends IdEntity {
+
+    private static final long serialVersionUID = 806290348733550628L;
+
+    private String name;
+
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date createdOn;
+
+    /* 废弃字段 */
+    private String examId;
+
+    /* 评卷是否结束 */
+    @NotNull
+    private Boolean isEnd;
+
+    /* 追加操作时间戳,用于创建完成是比对该值,看期间是否有新的追加 */
+    private Long appendTime;
+
+    private String remark;
+
+    /**
+     * 状态 0:创建中 1:创建成功 2:创建失败 3:追加中
+     */
+    private int status;
+
+    @NotNull
+    private Long rootOrgId;
+
+    public MarkWorkEntity() {
+    }
+
+    public MarkWorkEntity(String name, String examId, Long rootOrgId) {
+        this.name = name;
+        this.examId = examId;
+        this.rootOrgId = rootOrgId;
+        this.createdOn = new Date();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Date getCreatedOn() {
+        return createdOn;
+    }
+
+    public void setCreatedOn(Date createdOn) {
+        this.createdOn = createdOn;
+    }
+
+    public String getExamId() {
+        return examId;
+    }
+
+    public void setExamId(String examId) {
+        this.examId = examId;
+    }
+
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public Long getRootOrgId() {
+        return rootOrgId;
+    }
+
+    public void setRootOrgId(Long rootOrgId) {
+        this.rootOrgId = rootOrgId;
+    }
+
+    public Boolean getIsEnd() {
+        return isEnd;
+    }
+
+    public void setIsEnd(Boolean isEnd) {
+        this.isEnd = isEnd;
+    }
+
+    public Long getAppendTime() {
+        return appendTime;
+    }
+
+    public void setAppendTime(Long appendTime) {
+        this.appendTime = appendTime;
+    }
+
+}

+ 8 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/enums/marking/MarkModeType.java

@@ -0,0 +1,8 @@
+package cn.com.qmth.dp.examcloud.oe.enums.marking;
+
+/**
+ * Created by dizhi on 2016/12/21.
+ */
+public enum MarkModeType {
+    SINGLE,MULTI
+}

+ 275 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/marking_item_change/MarkingItemChangeService.java

@@ -0,0 +1,275 @@
+package cn.com.qmth.dp.examcloud.oe.modules.marking_item_change;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.transaction.Transactional;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.stereotype.Service;
+
+import com.google.common.collect.Lists;
+
+import cn.com.qmth.dp.examcloud.oe.bean.MarkItemBean;
+import cn.com.qmth.dp.examcloud.oe.dao.MarkItemRepo;
+import cn.com.qmth.dp.examcloud.oe.dao.MarkRangeRepo;
+import cn.com.qmth.dp.examcloud.oe.dao.MarkWorkRepo;
+import cn.com.qmth.dp.examcloud.oe.dao.PaperDetailRepo;
+import cn.com.qmth.dp.examcloud.oe.dao.PaperDetailUnitRepo;
+import cn.com.qmth.dp.examcloud.oe.dao.PaperRepo;
+import cn.com.qmth.dp.examcloud.oe.entity.marking.MarkItemEntity;
+import cn.com.qmth.dp.examcloud.oe.entity.marking.MarkRangeEntity;
+import cn.com.qmth.dp.examcloud.oe.entity.marking.MarkWorkEntity;
+import cn.com.qmth.dp.examcloud.oe.entity.question.Paper;
+import cn.com.qmth.dp.examcloud.oe.entity.question.PaperDetail;
+import cn.com.qmth.dp.examcloud.oe.entity.question.PaperDetailUnit;
+import cn.com.qmth.dp.examcloud.oe.entity.question.Question;
+import cn.com.qmth.dp.examcloud.oe.enums.question.QuesStructType;
+import cn.com.qmth.dp.examcloud.oe.util.Model;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultPaper;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionGroup;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionStructureWrapper;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionUnitWrapper;
+import cn.com.qmth.examcloud.question.commons.core.question.QuestionType;
+import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
+
+/**
+ * 修改评卷任务给分板
+ * 
+ * @author chenken
+ *
+ */
+@Service
+public class MarkingItemChangeService {
+
+	@Autowired
+	MongoTemplate mongoTemplate;
+	@Autowired
+	PaperRepo paperRepo;
+    @Autowired
+    private PaperDetailRepo paperDetailRepo;
+    @Autowired
+    private PaperDetailUnitRepo paperDetailUnitRepo;
+    @Autowired
+    private MarkWorkRepo markWorkRepo;
+    @Autowired
+    private MarkItemRepo markItemRepo;
+    @Autowired
+    private MarkRangeRepo markRangeRepo;
+    
+    @Transactional
+	public void start() {
+    	System.out.println("*******************start");
+		List<String> basePaperIds = new ArrayList<>();
+		basePaperIds.add("60c18496c68d4c45f68ef951");
+		basePaperIds.add("60c18495c68d4c45f68ef7af");
+		
+		Long workId = 1479L;
+
+		for (String basePaperId : basePaperIds) {
+			List<MarkItemBean> markItems = new ArrayList<MarkItemBean>();
+			DefaultPaper defaultPaper = getBaseDefaultPaper(basePaperId);
+			List<DefaultQuestionGroup> defaultQuestionGroupList = defaultPaper.getQuestionGroupList();
+			// 大题号
+			int mainNumber = 1;
+			// 每个小题在试卷中的位置
+			int order = 0;
+			for (DefaultQuestionGroup defaultQuestionGroup : defaultQuestionGroupList) {
+				List<DefaultQuestionStructureWrapper> defaultQuestionStructureWrapperList = defaultQuestionGroup
+						.getQuestionWrapperList();
+				// 小题号
+				int subNumber = 1;
+				for (DefaultQuestionStructureWrapper defaultQuestionStructureWrapper : defaultQuestionStructureWrapperList) {
+					List<DefaultQuestionUnitWrapper> defaultQuestionUnitWrapperList = defaultQuestionStructureWrapper
+							.getQuestionUnitWrapperList();
+					for (DefaultQuestionUnitWrapper defaultQuestionUnitWrapper : defaultQuestionUnitWrapperList) {
+						order++;
+						if ("FILL_UP".equals(defaultQuestionUnitWrapper.getQuestionType().toString())
+								|| "ESSAY".equals(defaultQuestionUnitWrapper.getQuestionType().toString())) {
+							MarkItemBean markItem = new MarkItemBean(basePaperId, mainNumber, subNumber,
+									defaultQuestionUnitWrapper.getQuestionScore(), 0.5, order,
+									defaultQuestionStructureWrapper.getQuestionId());
+							markItems.add(markItem);
+						}
+						subNumber++;
+					}
+				}
+				mainNumber++;
+			}
+			saveMarkWorkItem(workId,markItems,basePaperId);
+		}
+		System.out.println("*******************finish");
+	}
+	private void saveMarkWorkItem(Long workId,List<MarkItemBean> markItemBeanList,String basePaperId) {
+        if(null != workId && CollectionUtils.isNotEmpty(markItemBeanList)){
+        	List<MarkRangeEntity>  rs=markRangeRepo.findByWorkIdAndBasePaperId(workId, basePaperId);
+            MarkWorkEntity work = GlobalHelper.getEntity(markWorkRepo, workId, MarkWorkEntity.class);
+            if(work == null){
+            	throw new StatusException("Q-020560", "work null");
+            }
+            List<MarkItemEntity> markItems = Lists.newArrayList();
+            for(MarkItemBean bean : markItemBeanList){
+                MarkItemEntity entity = new MarkItemEntity(bean.getBasePaperId(),bean.getMainNumber(),bean.getSubNumber(),bean.getMaxScore()
+                ,bean.getScoreInterval(),bean.getOrders(),bean.getQuestionId());
+                entity.setWorkId(workId);
+                entity.setMarkRangeId(rs.get(0).getId());
+                markItems.add(entity);
+            }
+            markItemRepo.deleteByWorkIdPaperId(workId, basePaperId);
+            for (MarkItemEntity markItem : markItems) {
+                markItemRepo.save(markItem);
+            }
+        }
+	}
+
+	private DefaultPaper getBaseDefaultPaper(String paperId) {
+		Paper basePaper = Model.of(paperRepo.findById(paperId));
+		if (basePaper == null) {
+			throw new StatusException("Q-020560", "该考试和课程下调卷规则中试卷不存在,请重新制定调卷规则");
+		}
+
+		// 构建试卷结构
+		DefaultPaper defaultPaper = this.buildDefaultByBasePaper(basePaper, null, null, null);
+		return defaultPaper;
+	}
+    private boolean checkIsAllQbjectiveQuestion(List<PaperDetailUnit> paperDetailUnits) {
+        for (PaperDetailUnit paperDetailUnit : paperDetailUnits) {
+            Question question = paperDetailUnit.getQuestion();
+            //填空或问答
+            if (question.getQuestionType() == QuesStructType.FILL_BLANK_QUESTION
+                    || question.getQuestionType() == QuesStructType.TEXT_ANSWER_QUESTION) {
+                return false;
+            }
+            if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
+                List<Question> subQuestions = question.getSubQuestions();
+                for (Question subQuestion : subQuestions) {
+                    if (subQuestion.getQuestionType() == QuesStructType.FILL_BLANK_QUESTION
+                            || subQuestion.getQuestionType() == QuesStructType.TEXT_ANSWER_QUESTION) {
+                        return false;
+                    }
+                }
+            }
+        }
+        return true;
+    }
+	private DefaultPaper buildDefaultByBasePaper(Paper basePaper, Long examId, String courseCode, String groupCode) {
+
+		// 获取大题
+		List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(basePaper);
+
+		// 排序大题
+		Collections.sort(paperDetails);
+
+		// 将小题全部取出来,只取一次,减少对数据库的查询
+		List<PaperDetailUnit> allPaperDetailUnits = paperDetailUnitRepo.findByPaper(basePaper);
+		boolean fullyObjective = checkIsAllQbjectiveQuestion(allPaperDetailUnits);
+
+		// 根据大题id将小题归类
+		Map<String, List<PaperDetailUnit>> pduMap = allPaperDetailUnits.stream()
+				.collect(Collectors.groupingBy(PaperDetailUnit::getDetailId));
+
+
+		// 生成新的分组集合
+		List<DefaultQuestionGroup> questionGroupList = new ArrayList<>();
+		for (int i = 0; i < paperDetails.size(); i++) {
+			PaperDetail paperDetail = paperDetails.get(i);
+			DefaultQuestionGroup defaultQuestionGroup = new DefaultQuestionGroup();
+			defaultQuestionGroup.setGroupName(paperDetail.getName());
+			defaultQuestionGroup.setGroupScore(paperDetail.getScore());
+
+			// 获取原小题的集合
+			List<PaperDetailUnit> paperDetailUnits = pduMap.get(paperDetail.getId());
+			if (CollectionUtils.isEmpty(paperDetailUnits)) {
+				throw new StatusException("500", "考试试卷有误,请联系老师!");
+			}
+
+			// 按题号顺序排序
+			Collections.sort(paperDetailUnits);
+
+			// 生成新的题包装器集合
+			List<DefaultQuestionStructureWrapper> questionWrapperList = new ArrayList<>();
+			for (int j = 0; j < paperDetailUnits.size(); j++) {
+				PaperDetailUnit paperDetailUnit = paperDetailUnits.get(j);
+				DefaultQuestionStructureWrapper defaultQuestionStructureWrapper = new DefaultQuestionStructureWrapper();
+				defaultQuestionStructureWrapper.setQuestionId(paperDetailUnit.getQuestion().getId());
+				defaultQuestionStructureWrapper.setVersion("1.0");
+				defaultQuestionStructureWrapper.setQuestionScore(paperDetailUnit.getScore());
+				defaultQuestionStructureWrapper.setTimeLimit(paperDetailUnit.getTimeLimit());
+
+
+				// 生成新的题单元包装器
+				List<DefaultQuestionUnitWrapper> defaultQuestionUnitWrappers = new ArrayList<>();
+				if (paperDetailUnit.getQuestion().getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
+					List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
+					List<Double> scoreList = paperDetailUnit.getSubScoreList();
+					if (subQuesList != null && subQuesList.size() > 0) {
+						for (int k = 0; k < subQuesList.size(); k++) {
+							DefaultQuestionUnitWrapper defaultQuestionUnitWrapper = buildQuesUnitWrapper(
+									subQuesList.get(k), scoreList.get(k));
+							defaultQuestionUnitWrappers.add(defaultQuestionUnitWrapper);
+						}
+					}
+				} else {
+					DefaultQuestionUnitWrapper defaultQuestionUnitWrapper = buildQuesUnitWrapper(
+							paperDetailUnit.getQuestion(), paperDetailUnit.getScore());
+					defaultQuestionUnitWrappers.add(defaultQuestionUnitWrapper);
+				}
+
+				defaultQuestionStructureWrapper.setQuestionUnitWrapperList(defaultQuestionUnitWrappers);
+				questionWrapperList.add(defaultQuestionStructureWrapper);
+			}
+
+			defaultQuestionGroup.setQuestionWrapperList(questionWrapperList);
+			questionGroupList.add(defaultQuestionGroup);
+		}
+
+		DefaultPaper defaultPaper = new DefaultPaper();
+		defaultPaper.setName(basePaper.getName());
+		defaultPaper.setQuestionGroupList(questionGroupList);
+		defaultPaper.setFullyObjective(fullyObjective);
+
+		return defaultPaper;
+	}
+    private DefaultQuestionUnitWrapper buildQuesUnitWrapper(Question question, Double score) {
+        Integer[] optionPermutation = null;
+        if (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
+            int length = question.getQuesOptions().size();
+            optionPermutation = new Integer[length];
+
+            for (int i = 0; i < length; i++) {
+                optionPermutation[i] = i;
+            }
+        }
+
+        DefaultQuestionUnitWrapper defaultQuestionUnitWrapper = new DefaultQuestionUnitWrapper();
+        defaultQuestionUnitWrapper.setOptionPermutation(optionPermutation);
+        defaultQuestionUnitWrapper.setQuestionScore(score);
+        defaultQuestionUnitWrapper.setQuestionType(getByOldType(question.getQuestionType()));
+        defaultQuestionUnitWrapper.setAnswerType(question.getAnswerType());//作答类型
+        return defaultQuestionUnitWrapper;
+    }
+    private QuestionType getByOldType(QuesStructType quesStructType) {
+        if (quesStructType == QuesStructType.BOOL_ANSWER_QUESTION) {
+            return QuestionType.TRUE_OR_FALSE;
+        }
+        if (quesStructType == QuesStructType.FILL_BLANK_QUESTION) {
+            return QuestionType.FILL_UP;
+        }
+        if (quesStructType == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
+            return QuestionType.MULTIPLE_CHOICE;
+        }
+        if (quesStructType == QuesStructType.SINGLE_ANSWER_QUESTION) {
+            return QuestionType.SINGLE_CHOICE;
+        }
+        if (quesStructType == QuesStructType.TEXT_ANSWER_QUESTION) {
+            return QuestionType.ESSAY;
+        }
+        return null;
+    }
+}

+ 25 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/util/Model.java

@@ -0,0 +1,25 @@
+/*
+ * *************************************************
+ * Copyright (c) 2019 QMTH. All Rights Reserved.
+ * Created by Deason on 2019-05-01 15:53:53.
+ * *************************************************
+ */
+
+package cn.com.qmth.dp.examcloud.oe.util;
+
+import java.util.Optional;
+
+/**
+ * @author: QMTH
+ * @since: 2019/05/1
+ */
+public class Model {
+
+    public static <T> T of(Optional<T> optional) {
+        if (optional.isPresent()) {
+            return optional.get();
+        }
+        return null;
+    }
+
+}