package com.qxueyou.scc.exercise.service.impl.node;
|
|
import java.math.BigDecimal;
|
import java.math.BigInteger;
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.List;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import com.qxueyou.scc.exercise.model.ExerciseItem;
|
import com.qxueyou.scc.exercise.model.ExerciseItemAnalisi;
|
import com.qxueyou.scc.exercise.model.ExerciseItemOption;
|
import com.qxueyou.scc.exercise.service.impl.Node;
|
import com.qxueyou.scc.exercise.service.impl.parser.ItemParser;
|
|
public class Item extends Node {
|
|
public Item(){
|
setName("ITEM");
|
setParser(new ItemParser());
|
}
|
|
@Override
|
public boolean isComplete() {
|
|
ItemType type = (ItemType) getParent();
|
|
if(type.getType()!=ItemType.TYPE_TRUE_OR_FALSE){
|
if(getChildren().isEmpty()){
|
return false;
|
}
|
}
|
|
return getTitle().length()>4;
|
}
|
|
@SuppressWarnings("unchecked")
|
public List<Option> getOptions(){
|
List<Node> children = getChildren();
|
|
if(children.isEmpty()){
|
return Collections.EMPTY_LIST;
|
}
|
|
List<Option> options = new ArrayList<Option>(children.size());
|
|
for(Node node:children){
|
options.add((Option) node);
|
}
|
|
return options;
|
}
|
|
public Option getOption(String no){
|
|
Node node = getChild("NO", no);
|
|
return node==null?null:(Option)node;
|
}
|
|
public void setNo(String no){
|
setAttribute("NO",no);
|
}
|
|
public void setTitle(String title){
|
setAttribute("TITLE",title);
|
}
|
|
public void setAnalysis(String analysis){
|
setAttribute("ANALYSIS",analysis);
|
}
|
|
public String getNo(){
|
return (String) getAttribute("NO");
|
}
|
|
public String getAnswer(){
|
return (String) getAttribute("ANSWER");
|
}
|
|
public void setAnswer(String answer){
|
setAttribute("ANSWER",answer);
|
}
|
|
public String getTitle(){
|
return (String) getAttribute("TITLE");
|
}
|
|
public String getAnalysis(){
|
return (String) getAttribute("ANALYSIS");
|
}
|
|
/**
|
* 转换为数据模型
|
* @return
|
*/
|
public ExerciseItem convertExerciseItem() {
|
|
//new ExerciseItem
|
ExerciseItem item = new ExerciseItem();
|
|
//转换 ExerciseItemOption
|
List<ExerciseItemOption> options = new ArrayList<ExerciseItemOption>();
|
|
//确保判断题的OPTION
|
ensureTrueOrFalseOpt();
|
|
//更新参考答案 最终的答案 格式如A,B,C
|
String resultAnswer = updateAnswer();
|
|
for(Option opt:getOptions()){
|
if(!opt.isComplete()){
|
continue;
|
}
|
options.add(opt.convertExerciseItemOption());
|
}
|
|
// 设置正确答案
|
item.setAnswer(resultAnswer);
|
item.setTitle(this.getTitle());
|
item.setType(getExerciseType());
|
item.setOptions(options);
|
item.setItemNo(Integer.valueOf(getNo()));
|
|
//转换解析内容
|
addAnalysis(item);
|
|
//返回
|
return item;
|
}
|
|
/**
|
* 增加解析实体
|
* @param item
|
*/
|
private void addAnalysis(ExerciseItem item) {
|
|
if(StringUtils.isEmpty(getAnalysis())){
|
return;
|
}
|
|
ExerciseItemAnalisi analysis = new ExerciseItemAnalisi();
|
analysis.setAnalysis(getAnalysis());
|
analysis.setAccuracy(BigDecimal.ZERO);
|
analysis.setSubmitCorrectNumber(BigInteger.ZERO);
|
analysis.setSubmitNumber(BigInteger.ZERO);
|
|
item.setAnalisis(analysis);
|
}
|
|
/**
|
* 更新参考答案
|
*/
|
private String updateAnswer() {
|
|
String answer = getAnswer();
|
String resultAnswer = "";
|
if(StringUtils.isEmpty(answer)){
|
return resultAnswer;
|
}
|
|
//判断题
|
if(answer.equals("True")||answer.equals("False")){
|
Node node = getChild("NO", answer);
|
if(node==null){
|
return resultAnswer;
|
}
|
Option opt = (Option) node;
|
opt.setCheck(true);
|
resultAnswer = answer;
|
}else{//单选或多选题
|
for(int i=0;i<answer.length();i++){
|
String optAnswer = String.valueOf(answer.charAt(i));
|
Node node = getChild("NO", optAnswer);
|
if(node==null){
|
return resultAnswer;
|
}
|
Option opt = (Option) node;
|
opt.setCheck(true);
|
|
// 拼接答案
|
resultAnswer += answer.charAt(i);
|
if(i < answer.length()-1){//最后一次不添加
|
resultAnswer += ",";
|
}
|
|
}
|
}
|
|
return resultAnswer;
|
|
}
|
|
/**
|
* 特殊处理判断题的 option,自动添加 True 和 False 选项
|
*/
|
private void ensureTrueOrFalseOpt(){
|
ItemType type = (ItemType) getParent();
|
|
if(type.getType()==ItemType.TYPE_TRUE_OR_FALSE){
|
|
getChildren().clear();
|
|
Option optTrue = new Option();
|
optTrue.setContent("True");
|
optTrue.setNo("True");
|
|
Option optFalse = new Option();
|
optFalse.setContent("False");
|
optFalse.setNo("False");
|
|
addNode(optTrue);
|
addNode(optFalse);
|
}
|
}
|
|
/**
|
* 获取习题类型
|
* @return
|
*/
|
public short getExerciseType(){
|
ItemType type = (ItemType) (this.getParent());
|
|
String typeStr = type.getType();
|
|
if(ItemType.TYPE_SINGLE.equals(typeStr)){
|
return ExerciseItem.TYPE_SINGLE_SELECT;
|
}
|
|
if(ItemType.TYPE_MULTI.equals(typeStr)){
|
return ExerciseItem.TYPE_MULTI_SELECT;
|
}
|
|
if(ItemType.TYPE_TRUE_OR_FALSE.equals(typeStr)){
|
return ExerciseItem.TYPE_TRUE_OR_FALSE;
|
}
|
|
return ExerciseItem.TYPE_SINGLE_SELECT;
|
|
}
|
|
}
|