• Moon.Orm 5.0 (MQL版) 实战实例


    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, 1true0);
                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);
                }
            }
        }
    }
  • 相关阅读:
    Gradle中的buildScript,gradle wrapper,dependencies等一些基础知识
    在liferay 7中如何删除service builder已经生成的数据库table
    settings.gradle与build.gradle有什么区别
    如何建一个Liferay 7的theme
    如何在IDE的开发环境中启动Studio和本地build出一个product
    Lunix文件的读写权限问题
    liferay 7用OSGi的方式修改默认权限
    Liferay 7 module项目的依赖问题
    城市选择
    2016/04/26 流程 数据库lcdb 四个表 1,用户表users 2,流程表(设定有哪些流程)liucheng 3,流程发起者表(记录谁发起到哪里) 4,流程经过的人员表 flowpath (order排序)
  • 原文地址:https://www.cnblogs.com/humble/p/3402071.html
Copyright © 2020-2023  润新知