package com.walker.etaa; import com.walker.infrastructure.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; /** * 试题抽取条件选项对象,
* 业务可以创建该对象完成抽取范围设置。 * @author 时克英 * @date 2023-03-07 */ public class QuestionExtractOptions { protected static final Logger logger = LoggerFactory.getLogger(QuestionExtractOptions.class); private String ownerId; private String deptId; private String rootCatalog; private long extractTotal = 0; private List optionItemList = null; private ExtractStrategy extractStrategy = ExtractStrategy.Random; public ExtractStrategy getExtractStrategy() { return extractStrategy; } /** * 设置抽取策略。 * @param extractStrategy * @date 2023-03-08 */ public void setExtractStrategy(ExtractStrategy extractStrategy) { this.extractStrategy = extractStrategy; } /** * 返回归属对象,一般指顶级机构ID,可选 * @return */ public String getOwnerId() { return ownerId; } /** * 返回部门机构ID,表明抽取机构范围,可选 * @return */ public String getDeptId() { return deptId; } /** * 返回试题库主分类,通常表示一个根目录,如:化学、数学等,可选。 * @return */ public String getRootCatalog() { return rootCatalog; } /** * 返回抽取试题总数量。 * @return */ public long getExtractTotal() { return extractTotal; } /** * 返回抽取明细规则列表,包含多种选项,如:选择题10道、三角方程分类下判断题10道等,可选。

* 如果为空,则表示仅按照全局配置抽取即可。 * @return */ public List getOptionItemList() { return optionItemList; } public QuestionExtractOptions setGlobalConfig(String ownerId , String deptId, String rootCatalog, long extractTotal){ if(extractTotal <= 0){ throw new IllegalArgumentException("抽取试题数量必须大于0!"); } this.ownerId = ownerId; this.deptId = deptId; this.rootCatalog = rootCatalog; this.extractTotal = extractTotal; return this; } /** * 添加一个抽取明细配置,去掉了'minorCatalog',该属性废弃。 * @param majorCatalog 题目分类二级目录 * @param questionType 试题类型 * @param difficultLevel 难度级别,暂未使用 * @param count 抽取数量 * @return * @date 2023-03-08 */ public QuestionExtractOptions addOption(String majorCatalog // , String minorCatalog , QuestionType questionType, DifficultLevel difficultLevel, long count){ if(StringUtils.isEmpty(majorCatalog)){ // throw new IllegalArgumentException("major(主类)必须设置"); logger.warn("抽取试题'主分类'未设置,目前系统支持该操作。"); } // if(questionType == null){ // throw new IllegalArgumentException("试题类型必须设置!"); // } if(count <= 0){ throw new IllegalArgumentException("试题数量必须大于0!"); } if(this.optionItemList == null){ this.optionItemList = new ArrayList<>(4); } ExtractOptionItem extractOptionItem = new ExtractOptionItem(majorCatalog, null, questionType, difficultLevel, count); if(this.optionItemList.contains(extractOptionItem)){ throw new IllegalArgumentException("添加的条件已经存在!"); } this.optionItemList.add(extractOptionItem); return this; } @Override public String toString(){ return new StringBuilder("[owner=").append(this.ownerId) .append(", deptId=").append(this.deptId) .append(", rootCatalog=").append(this.rootCatalog) .append(", extractTotal=").append(this.extractTotal) .append(", optionItemList=").append(this.optionItemList) .append("]").toString(); } public class ExtractOptionItem { public ExtractOptionItem(String majorCatalog, String minorCatalog , QuestionType questionType, DifficultLevel difficultLevel, long count){ this.majorCatalog = majorCatalog; this.minorCatalog = minorCatalog; this.questionType = questionType; this.difficultLevel = difficultLevel; this.count = count; } @Override public boolean equals(Object obj){ if(obj == null){ return false; } if(obj instanceof ExtractOptionItem){ ExtractOptionItem item = (ExtractOptionItem) obj; if(item.hashCode == this.hashCode){ return true; } } return false; } @Override public int hashCode(){ if(this.hashCode == -1){ this.hashCode = this.getId().hashCode(); } return this.hashCode; } private String getId(){ StringBuilder sb = new StringBuilder(); if(StringUtils.isNotEmpty(this.majorCatalog)){ sb.append(this.majorCatalog); } if(StringUtils.isNotEmpty(this.minorCatalog)){ sb.append(this.minorCatalog); } sb.append(questionType.getIndex()); if(this.difficultLevel != null){ sb.append(this.difficultLevel.getIndex()); } sb.append(this.count); return sb.toString(); } public String getMajorCatalog() { return majorCatalog; } public void setMajorCatalog(String majorCatalog) { this.majorCatalog = majorCatalog; } /** * 该属性废弃,试题分类只有:root_catalog 和 major_catalog * @return * @date 2023-03-08 */ @Deprecated public String getMinorCatalog() { return minorCatalog; } public void setMinorCatalog(String minorCatalog) { this.minorCatalog = minorCatalog; } public QuestionType getQuestionType() { return questionType; } public void setQuestionType(QuestionType questionType) { this.questionType = questionType; } public DifficultLevel getDifficultLevel() { return difficultLevel; } public void setDifficultLevel(DifficultLevel difficultLevel) { this.difficultLevel = difficultLevel; } public long getCount() { return count; } public void setCount(long count) { this.count = count; } @Override public String toString(){ return new StringBuilder("[hashCode=").append(this.hashCode) .append(", majorCatalog=").append(this.majorCatalog) .append(", minorCatalog=").append(this.minorCatalog) .append(", questionType=").append(this.questionType) .append(", level=").append(this.difficultLevel) .append(", count=").append(this.count) .append("]").toString(); } private int hashCode = -1; private String majorCatalog; private String minorCatalog; private QuestionType questionType; private DifficultLevel difficultLevel; private long count = 0; } }