using System; using System.Collections.Generic; using System.Linq; using System.Web; using WeiSha.Common; using Song.ServiceInterfaces; using Song.Entities; using System.Xml; namespace Song.Site { /// /// 测试成绩回顾 /// public class TestView : BasePage { //测试成绩记录的Id int trid = WeiSha.Common.Request.QueryString["trid"].Int32 ?? 0; XmlDocument resXml = new XmlDocument(); protected override void InitPageTemplate(HttpContext context) { Song.Entities.TestResults result = Business.Do().ResultsSingle(trid); if (result == null) return; this.Document.Variables.SetValue("result", result); //试卷 Song.Entities.TestPaper tp = Business.Do().PagerSingle((int)result.Tp_Id); if (tp == null) return; this.Document.Variables.SetValue("pager", tp); //考生 Song.Entities.Accounts st = Business.Do().AccountsSingle((int)result.Ac_ID); this.Document.Variables.SetValue("st", st); //加载答题信息 resXml.LoadXml(result.Tr_Results, false); //获取试题项 Song.Entities.TestPaperItem[] tpi = getTpi(tp); this.Document.Variables.SetValue("tpi", tpi); //计算得分 this.Document.RegisterGlobalFunction(this.getTypeName); this.Document.RegisterGlobalFunction(this.getTypeNumber); this.Document.RegisterGlobalFunction(this.getAnswerCount); this.Document.RegisterGlobalFunction(this.getSucessCount); this.Document.RegisterGlobalFunction(this.getErrorCount); //展示答题状态 this.Document.RegisterGlobalFunction(this.getQues); this.Document.RegisterGlobalFunction(this.getItems); //计算答题状态等 this.Document.RegisterGlobalFunction(this.getAnswerState); //获取学生答题内容与正确答案 this.Document.RegisterGlobalFunction(this.getResult); this.Document.RegisterGlobalFunction(this.getSucessAnswer); this.Document.RegisterGlobalFunction(this.getQuesScore); } /// /// 获取试题的大项 /// /// private Song.Entities.TestPaperItem[] getTpi(Song.Entities.TestPaper tp) { Song.Entities.TestPaperItem[] tpi = Business.Do().GetItemForAny(tp); List list = new List(); XmlNodeList quesNodes = resXml.LastChild.ChildNodes; //当前答案中的试题分类项 foreach (Song.Entities.TestPaperItem t in tpi) { for (int i = 0; i < quesNodes.Count; i++) { int type = Convert.ToInt32(quesNodes[i].Attributes["type"].Value); if (t.TPI_Type == type) { list.Add(t); break; } } } return list.ToArray(); } #region 计算详细得分的方法 /// /// 获取类型名 /// /// /// private string getTypeName(object[] id) { int type = 0; if (id.Length > 0 && id[0] is int) type = Convert.ToInt32(id[0]); return WeiSha.Common.App.Get["QuesType"].Split(',')[type-1]; } /// /// 该类型得分 /// /// /// private string getTypeNumber(object[] id) { int type = 0; if (id.Length > 0 && id[0] is int) type = Convert.ToInt32(id[0]); XmlNode root = resXml.LastChild; XmlNodeList quesNodes = root.ChildNodes; double score = 0; for (int i = 0; i < quesNodes.Count; i++) { int tp = Convert.ToInt32(quesNodes[i].Attributes["type"].Value); if (tp == type) { //小题的节点 XmlNodeList qnode = quesNodes[i].ChildNodes; for (int j = 0; j < qnode.Count; j++) { bool isSuccess = false; bool.TryParse(qnode[j].Attributes["sucess"].Value, out isSuccess); if (isSuccess) { double num = 0; double.TryParse(qnode[j].Attributes["score"].Value, out num); score += num; } } } } return score.ToString(); } /// /// 答题数 /// /// /// private string getAnswerCount(object[] id) { int type = 0; if (id.Length > 0 && id[0] is int) type = Convert.ToInt32(id[0]); XmlNode root = resXml.LastChild; XmlNodeList quesNodes = root.ChildNodes; int count = 0; for (int i = 0; i < quesNodes.Count; i++) { int tp = Convert.ToInt32(quesNodes[i].Attributes["type"].Value); if (tp == type) { //小题的节点 XmlNodeList qnode = quesNodes[i].ChildNodes; for (int j = 0; j < qnode.Count; j++) { string ans=""; ans = type == 1 || type == 2 || type == 3 ? qnode[j].Attributes["ans"].Value : qnode[j].InnerText; ans = ans.Replace(",",""); if (!(string.IsNullOrWhiteSpace(ans) || ans == "" || ans == "")) count++; } } } return count.ToString(); } /// /// 答对的数目 /// /// /// private string getSucessCount(object[] id) { int type = 0; if (id.Length > 0 && id[0] is int) type = Convert.ToInt32(id[0]); XmlNode root = resXml.LastChild; XmlNodeList quesNodes = root.ChildNodes; int count = 0; for (int i = 0; i < quesNodes.Count; i++) { int tp = Convert.ToInt32(quesNodes[i].Attributes["type"].Value); if (tp == type) { //小题的节点 XmlNodeList qnode = quesNodes[i].ChildNodes; for (int j = 0; j < qnode.Count; j++) { string sucess = qnode[j].Attributes["sucess"].Value; if (sucess=="true") count++; } } } return count.ToString(); } /// /// 答错的数目 /// /// /// private string getErrorCount(object[] id) { int type = 0; if (id.Length > 0 && id[0] is int) type = Convert.ToInt32(id[0]); XmlNode root = resXml.LastChild; XmlNodeList quesNodes = root.ChildNodes; int count = 0; for (int i = 0; i < quesNodes.Count; i++) { int tp = Convert.ToInt32(quesNodes[i].Attributes["type"].Value); if (tp == type) { //小题的节点 XmlNodeList qnode = quesNodes[i].ChildNodes; for (int j = 0; j < qnode.Count; j++) { string sucess = qnode[j].Attributes["sucess"].Value; if (sucess == "false") count++; } } } return count.ToString(); } #endregion #region 展示试题的方法 /// /// 返回当前大题下的试题 /// /// 试题分类 /// private List getQues(object[] id) { int type = 0; if (id.Length > 0 && id[0] is int) type = Convert.ToInt32(id[0]); List list = new List(); XmlNode root = resXml.LastChild; XmlNodeList quesNodes = root.ChildNodes; for (int i = 0; i < quesNodes.Count; i++) { int tp = Convert.ToInt32(quesNodes[i].Attributes["type"].Value); if (tp == type) { //小题的节点 XmlNodeList qnode = quesNodes[i].ChildNodes; for (int j = 0; j < qnode.Count; j++) { int qid = Convert.ToInt32(qnode[j].Attributes["id"].Value); Song.Entities.Questions ques = Business.Do().QuesSingle(qid); if (ques != null) { ques = Extend.Questions.TranText(ques); ques.Qus_Title = Extend.Html.ClearHTML(ques.Qus_Title, "pre", "p"); ques.Qus_Explain = Extend.Html.ClearHTML(ques.Qus_Explain, "pre", "p"); list.Add(ques); } } } } return list; } /// /// 获取试题的答案选项 /// /// uid /// private List getItems(object[] p) { Song.Entities.Questions qus = null; if (p.Length > 0) qus = (Song.Entities.Questions)p[0]; //当前试题的答案 Song.Entities.QuesAnswer[] ans = Business.Do().QuestionsAnswer(qus, null); List list = new List(); for (int i = 0; i < ans.Length; i++) { ans[i] = Extend.Questions.TranText(ans[i]); list.Add(ans[i]); } return list; } #endregion #region 计算 /// /// 计算答题状态,0为正确,1为错误,2为未答题 /// /// /// private string getAnswerState(object[] obj) { string id = ""; if (obj.Length > 0 && obj[0] is int) id = obj[0].ToString(); XmlNode root = resXml.LastChild; XmlNodeList xnl = ((XmlElement)root).GetElementsByTagName("q"); int state = 2; foreach (XmlNode q in xnl) { string qid = q.Attributes["id"].Value; if (qid == id) { int type = Convert.ToInt32(q.ParentNode.Attributes["type"].Value); bool sucess = false; bool.TryParse(q.Attributes["sucess"].Value, out sucess); if (sucess) { state = 0; } else { string ans = ""; //如果是填空与简答 if (type == 4 || type == 5) { ans = q.InnerText; } else { ans = q.Attributes["ans"].Value; } ans = ans.Replace(",", ""); if (!string.IsNullOrWhiteSpace(ans)) state = 1; } break; } } return state.ToString(); } /// /// 获取用户答题信息 /// /// /// private string getResult(object[] obj) { string id = ""; if (obj.Length > 0 && obj[0] is int) id = obj[0].ToString(); XmlNode root = resXml.LastChild; XmlNodeList xnl = ((XmlElement)root).GetElementsByTagName("q"); string ans = ""; foreach (XmlNode q in xnl) { string qid = q.Attributes["id"].Value; if (qid == id) { int type = Convert.ToInt32(q.ParentNode.Attributes["type"].Value); //如果是填空与简答 if (type == 4 || type == 5) ans = q.InnerText; else ans = q.Attributes["ans"].Value; break; } } string[] tm = ans.Split(','); ans = ""; for (int i = 0; i < tm.Length; i++) { if (tm[i].Trim() == "") continue; ans += tm[i] + "、"; } if (ans.IndexOf("、") > -1 && ans.Substring(ans.Length - 1) == "、") { ans = ans.Substring(0, ans.Length - 1); } return ans; } /// /// 获取试题的得分 /// /// /// private string getQuesScore(object[] obj) { string id = ""; if (obj.Length > 0 && obj[0] is int) id = obj[0].ToString(); XmlNode root = resXml.LastChild; XmlNodeList xnl = ((XmlElement)root).GetElementsByTagName("q"); double score = 0; foreach (XmlNode q in xnl) { string qid = q.Attributes["id"].Value; if (qid == id) { if (q.Attributes["score"] != null) double.TryParse(q.Attributes["score"].Value, out score); break; } } return score.ToString(); } /// /// 试题的答案 /// /// /// protected string getSucessAnswer(object[] obj) { Song.Entities.Questions qus = (Song.Entities.Questions)obj[0]; if (qus == null) return ""; string ansStr = ""; if (qus.Qus_Type == 1) { //当前试题的答案 Song.Entities.QuesAnswer[] ans = Business.Do().QuestionsAnswer(qus, null); for (int i = 0; i < ans.Length; i++) { if (ans[i].Ans_IsCorrect) ansStr += (char)(65 + i); } } if (qus.Qus_Type == 2) { Song.Entities.QuesAnswer[] ans = Business.Do().QuestionsAnswer(qus, null); for (int i = 0; i < ans.Length; i++) { if (ans[i].Ans_IsCorrect) ansStr += (char)(65 + i) + "、"; } ansStr = ansStr.Substring(0, ansStr.LastIndexOf("、")); } if (qus.Qus_Type == 3) ansStr = qus.Qus_IsCorrect ? "正确" : "错误"; if (qus.Qus_Type == 4) { if (qus != null && !string.IsNullOrEmpty(qus.Qus_Answer)) ansStr = qus.Qus_Answer; } if (qus.Qus_Type == 5) { //当前试题的答案 Song.Entities.QuesAnswer[] ans = Business.Do().QuestionsAnswer(qus, null); for (int i = 0; i < ans.Length; i++) ansStr += (char)(65 + i) + "、" + ans[i].Ans_Context + "  "; } return ansStr; } #endregion } }