using System; using System.Collections.Generic; using System.Linq; using System.Text; using EMISOnline.Entities; using System.Xml.Linq; using EMISOnline.ViewModel.ExamView; using System.Web.Script.Serialization; using EMISOnline.DataLogic.ExamSetting; using EMISOnline.ViewModel; using System.Data; using System.Collections; namespace EMISOnline.CommonLogic.ExamServices { public class TestPaperServices : ITestPaperServices { public TestPaperDAL TestPaperDAL { get; set; } /// /// 创建动态子卷 /// /// /// public decimal CreateSinglePaper(decimal testid, test_paper t_paper) { decimal paperid = 0; if (t_paper != null) { string libs = t_paper.question_libary_set_id; decimal diff_min = t_paper.difficulty_degree_minvalue.HasValue ? t_paper.difficulty_degree_minvalue.Value : 0m; decimal diff_max = t_paper.difficulty_degree_maxvalue.HasValue ? t_paper.difficulty_degree_maxvalue.Value : 0m; decimal wrong_rate = t_paper.error_percent.HasValue ? t_paper.error_percent.Value : 0m; int usedcount_min = t_paper.used_count_min.HasValue ? t_paper.used_count_min.Value : 0; int usedcount_max = t_paper.used_count_max.HasValue ? t_paper.used_count_max.Value : 0; int prority = t_paper.Prority.HasValue ? t_paper.Prority.Value : 0; var ques_setting = new JavaScriptSerializer().Deserialize(t_paper.question_setting); //新试卷 test_paper newpaper = new test_paper(); newpaper.created_by = t_paper.created_by; newpaper.created_date = t_paper.created_date; newpaper.difficulty_degree_maxvalue = t_paper.difficulty_degree_maxvalue; newpaper.difficulty_degree_minvalue = t_paper.difficulty_degree_minvalue; newpaper.distributing_option = t_paper.distributing_option; newpaper.error_percent = t_paper.error_percent; newpaper.is_autogenerate = true; newpaper.is_dynamic = false; newpaper.is_vaild = t_paper.is_vaild; newpaper.paper_score = t_paper.paper_score; newpaper.PaperName = string.Format("{0}", t_paper.PaperName); newpaper.Prority = t_paper.Prority; newpaper.question_libary_set_id = t_paper.question_libary_set_id; newpaper.question_setting = t_paper.question_setting; newpaper.question_update_date_max = t_paper.question_update_date_max; newpaper.question_update_date_min = t_paper.question_update_date_min; newpaper.test_paper_parent_id = t_paper.test_paper_id; newpaper.used_count = t_paper.used_count; newpaper.used_count_max = t_paper.used_count_max; newpaper.used_count_min = t_paper.used_count_min; List list = new List(); foreach (var t in ques_setting) { XElement x = new XElement("QType"); x.SetAttributeValue("QTypeID", t.QType); x.SetAttributeValue("PSum", t.PSum); x.SetAttributeValue("TSum", t.TSum); x.SetAttributeValue("QScore", t.QScore); list.Add(x); } XElement xml = new XElement("paper_set", list); newpaper.question_setting_xml = xml.ToString(); TestPaperDAL.PaperRepository.UnitOfWork.Add(newpaper); TestPaperDAL.PaperRepository.UnitOfWork.Commit(); paperid = newpaper.test_paper_id; ////筛选题目并存储关联数据 TestPaperDAL.SetQuestion(paperid, diff_min, diff_max, usedcount_min, usedcount_max, wrong_rate); //context.SubmitChanges(); } return paperid; } public bool UpdatePaperID(decimal test_id, string userid, decimal newPaperid) { return TestPaperDAL.UpdatePaperID(test_id, userid, newPaperid); } public void RootReadPaper(decimal testid, string userid) { TestPaperDAL.RootReadPaper(testid, userid); } public bool IsControllable(decimal id, out int test_method) { test_method = 0; var result = TestPaperDAL.onlinetestRepository.Entities.Where(t => t.onlinetest_id == id).Select(t => new { t.isControllable, t.test_method_set_id }).FirstOrDefault(); if (result == null) return false; test_method = (int)(result.test_method_set_id.HasValue ? result.test_method_set_id.Value : 0); return result.isControllable ?? false; } public bool UpdateExamState(decimal test_id, string userid) { if (GetExamStatus(test_id, userid) == Examinee_ExamStatus.考试中) { var query = from test in TestPaperDAL.ExamResultRepository.Entities where test.onlinetest_id == test_id where test.user_id == userid select test; var testman = query.FirstOrDefault(); var onlinetest = TestPaperDAL.onlinetestRepository.Entities.Where(q => q.onlinetest_id == test_id).FirstOrDefault(); testman.relogin_count = (testman.relogin_count ?? 0) + 1; //if (testman.test_onlinetest.test_method_set_id.Value != 0 && testman.state != 2) //{ testman.state = 1; //} testman.lastLoginTime = DateTime.Now; // 原设计仅在第一次进入是设定开始时间,重新进入则从这个时间计时 //if (testman.relogin_count == 1) if (onlinetest.test_method_set_id == 0) { testman.test_begin_date = testman.lastLoginTime; testman.test_end_date = null; } TestPaperDAL.manRepository.UnitOfWork.Commit(); return true; } return false; } public Examinee_ExamStatus GetExamStatus(decimal test_id, string userid) { var query = from man in TestPaperDAL.ExamResultRepository.Entities join test in TestPaperDAL.onlinetestRepository.Entities on man.onlinetest_id equals test.onlinetest_id where man.onlinetest_id == test_id where man.user_id == userid select new { status_id = test.status_id, beginTime = test.test_begin_date, endTime = test.test_end_date, loginCount = test.relogin_count, reloginCount = man.relogin_count, lastLoginTime = man.lastLoginTime, testMethod = test.test_method_set_id, limited = man.limited_minutes, manBeginTime = man.test_begin_date, state = man.state }; var testman = query.FirstOrDefault(); var now = DateTime.Now; if (testman == null) return Examinee_ExamStatus.不能参加该场考试; if (testman.status_id == 0 || testman.beginTime > now) return Examinee_ExamStatus.考试未开始; if (testman.testMethod.Value == 1) { // 现场考试 if (now > testman.beginTime.Value.AddMinutes(testman.limited.Value)) return Examinee_ExamStatus.考试已结束; // 现场考试需要检查是否已交卷,在线考试无需判断 if (testman.state >= 2) return Examinee_ExamStatus.已交卷; } else { if (testman.endTime < now && !testman.lastLoginTime.HasValue) return Examinee_ExamStatus.考试已结束; //现在不用判断考试时长 //if (testman.manBeginTime.HasValue && now > testman.manBeginTime.Value.AddMinutes(testman.limited.Value)) // return Examinee_ExamStatus.考试已结束; } if (testman.reloginCount >= testman.loginCount) return Examinee_ExamStatus.登录次数已大于规定的次数; return Examinee_ExamStatus.考试中; } public void AddExchange(decimal test_id, int type, int receiveType, string receiver, int extendIntData) { TestPaperDAL.AddExchange(test_id, type, receiveType, receiver, extendIntData); } public ExamResult GetExam(string userid, decimal test_id) { return TestPaperDAL.ExamResultRepository.GetSingle(q => q.onlinetest_id == test_id && q.user_id == userid); } public double GetExamLastLength(decimal test_id, string userid) { var result = TestPaperDAL.ExamResultRepository.GetSingle(q => q.onlinetest_id == test_id && q.user_id == userid); return (result.test_begin_date.Value.AddMinutes(result.limited_minutes.Value) - DateTime.Now).TotalSeconds; } public object PaperBuilder(decimal test_id, decimal paper_id) { DataSet ds = TestPaperDAL.PaperBuilder(test_id, paper_id); var json = new JavaScriptSerializer(); var questionTb = ds.Tables[0]; var typeTb = ds.Tables[1]; var examTb = ds.Tables[2]; var waringTb = ds.Tables[3]; var result = new StringBuilder(); var examInfo = ParseExamInfo(examTb, questionTb.Rows.Count, json); var paper = ParsePaper(typeTb, questionTb, json); //result.AppendFormat("var examInfo = {0};", ParseExamInfo(examTb, questionTb.Rows.Count, json)); //result.AppendFormat("var paper = [{0}];", ParsePaper(typeTb, questionTb, json)); //result.Append(ParseWaring(waringTb, json)); return new { examInfo = examInfo, paper = paper, allWarring = getWaring(waringTb.AsEnumerable(), 2, json), personWarring = getWaring(waringTb.AsEnumerable(), 1, json) }; ; } private object ParseExamInfo(DataTable examTb, int questionCount, JavaScriptSerializer json) { var examRow = examTb.Rows[0]; var examInfo = new { name = examRow["test_name"].ToString(), test_id = (decimal)examRow["onlinetest_id"], begin = (DateTime)examRow["test_begin_date"], end = (DateTime)examRow["test_end_date"], limited = (int)examRow["limited_minutes"], breaking = (short)examRow["breaking_id"], display_type = examRow["display_type"].ToString(), //controllable = examRow["isControllable"] == DBNull.Value ? false : (bool)examRow["isControllable"], questionCount = questionCount }; return examInfo; } private object ParsePaper(DataTable typeTb, DataTable paperTb, JavaScriptSerializer json) { var buff = new StringBuilder(); var questionQuery = paperTb.AsEnumerable(); ArrayList list = new ArrayList(); JavaScriptSerializer serializer =new JavaScriptSerializer(); foreach (DataRow typeRow in typeTb.Rows) { var typeid = (decimal)typeRow["base_question_type_id"]; var name = typeRow["Name"] as string; var query = from questions in questionQuery where questions.Field("base_question_type_id") == typeid select questions.Field("question_json"); var questionList = new List(); query.ToList().ForEach(q => { questionList.Add(serializer.Deserialize(q)); }); if (questionList.Count > 0) { if (buff.Length > 0) buff.Append(","); //buff.AppendFormat("{{id: {0},name: {1},questions:[{2}]}}", // typeid, json.Serialize(name), string.Join(",", questionList)); list.Add(new { id = typeid, name = name, questions = questionList }); } } return list; } private object ParseWaring(DataTable waringTb, JavaScriptSerializer json) { var buff = new StringBuilder(); var query = waringTb.AsEnumerable(); //buff.AppendFormat("var allWarring = {0};", getWaring(query, 2, json)); //buff.AppendFormat("var personWarring = {0};", getWaring(query, 1, json)); return new { allWarring = getWaring(query, 2, json), personWarring = getWaring(query, 1, json) }; } private object getWaring(EnumerableRowCollection query, int type, JavaScriptSerializer json) { var result = query.Where(q => q.Field("AlertType") == type).Select(q => new { key = q.Field("ID"), value = q.Field("Message") }); return result.ToArray(); } public test_onlinetest GetOnlineTest(decimal id) { return TestPaperDAL.onlinetestRepository.Entities.Single(q => q.onlinetest_id == id); } public Examinee_ExamStatus GetExamStartLength(decimal test_id, string userid, out double limit) { limit = 0; var query = from man in TestPaperDAL.ExamResultRepository.Entities join test in TestPaperDAL.onlinetestRepository.Entities on man.onlinetest_id equals test.onlinetest_id where man.onlinetest_id == test_id where man.user_id == userid select new { status_id = test.status_id, beginTime = test.test_begin_date, endTime = test.test_end_date, loginCount = test.relogin_count, reloginCount = man.relogin_count, lastLoginTime = man.lastLoginTime, testMethod = test.test_method_set_id, limited = man.limited_minutes, manBeginTime = man.test_begin_date, state = man.state }; var testman = query.FirstOrDefault(); var now = DateTime.Now; if (testman == null) return Examinee_ExamStatus.不能参加该场考试; if (testman.status_id == 0) return Examinee_ExamStatus.考试未开始; if (testman.testMethod.Value == 1) { // 现场考试 if (now > testman.beginTime.Value.AddMinutes(testman.limited.Value)) return Examinee_ExamStatus.考试已结束; if (testman.state >= 2) return Examinee_ExamStatus.已交卷; } else { if (testman.endTime < now && !testman.lastLoginTime.HasValue) return Examinee_ExamStatus.考试已结束; //在线考试不受考试时间限制 //if (testman.manBeginTime.HasValue && now > testman.manBeginTime.Value.AddMinutes(testman.limited.Value)) // return Examinee_ExamStatus.考试已结束; } if (testman.reloginCount >= testman.loginCount) return Examinee_ExamStatus.登录次数已大于规定的次数; limit = (testman.beginTime.Value - DateTime.Now).TotalSeconds; return Examinee_ExamStatus.考试中; } public string ListExchange(decimal test_id, int receiveType, string receiver, DateTime? sendTime) { var query = TestPaperDAL.ListExchange(test_id, receiveType, receiver, sendTime); JavaScriptSerializer serial = new JavaScriptSerializer(); return serial.Serialize(query); } } }