using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Gta.Exam.Entities;
using Moon.Orm;
using System.Web;
using Gta.Exam.Utilities;
using System.Data.Common;
namespace Gta.Exam.BLL
{
public class QuestionBLL
{
private static readonly log4net.ILog LOG_ERROR = log4net.LogManager.GetLogger(typeof(QuestionBLL));
/// <summary>
/// 根据试题ID 返回试题数据
/// </summary>
public static QuestionViewResult GetQuestionResult(int questionId)
{
QuestionViewResult qr = new QuestionViewResult();
using (Db db = Db.CreateDefaultDb())
{
var MQL = QuestionViewSet.SelectAll()
.Where(QuestionViewSet.Id.Equal(questionId));
qr = db.GetEntity<QuestionViewResult>(MQL);
}
return qr;
}
/// <summary>
/// 根据父级ID 获取子试题列表
/// </summary>
/// <param name="questionId"></param>
/// <returns></returns>
public List<QuestionViewResult> GetChildQuestions(int questionId)
{
List<QuestionViewResult> qr = new List<QuestionViewResult>();
using (Db db = Db.CreateDefaultDb())
{
var MQL = QuestionViewSet.SelectAll()
.Where(QuestionViewSet.ParentId.Equal(questionId));
qr = db.GetEntities<QuestionViewResult>(MQL);
}
return qr;
}
/// <summary>
/// 我上传的试题
/// </summary>
public List<QuestionViewResult> MyUpload(int? page, int? rows, string sort, string order, Question que, out int recordCount, int User_Id)
{
List<QuestionViewResult> data;
EntityBase et = new EntityBase();
WhereExpression where = QuestionViewSet.Status.NotEqual(5)//不作废
.And(QuestionViewSet.ParentId.Equal(0))
.And(QuestionViewSet.IsExtract.Equal(que.IsExtract))
.And(QuestionViewSet.UserId.Equal(User_Id))
.And(QuestionViewSet.CourseId.Equal(que.CourseId));
if (!string.IsNullOrEmpty(que.KnowledgeId) && que.KnowledgeId != "0")
{
where = where.And(QuestionViewSet.KnowledgeId.Contains(que.KnowledgeId));
}
if (que.QuestionType > 0)
{
where = where.And(QuestionViewSet.QuestionType.Equal(que.QuestionType));
}
if (que.Difficulty > 0)
{
where = where.And(QuestionViewSet.Difficulty.Equal(que.Difficulty));
}
//未共享的 (包含 待审核 以及 审核不通过的)
if (que.Status == 1)
{
where = where.And(QuestionViewSet.Status.NotEqual(4));
}
else if (que.Status > 0)
{
where = where.And(QuestionViewSet.Status.Equal(que.Status));
}
data = GetList(page, rows, sort, order, out recordCount, where);
return data;
}
/// <summary>
/// 公共试题
/// </summary>
public List<QuestionViewResult> Public(int? page, int? rows, string sort, string order, Question que, out int recordCount)
{
List<QuestionViewResult> data;
EntityBase et = new EntityBase();
WhereExpression where = QuestionViewSet.Status.Equal(4)//共享试题
.And(QuestionViewSet.ParentId.Equal(0))
.And(QuestionViewSet.CourseId.Equal(que.CourseId));
if (!string.IsNullOrEmpty(que.KnowledgeId) && que.KnowledgeId != "0")
{
where = where.And(QuestionViewSet.KnowledgeId.Contains(que.KnowledgeId));
}
if (que.QuestionType > 0)
{
where = where.And(QuestionViewSet.QuestionType.Equal(que.QuestionType));
}
if (que.Difficulty > 0)
{
where = where.And(QuestionViewSet.Difficulty.Equal(que.Difficulty));
}
data = GetList(page, rows, sort, order, out recordCount, where);
return data;
}
/// <summary>
/// 我收藏的试题
/// </summary>
public List<QuestionViewResult> MyFavorite(int? page, int? rows, string sort, string order, Question que, out int recordCount, int User_Id)
{
List<QuestionViewResult> data;
EntityBase et = new EntityBase();
WhereExpression where = QuestionViewSet.Status.Equal(4)//共享的
.And(QuestionViewSet.ParentId.Equal(0))
.And(QuestionViewSet.CourseId.Equal(que.CourseId));
where = where.And(QuestionViewSet.Id.In(
QuestionCollectionSet.Select(QuestionCollectionSet.QuestionId)
.Where(QuestionCollectionSet.UserId.Equal(User_Id))));
if (!string.IsNullOrEmpty(que.KnowledgeId) && que.KnowledgeId != "0")
{
where = where.And(QuestionViewSet.KnowledgeId.Contains(que.KnowledgeId));
}
if (que.QuestionType > 0)
{
where = where.And(QuestionViewSet.QuestionType.Equal(que.QuestionType));
}
if (que.Difficulty > 0)
{
where = where.And(QuestionViewSet.Difficulty.Equal(que.Difficulty));
}
data = GetList(page, rows, sort, order, out recordCount, where);
return data;
}
/// <summary>
/// 获取分页数据
/// </summary>
/// <param name="page">页码</param>
/// <param name="rows">条数</param>
/// <param name="sort">排序字段</param>
/// <param name="order">排序</param>
/// <param name="recordCount">总条数</param>
/// <returns>数据列表</returns>
public List<QuestionViewResult> GetList(int? page, int? rows, string sort, string order, out int recordCount, WhereExpression where)
{
List<QuestionViewResult> data;
int pageIndex = page.HasValue && page.Value > 1 ? page.Value : 1;//页数
int pageSize = rows.HasValue && rows.Value > 1 ? rows.Value : 20;//每页条数
int startNum = (pageIndex - 1) * pageSize;//过滤掉的条数
var NotInId = QuestionViewSet.Select(QuestionViewSet.Id).Where(where).Top(startNum);
NotInId = OrderByMQL(order, NotInId, GetOrderByField(sort));
using (Db db = Db.CreateDefaultDb())//默认数据库链接
{
db.DebugEnabled = true;//开启调试
recordCount = Convert.ToInt32(db.GetCount(where));//获取总条数
var strSql = QuestionViewSet.SelectAll()
.Where(where.And(QuestionViewSet.Id.NotIn(NotInId))).Top(pageSize);
strSql = OrderByMQL(order, strSql, GetOrderByField(sort));
data = db.GetEntities<QuestionViewResult>(strSql);
string sql = db.CurrentSQL;
}
return data;
}
/// <summary>
/// 返回排序的组合
/// </summary>
public MQLBase OrderByMQL(string sort, MQLBase mql, params FieldBase[] fields)
{
if (!string.IsNullOrEmpty(sort) && sort.ToLower() == "asc")
{
mql.OrderByASC(fields);
}
else
{
mql.OrderByDESC(fields);
}
return mql;
}
/// <summary>
/// 排序的字段
/// </summary>
public FieldBase GetOrderByField(string order)
{
FieldBase result = null;
switch (order)
{
case "Id":
result = QuestionViewSet.Id;
break;
case "KnowledgeName":
result = QuestionViewSet.KnowledgeId;
break;
case "Question_Type":
case "QuestionTypeName":
result = QuestionViewSet.QuestionType;//试卷类型
break;
case "Difficulty":
case "DifficultName":
result = QuestionViewSet.Difficulty;//试题难度
break;
case "Score":
result = QuestionViewSet.Score;//分数
break;
case "Create_Date":
case "CreateTimeString":
result = QuestionViewSet.CreateDate;//创建时间
break;
case "StatusName":
result = QuestionViewSet.Status;//共享状态
break;
case "CollectCount":
result = QuestionViewSet.CollectCount;//收藏量
break;
case "UseCount":
result = QuestionViewSet.UseCount;//使用量
break;
case "UserName":
result = QuestionViewSet.UserId;
break;
default:
result = QuestionViewSet.CreateDate;//创建时间
break;
}
return result;
}
public static bool ChangeMoreQuestionStatus(string questionStringIDs, bool isPass)
{
int count = 0;
using (Db db = Db.CreateDefaultDb())
{
Question questionentity = new Question();
questionentity.Status = isPass ? (byte)QuestionStatusEnum.SharedToAuditSuccess : (byte)QuestionStatusEnum.SharedToAuditFail;
questionentity.WhereExpression = QuestionSet.Id.In(questionStringIDs.Split(','));
//WhereExpression where = QuestionSet.Status.Equal(questionentity.Status).And(QuestionSet.Id.In(questionStringIDs.Split(',')));
//var strSql = QuestionSet.SelectAll().Where(where);
//string sql = strSql.ToDebugSQL();
count = db.Update(questionentity);
}
if (count > 0)
return true;
else
return false;
}
/// <summary>
///更改status状态 私有试题(1)、共享待审核(2)、审核不通过(3)、公有试题(4)、作废(5)
/// </summary>
public static bool DeleteQuestion(int ID, int Status)
{
bool result = false;
if (ID > 0)
{
using (Db db = Db.CreateDefaultDb())
{
Question que = new Question();
que.Status = (byte)Status;
que.WhereExpression = QuestionSet.Id.Equal(ID);
result = db.Update(que) > 0 ? true : false;
}
}
return result;
}
/// <summary>
/// 获取分页数据
/// </summary>
/// <param name="page">页码</param>
/// <param name="rows">条数</param>
/// <param name="sort">排序字段</param>
/// <param name="order">排序</param>
/// <param name="searchEntity">查询实体条件</param>
/// <param name="recordCount">总条数</param>
/// <returns>数据列表</returns>
public List<QuestionViewResult> QuestionAuditList(int? page, int? rows, string sort, string order, Question searchEntity, out int recordCount)
{
List<QuestionViewResult> data;
WhereExpression where = QuestionViewSet.Status.Equal(searchEntity.Status);
if (searchEntity.Id > 0)
{
where = where.And(QuestionViewSet.Id.In(searchEntity.Id));
}
data = GetList(page, rows, sort, order, out recordCount, where);
return data;
}
#region 创建试题
/// <summary>
/// 创建多个问题
/// </summary>
/// <param name="qpModelList"></param>
/// <returns></returns>
public OperationResult CreateMoreQuestion(IEnumerable<QuestionProduceModel> qpModelList)
{
if (qpModelList == null)
{
throw new ArgumentNullException("qpModel");
}
OperationResult operation = new OperationResult();
foreach (var item in qpModelList)
{
ResultMessage result = CreateQuestion(item);
if (result.Success)
{
operation.SuccessCount++;
}
else
{
operation.FailureCount++;
}
}
return operation;
}
/// <summary>
/// 创建试题
/// </summary>
/// <param name="qpModel"></param>
/// <returns></returns>
public ResultMessage CreateQuestion(QuestionProduceModel qpModel)
{
ResultMessage msg = new ResultMessage(true, "");
if (qpModel == null)
{
throw new ArgumentNullException("qpModel");
}
if (qpModel.QuestionClientPostModel == null || !qpModel.QuestionClientPostModel.Any())
{
return new ResultMessage(false, "答题卡里面至少包含一项!");
}
int q_count = qpModel.QuestionClientPostModel.Length;
Question rootQuestion;
try
{
using (Db db = Db.CreateDefaultDb())
{
try
{
db.TransactionEnabled = true;
ResultMessage result = CreateQuestion(
db,
qpModel.QuestionClientPostModel,
qpModel.Description,
q_count > 1,
qpModel.CourseId,
qpModel.KnowledgeId,
qpModel.Custom_Question_TypeId,
qpModel.DifficultyId,
qpModel.Creator,
qpModel.Creator_Name,
true,
out rootQuestion);
//db.Transaction.Commit();
msg = result;
}
catch (Exception ex)
{
LOG_ERROR.Error("添加试卷发生异常,异常信息:" + ex.Message);
db.Transaction.Rollback();
}
}
}
catch (Exception)
{
msg = new ResultMessage(false, "添加时发生异常,已经回滚!");
}
return msg;
}
/// <summary>
/// 添加试题
/// </summary>
public ResultMessage CreateQuestion(Db db, QuestionModelForClientPost[] clientPostQuestionModels, string qDescription, bool hasChildQuestion, string courseId, string knowledgeId, short? custom_Question_Type, int? difficultyId, int creator, string creator_Name, bool is_Extract, out Question rootQuestion)
{
#region 查看重复
if (!string.IsNullOrEmpty(qDescription))
{
//查看 课程ID 用户ID 题干内容 是否同时存在 重复数据
WhereExpression where = QuestionSet.UserId.Equal(creator)
.And(QuestionSet.CourseId.Equal(courseId))
.And(QuestionSet.Id.In(QuestionDescSet.Select(QuestionDescSet.QuestionId)
.Where(QuestionDescSet.Description.Equal(qDescription))));
int existsQuestionCount = Convert.ToInt32(db.GetCount(where));
if (existsQuestionCount > 0)
{
rootQuestion = null;
return new ResultMessage(false, "添加失败!该试题已经在您的题库中存在了!");
}
}
#endregion
RealQuestionType rqType = hasChildQuestion ?
RealQuestionType.CP : RealQuestionTypeManager.GetRealQuestionTypeByCustomKey(clientPostQuestionModels[0].Type);
bool is_Machine = true;
decimal totalScore = 0;
foreach (QuestionModelForClientPost item in clientPostQuestionModels)
{
totalScore += item.ScoreArray.Sum();
if (RealQuestionTypeManager.GetRealQuestionTypeByCustomKey(item.Type) == RealQuestionType.QA)
{
is_Machine = false;
}
}
string reference_Answer = null;
if (!hasChildQuestion && (rqType == RealQuestionType.SS || rqType == RealQuestionType.MS || rqType == RealQuestionType.RW))
{
// 用逗号连接每个正确答案的选项
if (clientPostQuestionModels[0].StandardAnswer != null)
{
if (rqType == RealQuestionType.RW)
{
string standardAnswerValue = clientPostQuestionModels[0].StandardAnswer[0];
reference_Answer = standardAnswerValue.Equals("right", StringComparison.InvariantCultureIgnoreCase) ? "1" : "2";
}
else
{
reference_Answer = string.Join(",",
EnglishCharConverter.ConvertEnglishCharArrayToNumberArray(clientPostQuestionModels[0].StandardAnswer));
}
}
}
rootQuestion = new Question();
if (knowledgeId != null)
{
rootQuestion.KnowledgeId = knowledgeId;
}
rootQuestion.CourseId = courseId;
if (custom_Question_Type.HasValue)
{
rootQuestion.CustomQuestionType = custom_Question_Type;
}
if (difficultyId.HasValue)
{
rootQuestion.Difficulty = difficultyId;
}
rootQuestion.QuestionType = (short)rqType;
rootQuestion.Score = (double)totalScore;
rootQuestion.QuestionSource = 0;
rootQuestion.IsMachineScore = (byte)(is_Machine ? 1 : 0);
rootQuestion.ParentId = 0;
rootQuestion.ScoreRate = 0;
rootQuestion.Status = (byte)QuestionStatusEnum.UnShared;
rootQuestion.ReferenceId = 0;
//rootQuestion.DescriptionDir = null;
rootQuestion.CreateDate = DateTime.Now;
rootQuestion.UserId = creator;
if (creator_Name != null)
{
rootQuestion.UserName = creator_Name;
}
rootQuestion.UseCount = 0;
rootQuestion.CollectCount = 0;
rootQuestion.IsExtract = is_Extract ? (byte)QuestionIsExtractEnum.Yes : (byte)QuestionIsExtractEnum.No;
rootQuestion.IsAnswerable = !hasChildQuestion ? (byte)1 : (byte)0;
if (reference_Answer != null)
{
rootQuestion.ReferenceAnswer = reference_Answer;
}
db.Add(rootQuestion);
//rootQuestion.Id = this._questionRepository.DeferInsertReturnNewId(rootQuestion, unitOfWork);
if (rootQuestion.Id == 0)
{
return new ResultMessage(false, "添加失败!未知原因!");
}
//添加题干
QuestionDesc question_Desc = new QuestionDesc();
question_Desc.QuestionId = rootQuestion.Id;
if (!string.IsNullOrEmpty(qDescription))
{
question_Desc.Description = qDescription;
}
db.Add(question_Desc);
if (hasChildQuestion)
{
InsertChildQuestion(
db,
clientPostQuestionModels,
courseId,
knowledgeId,
custom_Question_Type,
difficultyId,
creator,
creator_Name,
rootQuestion
);
}
else
{
CreateQuestionOptionToDb(
db,
clientPostQuestionModels[0],
rootQuestion,
rqType);
}
return new ResultMessage(true, "添加成功!");
}
/// <summary>
/// 添加子题
/// </summary>
public void InsertChildQuestion(Db db, QuestionModelForClientPost[] clientPostQuestionModels, string courseId, string knowledgeId, short? custom_Question_Type, int? difficultyId, int creator, string creator_Name, Question parentQuestion)
{
if (clientPostQuestionModels == null)
{
throw new ArgumentNullException("clientPostQuestionModels");
}
foreach (QuestionModelForClientPost item in clientPostQuestionModels)
{
var tempRqType = RealQuestionTypeManager.GetRealQuestionTypeByCustomKey(item.Type);
string reference_Answer = null;
if (tempRqType == RealQuestionType.SS || tempRqType == RealQuestionType.MS || tempRqType == RealQuestionType.RW)
{
// 用逗号连接每个正确答案的选项
if (item.StandardAnswer != null)
{
if (tempRqType == RealQuestionType.RW)
{
string standardAnswerValue = item.StandardAnswer[0];
reference_Answer = standardAnswerValue.Equals("right", StringComparison.InvariantCultureIgnoreCase) ? "1" : "2";
}
else
{
reference_Answer = string.Join(",",
EnglishCharConverter.ConvertEnglishCharArrayToNumberArray(item.StandardAnswer));
}
}
}
double currentScore = (double)item.ScoreArray.Sum();
Question childQuestion = new Question();
if (knowledgeId != null)
{
childQuestion.KnowledgeId = knowledgeId;
}
childQuestion.CourseId = courseId;
if (custom_Question_Type.HasValue)
{
childQuestion.CustomQuestionType = custom_Question_Type;
}
if (difficultyId.HasValue)
{
childQuestion.Difficulty = difficultyId;
}
childQuestion.QuestionType = (short)tempRqType;
childQuestion.Score = currentScore;
childQuestion.QuestionSource = 0;
childQuestion.IsMachineScore = tempRqType != RealQuestionType.QA ? (byte)1 : (byte)0;
childQuestion.ParentId = parentQuestion.Id;
childQuestion.ScoreRate = currentScore / parentQuestion.Score.Value;
childQuestion.Status = (byte)QuestionStatusEnum.UnShared;
childQuestion.ReferenceId = 0;
//DescriptionDir = null,
childQuestion.CreateDate = DateTime.Now;
childQuestion.UserId = creator;
if (creator_Name != null)
{
childQuestion.UserName = creator_Name;
}
childQuestion.UseCount = 0;
childQuestion.CollectCount = 0;
childQuestion.IsExtract = (byte)QuestionIsExtractEnum.No;
childQuestion.IsAnswerable = 1;
if (reference_Answer != null)
{
childQuestion.ReferenceAnswer = reference_Answer;
}
childQuestion.Id = Convert.ToInt32(db.Add(childQuestion));
if (childQuestion.Id == 0)
{
continue;
}
CreateQuestionOptionToDb(db, item, childQuestion, tempRqType);
}
}
/// <summary>
/// 添加 试题
/// </summary>
/// <param name="qmForCp"></param>
/// <param name="currentQuestion"></param>
/// <param name="realQuestionType"></param>
/// <param name="unitOfWork"></param>
private void CreateQuestionOptionToDb(Db db, QuestionModelForClientPost qmForCp, Question currentQuestion, RealQuestionType realQuestionType)
{
switch (realQuestionType)
{
case RealQuestionType.SS:
case RealQuestionType.MS:
case RealQuestionType.RW:
CreateSsOrMsOrRwToDb(db, qmForCp, currentQuestion, realQuestionType);
break;
case RealQuestionType.FB:
case RealQuestionType.QA:
CreateFbOrQaToDb(db, qmForCp, currentQuestion);
break;
default:
throw new NotImplementedException("未知的题形!");
}
}
/// <summary>
/// 添加单选 多选 跟判断题
/// </summary>
private void CreateSsOrMsOrRwToDb(Db db, QuestionModelForClientPost clientQuestionModel, Question currentQuestion, RealQuestionType questionType)
{
short i = 0;
double itemScore = (double)clientQuestionModel.ScoreArray[0];
foreach (string questionValue in clientQuestionModel.QuestionValueArray)
{
i++;
QuestionOption question_Option = new QuestionOption()
{
QuestionId = currentQuestion.Id,
OptionTitle = questionType == RealQuestionType.RW ? clientQuestionModel.QuestionTitleArray[i - 1] : string.Empty, // 目前没有用到,由于题干中已经包含了
ReferenceAnswer = string.Empty,
//Score = null,
ScoreRate = itemScore / currentQuestion.Score.Value,
IsAnswer = clientQuestionModel.StandardAnswer.Contains(questionValue) ? (byte)1 : (byte)0,
OrderNo = (byte)i
};
db.Add(question_Option);
//this._question_OptionRepository.DeferInsert(question_Option, unitOfWork);
}
}
/// <summary>
/// 添加简答题 跟 填空题
/// </summary>
/// <param name="db"></param>
/// <param name="clientQuestionModel"></param>
/// <param name="currentQuestion"></param>
private void CreateFbOrQaToDb(Db db, QuestionModelForClientPost clientQuestionModel, Question currentQuestion)
{
short i = 0;
foreach (decimal questionValue in clientQuestionModel.ScoreArray)
{
i++;
double itemScore = (double)questionValue;
QuestionOption question_Option = new QuestionOption()
{
QuestionId = currentQuestion.Id,
OptionTitle = string.Empty, // 目前没有用到,由于题干中已经包含了
ReferenceAnswer = clientQuestionModel.StandardAnswer == null ? "" : clientQuestionModel.StandardAnswer[i - 1],
Score = itemScore,
ScoreRate = itemScore / currentQuestion.Score.Value,
IsAnswer = 0,
OrderNo = (byte)i
};
db.Add(question_Option);
//this._question_OptionRepository.DeferInsert(question_Option, unitOfWork);
}
}
#endregion
/// <summary>
/// 获取试题 选项的模型
/// </summary>
/// <param name="questionId"></param>
/// <param name="questionRenderModel"></param>
/// <param name="message"></param>
/// <returns></returns>
public QuestionViewResult GetQuestionViewWithQuestionRenderModel(int questionId, out PaperModelForRender questionRenderModel, out string message)
{
questionRenderModel = null;
message = null;
QuestionViewResult qv = GetQuestionResult(questionId);
if (qv == null || qv.Status == (short)QuestionStatusEnum.Deleted)
{
message = "您要查看的试题不存在,可能已经被删除了!";
return null;
}
if (qv.ParentId != 0)
{
message = "您要查看的试题是复合题中小题,无法单独查看!";
return null;
}
questionRenderModel = GetSingleQuestionModelForRender(questionId, 1, true, 0);
return qv;
}
/// <summary>
/// 获取非复合题 的选项
/// </summary>
/// <param name="questionId"></param>
/// <param name="renderQuestionNumber"></param>
/// <param name="isTakeScoreFromQuestion"></param>
/// <param name="ifNotTakeThenTotalScore"></param>
/// <returns></returns>
public PaperModelForRender GetSingleQuestionModelForRender(int questionId, int renderQuestionNumber, bool isTakeScoreFromQuestion, double ifNotTakeThenTotalScore)
{
QuestionViewResult qview = GetQuestionResult(questionId);
if (qview == null)
{
return null;
}
RealQuestionType realQuestionType = RealQuestionTypeManager.Convert(qview.QuestionType.Value.ToString());
IList<QuestionOption> q_options = null; // 非复合题才使用
IList<QuestionViewResult> childQuestions = null; // 复合题才使用
if (realQuestionType != RealQuestionType.CP)
{
q_options = QuestionOptionBLL.GetQuestionOptionList(questionId);
}
else
{
childQuestions = GetChildQuestions(questionId);
}
PaperModelForRender resultItem = new PaperModelForRender()
{
Number = renderQuestionNumber,
QuestionId = qview.Id,
QuestionType = realQuestionType,
TotalScore = isTakeScoreFromQuestion ? qview.Score.Value : ifNotTakeThenTotalScore,
QuestionDescription = qview.Description,
};
List<QuestionChildModelForRender> questionOptions = new List<QuestionChildModelForRender>();
switch (realQuestionType)
{
case RealQuestionType.SS:
case RealQuestionType.MS:
case RealQuestionType.RW:
{
if (q_options != null && q_options.Count > 0)
{
foreach (QuestionOption q_option_item in q_options)
{
string englishAnswer = EnglishCharConverter.ConvertNumberToEnglishChar(q_option_item.OrderNo).ToString();
questionOptions.Add(new QuestionChildModelForRender()
{
Id = q_option_item.Id,
Order_No = q_option_item.OrderNo != null ? q_option_item.OrderNo : (short)1,
QuestionTitle = realQuestionType == RealQuestionType.RW ? q_option_item.OptionTitle : englishAnswer,
QuestionValue = englishAnswer,
Score = resultItem.TotalScore
});
if (q_option_item.IsAnswer == 1)
{
if (!string.IsNullOrEmpty(resultItem.StandardAnswer))
{
resultItem.StandardAnswer += ",";
}
resultItem.StandardAnswer += (realQuestionType == RealQuestionType.RW ? q_option_item.OptionTitle : englishAnswer);
}
}
}
}
break;
case RealQuestionType.FB:
case RealQuestionType.QA:
{
if (q_options != null && q_options.Count > 0)
{
foreach (QuestionOption q_option_item in q_options)
{
questionOptions.Add(new QuestionChildModelForRender()
{
Id = q_option_item.Id,
Order_No = q_option_item.OrderNo != null ? q_option_item.OrderNo : (short)1,
QuestionTitle = null,
QuestionValue = null,
Score = isTakeScoreFromQuestion ? q_option_item.Score.Value : (resultItem.TotalScore * q_option_item.ScoreRate.Value),
StandardAnswer = q_option_item.ReferenceAnswer
});
}
}
}
break;
case RealQuestionType.CP:
{
GetCpQuestionInPaper(childQuestions, resultItem, isTakeScoreFromQuestion);
}
break;
}
resultItem.QuestionOptions = questionOptions;
return resultItem;
}
/// <summary>
/// 获取复合型试题的选项
/// </summary>
/// <param name="childQuestions"></param>
/// <param name="globalResultItem"></param>
/// <param name="isTakeScoreFromQuestion"></param>
protected void GetCpQuestionInPaper(IList<QuestionViewResult> childQuestions, PaperModelForRender globalResultItem, bool isTakeScoreFromQuestion)
{
if (childQuestions == null || childQuestions.Count == 0)
{
return;
}
globalResultItem.ChildQuestionForRenders = new List<PaperModelForRender>();
int i = 0;
foreach (QuestionViewResult childQv_item in childQuestions)
{
i++;
IList<QuestionOption> child_q_options = QuestionOptionBLL.GetQuestionOptionList(childQv_item.Id);
RealQuestionType childRealQuestionType = RealQuestionTypeManager.Convert(childQv_item.QuestionType.Value.ToString());
PaperModelForRender childResultItem = new PaperModelForRender()
{
Number = i,
QuestionId = childQv_item.Id,
QuestionType = childRealQuestionType,
TotalScore = isTakeScoreFromQuestion ? childQv_item.Score.Value : (globalResultItem.TotalScore * childQv_item.ScoreRate.Value),
QuestionDescription = null,
};
List<QuestionChildModelForRender> questionOptions = new List<QuestionChildModelForRender>();
switch (childRealQuestionType)
{
case RealQuestionType.SS:
case RealQuestionType.MS:
case RealQuestionType.RW:
{
if (child_q_options != null && child_q_options.Count > 0)
{
foreach (QuestionOption child_q_option_item in child_q_options)
{
string englishAnswer = EnglishCharConverter.ConvertNumberToEnglishChar(child_q_option_item.OrderNo).ToString();
questionOptions.Add(new QuestionChildModelForRender()
{
Id = child_q_option_item.Id,
Order_No = child_q_option_item.OrderNo != 0 ? child_q_option_item.OrderNo : (short)1,
QuestionTitle = childRealQuestionType == RealQuestionType.RW ? child_q_option_item.OptionTitle : englishAnswer,
QuestionValue = englishAnswer,
Score = isTakeScoreFromQuestion ? childQv_item.Score.Value : (childResultItem.TotalScore * child_q_option_item.ScoreRate.Value)
});
if (child_q_option_item.IsAnswer == 1)
{
if (!string.IsNullOrEmpty(childResultItem.StandardAnswer))
{
childResultItem.StandardAnswer += ",";
}
childResultItem.StandardAnswer += englishAnswer;
}
}
}
}
break;
case RealQuestionType.FB:
case RealQuestionType.QA:
{
if (child_q_options != null && child_q_options.Count > 0)
{
foreach (QuestionOption child_q_option_item in child_q_options)
{
questionOptions.Add(new QuestionChildModelForRender()
{
Id = child_q_option_item.Id,
Order_No = child_q_option_item.OrderNo != null ? child_q_option_item.OrderNo : (short)1,
QuestionTitle = null,
QuestionValue = null,
Score = isTakeScoreFromQuestion ?
(child_q_options.Count == 1 ? childQv_item.Score.Value : child_q_option_item.Score.Value)
:
(childResultItem.TotalScore * child_q_option_item.ScoreRate.Value),
StandardAnswer = child_q_option_item.ReferenceAnswer
});
}
}
}
break;
}
childResultItem.QuestionOptions = questionOptions;
globalResultItem.ChildQuestionForRenders.Add(childResultItem);
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Gta.Exam.Entities;
using Moon.Orm;
using System.Web;
using Gta.Exam.Utilities;
using System.Data.Common;
namespace Gta.Exam.BLL
{
public class QuestionBLL
{
private static readonly log4net.ILog LOG_ERROR = log4net.LogManager.GetLogger(typeof(QuestionBLL));
/// <summary>
/// 根据试题ID 返回试题数据
/// </summary>
public static QuestionViewResult GetQuestionResult(int questionId)
{
QuestionViewResult qr = new QuestionViewResult();
using (Db db = Db.CreateDefaultDb())
{
var MQL = QuestionViewSet.SelectAll()
.Where(QuestionViewSet.Id.Equal(questionId));
qr = db.GetEntity<QuestionViewResult>(MQL);
}
return qr;
}
/// <summary>
/// 根据父级ID 获取子试题列表
/// </summary>
/// <param name="questionId"></param>
/// <returns></returns>
public List<QuestionViewResult> GetChildQuestions(int questionId)
{
List<QuestionViewResult> qr = new List<QuestionViewResult>();
using (Db db = Db.CreateDefaultDb())
{
var MQL = QuestionViewSet.SelectAll()
.Where(QuestionViewSet.ParentId.Equal(questionId));
qr = db.GetEntities<QuestionViewResult>(MQL);
}
return qr;
}
/// <summary>
/// 我上传的试题
/// </summary>
public List<QuestionViewResult> MyUpload(int? page, int? rows, string sort, string order, Question que, out int recordCount, int User_Id)
{
List<QuestionViewResult> data;
EntityBase et = new EntityBase();
WhereExpression where = QuestionViewSet.Status.NotEqual(5)//不作废
.And(QuestionViewSet.ParentId.Equal(0))
.And(QuestionViewSet.IsExtract.Equal(que.IsExtract))
.And(QuestionViewSet.UserId.Equal(User_Id))
.And(QuestionViewSet.CourseId.Equal(que.CourseId));
if (!string.IsNullOrEmpty(que.KnowledgeId) && que.KnowledgeId != "0")
{
where = where.And(QuestionViewSet.KnowledgeId.Contains(que.KnowledgeId));
}
if (que.QuestionType > 0)
{
where = where.And(QuestionViewSet.QuestionType.Equal(que.QuestionType));
}
if (que.Difficulty > 0)
{
where = where.And(QuestionViewSet.Difficulty.Equal(que.Difficulty));
}
//未共享的 (包含 待审核 以及 审核不通过的)
if (que.Status == 1)
{
where = where.And(QuestionViewSet.Status.NotEqual(4));
}
else if (que.Status > 0)
{
where = where.And(QuestionViewSet.Status.Equal(que.Status));
}
data = GetList(page, rows, sort, order, out recordCount, where);
return data;
}
/// <summary>
/// 公共试题
/// </summary>
public List<QuestionViewResult> Public(int? page, int? rows, string sort, string order, Question que, out int recordCount)
{
List<QuestionViewResult> data;
EntityBase et = new EntityBase();
WhereExpression where = QuestionViewSet.Status.Equal(4)//共享试题
.And(QuestionViewSet.ParentId.Equal(0))
.And(QuestionViewSet.CourseId.Equal(que.CourseId));
if (!string.IsNullOrEmpty(que.KnowledgeId) && que.KnowledgeId != "0")
{
where = where.And(QuestionViewSet.KnowledgeId.Contains(que.KnowledgeId));
}
if (que.QuestionType > 0)
{
where = where.And(QuestionViewSet.QuestionType.Equal(que.QuestionType));
}
if (que.Difficulty > 0)
{
where = where.And(QuestionViewSet.Difficulty.Equal(que.Difficulty));
}
data = GetList(page, rows, sort, order, out recordCount, where);
return data;
}
/// <summary>
/// 我收藏的试题
/// </summary>
public List<QuestionViewResult> MyFavorite(int? page, int? rows, string sort, string order, Question que, out int recordCount, int User_Id)
{
List<QuestionViewResult> data;
EntityBase et = new EntityBase();
WhereExpression where = QuestionViewSet.Status.Equal(4)//共享的
.And(QuestionViewSet.ParentId.Equal(0))
.And(QuestionViewSet.CourseId.Equal(que.CourseId));
where = where.And(QuestionViewSet.Id.In(
QuestionCollectionSet.Select(QuestionCollectionSet.QuestionId)
.Where(QuestionCollectionSet.UserId.Equal(User_Id))));
if (!string.IsNullOrEmpty(que.KnowledgeId) && que.KnowledgeId != "0")
{
where = where.And(QuestionViewSet.KnowledgeId.Contains(que.KnowledgeId));
}
if (que.QuestionType > 0)
{
where = where.And(QuestionViewSet.QuestionType.Equal(que.QuestionType));
}
if (que.Difficulty > 0)
{
where = where.And(QuestionViewSet.Difficulty.Equal(que.Difficulty));
}
data = GetList(page, rows, sort, order, out recordCount, where);
return data;
}
/// <summary>
/// 获取分页数据
/// </summary>
/// <param name="page">页码</param>
/// <param name="rows">条数</param>
/// <param name="sort">排序字段</param>
/// <param name="order">排序</param>
/// <param name="recordCount">总条数</param>
/// <returns>数据列表</returns>
public List<QuestionViewResult> GetList(int? page, int? rows, string sort, string order, out int recordCount, WhereExpression where)
{
List<QuestionViewResult> data;
int pageIndex = page.HasValue && page.Value > 1 ? page.Value : 1;//页数
int pageSize = rows.HasValue && rows.Value > 1 ? rows.Value : 20;//每页条数
int startNum = (pageIndex - 1) * pageSize;//过滤掉的条数
var NotInId = QuestionViewSet.Select(QuestionViewSet.Id).Where(where).Top(startNum);
NotInId = OrderByMQL(order, NotInId, GetOrderByField(sort));
using (Db db = Db.CreateDefaultDb())//默认数据库链接
{
db.DebugEnabled = true;//开启调试
recordCount = Convert.ToInt32(db.GetCount(where));//获取总条数
var strSql = QuestionViewSet.SelectAll()
.Where(where.And(QuestionViewSet.Id.NotIn(NotInId))).Top(pageSize);
strSql = OrderByMQL(order, strSql, GetOrderByField(sort));
data = db.GetEntities<QuestionViewResult>(strSql);
string sql = db.CurrentSQL;
}
return data;
}
/// <summary>
/// 返回排序的组合
/// </summary>
public MQLBase OrderByMQL(string sort, MQLBase mql, params FieldBase[] fields)
{
if (!string.IsNullOrEmpty(sort) && sort.ToLower() == "asc")
{
mql.OrderByASC(fields);
}
else
{
mql.OrderByDESC(fields);
}
return mql;
}
/// <summary>
/// 排序的字段
/// </summary>
public FieldBase GetOrderByField(string order)
{
FieldBase result = null;
switch (order)
{
case "Id":
result = QuestionViewSet.Id;
break;
case "KnowledgeName":
result = QuestionViewSet.KnowledgeId;
break;
case "Question_Type":
case "QuestionTypeName":
result = QuestionViewSet.QuestionType;//试卷类型
break;
case "Difficulty":
case "DifficultName":
result = QuestionViewSet.Difficulty;//试题难度
break;
case "Score":
result = QuestionViewSet.Score;//分数
break;
case "Create_Date":
case "CreateTimeString":
result = QuestionViewSet.CreateDate;//创建时间
break;
case "StatusName":
result = QuestionViewSet.Status;//共享状态
break;
case "CollectCount":
result = QuestionViewSet.CollectCount;//收藏量
break;
case "UseCount":
result = QuestionViewSet.UseCount;//使用量
break;
case "UserName":
result = QuestionViewSet.UserId;
break;
default:
result = QuestionViewSet.CreateDate;//创建时间
break;
}
return result;
}
public static bool ChangeMoreQuestionStatus(string questionStringIDs, bool isPass)
{
int count = 0;
using (Db db = Db.CreateDefaultDb())
{
Question questionentity = new Question();
questionentity.Status = isPass ? (byte)QuestionStatusEnum.SharedToAuditSuccess : (byte)QuestionStatusEnum.SharedToAuditFail;
questionentity.WhereExpression = QuestionSet.Id.In(questionStringIDs.Split(','));
//WhereExpression where = QuestionSet.Status.Equal(questionentity.Status).And(QuestionSet.Id.In(questionStringIDs.Split(',')));
//var strSql = QuestionSet.SelectAll().Where(where);
//string sql = strSql.ToDebugSQL();
count = db.Update(questionentity);
}
if (count > 0)
return true;
else
return false;
}
/// <summary>
///更改status状态 私有试题(1)、共享待审核(2)、审核不通过(3)、公有试题(4)、作废(5)
/// </summary>
public static bool DeleteQuestion(int ID, int Status)
{
bool result = false;
if (ID > 0)
{
using (Db db = Db.CreateDefaultDb())
{
Question que = new Question();
que.Status = (byte)Status;
que.WhereExpression = QuestionSet.Id.Equal(ID);
result = db.Update(que) > 0 ? true : false;
}
}
return result;
}
/// <summary>
/// 获取分页数据
/// </summary>
/// <param name="page">页码</param>
/// <param name="rows">条数</param>
/// <param name="sort">排序字段</param>
/// <param name="order">排序</param>
/// <param name="searchEntity">查询实体条件</param>
/// <param name="recordCount">总条数</param>
/// <returns>数据列表</returns>
public List<QuestionViewResult> QuestionAuditList(int? page, int? rows, string sort, string order, Question searchEntity, out int recordCount)
{
List<QuestionViewResult> data;
WhereExpression where = QuestionViewSet.Status.Equal(searchEntity.Status);
if (searchEntity.Id > 0)
{
where = where.And(QuestionViewSet.Id.In(searchEntity.Id));
}
data = GetList(page, rows, sort, order, out recordCount, where);
return data;
}
#region 创建试题
/// <summary>
/// 创建多个问题
/// </summary>
/// <param name="qpModelList"></param>
/// <returns></returns>
public OperationResult CreateMoreQuestion(IEnumerable<QuestionProduceModel> qpModelList)
{
if (qpModelList == null)
{
throw new ArgumentNullException("qpModel");
}
OperationResult operation = new OperationResult();
foreach (var item in qpModelList)
{
ResultMessage result = CreateQuestion(item);
if (result.Success)
{
operation.SuccessCount++;
}
else
{
operation.FailureCount++;
}
}
return operation;
}
/// <summary>
/// 创建试题
/// </summary>
/// <param name="qpModel"></param>
/// <returns></returns>
public ResultMessage CreateQuestion(QuestionProduceModel qpModel)
{
ResultMessage msg = new ResultMessage(true, "");
if (qpModel == null)
{
throw new ArgumentNullException("qpModel");
}
if (qpModel.QuestionClientPostModel == null || !qpModel.QuestionClientPostModel.Any())
{
return new ResultMessage(false, "答题卡里面至少包含一项!");
}
int q_count = qpModel.QuestionClientPostModel.Length;
Question rootQuestion;
try
{
using (Db db = Db.CreateDefaultDb())
{
try
{
db.TransactionEnabled = true;
ResultMessage result = CreateQuestion(
db,
qpModel.QuestionClientPostModel,
qpModel.Description,
q_count > 1,
qpModel.CourseId,
qpModel.KnowledgeId,
qpModel.Custom_Question_TypeId,
qpModel.DifficultyId,
qpModel.Creator,
qpModel.Creator_Name,
true,
out rootQuestion);
//db.Transaction.Commit();
msg = result;
}
catch (Exception ex)
{
LOG_ERROR.Error("添加试卷发生异常,异常信息:" + ex.Message);
db.Transaction.Rollback();
}
}
}
catch (Exception)
{
msg = new ResultMessage(false, "添加时发生异常,已经回滚!");
}
return msg;
}
/// <summary>
/// 添加试题
/// </summary>
public ResultMessage CreateQuestion(Db db, QuestionModelForClientPost[] clientPostQuestionModels, string qDescription, bool hasChildQuestion, string courseId, string knowledgeId, short? custom_Question_Type, int? difficultyId, int creator, string creator_Name, bool is_Extract, out Question rootQuestion)
{
#region 查看重复
if (!string.IsNullOrEmpty(qDescription))
{
//查看 课程ID 用户ID 题干内容 是否同时存在 重复数据
WhereExpression where = QuestionSet.UserId.Equal(creator)
.And(QuestionSet.CourseId.Equal(courseId))
.And(QuestionSet.Id.In(QuestionDescSet.Select(QuestionDescSet.QuestionId)
.Where(QuestionDescSet.Description.Equal(qDescription))));
int existsQuestionCount = Convert.ToInt32(db.GetCount(where));
if (existsQuestionCount > 0)
{
rootQuestion = null;
return new ResultMessage(false, "添加失败!该试题已经在您的题库中存在了!");
}
}
#endregion
RealQuestionType rqType = hasChildQuestion ?
RealQuestionType.CP : RealQuestionTypeManager.GetRealQuestionTypeByCustomKey(clientPostQuestionModels[0].Type);
bool is_Machine = true;
decimal totalScore = 0;
foreach (QuestionModelForClientPost item in clientPostQuestionModels)
{
totalScore += item.ScoreArray.Sum();
if (RealQuestionTypeManager.GetRealQuestionTypeByCustomKey(item.Type) == RealQuestionType.QA)
{
is_Machine = false;
}
}
string reference_Answer = null;
if (!hasChildQuestion && (rqType == RealQuestionType.SS || rqType == RealQuestionType.MS || rqType == RealQuestionType.RW))
{
// 用逗号连接每个正确答案的选项
if (clientPostQuestionModels[0].StandardAnswer != null)
{
if (rqType == RealQuestionType.RW)
{
string standardAnswerValue = clientPostQuestionModels[0].StandardAnswer[0];
reference_Answer = standardAnswerValue.Equals("right", StringComparison.InvariantCultureIgnoreCase) ? "1" : "2";
}
else
{
reference_Answer = string.Join(",",
EnglishCharConverter.ConvertEnglishCharArrayToNumberArray(clientPostQuestionModels[0].StandardAnswer));
}
}
}
rootQuestion = new Question();
if (knowledgeId != null)
{
rootQuestion.KnowledgeId = knowledgeId;
}
rootQuestion.CourseId = courseId;
if (custom_Question_Type.HasValue)
{
rootQuestion.CustomQuestionType = custom_Question_Type;
}
if (difficultyId.HasValue)
{
rootQuestion.Difficulty = difficultyId;
}
rootQuestion.QuestionType = (short)rqType;
rootQuestion.Score = (double)totalScore;
rootQuestion.QuestionSource = 0;
rootQuestion.IsMachineScore = (byte)(is_Machine ? 1 : 0);
rootQuestion.ParentId = 0;
rootQuestion.ScoreRate = 0;
rootQuestion.Status = (byte)QuestionStatusEnum.UnShared;
rootQuestion.ReferenceId = 0;
//rootQuestion.DescriptionDir = null;
rootQuestion.CreateDate = DateTime.Now;
rootQuestion.UserId = creator;
if (creator_Name != null)
{
rootQuestion.UserName = creator_Name;
}
rootQuestion.UseCount = 0;
rootQuestion.CollectCount = 0;
rootQuestion.IsExtract = is_Extract ? (byte)QuestionIsExtractEnum.Yes : (byte)QuestionIsExtractEnum.No;
rootQuestion.IsAnswerable = !hasChildQuestion ? (byte)1 : (byte)0;
if (reference_Answer != null)
{
rootQuestion.ReferenceAnswer = reference_Answer;
}
db.Add(rootQuestion);
//rootQuestion.Id = this._questionRepository.DeferInsertReturnNewId(rootQuestion, unitOfWork);
if (rootQuestion.Id == 0)
{
return new ResultMessage(false, "添加失败!未知原因!");
}
//添加题干
QuestionDesc question_Desc = new QuestionDesc();
question_Desc.QuestionId = rootQuestion.Id;
if (!string.IsNullOrEmpty(qDescription))
{
question_Desc.Description = qDescription;
}
db.Add(question_Desc);
if (hasChildQuestion)
{
InsertChildQuestion(
db,
clientPostQuestionModels,
courseId,
knowledgeId,
custom_Question_Type,
difficultyId,
creator,
creator_Name,
rootQuestion
);
}
else
{
CreateQuestionOptionToDb(
db,
clientPostQuestionModels[0],
rootQuestion,
rqType);
}
return new ResultMessage(true, "添加成功!");
}
/// <summary>
/// 添加子题
/// </summary>
public void InsertChildQuestion(Db db, QuestionModelForClientPost[] clientPostQuestionModels, string courseId, string knowledgeId, short? custom_Question_Type, int? difficultyId, int creator, string creator_Name, Question parentQuestion)
{
if (clientPostQuestionModels == null)
{
throw new ArgumentNullException("clientPostQuestionModels");
}
foreach (QuestionModelForClientPost item in clientPostQuestionModels)
{
var tempRqType = RealQuestionTypeManager.GetRealQuestionTypeByCustomKey(item.Type);
string reference_Answer = null;
if (tempRqType == RealQuestionType.SS || tempRqType == RealQuestionType.MS || tempRqType == RealQuestionType.RW)
{
// 用逗号连接每个正确答案的选项
if (item.StandardAnswer != null)
{
if (tempRqType == RealQuestionType.RW)
{
string standardAnswerValue = item.StandardAnswer[0];
reference_Answer = standardAnswerValue.Equals("right", StringComparison.InvariantCultureIgnoreCase) ? "1" : "2";
}
else
{
reference_Answer = string.Join(",",
EnglishCharConverter.ConvertEnglishCharArrayToNumberArray(item.StandardAnswer));
}
}
}
double currentScore = (double)item.ScoreArray.Sum();
Question childQuestion = new Question();
if (knowledgeId != null)
{
childQuestion.KnowledgeId = knowledgeId;
}
childQuestion.CourseId = courseId;
if (custom_Question_Type.HasValue)
{
childQuestion.CustomQuestionType = custom_Question_Type;
}
if (difficultyId.HasValue)
{
childQuestion.Difficulty = difficultyId;
}
childQuestion.QuestionType = (short)tempRqType;
childQuestion.Score = currentScore;
childQuestion.QuestionSource = 0;
childQuestion.IsMachineScore = tempRqType != RealQuestionType.QA ? (byte)1 : (byte)0;
childQuestion.ParentId = parentQuestion.Id;
childQuestion.ScoreRate = currentScore / parentQuestion.Score.Value;
childQuestion.Status = (byte)QuestionStatusEnum.UnShared;
childQuestion.ReferenceId = 0;
//DescriptionDir = null,
childQuestion.CreateDate = DateTime.Now;
childQuestion.UserId = creator;
if (creator_Name != null)
{
childQuestion.UserName = creator_Name;
}
childQuestion.UseCount = 0;
childQuestion.CollectCount = 0;
childQuestion.IsExtract = (byte)QuestionIsExtractEnum.No;
childQuestion.IsAnswerable = 1;
if (reference_Answer != null)
{
childQuestion.ReferenceAnswer = reference_Answer;
}
childQuestion.Id = Convert.ToInt32(db.Add(childQuestion));
if (childQuestion.Id == 0)
{
continue;
}
CreateQuestionOptionToDb(db, item, childQuestion, tempRqType);
}
}
/// <summary>
/// 添加 试题
/// </summary>
/// <param name="qmForCp"></param>
/// <param name="currentQuestion"></param>
/// <param name="realQuestionType"></param>
/// <param name="unitOfWork"></param>
private void CreateQuestionOptionToDb(Db db, QuestionModelForClientPost qmForCp, Question currentQuestion, RealQuestionType realQuestionType)
{
switch (realQuestionType)
{
case RealQuestionType.SS:
case RealQuestionType.MS:
case RealQuestionType.RW:
CreateSsOrMsOrRwToDb(db, qmForCp, currentQuestion, realQuestionType);
break;
case RealQuestionType.FB:
case RealQuestionType.QA:
CreateFbOrQaToDb(db, qmForCp, currentQuestion);
break;
default:
throw new NotImplementedException("未知的题形!");
}
}
/// <summary>
/// 添加单选 多选 跟判断题
/// </summary>
private void CreateSsOrMsOrRwToDb(Db db, QuestionModelForClientPost clientQuestionModel, Question currentQuestion, RealQuestionType questionType)
{
short i = 0;
double itemScore = (double)clientQuestionModel.ScoreArray[0];
foreach (string questionValue in clientQuestionModel.QuestionValueArray)
{
i++;
QuestionOption question_Option = new QuestionOption()
{
QuestionId = currentQuestion.Id,
OptionTitle = questionType == RealQuestionType.RW ? clientQuestionModel.QuestionTitleArray[i - 1] : string.Empty, // 目前没有用到,由于题干中已经包含了
ReferenceAnswer = string.Empty,
//Score = null,
ScoreRate = itemScore / currentQuestion.Score.Value,
IsAnswer = clientQuestionModel.StandardAnswer.Contains(questionValue) ? (byte)1 : (byte)0,
OrderNo = (byte)i
};
db.Add(question_Option);
//this._question_OptionRepository.DeferInsert(question_Option, unitOfWork);
}
}
/// <summary>
/// 添加简答题 跟 填空题
/// </summary>
/// <param name="db"></param>
/// <param name="clientQuestionModel"></param>
/// <param name="currentQuestion"></param>
private void CreateFbOrQaToDb(Db db, QuestionModelForClientPost clientQuestionModel, Question currentQuestion)
{
short i = 0;
foreach (decimal questionValue in clientQuestionModel.ScoreArray)
{
i++;
double itemScore = (double)questionValue;
QuestionOption question_Option = new QuestionOption()
{
QuestionId = currentQuestion.Id,
OptionTitle = string.Empty, // 目前没有用到,由于题干中已经包含了
ReferenceAnswer = clientQuestionModel.StandardAnswer == null ? "" : clientQuestionModel.StandardAnswer[i - 1],
Score = itemScore,
ScoreRate = itemScore / currentQuestion.Score.Value,
IsAnswer = 0,
OrderNo = (byte)i
};
db.Add(question_Option);
//this._question_OptionRepository.DeferInsert(question_Option, unitOfWork);
}
}
#endregion
/// <summary>
/// 获取试题 选项的模型
/// </summary>
/// <param name="questionId"></param>
/// <param name="questionRenderModel"></param>
/// <param name="message"></param>
/// <returns></returns>
public QuestionViewResult GetQuestionViewWithQuestionRenderModel(int questionId, out PaperModelForRender questionRenderModel, out string message)
{
questionRenderModel = null;
message = null;
QuestionViewResult qv = GetQuestionResult(questionId);
if (qv == null || qv.Status == (short)QuestionStatusEnum.Deleted)
{
message = "您要查看的试题不存在,可能已经被删除了!";
return null;
}
if (qv.ParentId != 0)
{
message = "您要查看的试题是复合题中小题,无法单独查看!";
return null;
}
questionRenderModel = GetSingleQuestionModelForRender(questionId, 1, true, 0);
return qv;
}
/// <summary>
/// 获取非复合题 的选项
/// </summary>
/// <param name="questionId"></param>
/// <param name="renderQuestionNumber"></param>
/// <param name="isTakeScoreFromQuestion"></param>
/// <param name="ifNotTakeThenTotalScore"></param>
/// <returns></returns>
public PaperModelForRender GetSingleQuestionModelForRender(int questionId, int renderQuestionNumber, bool isTakeScoreFromQuestion, double ifNotTakeThenTotalScore)
{
QuestionViewResult qview = GetQuestionResult(questionId);
if (qview == null)
{
return null;
}
RealQuestionType realQuestionType = RealQuestionTypeManager.Convert(qview.QuestionType.Value.ToString());
IList<QuestionOption> q_options = null; // 非复合题才使用
IList<QuestionViewResult> childQuestions = null; // 复合题才使用
if (realQuestionType != RealQuestionType.CP)
{
q_options = QuestionOptionBLL.GetQuestionOptionList(questionId);
}
else
{
childQuestions = GetChildQuestions(questionId);
}
PaperModelForRender resultItem = new PaperModelForRender()
{
Number = renderQuestionNumber,
QuestionId = qview.Id,
QuestionType = realQuestionType,
TotalScore = isTakeScoreFromQuestion ? qview.Score.Value : ifNotTakeThenTotalScore,
QuestionDescription = qview.Description,
};
List<QuestionChildModelForRender> questionOptions = new List<QuestionChildModelForRender>();
switch (realQuestionType)
{
case RealQuestionType.SS:
case RealQuestionType.MS:
case RealQuestionType.RW:
{
if (q_options != null && q_options.Count > 0)
{
foreach (QuestionOption q_option_item in q_options)
{
string englishAnswer = EnglishCharConverter.ConvertNumberToEnglishChar(q_option_item.OrderNo).ToString();
questionOptions.Add(new QuestionChildModelForRender()
{
Id = q_option_item.Id,
Order_No = q_option_item.OrderNo != null ? q_option_item.OrderNo : (short)1,
QuestionTitle = realQuestionType == RealQuestionType.RW ? q_option_item.OptionTitle : englishAnswer,
QuestionValue = englishAnswer,
Score = resultItem.TotalScore
});
if (q_option_item.IsAnswer == 1)
{
if (!string.IsNullOrEmpty(resultItem.StandardAnswer))
{
resultItem.StandardAnswer += ",";
}
resultItem.StandardAnswer += (realQuestionType == RealQuestionType.RW ? q_option_item.OptionTitle : englishAnswer);
}
}
}
}
break;
case RealQuestionType.FB:
case RealQuestionType.QA:
{
if (q_options != null && q_options.Count > 0)
{
foreach (QuestionOption q_option_item in q_options)
{
questionOptions.Add(new QuestionChildModelForRender()
{
Id = q_option_item.Id,
Order_No = q_option_item.OrderNo != null ? q_option_item.OrderNo : (short)1,
QuestionTitle = null,
QuestionValue = null,
Score = isTakeScoreFromQuestion ? q_option_item.Score.Value : (resultItem.TotalScore * q_option_item.ScoreRate.Value),
StandardAnswer = q_option_item.ReferenceAnswer
});
}
}
}
break;
case RealQuestionType.CP:
{
GetCpQuestionInPaper(childQuestions, resultItem, isTakeScoreFromQuestion);
}
break;
}
resultItem.QuestionOptions = questionOptions;
return resultItem;
}
/// <summary>
/// 获取复合型试题的选项
/// </summary>
/// <param name="childQuestions"></param>
/// <param name="globalResultItem"></param>
/// <param name="isTakeScoreFromQuestion"></param>
protected void GetCpQuestionInPaper(IList<QuestionViewResult> childQuestions, PaperModelForRender globalResultItem, bool isTakeScoreFromQuestion)
{
if (childQuestions == null || childQuestions.Count == 0)
{
return;
}
globalResultItem.ChildQuestionForRenders = new List<PaperModelForRender>();
int i = 0;
foreach (QuestionViewResult childQv_item in childQuestions)
{
i++;
IList<QuestionOption> child_q_options = QuestionOptionBLL.GetQuestionOptionList(childQv_item.Id);
RealQuestionType childRealQuestionType = RealQuestionTypeManager.Convert(childQv_item.QuestionType.Value.ToString());
PaperModelForRender childResultItem = new PaperModelForRender()
{
Number = i,
QuestionId = childQv_item.Id,
QuestionType = childRealQuestionType,
TotalScore = isTakeScoreFromQuestion ? childQv_item.Score.Value : (globalResultItem.TotalScore * childQv_item.ScoreRate.Value),
QuestionDescription = null,
};
List<QuestionChildModelForRender> questionOptions = new List<QuestionChildModelForRender>();
switch (childRealQuestionType)
{
case RealQuestionType.SS:
case RealQuestionType.MS:
case RealQuestionType.RW:
{
if (child_q_options != null && child_q_options.Count > 0)
{
foreach (QuestionOption child_q_option_item in child_q_options)
{
string englishAnswer = EnglishCharConverter.ConvertNumberToEnglishChar(child_q_option_item.OrderNo).ToString();
questionOptions.Add(new QuestionChildModelForRender()
{
Id = child_q_option_item.Id,
Order_No = child_q_option_item.OrderNo != 0 ? child_q_option_item.OrderNo : (short)1,
QuestionTitle = childRealQuestionType == RealQuestionType.RW ? child_q_option_item.OptionTitle : englishAnswer,
QuestionValue = englishAnswer,
Score = isTakeScoreFromQuestion ? childQv_item.Score.Value : (childResultItem.TotalScore * child_q_option_item.ScoreRate.Value)
});
if (child_q_option_item.IsAnswer == 1)
{
if (!string.IsNullOrEmpty(childResultItem.StandardAnswer))
{
childResultItem.StandardAnswer += ",";
}
childResultItem.StandardAnswer += englishAnswer;
}
}
}
}
break;
case RealQuestionType.FB:
case RealQuestionType.QA:
{
if (child_q_options != null && child_q_options.Count > 0)
{
foreach (QuestionOption child_q_option_item in child_q_options)
{
questionOptions.Add(new QuestionChildModelForRender()
{
Id = child_q_option_item.Id,
Order_No = child_q_option_item.OrderNo != null ? child_q_option_item.OrderNo : (short)1,
QuestionTitle = null,
QuestionValue = null,
Score = isTakeScoreFromQuestion ?
(child_q_options.Count == 1 ? childQv_item.Score.Value : child_q_option_item.Score.Value)
:
(childResultItem.TotalScore * child_q_option_item.ScoreRate.Value),
StandardAnswer = child_q_option_item.ReferenceAnswer
});
}
}
}
break;
}
childResultItem.QuestionOptions = questionOptions;
globalResultItem.ChildQuestionForRenders.Add(childResultItem);
}
}
}
}