shikeying
2024-01-11 3b67e947e36133e2a40eb2737b15ea375e157ea0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
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;
 
/**
 * 试题抽取条件选项对象,<br>
 * 业务可以创建该对象完成抽取范围设置。
 * @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<ExtractOptionItem> 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道等,可选。<p></p>
     * 如果为空,则表示仅按照全局配置抽取即可。
     * @return
     */
    public List<ExtractOptionItem> 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;
    }
}