using Edu.Model.ViewModel.Question;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Edu.Module.Question
{
///
/// 解析问题
///
public class AnalysisQuestionTypeModule
{
///
/// 字母选项数组
///
private static readonly string [] LetterArray= new string[26] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
///
/// 问题解析
///
/// 问题Key
/// 选项内容
/// 是否去掉答案
/// 是否选项随机(1-随机选项)
/// 是否选项随机(编辑状态)
///
public object ParsingQuestion(string key, string data,bool isNoAnswer=false,int isOptionRandom=0,bool isEdit=false)
{
var obj = new object();
switch (key)
{
//单选题
case "single":
obj = GetChooseOptionList(data, isOptionRandom, isNoAnswer, isEdit: isEdit);
break;
//多选题
case "multiple":
obj= GetChooseOptionList(data, isOptionRandom, isNoAnswer, isEdit: isEdit);
break;
//填空题
case "fill-in":
obj = GetFillInList(data, isNoAnswer);
break;
//判断题
case "judge":
obj = GetJudgeList(data,isNoAnswer);
break;
//简答题
case "short-answer":
obj = data;
break;
//名词解释
case "noun-explanation":
obj = data;
break;
//论述题
case "essay-question":
obj = data;
break;
//计算题
case "calculation":
obj = data;
break;
//分录题
case "entry-problem":
obj = GetFillInList(data,isNoAnswer);
break;
//资料题
case "data-question":
obj = GetFillInList(data, isNoAnswer);
break;
//连线题
case "matching":
obj = GetMatchingList(data, isNoAnswer);
break;
//排序题
case "sorting-problem":
obj = GetSortingProblemList(data,isNoAnswer);
break;
//完型填空
case "cloze":
obj = GetClozeList(data,isNoAnswer);
break;
//阅读理解
case "reading-comprehensio":
var readingList = Common.Plugin.JsonHelper.DeserializeObject>(data);
if (readingList != null && readingList.Count > 0)
{
foreach (var item in readingList)
{
switch (item.QuestionKey)
{
//单选题
case "single":
item.SubAnwser = GetChooseOptionList(item.SubAnwser.ToString(), 0, isNoAnswer);
break;
//多选题
case "multiple":
item.SubAnwser = GetChooseOptionList(item.SubAnwser.ToString(), 0, isNoAnswer);
break;
//填空题
case "fill-in":
item.SubAnwser = GetFillInList(item.SubAnwser.ToString(), isNoAnswer);
break;
//判断题
case "judge":
item.SubAnwser = GetJudgeList(item.SubAnwser.ToString(), isNoAnswer);
break;
//简答题
case "short-answer":
item.SubAnwser = GetShortAnswer(item.SubAnwser.ToString(), isNoAnswer);
break;
//单选题(数字)
case "single-number":
item.SubAnwser = GetChooseOptionList(item.SubAnwser.ToString(), 0, isNoAnswer);
break;
}
}
}
obj = readingList;
break;
//口语题
case "spoken":
obj = data;
break;
//听力题
case "listening":
var listenList = Common.Plugin.JsonHelper.DeserializeObject>(data);
if (listenList != null && listenList.Count > 0)
{
foreach (var item in listenList)
{
switch (item.QuestionKey)
{
//单选题
case "single":
item.SubAnwser = GetChooseOptionList(item.SubAnwser.ToString(),0, isNoAnswer);
break;
//多选题
case "multiple":
item.SubAnwser = GetChooseOptionList(item.SubAnwser.ToString(), 0, isNoAnswer);
break;
//填空题
case "fill-in":
item.SubAnwser = GetFillInList(item.SubAnwser.ToString(), isNoAnswer);
break;
//判断题
case "judge":
item.SubAnwser = GetJudgeList(item.SubAnwser.ToString(), isNoAnswer);
break;
//简答题
case "short-answer":
item.SubAnwser = GetShortAnswer(item.SubAnwser.ToString(), isNoAnswer);
break;
//单选题(数字)
case "single-number":
item.SubAnwser = GetChooseOptionList(item.SubAnwser.ToString(), 0, isNoAnswer);
break;
}
}
}
obj = listenList;
break;
//共用选择题
case "sharing-choose":
obj = GetShareChooseList(data, isNoAnswer);
break;
//其它题
case "other":
obj = data;
break;
//单选题(数字)
case "single-number":
obj = GetChooseOptionList(data, isOptionRandom, isNoAnswer,isSingleNum:true,isEdit:isEdit);
break;
}
return obj;
}
///
/// 获取选择题选项
///
///
///
///
///
private object GetChooseOptionList(string data, int isOptionRandom, bool isNoAnswer, bool isSingleNum = false, bool isEdit = false)
{
var obj = new object();
var singleList = Common.Plugin.JsonHelper.DeserializeObject>(data);
var newList = new List();
if (!isEdit)
{
singleList.ForEach(item =>
{
item.ShowName = item.Name;
});
}
//选项随机
if (isOptionRandom == 1)
{
var tempList = singleList.OrderBy(qitem => Guid.NewGuid()).ToList();
for (var i = 0; i < tempList.Count; i++)
{
var item = new optionItem()
{
Name = tempList[i].Name,
Content = tempList[i].Content,
IsAnswer = tempList[i].IsAnswer
};
item.ShowName = isSingleNum ? (i + 1).ToString() : LetterArray[i];
newList.Add(item);
}
}
//去掉答案
if (isNoAnswer)
{
singleList.ForEach(item =>
{
item.IsAnswer = false;
});
newList.ForEach(item =>
{
item.IsAnswer = false;
});
}
if (isOptionRandom == 1)
{
obj = newList;
}
else
{
obj = singleList;
}
return obj;
}
///
/// 获取填空题填空列表
///
///
///
///
private object GetFillInList(string data, bool isNoAnswer)
{
var obj = new object();
if (!string.IsNullOrEmpty(data))
{
var fillInList = Common.Plugin.JsonHelper.DeserializeObject>(data);
if (isNoAnswer)
{
fillInList.ForEach(item =>
{
item.Content = "";
});
}
obj = fillInList;
}
else
{
obj = null;
}
return obj;
}
///
/// 获取判断题选项列表
///
///
///
///
private object GetJudgeList(string data, bool isNoAnswer)
{
var judgeList = Common.Plugin.JsonHelper.DeserializeObject>(data);
if (isNoAnswer)
{
judgeList.ForEach(item =>
{
item.IsAnswer = false;
});
}
return judgeList;
}
///
/// 获取连线题列表
///
///
///
///
private object GetMatchingList(string data, bool isNoAnswer)
{
var matchingList = Common.Plugin.JsonHelper.DeserializeObject>>(data);
if (isNoAnswer)
{
if (matchingList != null && matchingList.Count > 2)
{
matchingList[2].ForEach(item =>
{
item.Content = "";
});
}
}
return matchingList;
}
///
/// 获取排序题列表
///
///
///
///
private object GetSortingProblemList(string data, bool isNoAnswer)
{
var sortingProblemList = Common.Plugin.JsonHelper.DeserializeObject>>(data);
if (isNoAnswer)
{
if (sortingProblemList != null && sortingProblemList.Count > 1)
{
sortingProblemList[1].ForEach(item =>
{
item.Name = "";
});
}
}
return sortingProblemList;
}
///
/// 完型填空选项列表
///
///
///
///
private object GetClozeList(string data, bool isNoAnswer)
{
var clozeList = Common.Plugin.JsonHelper.DeserializeObject>(data);
if (isNoAnswer)
{
if (clozeList != null && clozeList.Count > 0)
{
clozeList.ForEach(item =>
{
item.OptionList.ForEach(subItem =>
{
subItem.IsAnswer = false;
});
});
}
}
return clozeList;
}
///
/// 获取阅读理解、听力题简答题
///
///
///
///
private object GetShortAnswer(string data, bool isNoAnswer)
{
var shortAnswerList= Common.Plugin.JsonHelper.DeserializeObject>(data);
if (isNoAnswer)
{
shortAnswerList.ForEach(item =>
{
item.Content = "";
});
}
return shortAnswerList;
}
///
/// 共用选项题列表
///
///
///
///
private object GetShareChooseList(string data, bool isNoAnswer)
{
var shareChooseList = new List>();
if (!string.IsNullOrEmpty(data))
{
shareChooseList = Common.Plugin.JsonHelper.DeserializeObject>>(data);
}
if (isNoAnswer && shareChooseList != null && shareChooseList.Count > 1)
{
shareChooseList[1].ForEach(item =>
{
item.Name = "";
});
}
return shareChooseList;
}
///
/// 问题验证
///
/// 问题类型
/// 问题内容
/// 问题答案
/// 解析答案
/// 是否开启验证
///
public string CheckQuestion(string QuestionTypeKey,string QuestionContent,string Answer, out string AnalysisAnswer,bool IsRequire=true)
{
AnalysisAnswer = "";
string message = "";
//单选、多选、单选(数字)题
if (QuestionTypeKey == "single" || QuestionTypeKey == "multiple" || QuestionTypeKey == "single-number")
{
if (!string.IsNullOrEmpty(QuestionContent))
{
var optionItems = new List();
try
{
optionItems = Common.Plugin.JsonHelper.DeserializeObject>(QuestionContent);
}
catch (Exception ex)
{
Common.Plugin.LogHelper.Write(ex, " CheckQuestion:____" + QuestionContent);
}
message = CheckChoose(optionItems);
var tempList = optionItems.Where(qitem => qitem.IsAnswer == true);
if (tempList != null && tempList.Count() > 0)
{
AnalysisAnswer = string.Join(",", tempList.OrderBy(qitem => qitem.Name).Select(qitem => qitem.Name));
}
else
{
AnalysisAnswer = "";
}
if (!string.IsNullOrEmpty(message))
{
return message;
}
}
}
//判断题
else if (QuestionTypeKey == "judge")
{
var optionItems = Common.Plugin.JsonHelper.DeserializeObject>(QuestionContent);
message = CheckChoose(optionItems);
var judgeModel = optionItems.Where(qitem => qitem.IsAnswer == true)?.FirstOrDefault();
if (judgeModel != null )
{
AnalysisAnswer = string.Join(",", judgeModel?.Name);
}
else
{
AnalysisAnswer = "";
}
if (!string.IsNullOrEmpty(message))
{
return message;
}
}
//填空题
else if (QuestionTypeKey == "fill-in")
{
var fillInList = Common.Plugin.JsonHelper.DeserializeObject>(QuestionContent);
message = CheckFillIn(fillInList);
AnalysisAnswer = string.Join("★", fillInList.Select(qitem => Common.Plugin.StringHelper.AppHtmlFilterr(qitem.Content)));
if (!string.IsNullOrEmpty(message))
{
return message;
}
}
//简答题
else if (QuestionTypeKey == "short-answer")
{
message = CheckShortAnswer(Answer);
AnalysisAnswer = Common.Plugin.StringHelper.AppHtmlFilterr(Answer);
if (!string.IsNullOrEmpty(message))
{
return message;
}
}
//名词解释
else if (QuestionTypeKey == "noun-explanation")
{
AnalysisAnswer = Common.Plugin.StringHelper.AppHtmlFilterr(Answer);
if (string.IsNullOrEmpty(Answer))
{
message = "请填写名词解释答案";
return message;
}
}
//论述题
else if (QuestionTypeKey == "essay-question")
{
AnalysisAnswer = Common.Plugin.StringHelper.AppHtmlFilterr(Answer);
if (string.IsNullOrEmpty(Answer))
{
message = "请填写论述题答案";
return message;
}
}
//计算题
else if (QuestionTypeKey == "calculation")
{
AnalysisAnswer = Common.Plugin.StringHelper.AppHtmlFilterr(Answer);
if (string.IsNullOrEmpty(Answer))
{
message = "请填写计算题答案";
return message;
}
}
//分录题、资料题
else if (QuestionTypeKey == "entry-problem" || QuestionTypeKey == "data-question")
{
var entryList = Common.Plugin.JsonHelper.DeserializeObject>(QuestionContent);
if (entryList != null && entryList.Count > 0)
{
AnalysisAnswer = string.Join("★", entryList.Select(qitem => Common.Plugin.StringHelper.AppHtmlFilterr(qitem.Content)));
if (entryList.Where(qitem => string.IsNullOrEmpty(qitem.Content)).Count() > 0)
{
message = "请输入答案";
return message;
}
}
else
{
message = "请添加答案";
return message;
}
}
//排序题
else if (QuestionTypeKey == "sorting-problem")
{
var sortList = Common.Plugin.JsonHelper.DeserializeObject>>(QuestionContent);
if (sortList != null && sortList.Count > 0)
{
if (sortList.Count > 1)
{
AnalysisAnswer = string.Join(",", sortList[1].Select(qitem => qitem.Name));
}
if (sortList[0].Where(qitem => string.IsNullOrEmpty(qitem.Content)).Count() > 0)
{
message = "请输入选项内容";
return message;
}
}
else
{
message = "请添加选项";
return message;
}
}
//连线题
else if (QuestionTypeKey == "matching")
{
var matchList = Common.Plugin.JsonHelper.DeserializeObject>>(QuestionContent);
if (matchList != null && matchList.Count > 0)
{
if (matchList[0] != null && matchList[0].Count > 0)
{
if (matchList[0].Where(qitem => string.IsNullOrEmpty(qitem.Content)).Count() > 0)
{
message = "第一组选项内容不能为空";
return message;
}
}
else
{
message = "请添加第一组选项";
return message;
}
if (matchList.Count > 1 && matchList[1] != null && matchList[1].Count > 0)
{
if (matchList[1].Where(qitem => string.IsNullOrEmpty(qitem.Content)).Count() > 0)
{
message = "第二组选项内容不能为空";
return message;
}
}
else
{
message = "请添加第二组选项";
return message;
}
if (matchList.Count > 2)
{
AnalysisAnswer = string.Join(",", matchList[2].Select(qitem => qitem.Content));
if (matchList[2].Where(qitem => string.IsNullOrEmpty(qitem.Content)).Count() > 0)
{
message = "请设置答案";
return message;
}
}
}
else
{
message = "请添加选项";
return message;
}
}
//完型填空
else if (QuestionTypeKey == "cloze")
{
var clozeList = Common.Plugin.JsonHelper.DeserializeObject>(QuestionContent);
if (clozeList != null && clozeList.Count > 0)
{
int index = 1;
List clozeAnswerList = new List();
foreach (var rootItem in clozeList)
{
var tempModel = rootItem.OptionList.Where(qitem => qitem.IsAnswer == true)?.FirstOrDefault();
clozeAnswerList.Add(new SubAnswerItem()
{
SubQuestionId= index.ToString(),
SubAnswer= tempModel?.Name ?? "",
SubScore = rootItem.SubScore,
});
if (IsRequire)
{
if (rootItem.OptionList.Where(qitem => string.IsNullOrEmpty(qitem.Content)).Count() > 0)
{
message = string.Format("第{0}小题选项内容不能为空!", index);
return message;
}
if (!(rootItem.OptionList.Where(qitem => qitem.IsAnswer == true).Count() > 0))
{
message = string.Format("请设置第{0}小题选项的正确答案!", index);
return message;
}
}
index++;
}
AnalysisAnswer = Common.Plugin.JsonHelper.Serialize(clozeAnswerList);
}
else
{
message = "请添加小题!";
return message;
}
}
//口语题
else if (QuestionTypeKey == "spoken")
{
AnalysisAnswer = Common.Plugin.StringHelper.AppHtmlFilterr(Answer);
if (string.IsNullOrEmpty(Answer))
{
message = "请填写口语题答案!";
return message;
}
}
//其它题
else if (QuestionTypeKey == "other")
{
AnalysisAnswer = Common.Plugin.StringHelper.AppHtmlFilterr(Answer);
if (string.IsNullOrEmpty(Answer))
{
message = "请填写其它题答案!";
return message;
}
}
//阅读理解和听力题
else if (QuestionTypeKey == "reading-comprehensio" || QuestionTypeKey == "listening")
{
var readingList = Common.Plugin.JsonHelper.DeserializeObject>(QuestionContent);
if (readingList != null && readingList.Count > 0)
{
List resultList = new List();
int Index = 1;
foreach (var item in readingList)
{
if (string.IsNullOrEmpty(item.SubTitle))
{
message = "请填写题干!";
return message;
}
switch (item.QuestionKey)
{
//单选题
case "single":
var singleAnwser = Common.Plugin.JsonHelper.DeserializeObject>(item.SubAnwser.ToString());
string singleMessage = CheckChoose(singleAnwser);
resultList.Add(new SubAnswerItem
{
SubQuestionId = Index.ToString(),
SubQuestionKey=item.QuestionKey,
SubAnswer = singleAnwser.Where(qitem => qitem.IsAnswer == true)?.FirstOrDefault()?.Name??"",
SubScore=item.SubScore,
});
if (IsRequire)
{
if (!string.IsNullOrEmpty(singleMessage))
{
return singleMessage;
}
}
break;
//单选题(数字)
case "single-number":
var singleNumberAnwser = Common.Plugin.JsonHelper.DeserializeObject>(item.SubAnwser.ToString());
string singleNumberMessage = CheckChoose(singleNumberAnwser);
resultList.Add(new SubAnswerItem
{
SubQuestionId = Index.ToString(),
SubQuestionKey = item.QuestionKey,
SubAnswer = singleNumberAnwser.Where(qitem => qitem.IsAnswer == true)?.FirstOrDefault()?.Name ?? "",
SubScore = item.SubScore,
});
if (IsRequire)
{
if (!string.IsNullOrEmpty(singleNumberMessage))
{
return singleNumberMessage;
}
}
break;
//多选题
case "multiple":
var multipleAnwser = Common.Plugin.JsonHelper.DeserializeObject>(item.SubAnwser.ToString());
string multipleMessage = CheckChoose(multipleAnwser);
resultList.Add(new SubAnswerItem
{
SubQuestionId = Index.ToString(),
SubQuestionKey = item.QuestionKey,
SubAnswer = string.Join(",", multipleAnwser.Where(qitem => qitem.IsAnswer == true).Select(qitem => qitem.Name)),
SubScore=item.SubScore,
});
if (IsRequire)
{
if (!string.IsNullOrEmpty(multipleMessage))
{
return multipleMessage;
}
}
break;
//填空题
case "fill-in":
var r_fillInList = Common.Plugin.JsonHelper.DeserializeObject>(item.SubAnwser.ToString());
string r_fillMessage = CheckFillIn(r_fillInList);
resultList.Add(new SubAnswerItem
{
SubQuestionId = Index.ToString(),
SubQuestionKey = item.QuestionKey,
SubAnswer = string.Join(",", r_fillInList.Select(qitem => Common.Plugin.StringHelper.AppHtmlFilterr(qitem.Content))),
SubScore=item.SubScore,
});
if (IsRequire)
{
if (!string.IsNullOrEmpty(r_fillMessage))
{
return r_fillMessage;
}
}
break;
//判断题
case "judge":
var judgeList = Common.Plugin.JsonHelper.DeserializeObject>(item.SubAnwser.ToString());
resultList.Add(new SubAnswerItem
{
SubQuestionId = Index.ToString(),
SubQuestionKey = item.QuestionKey,
SubAnswer = judgeList.Where(qitem=>qitem.IsAnswer==true)?.FirstOrDefault()?.Name??"",
SubScore=item.SubScore,
});
break;
//简答题
case "short-answer":
var shortAnswer = Common.Plugin.JsonHelper.DeserializeObject>(item.SubAnwser.ToString());
string r_shortMessage = CheckShortAnswer(shortAnswer[0].Content);
resultList.Add(new SubAnswerItem
{
SubQuestionId = Index.ToString(),
SubQuestionKey = item.QuestionKey,
SubAnswer = Common.Plugin.StringHelper.AppHtmlFilterr(shortAnswer[0].Content),
SubScore=item.SubScore,
});
if (IsRequire)
{
if (!string.IsNullOrEmpty(r_shortMessage))
{
return r_shortMessage;
}
}
break;
}
Index++;
}
if (resultList != null && resultList.Count > 0)
{
AnalysisAnswer = Common.Plugin.JsonHelper.Serialize(resultList);
}
}
else
{
message = "请添加小题!";
return message;
}
}
//共用选择题
else if (QuestionTypeKey == "sharing-choose")
{
var shareList = Common.Plugin.JsonHelper.DeserializeObject>>(QuestionContent);
if (shareList != null && shareList.Count == 2)
{
if (shareList[0].Where(qitem => string.IsNullOrEmpty(qitem.Content)).Count() > 0)
{
message = string.Format("选项内容不能为空!");
return message;
}
//判断选项是否重复
if (shareList[0].GroupBy(qitem => new { qitem.Content }).Where(qitem => qitem.Count() > 1).Count() > 0)
{
message = string.Format("选项内容不能相同!");
return message;
}
if (shareList[1].Where(qitem => string.IsNullOrEmpty(qitem.Content)).Count() > 0)
{
message = string.Format("题干不能为空!");
return message;
}
//判断题干是否重复
if (shareList[1].GroupBy(qitem => new { qitem.Content }).Where(qitem => qitem.Count() > 1).Count() > 0)
{
message = string.Format("题干不能相同!");
return message;
}
AnalysisAnswer = string.Join(",", shareList[1].Select(qitem => qitem.Name));
//判断题干是否设置正确选项
if (shareList[1].Where(qitem => string.IsNullOrEmpty(qitem.Name)).Count() > 0)
{
message = string.Format("请设置题干的正确选项!");
return message;
}
}
else
{
message = string.Format("请添加选项!");
return message;
}
}
return message;
}
///
/// 选择题验证
///
///
///
private string CheckChoose(List optionItems)
{
string message = "";
if (optionItems != null && optionItems.Count > 0)
{
if (optionItems.Where(qitem => string.IsNullOrEmpty(qitem.Content)).Count() > 0)
{
message = "选项不能为空!";
}
//判断选项是否重复
var tempList = optionItems.GroupBy(qitem => new { qitem.Content }).Select(qitem => new
{
qitem.Key.Content
});
foreach (var item in tempList)
{
var tempCount = optionItems.Where(qitem => qitem.Content == item.Content).Count();
if (tempCount > 1 && string.IsNullOrEmpty(message))
{
message = string.Format("选项【{0}】不能相同!", item.Content);
}
}
if (!(optionItems.Where(qitem => qitem.IsAnswer == true).Count() > 0))
{
message = "请设置正确的选项!";
}
}
else
{
message = "请添加选择题选项!";
}
return message;
}
///
/// 验证填空题
///
///
///
private string CheckFillIn(List fillInList)
{
string message = "";
if (fillInList != null && fillInList.Count > 0)
{
if (fillInList.Where(qitem => string.IsNullOrEmpty(qitem.Content)).Count() > 0)
{
message = "请输入答案!";
}
}
else
{
message = "请添加答案!";
}
return message;
}
///
/// 验证简答题
///
///
///
private string CheckShortAnswer(string answer)
{
string message = "";
if (string.IsNullOrEmpty(answer))
{
message = "请填写简答题答案!";
}
return message;
}
}
}