public void SaveConfiguration(IEnumerable<ConfigurationRecord> configurations) { MultiThreadWorker<ConfigurationRecord> worker = new MultiThreadWorker<ConfigurationRecord>(); worker.MaxThreads = 3; worker.PackageSize = 20; worker.PackageWorker += delegate(object sender, PackageWorkEventArgs<ConfigurationRecord> e) { DSXmlHelper insert = new DSXmlHelper("Request"); DSXmlHelper update = new DSXmlHelper("Request"); DSXmlHelper delete = new DSXmlHelper("Request"); bool insert_exec = false, update_exec = false, delete_exec = false; foreach (ConfigurationRecord eachConf in e.List) { if (eachConf.EditAction == 1) //新增 { insert.AddElement("Configuration"); insert.AddElement("Configuration", "Name", eachConf.Namespace); insert.AddElement("Configuration", "Content", eachConf.GetXml(), true); insert_exec = true; } else if (eachConf.EditAction == 2) //修改 { update.AddElement("Configuration"); update.AddElement("Configuration", "Content", eachConf.GetXml(), true); update.AddElement("Configuration", "Condition"); update.AddElement("Configuration/Condition", "Name", eachConf.Namespace); update_exec = true; } else if (eachConf.EditAction == 3) //刪除 { delete.AddElement("Configuration"); delete.AddElement("Configuration", "Name", eachConf.Namespace); delete_exec = true; } else throw new ArgumentException("沒有這一種的啦。"); } if (insert_exec) DSAServices.CallService("SmartSchool.Configuration.Insert", new DSRequest(insert)); if (update_exec) DSAServices.CallService("SmartSchool.Configuration.Update", new DSRequest(update)); if (delete_exec) DSAServices.CallService("SmartSchool.Configuration.Delete", new DSRequest(delete)); }; List<PackageWorkEventArgs<ConfigurationRecord>> results = worker.Run(configurations); foreach (PackageWorkEventArgs<ConfigurationRecord> each in results) if (each.HasException) throw each.Exception; }
public static void SaveClassRecordEditor(IEnumerable<ClassRecordEditor> editors) { MultiThreadWorker<ClassRecordEditor> worker = new MultiThreadWorker<ClassRecordEditor>(); worker.MaxThreads = 3; worker.PackageSize = 100; worker.PackageWorker += delegate(object sender, PackageWorkEventArgs<ClassRecordEditor> e) { DSXmlHelper updateHelper = new DSXmlHelper("Request"); DSXmlHelper insertHelper = new DSXmlHelper("Request"); DSXmlHelper deleteHelper = new DSXmlHelper("Request"); List<string> synclist = new List<string>(); bool hasUpdate = false, hasInsert = false, hasDelete = false; foreach (var editor in e.List) { #region 更新 if (editor.EditorStatus == SchoolCore.Editor.EditorStatus.Update) { updateHelper.AddElement("Class"); updateHelper.AddElement("Class", "Field"); updateHelper.AddElement("Class/Field", "ClassName", editor.Name); updateHelper.AddElement("Class/Field", "NamingRule", editor.NamingRule); updateHelper.AddElement("Class/Field", "GradeYear", editor.GradeYear); updateHelper.AddElement("Class/Field", "RefDepartmentID", editor.RefDepartmentID); updateHelper.AddElement("Class/Field", "RefGraduationPlanID", editor.RefProgramPlanID); updateHelper.AddElement("Class/Field", "RefScoreCalcRuleID", editor.RefScoreCalcRuleID); updateHelper.AddElement("Class/Field", "RefTeacherID", editor.RefTeacherID); updateHelper.AddElement("Class/Field", "DisplayOrder", editor.DisplayOrder); updateHelper.AddElement("Class", "Condition"); updateHelper.AddElement("Class/Condition", "ID", editor.ID); hasUpdate = true; synclist.Add(editor.ID); } #endregion #region 新增 if (editor.EditorStatus == SchoolCore.Editor.EditorStatus.Insert) { insertHelper.AddElement("Class"); insertHelper.AddElement("Class", "Field"); insertHelper.AddElement("Class/Field", "ClassName", editor.Name); insertHelper.AddElement("Class/Field", "NamingRule", editor.NamingRule); insertHelper.AddElement("Class/Field", "GradeYear", editor.GradeYear); insertHelper.AddElement("Class/Field", "RefDepartmentID", editor.RefDepartmentID); insertHelper.AddElement("Class/Field", "RefGraduationPlanID", editor.RefProgramPlanID); insertHelper.AddElement("Class/Field", "RefScoreCalcRuleID", editor.RefScoreCalcRuleID); insertHelper.AddElement("Class/Field", "RefTeacherID", editor.RefTeacherID); insertHelper.AddElement("Class/Field", "DisplayOrder", editor.DisplayOrder); hasInsert = true; } #endregion #region 刪除 if (editor.EditorStatus == SchoolCore.Editor.EditorStatus.Delete) { deleteHelper.AddElement("Class"); deleteHelper.AddElement("Class", "ID", editor.ID); hasDelete = true; synclist.Add(editor.ID); } #endregion } if (hasUpdate) DSAServices.CallService("SmartSchool.Class.Update", new DSRequest(updateHelper.BaseElement)); if (hasInsert) { DSXmlHelper response = DSAServices.CallService("SmartSchool.Class.Insert", new DSRequest(insertHelper.BaseElement)).GetContent(); foreach (XmlElement each in response.GetElements("NewID")) synclist.Add(each.InnerText); } if (hasDelete) DSAServices.CallService("SmartSchool.Class.Delete", new DSRequest(deleteHelper.BaseElement)); Class.Instance.SyncDataBackground(synclist); }; List<PackageWorkEventArgs<ClassRecordEditor>> packages = worker.Run(editors); foreach (PackageWorkEventArgs<ClassRecordEditor> each in packages) { if (each.HasException) throw each.Exception; } }
public static void SaveAEIncludeRecordEditor(IEnumerable <AEIncludeRecordEditor> editors) { MultiThreadWorker <AEIncludeRecordEditor> worker = new MultiThreadWorker <AEIncludeRecordEditor>(); worker.MaxThreads = 3; worker.PackageSize = 100; worker.PackageWorker += delegate(object sender, PackageWorkEventArgs <AEIncludeRecordEditor> e) { DSXmlHelper insertHelper = new DSXmlHelper("InsertRequest"); DSXmlHelper updateHelper = new DSXmlHelper("UpdateRequest"); DSXmlHelper deleteHelper = new DSXmlHelper("DeleteRequest"); deleteHelper.AddElement("IncludeExam"); List <LogInfo> logs = new List <LogInfo>(); List <string> synclist = new List <string>(); bool hasInsert = false; bool hasUpdate = false; bool hasRemove = false; foreach (var editor in e.List) { if (editor.EditorStatus != JHSchool.Editor.EditorStatus.NoChanged) { if (!string.IsNullOrEmpty(editor.ID)) { synclist.Add(editor.ID); } } if (editor.EditorStatus == JHSchool.Editor.EditorStatus.Insert) { insertHelper.AddElement("IncludeExam"); insertHelper.AddElement("IncludeExam", "RefExamTemplateID", editor.RefAssessmentSetupID); insertHelper.AddElement("IncludeExam", "RefExamID", editor.RefExamID); insertHelper.AddElement("IncludeExam", "UseScore", editor.UseScore ? "是" : "否"); insertHelper.AddElement("IncludeExam", "Weight", "" + editor.Weight); insertHelper.AddElement("IncludeExam", "StartTime", editor.StartTime); insertHelper.AddElement("IncludeExam", "EndTime", editor.EndTime); insertHelper.AddElement("IncludeExam", "Extension"); insertHelper.AddElement("IncludeExam/Extension", "Extension"); insertHelper.AddElement("IncludeExam/Extension/Extension", "UseEffort", editor.UseEffort ? "是" : "否"); insertHelper.AddElement("IncludeExam/Extension/Extension", "UseText", editor.UseText ? "是" : "否"); #region 參考 //<InsertIncludeExamRequest> // <IncludeExam> // <RefExamTemplateID>integer</RefExamTemplateID> // <RefExamID>integer</RefExamID> // <UseScore>是否</UseScore> // <UseText>是否</UseText> // <Weight>integer</Weight> // <OpenTeacherAccess>是否</OpenTeacherAccess> // <StartTime>timestamp</StartTime> // <EndTime>timestamp</EndTime> // <InputRequired/> // </IncludeExam> //</InsertIncludeExamRequest> #endregion hasInsert = true; } if (editor.EditorStatus == JHSchool.Editor.EditorStatus.Update) { updateHelper.AddElement("IncludeExam"); updateHelper.AddElement("IncludeExam", "RefExamTemplateID", editor.RefAssessmentSetupID); updateHelper.AddElement("IncludeExam", "RefExamID", editor.RefExamID); updateHelper.AddElement("IncludeExam", "UseScore", editor.UseScore ? "是" : "否"); updateHelper.AddElement("IncludeExam", "Weight", "" + editor.Weight); updateHelper.AddElement("IncludeExam", "StartTime", editor.StartTime); updateHelper.AddElement("IncludeExam", "EndTime", editor.EndTime); updateHelper.AddElement("IncludeExam", "Extension"); updateHelper.AddElement("IncludeExam/Extension", "Extension"); updateHelper.AddElement("IncludeExam/Extension/Extension", "UseEffort", editor.UseEffort ? "是" : "否"); updateHelper.AddElement("IncludeExam/Extension/Extension", "UseText", editor.UseText ? "是" : "否"); updateHelper.AddElement("IncludeExam", "Condition"); updateHelper.AddElement("IncludeExam/Condition", "ID", editor.ID); #region 參考 //<UpdateIncludeExamRequest> // <IncludeExam> // <RefExamID>integer</RefExamID> // <RefExamTemplateID></RefExamTemplateID> // <UseScore>是否</UseScore> // <UseText>是否</UseText> // <Weight>integer</Weight> // <OpenTeacherAccess>是否</OpenTeacherAccess> // <StartTime>timestamp</StartTime> // <EndTime>timestamp</EndTime> // <Condition> // <ID>integer</ID> // </Condition> // <InputRequired/> // </IncludeExam> //</UpdateIncludeExamRequest> #endregion hasUpdate = true; } if (editor.EditorStatus == JHSchool.Editor.EditorStatus.Delete) { deleteHelper.AddElement("IncludeExam", "ID", editor.ID); hasRemove = true; } } if (hasInsert) { DSResponse resp = FISCA.Authentication.DSAServices.CallService("SmartSchool.ExamTemplate.InsertIncludeExam", new DSRequest(insertHelper.BaseElement)); foreach (var item in resp.GetContent().GetElements("NewID")) { synclist.Add(item.InnerText); } } if (hasUpdate) { FISCA.Authentication.DSAServices.CallService("SmartSchool.ExamTemplate.UpdateIncludeExam", new DSRequest(updateHelper.BaseElement)); } if (hasRemove) { FISCA.Authentication.DSAServices.CallService("SmartSchool.ExamTemplate.DeleteIncludeExam", new DSRequest(deleteHelper.BaseElement)); } if (synclist.Count > 0) { AEInclude.Instance.SyncData(synclist); } }; List <PackageWorkEventArgs <AEIncludeRecordEditor> > packages = worker.Run(editors); foreach (PackageWorkEventArgs <AEIncludeRecordEditor> each in packages) { if (each.HasException) { throw each.Exception; } } }
internal static void SaveStudentTagRecordEditor(IEnumerable <JHSchool.Editor.StudentTagRecordEditor> editors) { MultiThreadWorker <JHSchool.Editor.StudentTagRecordEditor> worker = new MultiThreadWorker <JHSchool.Editor.StudentTagRecordEditor>(); worker.MaxThreads = 3; worker.PackageSize = 100; worker.PackageWorker += delegate(object sender, PackageWorkEventArgs <JHSchool.Editor.StudentTagRecordEditor> e) { DSXmlHelper updateHelper = new DSXmlHelper("Request"); DSXmlHelper insertHelper = new DSXmlHelper("Request"); DSXmlHelper deleteHelper = new DSXmlHelper("Request"); List <string> synclist = new List <string>(); //這個目前沒作用 bool hasInsert = false, hasDelete = false; foreach (var editor in e.List) { #region 更新 if (editor.EditorStatus == JHSchool.Editor.EditorStatus.Update) { deleteHelper.AddElement("Tag"); deleteHelper.AddElement("Tag", "RefStudentID", editor.RefEntityID); deleteHelper.AddElement("Tag", "RefTagID", editor.RefTagID); hasDelete = true; synclist.Add(editor.RefEntityID); insertHelper.AddElement("Tag"); insertHelper.AddElement("Tag", "RefStudentID", editor.RefEntityID); insertHelper.AddElement("Tag", "RefTagID", editor.RefTagID); hasInsert = true; } #endregion #region 新增 if (editor.EditorStatus == JHSchool.Editor.EditorStatus.Insert) { insertHelper.AddElement("Tag"); insertHelper.AddElement("Tag", "RefStudentID", editor.RefEntityID); insertHelper.AddElement("Tag", "RefTagID", editor.RefTagID); hasInsert = true; } #endregion #region 刪除 if (editor.EditorStatus == JHSchool.Editor.EditorStatus.Delete) { deleteHelper.AddElement("Tag"); deleteHelper.AddElement("Tag", "RefStudentID", editor.RefEntityID); deleteHelper.AddElement("Tag", "RefTagID", editor.RefTagID); hasDelete = true; synclist.Add(editor.RefEntityID); } #endregion } if (hasInsert) { DSXmlHelper response = DSAServices.CallService("SmartSchool.Tag.AddStudentTag", new DSRequest(insertHelper.BaseElement)).GetContent(); foreach (XmlElement each in response.GetElements("NewID")) { synclist.Add(each.InnerText); } } if (hasDelete) { DSAServices.CallService("SmartSchool.Tag.RemoveStudentTag", new DSRequest(deleteHelper.BaseElement)); } }; List <PackageWorkEventArgs <JHSchool.Editor.StudentTagRecordEditor> > packages = worker.Run(editors); foreach (PackageWorkEventArgs <JHSchool.Editor.StudentTagRecordEditor> each in packages) { if (each.HasException) { throw each.Exception; } } }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { Dictionary <string, int> _ID_SchoolYear_Semester_GradeYear = new Dictionary <string, int>(); Dictionary <string, List <string> > _ID_SchoolYear_Semester_Subject = new Dictionary <string, List <string> >(); Dictionary <string, JHStudentRecord> _StudentCollection = new Dictionary <string, JHStudentRecord>(); Dictionary <JHStudentRecord, Dictionary <int, decimal> > _StudentPassScore = new Dictionary <JHStudentRecord, Dictionary <int, decimal> >(); Dictionary <string, List <JHSemesterScoreRecord> > semsDict = new Dictionary <string, List <JHSemesterScoreRecord> >(); wizard.PackageLimit = 3000; //wizard.ImportableFields.AddRange("領域", "科目", "學年度", "學期", "權數", "節數", "分數評量", "努力程度", "文字描述", "註記"); //wizard.ImportableFields.AddRange("領域", "科目", "學年度", "學期", "權數", "節數", "分數評量", "文字描述", "註記"); //2015.1.27 Cloud新增 //2017/6/16 穎驊新增,因應[02-02][06] 計算學期科目成績新增清空原成績模式 項目, 新增 "刪除"欄位,使使用者能匯入 刪除成績資料 wizard.ImportableFields.AddRange("領域", "科目", "學年度", "學期", "權數", "節數", "成績", "原始成績", "補考成績", "努力程度", "文字描述", "註記", "刪除"); wizard.RequiredFields.AddRange("領域", "科目", "學年度", "學期"); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { #region ValidateStart _ID_SchoolYear_Semester_GradeYear.Clear(); _ID_SchoolYear_Semester_Subject.Clear(); _StudentCollection.Clear(); List <JHStudentRecord> list = JHStudent.SelectByIDs(e.List); MultiThreadWorker <JHStudentRecord> loader = new MultiThreadWorker <JHStudentRecord>(); loader.MaxThreads = 3; loader.PackageSize = 250; loader.PackageWorker += delegate(object sender1, PackageWorkEventArgs <JHStudentRecord> e1) { foreach (var item in JHSemesterScore.SelectByStudents(e1.List)) { if (!semsDict.ContainsKey(item.RefStudentID)) { semsDict.Add(item.RefStudentID, new List <JHSchool.Data.JHSemesterScoreRecord>()); } semsDict[item.RefStudentID].Add(item); } }; loader.Run(list); foreach (JHStudentRecord stu in list) { if (!_StudentCollection.ContainsKey(stu.ID)) { _StudentCollection.Add(stu.ID, stu); } } #endregion }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { #region ValidateRow int t; decimal d; JHStudentRecord student; if (_StudentCollection.ContainsKey(e.Data.ID)) { student = _StudentCollection[e.Data.ID]; } else { e.ErrorMessage = "壓根就沒有這個學生" + e.Data.ID; return; } bool inputFormatPass = true; #region 驗各欄位填寫格式 foreach (string field in e.SelectFields) { string value = e.Data[field]; switch (field) { default: break; case "領域": //if (value == "") //{ // inputFormatPass &= false; // e.ErrorFields.Add(field, "必須填寫"); //} //else if (!Domains.Contains(value)) //{ // inputFormatPass &= false; // e.ErrorFields.Add(field, "必須為七大領域"); //} break; case "科目": if (value == "") { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填寫"); } break; case "學年度": if (value == "" || !int.TryParse(value, out t)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入學年度"); } break; case "權數": case "節數": if (value == "" || !decimal.TryParse(value, out d)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入數值"); } break; //case "成績年級": // if (value == "" || !int.TryParse(value, out t)) // { // inputFormatPass &= false; // e.ErrorFields.Add(field, "必須填入整數"); // } // break; case "學期": if (value == "" || !int.TryParse(value, out t) || t > 2 || t < 1) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入1或2"); } break; //case "分數評量": // if (value != "" && !decimal.TryParse(value, out d)) // { // inputFormatPass &= false; // e.ErrorFields.Add(field, "必須填入空白或數值"); // } // break; //2015.1.27 Cloud新增 case "成績": if (value != "" && !decimal.TryParse(value, out d)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入空白或數值"); } break; //2015.1.27 Cloud新增 case "原始成績": if (value != "" && !decimal.TryParse(value, out d)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入空白或數值"); } break; //2015.1.27 Cloud新增 case "補考成績": if (value != "" && !decimal.TryParse(value, out d)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入空白或數值"); } break; case "努力程度": if (value != "" && !int.TryParse(value, out t)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入空白或數值"); } break; case "刪除": if (value != "" && value != "是") { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入空白或 '是'"); } break; } } #endregion //輸入格式正確才會針對情節做檢驗 if (inputFormatPass) { string errorMessage = ""; string subject = e.Data["科目"]; string schoolYear = e.Data["學年度"]; string semester = e.Data["學期"]; int? sy = null; int? se = null; if (int.TryParse(schoolYear, out t)) { sy = t; } if (int.TryParse(semester, out t)) { se = t; } if (sy != null && se != null) { string key = e.Data.ID + "_" + sy + "_" + se; #region 驗證新增科目成績 List <JHSemesterScoreRecord> semsList; if (semsDict.ContainsKey(student.ID)) { semsList = semsDict[student.ID]; } else { semsList = new List <JHSemesterScoreRecord>(); } foreach (JHSemesterScoreRecord record in semsList) { if (record.SchoolYear != sy) { continue; } if (record.Semester != se) { continue; } bool isNewSubjectInfo = true; string message = ""; foreach (K12.Data.SubjectScore s in record.Subjects.Values) { if (s.Subject == subject) { isNewSubjectInfo = false; } } if (isNewSubjectInfo) { if (!e.WarningFields.ContainsKey("查無此科目")) { e.WarningFields.Add("查無此科目", "學生在此學期並無此筆科目成績資訊,將會新增此科目成績"); } foreach (string field in new string[] { "領域", "科目", "學年度", "學期", "權數", "節數" }) { if (!e.SelectFields.Contains(field)) { message += (message == "" ? "發現此學期無此科目,\n將會新增成績\n缺少成績必要欄位" : "、") + field; } } if (message != "") { errorMessage += (errorMessage == "" ? "" : "\n") + message; } } } #endregion #region 驗證重複科目資料 //string skey = subject + "_" + le; string skey = subject; if (!_ID_SchoolYear_Semester_Subject.ContainsKey(key)) { _ID_SchoolYear_Semester_Subject.Add(key, new List <string>()); } if (_ID_SchoolYear_Semester_Subject[key].Contains(skey)) { errorMessage += (errorMessage == "" ? "" : "\n") + "同一學期不允許多筆相同科目的資料"; } else { _ID_SchoolYear_Semester_Subject[key].Add(skey); } #endregion } e.ErrorMessage = errorMessage; } #endregion }; wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { #region ImportPackage Dictionary <string, List <RowData> > id_Rows = new Dictionary <string, List <RowData> >(); #region 分包裝 foreach (RowData data in e.Items) { if (!id_Rows.ContainsKey(data.ID)) { id_Rows.Add(data.ID, new List <RowData>()); } id_Rows[data.ID].Add(data); } #endregion List <JHSemesterScoreRecord> insertList = new List <JHSemesterScoreRecord>(); List <JHSemesterScoreRecord> updateList = new List <JHSemesterScoreRecord>(); //交叉比對各學生資料 #region 交叉比對各學生資料 foreach (string id in id_Rows.Keys) { XmlDocument doc = new XmlDocument(); JHStudentRecord studentRec = _StudentCollection[id]; //該學生的學期科目成績 Dictionary <SemesterInfo, JHSemesterScoreRecord> semesterScoreDictionary = new Dictionary <SemesterInfo, JHSemesterScoreRecord>(); #region 整理現有的成績資料 List <JHSchool.Data.JHSemesterScoreRecord> semsList; if (semsDict.ContainsKey(studentRec.ID)) { semsList = semsDict[studentRec.ID]; } else { semsList = new List <JHSchool.Data.JHSemesterScoreRecord>(); } foreach (JHSemesterScoreRecord var in semsList) { SemesterInfo info = new SemesterInfo(); info.SchoolYear = var.SchoolYear; info.Semester = var.Semester; if (!semesterScoreDictionary.ContainsKey(info)) { semesterScoreDictionary.Add(info, var); } //string key = var.Subject + "_" + var.Level; //if (!semesterScoreDictionary.ContainsKey(var.SchoolYear)) // semesterScoreDictionary.Add(var.SchoolYear, new Dictionary<int, Dictionary<string, SemesterSubjectScoreInfo>>()); //if (!semesterScoreDictionary[var.SchoolYear].ContainsKey(var.Semester)) // semesterScoreDictionary[var.SchoolYear].Add(var.Semester, new Dictionary<string, SemesterSubjectScoreInfo>()); //if (!semesterScoreDictionary[var.SchoolYear][var.Semester].ContainsKey(key)) // semesterScoreDictionary[var.SchoolYear][var.Semester].Add(key, var); } #endregion //要匯入的學期科目成績 Dictionary <SemesterInfo, Dictionary <string, RowData> > semesterImportScoreDictionary = new Dictionary <SemesterInfo, Dictionary <string, RowData> >(); #region 整理要匯入的資料 foreach (RowData row in id_Rows[id]) { string subject = row["科目"]; string schoolYear = row["學年度"]; string semester = row["學期"]; int sy = int.Parse(schoolYear); int se = int.Parse(semester); SemesterInfo info = new SemesterInfo(); info.SchoolYear = sy; info.Semester = se; if (!semesterImportScoreDictionary.ContainsKey(info)) { semesterImportScoreDictionary.Add(info, new Dictionary <string, RowData>()); } if (!semesterImportScoreDictionary[info].ContainsKey(subject)) { semesterImportScoreDictionary[info].Add(subject, row); } } #endregion //學期年級重整 //Dictionary<SemesterInfo, int> semesterGradeYear = new Dictionary<SemesterInfo, int>(); //要變更成績的學期 List <SemesterInfo> updatedSemester = new List <SemesterInfo>(); //在變更學期中新增加的成績資料 Dictionary <SemesterInfo, List <RowData> > updatedNewSemesterScore = new Dictionary <SemesterInfo, List <RowData> >(); //要增加成績的學期 Dictionary <SemesterInfo, List <RowData> > insertNewSemesterScore = new Dictionary <SemesterInfo, List <RowData> >(); //開始處理ImportScore #region 開始處理ImportScore foreach (SemesterInfo info in semesterImportScoreDictionary.Keys) { foreach (string subject in semesterImportScoreDictionary[info].Keys) { RowData data = semesterImportScoreDictionary[info][subject]; //如果是本來沒有這筆學期的成績就加到insertNewSemesterScore if (!semesterScoreDictionary.ContainsKey(info)) { if (!insertNewSemesterScore.ContainsKey(info)) { insertNewSemesterScore.Add(info, new List <RowData>()); } insertNewSemesterScore[info].Add(data); } else { bool hasChanged = false; //修改已存在的資料 if (semesterScoreDictionary[info].Subjects.ContainsKey(subject)) { JHSemesterScoreRecord record = semesterScoreDictionary[info]; #region 直接修改已存在的成績資料的Detail foreach (string field in e.ImportFields) { K12.Data.SubjectScore score = record.Subjects[subject]; string value = data[field]; //"分數評量", "努力程度", "文字描述", "註記" switch (field) { default: break; case "領域": if (score.Domain != value) { score.Domain = value; hasChanged = true; } break; case "權數": if ("" + score.Credit != value) { score.Credit = decimal.Parse(value); hasChanged = true; } break; case "節數": if ("" + score.Period != value) { score.Period = decimal.Parse(value); hasChanged = true; } break; //case "成績年級": // int gy = int.Parse(data["成績年級"]); // if (record.GradeYear != gy) // { // semesterGradeYear[info] = gy; // hasChanged = true; // } // break; //case "分數評量": // if ("" + score.Score != value) // { // decimal d; // if (decimal.TryParse(value, out d)) // score.Score = d; // else // score.Score = null; // hasChanged = true; // } // break; //2015.1.27 Cloud新增 case "成績": if ("" + score.Score != value) { decimal d; if (decimal.TryParse(value, out d)) { score.Score = d; } else { score.Score = null; } hasChanged = true; } break; //2015.1.27 Cloud新增 case "原始成績": if ("" + score.ScoreOrigin != value) { decimal d; if (decimal.TryParse(value, out d)) { score.ScoreOrigin = d; } else { score.ScoreOrigin = null; } hasChanged = true; } break; //2015.1.27 Cloud新增 case "補考成績": if ("" + score.ScoreMakeup != value) { decimal d; if (decimal.TryParse(value, out d)) { score.ScoreMakeup = d; } else { score.ScoreMakeup = null; } hasChanged = true; } break; case "努力程度": if ("" + score.Effort != value) { int i; if (int.TryParse(value, out i)) { score.Effort = i; } else { score.Effort = null; } hasChanged = true; } break; case "文字描述": if ("" + score.Text != value) { score.Text = value; hasChanged = true; } break; case "註記": if (score.Comment != value) { score.Comment = value; hasChanged = true; } break; case "刪除": if (value == "是") { record.Subjects.Remove(subject); hasChanged = true; } break; } } #endregion } else//加入新成績至已存在的學期 { if (!updatedNewSemesterScore.ContainsKey(info)) { updatedNewSemesterScore.Add(info, new List <RowData>()); } updatedNewSemesterScore[info].Add(data); hasChanged = true; } //真的有變更 if (hasChanged) { #region 登錄有變更的學期 if (!updatedSemester.Contains(info)) { updatedSemester.Add(info); } #endregion } } } } #endregion //處理已登錄要更新的學期成績 #region 處理已登錄要更新的學期成績 foreach (SemesterInfo info in updatedSemester) { //Dictionary<int, Dictionary<int, string>> semeScoreID = (Dictionary<int, Dictionary<int, string>>)studentRec.Fields["SemesterSubjectScoreID"]; //string semesterScoreID = semeScoreID[sy][se];//從學期抓ID //int gradeyear = semesterGradeYear[info];//抓年級 //XmlElement subjectScoreInfo = doc.CreateElement("SemesterSubjectScoreInfo"); #region 產生該學期科目成績的XML //foreach (SemesterSubjectScoreInfo scoreInfo in semesterScoreDictionary[sy][se].Values) //{ // subjectScoreInfo.AppendChild(doc.ImportNode(scoreInfo.Detail, true)); //} updateList.Add(semesterScoreDictionary[info]); //if (updatedNewSemesterScore.ContainsKey(sy) && updatedNewSemesterScore[sy].ContainsKey(se)) if (updatedNewSemesterScore.ContainsKey(info)) { foreach (RowData row in updatedNewSemesterScore[info]) { //XmlElement newScore = doc.CreateElement("Subject"); K12.Data.SubjectScore subjectScore = new K12.Data.SubjectScore(); bool contain_deleted_words = false; #region 建立newScore //foreach (string field in new string[] { "領域", "科目", "權數", "節數", "分數評量", "努力程度", "文字描述", "註記" }) foreach (string field in new string[] { "領域", "科目", "權數", "節數", "成績", "原始成績", "補考成績", "努力程度", "文字描述", "註記", "刪除" }) { if (e.ImportFields.Contains(field)) { decimal d; #region 填入科目資訊 string value = row[field]; switch (field) { default: break; case "領域": subjectScore.Domain = value; break; case "科目": subjectScore.Subject = value; break; case "權數": subjectScore.Credit = decimal.Parse(value); break; case "節數": subjectScore.Period = decimal.Parse(value); break; //case "分數評量": // decimal d; // if (decimal.TryParse(value, out d)) // subjectScore.Score = d; // else // subjectScore.Score = null; // break; //2015.1.27 Cloud新增 case "成績": if (decimal.TryParse(value, out d)) { subjectScore.Score = d; } else { subjectScore.Score = null; } break; //2015.1.27 Cloud新增 case "原始成績": if (decimal.TryParse(value, out d)) { subjectScore.ScoreOrigin = d; } else { subjectScore.ScoreOrigin = null; } break; //2015.1.27 Cloud新增 case "補考成績": if (decimal.TryParse(value, out d)) { subjectScore.ScoreMakeup = d; } else { subjectScore.ScoreMakeup = null; } break; case "努力程度": int i; if (int.TryParse(value, out i)) { subjectScore.Effort = i; } else { subjectScore.Effort = null; } break; case "文字描述": subjectScore.Text = value; break; case "註記": subjectScore.Comment = value; break; case "刪除": if (value == "是") { contain_deleted_words = true; } break; } #endregion } } #endregion //subjectScoreInfo.AppendChild(newScore); if (!contain_deleted_words) { JHSemesterScoreRecord record = semesterScoreDictionary[info]; if (!record.Subjects.ContainsKey(subjectScore.Subject)) { record.Subjects.Add(subjectScore.Subject, subjectScore); } else { record.Subjects[subjectScore.Subject] = subjectScore; } updateList.Add(record); } } } #endregion //updateList.Add(new SmartSchool.Feature.Score.EditScore.UpdateInfo(semesterScoreID, gradeyear, subjectScoreInfo)); } #endregion //處理新增成績學期 #region 處理新增成績學期 foreach (SemesterInfo info in insertNewSemesterScore.Keys) { //int gradeyear = semesterGradeYear[info];//抓年級 foreach (RowData row in insertNewSemesterScore[info]) { K12.Data.SubjectScore subjectScore = new K12.Data.SubjectScore(); bool contain_deleted_words = false; //foreach (string field in new string[] { "領域", "科目", "權數", "節數", "分數評量", "努力程度", "文字描述", "註記" }) foreach (string field in new string[] { "領域", "科目", "權數", "節數", "成績", "原始成績", "補考成績", "努力程度", "文字描述", "註記", "刪除" }) { if (e.ImportFields.Contains(field)) { decimal d; string value = row[field]; switch (field) { default: break; case "領域": subjectScore.Domain = value; break; case "科目": subjectScore.Subject = value; break; case "權數": subjectScore.Credit = decimal.Parse(value); break; case "節數": subjectScore.Period = decimal.Parse(value); break; //case "分數評量": // decimal d; // if (decimal.TryParse(value, out d)) // subjectScore.Score = d; // else // subjectScore.Score = null; // break; //2015.1.27 Cloud新增 case "成績": if (decimal.TryParse(value, out d)) { subjectScore.Score = d; } else { subjectScore.Score = null; } break; //2015.1.27 Cloud新增 case "原始成績": if (decimal.TryParse(value, out d)) { subjectScore.ScoreOrigin = d; } else { subjectScore.ScoreOrigin = null; } break; //2015.1.27 Cloud新增 case "補考成績": if (decimal.TryParse(value, out d)) { subjectScore.ScoreMakeup = d; } else { subjectScore.ScoreMakeup = null; } break; case "努力程度": int i; if (int.TryParse(value, out i)) { subjectScore.Effort = i; } else { subjectScore.Effort = null; } break; case "文字描述": subjectScore.Text = value; break; case "註記": subjectScore.Comment = value; break; case "刪除": if (value == "是") { contain_deleted_words = true; } break; } } } //subjectScoreInfo.AppendChild(newScore); JHSemesterScoreRecord record = new JHSemesterScoreRecord(); record.SchoolYear = info.SchoolYear; record.Semester = info.Semester; record.RefStudentID = studentRec.ID; //record.GradeYear = gradeyear; if (!record.Subjects.ContainsKey(subjectScore.Subject)) { record.Subjects.Add(subjectScore.Subject, subjectScore); } else { record.Subjects[subjectScore.Subject] = subjectScore; } if (!contain_deleted_words) { insertList.Add(record); } } //insertList.Add(new SmartSchool.Feature.Score.AddScore.InsertInfo(studentRec.StudentID, "" + sy, "" + se, gradeyear, "", subjectScoreInfo)); } #endregion } #endregion Dictionary <string, JHSemesterScoreRecord> iList = new Dictionary <string, JHSemesterScoreRecord>(); Dictionary <string, JHSemesterScoreRecord> uList = new Dictionary <string, JHSemesterScoreRecord>(); foreach (var record in insertList) { string key = record.RefStudentID + "_" + record.SchoolYear + "_" + record.Semester; if (!iList.ContainsKey(key)) { iList.Add(key, new JHSemesterScoreRecord()); } JHSemesterScoreRecord newRecord = iList[key]; newRecord.RefStudentID = record.RefStudentID; newRecord.SchoolYear = record.SchoolYear; newRecord.Semester = record.Semester; foreach (var subject in record.Subjects.Keys) { if (!newRecord.Subjects.ContainsKey(subject)) { newRecord.Subjects.Add(subject, record.Subjects[subject]); } if (newRecord.Subjects[subject].Text != null) { if (newRecord.Subjects[subject].Text.Contains("\b")) { newRecord.Subjects[subject].Text = newRecord.Subjects[subject].Text.Replace("\b", ""); } } } } foreach (var record in updateList) { string key = record.RefStudentID + "_" + record.SchoolYear + "_" + record.Semester; if (!uList.ContainsKey(key)) { uList.Add(key, record); } JHSemesterScoreRecord newRecord = uList[key]; newRecord.RefStudentID = record.RefStudentID; newRecord.SchoolYear = record.SchoolYear; newRecord.Semester = record.Semester; newRecord.ID = record.ID; foreach (var subject in record.Subjects.Keys) { if (!newRecord.Subjects.ContainsKey(subject)) { newRecord.Subjects.Add(subject, record.Subjects[subject]); } if (newRecord.Subjects[subject].Text != null) { if (newRecord.Subjects[subject].Text.Contains("\b")) { newRecord.Subjects[subject].Text = newRecord.Subjects[subject].Text.Replace("\b", ""); } } } } List <string> ids = new List <string>(id_Rows.Keys); Dictionary <string, JHSemesterScoreRecord> origs = new Dictionary <string, JHSemesterScoreRecord>(); foreach (var record in JHSemesterScore.SelectByStudentIDs(ids)) { if (!origs.ContainsKey(record.ID)) { origs.Add(record.ID, record); } } foreach (var record in uList.Values) { if (origs.ContainsKey(record.ID)) { foreach (var domain in origs[record.ID].Domains.Keys) { if (!record.Domains.ContainsKey(domain)) { record.Domains.Add(domain, origs[record.ID].Domains[domain]); } } } } //FunctionSpliter<JHSemesterScoreRecord, int> splitInsert = new FunctionSpliter<JHSemesterScoreRecord, int>(200, 3); //splitInsert.Function = delegate(List<JHSemesterScoreRecord> part) //{ // JHSemesterScore.Insert(part); // return null; //}; //splitInsert.Execute(new List<JHSemesterScoreRecord>(iList.Values)); //FunctionSpliter<JHSemesterScoreRecord, int> splitUpdate= new FunctionSpliter<JHSemesterScoreRecord, int>(200, 3); //splitUpdate.Function = delegate(List<JHSemesterScoreRecord> part) //{ // JHSemesterScore.Update(part); // return null; //}; //splitUpdate.Execute(new List<JHSemesterScoreRecord>(uList.Values)); JHSemesterScore.Insert(iList.Values); JHSemesterScore.Update(uList.Values); FISCA.LogAgent.ApplicationLog.Log("成績系統.匯入匯出", "匯入學期科目成績", "總共匯入" + (insertList.Count + updateList.Count) + "筆學期科目成績。"); #endregion }; wizard.ImportComplete += delegate { MsgBox.Show("匯入完成"); }; }
void bkwLoader_DoWork(object sender, DoWorkEventArgs e) { ManualResetEvent _waitInit = (ManualResetEvent)e.Argument; #region 取得選取學生修課 //儲存選取班級中包含學生的修課資料 List<CourseRecord> courseRecs = new List<CourseRecord>(); List<StudentRecord> students = new List<StudentRecord>(); selectedClasses.AddRange(accessHelper.ClassHelper.GetSelectedClass()); foreach (ClassRecord c in selectedClasses) { foreach (StudentRecord s in c.Students) { if (!students.Contains(s)) students.Add(s); } } MultiThreadWorker<StudentRecord> courseLoader = new MultiThreadWorker<StudentRecord>(); courseLoader.MaxThreads = 3; courseLoader.PackageSize = 125; courseLoader.PackageWorker += new EventHandler<PackageWorkEventArgs<StudentRecord>>(courseLoader_PackageWorker); courseLoader.Run(students, courseRecs); #endregion #region 取得課程考試 MultiThreadWorker<CourseRecord> examLoader = new MultiThreadWorker<CourseRecord>(); examLoader.MaxThreads = 2; examLoader.PackageSize = 200; examLoader.PackageWorker += new EventHandler<PackageWorkEventArgs<CourseRecord>>(examLoader_PackageWorker); examLoader.Run(courseRecs); #endregion #region 整理試別 List<string> exams = new List<string>(); foreach (CourseRecord c in courseRecs) { for (int i = 0; i < c.ExamList.Count; i++) { if (!exams.Contains(c.ExamList[i])) { exams.Add(c.ExamList[i]); } } } exams.Sort(); #endregion e.Result = exams; //等變綠燈才可以繼續 _waitInit.WaitOne(); }
void _uploadingWorker4_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bkw = ((BackgroundWorker)sender); Dictionary <int, List <int> > insertTags = (Dictionary <int, List <int> >)((object[])e.Argument)[0]; Dictionary <int, List <int> > removeTags = (Dictionary <int, List <int> >)((object[])e.Argument)[1]; List <DSRequest> updateRequests = (List <DSRequest>)((object[])e.Argument)[2]; List <StudentRecord> selectedStudents = (List <StudentRecord>)((object[])e.Argument)[3]; double maxPackage = insertTags.Count + removeTags.Count; if (maxPackage == 0) { maxPackage = 1; } double processedPackage = 0; bkw.ReportProgress(1, null); List <string> updatedList = new List <string>(); foreach (int tagid in removeTags.Keys) { if (removeTags[tagid].Count == 0) { continue; } foreach (int id in removeTags[tagid]) { if (!updatedList.Contains("" + id)) { updatedList.Add("" + id); } } SmartSchool.Feature.Tag.EditStudentTag.Remove(removeTags[tagid], tagid); processedPackage++; bkw.ReportProgress((int)((processedPackage * 100.0) / maxPackage)); } MultiThreadWorker <DSRequest> multiThreadUpdater = new MultiThreadWorker <DSRequest>(); multiThreadUpdater.MaxThreads = 2; multiThreadUpdater.PackageSize = 150; multiThreadUpdater.PackageWorker += new EventHandler <PackageWorkEventArgs <DSRequest> >(multiThreadUpdater_PackageWorker); multiThreadUpdater.Run(updateRequests); foreach (int tagid in insertTags.Keys) { if (insertTags[tagid].Count == 0) { continue; } foreach (int id in insertTags[tagid]) { if (!updatedList.Contains("" + id)) { updatedList.Add("" + id); } } SmartSchool.Feature.Tag.EditStudentTag.Add(insertTags[tagid], tagid); processedPackage++; bkw.ReportProgress((int)((processedPackage * 100.0) / maxPackage)); } e.Result = new object[] { updatedList }; }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { //學生資訊 key: studentID Dictionary <string, JHStudentRecord> students = new Dictionary <string, JHSchool.Data.JHStudentRecord>(); //學生修課資訊 studentID -> List:SCAttendRecord Dictionary <string, List <JHSCAttendRecord> > scattends = new Dictionary <string, List <JHSchool.Data.JHSCAttendRecord> >(); //學生修習的課程 courseID -> CourseRecord Dictionary <string, JHCourseRecord> courses = new Dictionary <string, JHSchool.Data.JHCourseRecord>(); //所有課程(依學年度學期分開) schoolYear_semester -> (courseName -> CourseRecord) Dictionary <string, Dictionary <string, JHCourseRecord> > allcourses = new Dictionary <string, Dictionary <string, JHSchool.Data.JHCourseRecord> >(); //學生修習的課程對應的評量設定細節 Dictionary <string, List <HC.JHAEIncludeRecord> > courseAe = new Dictionary <string, List <HC.JHAEIncludeRecord> >(); //學生的評量成績記錄 Dictionary <string, List <HC.JHSCETakeRecord> > existSces = new Dictionary <string, List <HC.JHSCETakeRecord> >(); //所有試別 Dictionary <string, JHExamRecord> exams = new Dictionary <string, JHSchool.Data.JHExamRecord>(); //評量成績缺考暨免試設定 PluginMain.ScoreTextMap.Clear(); PluginMain.ScoreValueMap.Clear(); wizard.PackageLimit = 3000; wizard.ImportableFields.AddRange("學年度", "學期", "課程名稱", "評量名稱", "定期分數", "平時分數", "文字描述"); wizard.RequiredFields.AddRange("學年度", "學期", "課程名稱", "評量名稱"); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { #region 取得學生資訊 foreach (JHStudentRecord stu in JHStudent.SelectByIDs(e.List)) { if (!students.ContainsKey(stu.ID)) { students.Add(stu.ID, stu); } } #endregion #region 取得修課記錄 MultiThreadWorker <string> loader1 = new MultiThreadWorker <string>(); loader1.MaxThreads = 3; loader1.PackageSize = 250; loader1.PackageWorker += delegate(object sender1, PackageWorkEventArgs <string> e1) { foreach (JHSCAttendRecord record in JHSCAttend.SelectByStudentIDAndCourseID(e1.List, new string[] { })) { if (!scattends.ContainsKey(record.RefStudentID)) { scattends.Add(record.RefStudentID, new List <JHSCAttendRecord>()); } scattends[record.RefStudentID].Add(record); if (!courses.ContainsKey(record.RefCourseID)) { courses.Add(record.RefCourseID, null); } } }; loader1.Run(e.List); #endregion #region 取得課程資訊 MultiThreadWorker <string> loader2 = new MultiThreadWorker <string>(); loader2.MaxThreads = 3; loader2.PackageSize = 250; loader2.PackageWorker += delegate(object sender2, PackageWorkEventArgs <string> e2) { foreach (JHCourseRecord record in JHCourse.SelectByIDs(new List <string>(e2.List))) { if (courses.ContainsKey(record.ID)) { courses[record.ID] = record; } } }; loader2.Run(courses.Keys); foreach (JHCourseRecord course in JHCourse.SelectAll()) { string key = course.SchoolYear + "_" + course.Semester; if (!allcourses.ContainsKey(key)) { allcourses.Add(key, new Dictionary <string, JHCourseRecord>()); } if (!allcourses[key].ContainsKey(course.Name)) { allcourses[key].Add(course.Name, course); } } #endregion #region 取得目前評量成績記錄 MultiThreadWorker <string> loader3 = new MultiThreadWorker <string>(); loader3.MaxThreads = 3; loader3.PackageSize = 250; loader3.PackageWorker += delegate(object sender3, PackageWorkEventArgs <string> e3) { foreach (HC.JHSCETakeRecord sce in JHSCETake.SelectByStudentIDs(e3.List).AsHCJHSCETakeRecords()) { if (!existSces.ContainsKey(sce.RefSCAttendID)) { existSces.Add(sce.RefSCAttendID, new List <HC.JHSCETakeRecord>()); } existSces[sce.RefSCAttendID].Add(sce); } }; loader3.Run(e.List); #endregion #region 取得評量設定 foreach (HC.JHAEIncludeRecord ae in JHAEInclude.SelectAll().AsHCJHAEIncludeRecords()) { if (!courseAe.ContainsKey(ae.RefAssessmentSetupID)) { courseAe.Add(ae.RefAssessmentSetupID, new List <HC.JHAEIncludeRecord>()); } courseAe[ae.RefAssessmentSetupID].Add(ae); } #endregion #region 取得試別 foreach (JHExamRecord exam in JHExam.SelectAll()) { if (!exams.ContainsKey(exam.ID)) { exams.Add(exam.ID, exam); } } #endregion #region 取得評量成績缺考暨免試設定 Framework.ConfigData cd = JHSchool.School.Configuration["評量成績缺考暨免試設定"]; if (!string.IsNullOrEmpty(cd["評量成績缺考暨免試設定"])) { XmlElement element = Framework.XmlHelper.LoadXml(cd["評量成績缺考暨免試設定"]); foreach (XmlElement each in element.SelectNodes("Setting")) { var UseText = each.SelectSingleNode("UseText").InnerText; var AllowCalculation = bool.Parse(each.SelectSingleNode("AllowCalculation").InnerText); decimal Score; decimal.TryParse(each.SelectSingleNode("Score").InnerText, out Score); var Active = bool.Parse(each.SelectSingleNode("Active").InnerText); var UseValue = decimal.Parse(each.SelectSingleNode("UseValue").InnerText); if (Active) { if (!PluginMain.ScoreTextMap.ContainsKey(UseText)) { PluginMain.ScoreTextMap.Add(UseText, new ScoreMap { UseText = UseText, AllowCalculation = AllowCalculation, Score = Score, Active = Active, UseValue = UseValue, }); } if (!PluginMain.ScoreValueMap.ContainsKey(UseValue)) { PluginMain.ScoreValueMap.Add(UseValue, new ScoreMap { UseText = UseText, AllowCalculation = AllowCalculation, Score = Score, Active = Active, UseValue = UseValue, }); } } } } #endregion }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { int i; decimal d; #region 檢查學生是否存在 JHStudentRecord student = null; if (students.ContainsKey(e.Data.ID)) { student = students[e.Data.ID]; } else { e.ErrorMessage = "壓根就沒有這個學生" + e.Data.ID; return; } #endregion #region 驗證各個欄位格式 bool inputFormatPass = true; foreach (string field in e.SelectFields) { string value = e.Data[field]; switch (field) { default: break; case "學年度": case "學期": if (value == "" || !int.TryParse(value, out i)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入整數"); } break; case "課程名稱": if (value == "") { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入課程名稱"); } break; case "評量名稱": if (value == "") { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入評量名稱"); } break; case "定期分數": case "平時分數": if (value != "" && !decimal.TryParse(value, out d)) { if (PluginMain.ScoreTextMap.Keys.Count > 0) { if (!PluginMain.ScoreTextMap.ContainsKey(value)) { inputFormatPass &= false; e.ErrorFields.Add(field, "僅允許空白、數值或「" + string.Join("、", PluginMain.ScoreTextMap.Keys) + "」"); } } else { inputFormatPass &= false; e.ErrorFields.Add(field, "僅允許空白或數值"); } } break; //case "努力程度": // if (value != "" && !int.TryParse(value, out i)) // { // inputFormatPass &= false; // e.ErrorFields.Add(field, "必須填入空白或整數"); // } // break; case "文字描述": break; } } #endregion //輸入格式正確才會針對情節做檢驗 #region 驗證各種情節 if (inputFormatPass) { string errorMessage = ""; string sy = e.Data["學年度"]; string se = e.Data["學期"]; string key = e.Data.ID + "_" + sy + "_" + se; string courseName = e.Data["課程名稱"]; string semsKey = sy + "_" + se; string examName = e.Data["評量名稱"]; //int schoolyear = Framework.Int.ParseInt(sy); //int semester = Framework.Int.ParseInt(se); #region 檢查課程是否存在系統中 bool noCourse = false; if (!allcourses.ContainsKey(semsKey)) { noCourse = true; errorMessage += (errorMessage == "" ? "" : "\n") + " 系統中找不到該課程"; } else if (!allcourses[semsKey].ContainsKey(courseName)) { noCourse = true; errorMessage += (errorMessage == "" ? "" : "\n") + " 系統中找不到該課程"; } else { } #endregion #region 檢查學生是否有修此課程 & 評量是否存在 bool attended = false; JHCourseRecord attendCourse = null; if (scattends.ContainsKey(e.Data.ID)) { foreach (JHSCAttendRecord record in scattends[e.Data.ID]) { //if (courses[record.RefCourseID].Name == courseName) // attendCourse = courses[record.RefCourseID]; bool HasRec = false; // 當有學年度學期課程名稱相同 if (courses[record.RefCourseID].Name == courseName && courses[record.RefCourseID].SchoolYear.HasValue && courses[record.RefCourseID].Semester.HasValue) { if ((courses[record.RefCourseID].SchoolYear.Value.ToString().Trim() == sy.Trim()) && courses[record.RefCourseID].Semester.Value.ToString().Trim() == se.Trim()) { HasRec = true; } } if (HasRec && courses.ContainsKey(record.RefCourseID)) { attendCourse = courses[record.RefCourseID]; } } } else //學生沒修半堂課 { } if (attendCourse == null && !noCourse) { if (!e.ErrorFields.ContainsKey("無修課記錄")) { e.ErrorFields.Add("無修課記錄", "學生在此學期並無修習此課程"); } } else if (attendCourse != null) { #region 驗證評量是否存在 if (string.IsNullOrEmpty(attendCourse.RefAssessmentSetupID)) { if (!e.ErrorFields.ContainsKey("無評量設定")) { e.ErrorFields.Add("無評量設定", "課程(" + attendCourse.Name + ")無評量設定"); } } else { if (!courseAe.ContainsKey(attendCourse.RefAssessmentSetupID)) { if (!e.ErrorFields.ContainsKey("無評量設定")) { e.ErrorFields.Add("無評量設定", "課程(" + attendCourse.Name + ")無評量設定"); } } else { bool examValid = false; foreach (HC.JHAEIncludeRecord ae in courseAe[attendCourse.RefAssessmentSetupID]) { if (!exams.ContainsKey(ae.RefExamID)) { continue; } if (exams[ae.RefExamID].Name == examName) { examValid = true; } } if (!examValid) { if (!e.ErrorFields.ContainsKey("評量名稱無效")) { e.ErrorFields.Add("評量名稱無效", "評量名稱(" + examName + ")不存在系統中"); } } } } #endregion } #endregion e.ErrorMessage = errorMessage; } #endregion }; wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { Dictionary <string, List <RowData> > id_Rows = new Dictionary <string, List <RowData> >(); #region 分包裝 foreach (RowData data in e.Items) { if (!id_Rows.ContainsKey(data.ID)) { id_Rows.Add(data.ID, new List <RowData>()); } id_Rows[data.ID].Add(data); } #endregion List <HC.JHSCETakeRecord> insertList = new List <HC.JHSCETakeRecord>(); List <HC.JHSCETakeRecord> updateList = new List <HC.JHSCETakeRecord>(); //交叉比對各學生資料 #region 交叉比對各學生資料 foreach (string id in id_Rows.Keys) { JHStudentRecord studentRec = students[id]; foreach (RowData data in id_Rows[id]) { string examName = data["評量名稱"]; string courseName = data["課程名稱"]; string SchoolYear = data["學年度"]; string Semester = data["學期"]; if (!scattends.ContainsKey(id)) { continue; } foreach (JHSCAttendRecord record in scattends[id]) { if (!courses.ContainsKey(record.RefCourseID)) { continue; } JHCourseRecord course = courses[record.RefCourseID]; //if (course.Name != courseName) continue; HC.JHSCETakeRecord currentSCE = null; string sy = "", ss = ""; if (course.SchoolYear.HasValue) { sy = course.SchoolYear.Value.ToString(); } if (course.Semester.HasValue) { ss = course.Semester.Value.ToString(); } if (SchoolYear != sy || Semester != ss || courseName != course.Name) { continue; } if (SchoolYear == sy && Semester == ss && course.Name == courseName) { if (existSces.ContainsKey(record.ID)) { foreach (HC.JHSCETakeRecord sce in existSces[record.ID]) { if (!exams.ContainsKey(sce.RefExamID)) { continue; } if (exams[sce.RefExamID].Name == examName) { currentSCE = sce; } } } } if (currentSCE != null) { bool changed = false; #region 填入資料 foreach (string field in e.ImportFields) { string value = data[field]; switch (field) { case "定期分數": if ("" + currentSCE.Score != value) { decimal d; if (decimal.TryParse(value, out d)) { currentSCE.Score = d; } else { if (PluginMain.ScoreTextMap.ContainsKey(value)) { currentSCE.Score = PluginMain.ScoreTextMap[value].UseValue; } else { currentSCE.Score = null; } } changed = true; } break; case "平時分數": if ("" + currentSCE.AssignmentScore != value) { decimal d; if (decimal.TryParse(value, out d)) { currentSCE.AssignmentScore = d; } else { if (PluginMain.ScoreTextMap.ContainsKey(value)) { currentSCE.AssignmentScore = PluginMain.ScoreTextMap[value].UseValue; } else { currentSCE.AssignmentScore = null; } } changed = true; } break; //case "努力程度": // if ("" + currentSCE.Effort != value) // { // int i; // if (int.TryParse(value, out i)) // currentSCE.Effort = i; // else // currentSCE.Effort = null; // changed = true; // } // break; case "文字描述": if (currentSCE.Text != value) { currentSCE.Text = value; changed = true; } break; } } #endregion if (changed) { updateList.Add(currentSCE); } } else { HC.JHSCETakeRecord newSCE = new HC.JHSCETakeRecord(new JHSCETakeRecord()); newSCE.RefStudentID = id; newSCE.RefSCAttendID = record.ID; newSCE.RefCourseID = record.RefCourseID; foreach (JHExamRecord exam in exams.Values) { if (exam.Name == examName) { newSCE.RefExamID = exam.ID; } } #region 填入資料 foreach (string field in e.ImportFields) { string value = data[field]; switch (field) { case "定期分數": if (value != "") { decimal d; if (decimal.TryParse(value, out d)) { newSCE.Score = d; } else { if (PluginMain.ScoreTextMap.ContainsKey(value)) { newSCE.Score = PluginMain.ScoreTextMap[value].UseValue; } else { newSCE.Score = null; } } } else { newSCE.Score = null; } break; case "平時分數": if (value != "") { decimal d; if (decimal.TryParse(value, out d)) { newSCE.AssignmentScore = d; } else { if (PluginMain.ScoreTextMap.ContainsKey(value)) { newSCE.AssignmentScore = PluginMain.ScoreTextMap[value].UseValue; } else { newSCE.AssignmentScore = null; } } } else { newSCE.AssignmentScore = null; } break; case "文字描述": newSCE.Text = value; break; } } #endregion if (newSCE.RefExamID != "") { insertList.Add(newSCE); } } } } } try { if (updateList.Count > 0) { #region 分批次兩路上傳 List <List <HC.JHSCETakeRecord> > updatePackages = new List <List <HC.JHSCETakeRecord> >(); List <List <HC.JHSCETakeRecord> > updatePackages2 = new List <List <HC.JHSCETakeRecord> >(); { List <HC.JHSCETakeRecord> package = null; int count = 0; foreach (HC.JHSCETakeRecord var in updateList) { if (count == 0) { package = new List <HC.JHSCETakeRecord>(30); count = 30; if ((updatePackages.Count & 1) == 0) { updatePackages.Add(package); } else { updatePackages2.Add(package); } } package.Add(var); count--; } } Thread threadUpdateSemesterSubjectScore = new Thread(new ParameterizedThreadStart(Update)); threadUpdateSemesterSubjectScore.IsBackground = true; threadUpdateSemesterSubjectScore.Start(updatePackages); Thread threadUpdateSemesterSubjectScore2 = new Thread(new ParameterizedThreadStart(Update)); threadUpdateSemesterSubjectScore2.IsBackground = true; threadUpdateSemesterSubjectScore2.Start(updatePackages2); threadUpdateSemesterSubjectScore.Join(); threadUpdateSemesterSubjectScore2.Join(); #endregion } } catch (Exception ex) { } if (insertList.Count > 0) { #region 分批次兩路上傳 List <List <HC.JHSCETakeRecord> > insertPackages = new List <List <HC.JHSCETakeRecord> >(); List <List <HC.JHSCETakeRecord> > insertPackages2 = new List <List <HC.JHSCETakeRecord> >(); { List <HC.JHSCETakeRecord> package = null; int count = 0; foreach (HC.JHSCETakeRecord var in insertList) { if (count == 0) { package = new List <HC.JHSCETakeRecord>(30); count = 30; if ((insertPackages.Count & 1) == 0) { insertPackages.Add(package); } else { insertPackages2.Add(package); } } package.Add(var); count--; } } Thread threadInsertSemesterSubjectScore = new Thread(new ParameterizedThreadStart(Insert)); threadInsertSemesterSubjectScore.IsBackground = true; threadInsertSemesterSubjectScore.Start(insertPackages); Thread threadInsertSemesterSubjectScore2 = new Thread(new ParameterizedThreadStart(Insert)); threadInsertSemesterSubjectScore2.IsBackground = true; threadInsertSemesterSubjectScore2.Start(insertPackages2); threadInsertSemesterSubjectScore.Join(); threadInsertSemesterSubjectScore2.Join(); #endregion } FISCA.LogAgent.ApplicationLog.Log("成績系統.匯入匯出", "匯入評量成績", "總共匯入" + (insertList.Count + updateList.Count) + "筆評量成績。"); #endregion }; }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { // 取得學生資料 Dictionary<string, SHStudentRecord> Students = new Dictionary<string, SHStudentRecord>(); // 取得異動資料 Dictionary<string, List<SHUpdateRecordRecord>> UpdateRecs = new Dictionary<string, List<SHUpdateRecordRecord>>(); wizard.PackageLimit = 3000; wizard.ImportableFields.AddRange("班別", "特殊身份代碼", "異動科別", "年級", "異動學號", "異動姓名", "身分證號", "註1", "異動代碼", "異動日期", "原因及事項", "新學號", "更正後資料", "舊班別", "舊科別代碼", "備查日期", "備查文號", "核准日期", "核准文號", "備註"); wizard.RequiredFields.AddRange("異動代碼", "異動日期"); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { Students.Clear(); UpdateRecs.Clear(); // 取得學生資料 foreach (SHStudentRecord studRec in SHStudent.SelectByIDs(e.List)) if (!Students.ContainsKey(studRec.ID)) Students.Add(studRec.ID, studRec); foreach (string str in Students.Keys) { List<SHUpdateRecordRecord> UpdRecList = new List<SHUpdateRecordRecord>(); UpdateRecs.Add(str, UpdRecList); } // 取得異動 MultiThreadWorker<string> loader1 = new MultiThreadWorker<string>(); loader1.MaxThreads = 3; loader1.PackageSize = 250; loader1.PackageWorker += delegate(object sender1, PackageWorkEventArgs<string> e1) { foreach (SHUpdateRecordRecord UpdRec in SHUpdateRecord.SelectByStudentIDs(e.List)) { // 過濾非符合標準的異動(目前是學籍) if(!_UpdateCodeList.Contains(UpdRec.UpdateCode)) continue; if (UpdateRecs.ContainsKey(UpdRec.StudentID)) UpdateRecs[UpdRec.StudentID].Add(UpdRec); } }; loader1.Run(e.List); }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { int i = 0; DateTime dt; // 檢查學生是否存在 SHStudentRecord studRec = null; if (Students.ContainsKey(e.Data.ID)) studRec = Students[e.Data.ID]; else { e.ErrorMessage = "沒有這位學生" + e.Data.ID; return; } // 驗證格式資料 bool InputFormatPass = true; foreach (string field in e.SelectFields) { string value = e.Data[field].Trim(); //// 驗證$無法匯入 //if (value.IndexOf('$') > -1) //{ // e.ErrorFields.Add(field, "儲存格有$無法匯入."); // break; //} switch (field) { default: break; //// 班別 //case "班別": break; //// 特殊身份代碼 //case "特殊身份代碼": break; //// 異動科別 //case "異動科別": break; //// 年級 //case "年級": break; //// 異動學號 //case "異動學號": break; //// 異動姓名 //case "異動姓名": break; //// 身分證號 //case "身分證號": break; //// 註1 //case "註1": break; //// 異動種類 //case "異動種類": break; // 異動代碼 case "異動代碼": if (!_UpdateCodeList.Contains(value)) { InputFormatPass &= false; e.ErrorFields.Add(field, "非學籍異動代碼!"); } break; // 異動日期(必填) case "異動日期": DateTime dtC1; if (DateTime.TryParse(value, out dtC1)) { } else { InputFormatPass &= false; e.ErrorFields.Add(field, "日期錯誤!"); } break; case "備查日期": case "核准日期": DateTime dtC2; if (value.Trim() != "") { if (DateTime.TryParse(value, out dtC2)) { } else { InputFormatPass &= false; e.ErrorFields.Add(field, "日期錯誤!"); } } break; //// 原因及事項 //case "原因及事項": break; //// 新學號 //case "新學號": break; //// 更正後資料 //case "更正後資料": break; //// 舊班別 //case "舊班別": break; //// 舊科別代碼 //case "舊科別代碼": break; //// 備查日期 //case "備查日期": // break; //// 備查文號 //case "備查文號": break; //// 核准日期 //case "核准日期": break; //// 核准文號 //case "核准文號": break; //// 備註 //case "備註": break; } } }; wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { Dictionary<string, List<RowData>> id_Rows = new Dictionary<string, List<RowData>>(); foreach (RowData data in e.Items) { if (!id_Rows.ContainsKey(data.ID)) id_Rows.Add(data.ID, new List<RowData>()); id_Rows[data.ID].Add(data); } List<SHUpdateRecordRecord> InsertList = new List<SHUpdateRecordRecord>(); List<SHUpdateRecordRecord> UpdateList = new List<SHUpdateRecordRecord>(); // 檢查新增或更新方式: // 每筆 Key 為:異動日期+異動代碼+原因及事項,如果三者內容相同更新,如果不同就新增。 foreach (string id in id_Rows.Keys) { DateTime dt; // 讀取工作表內資料 foreach (RowData data in id_Rows[id]) { // 當異動記錄內沒有工作表讀取轉換後學生ID,就跳過。 if (!UpdateRecs.ContainsKey(id)) continue; DateTime.TryParse(data["異動日期"], out dt); // 異動代碼 string UpdateCode = string.Empty; if (data.ContainsKey("異動代碼")) UpdateCode = data["異動代碼"]; // 取得原因及事項 string UpdateDesc = string.Empty; if (data.ContainsKey("原因及事項")) UpdateDesc = data["原因及事項"]; SHUpdateRecordRecord updateRec = null; // 異動日期+異動代碼 (如果相同有當更新,不同就新增) foreach (SHUpdateRecordRecord urr in UpdateRecs[id]) { if (UpdateCode == urr.UpdateCode) { DateTime dt1; DateTime.TryParse(urr.UpdateDate, out dt1); if (dt == dt1) { // 使用原因及事項當作Key if(UpdateDesc == urr.UpdateDescription ) updateRec = urr; } } } bool isInsert = true; if (updateRec == null) { updateRec = new SHUpdateRecordRecord(); updateRec.StudentID = id; } else isInsert = false; // 這段在做資料填入異動紀錄 foreach (string field in e.ImportFields) { string value = data[field].Trim(); switch (field) { // 班別 case "班別": updateRec.ClassType = value; break; // 特殊身份代碼 case "特殊身份代碼": updateRec.SpecialStatus = value; break; // 異動科別 case "異動科別": updateRec.Department = value; break; // 年級 case "年級": updateRec.GradeYear = value; break; // 異動學號 case "異動學號": updateRec.StudentNumber = value; break; // 異動姓名 case "異動姓名": updateRec.StudentName = value; break; // 身分證號 case "身分證號": updateRec.IDNumber = value; break; // 註1 case "註1": updateRec.IDNumberComment = value; break; //// 異動種類 //case "異動種類": // break; // 異動代碼 case "異動代碼": updateRec.UpdateCode = value; break; // 異動日期 case "異動日期": DateTime dt1; if (DateTime.TryParse(value, out dt1)) updateRec.UpdateDate = dt1.ToShortDateString(); break; // 原因及事項 case "原因及事項": updateRec.UpdateDescription = value; break; // 新學號 case "新學號": updateRec.NewStudentNumber = value; break; // 更正後資料 case "更正後資料": updateRec.NewData = value; break; // 舊班別 case "舊班別": updateRec.OldClassType = value; break; // 舊科別代碼 case "舊科別代碼": updateRec.OldDepartmentCode = value; break; // 備查日期 case "備查日期": DateTime dt2; if (DateTime.TryParse(value,out dt2)) updateRec.LastADDate = dt2.ToShortDateString (); break; // 備查文號 case "備查文號": updateRec.LastADNumber = value; break; // 核准日期 case "核准日期": DateTime dt3; if(DateTime.TryParse(value, out dt3)) updateRec.ADDate = dt3.ToShortDateString(); break; // 核准文號 case "核准文號": updateRec.ADNumber = value; break; // 備註 case "備註": updateRec.GraduateComment = value; break; } } if (string.IsNullOrEmpty(updateRec.StudentID) || string.IsNullOrEmpty(updateRec.UpdateDate) || string.IsNullOrEmpty(updateRec.UpdateCode)) continue; else { if (isInsert) InsertList.Add(updateRec); else UpdateList.Add(updateRec); } } } try { if (InsertList.Count > 0) Insert(InsertList); if (UpdateList.Count > 0) Update(UpdateList); PermRecLogProcess prlp = new PermRecLogProcess(); prlp.SaveLog("學生.匯入異動", "匯入學籍異動", "匯入學籍異動:共新增" + InsertList.Count + "筆資料,共更新:" + UpdateList.Count + "筆資料"); SmartSchool.StudentRelated.Student.Instance.SyncAllBackground(); } catch (Exception ex) { } }; }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { //學生資訊 key: studentID Dictionary <string, JHStudentRecord> students = new Dictionary <string, JHStudentRecord>(); //學生修課資訊 studentID -> List:SCAttendRecord Dictionary <string, List <JHSCAttendRecord> > scattends = new Dictionary <string, List <JHSCAttendRecord> >(); //學生修習的課程 courseID -> CourseRecord Dictionary <string, JHCourseRecord> courses = new Dictionary <string, JHCourseRecord>(); //所有課程(依學年度學期分開) schoolYear_semester -> (courseName -> CourseRecord) Dictionary <string, Dictionary <string, JHCourseRecord> > allcourses = new Dictionary <string, Dictionary <string, JHSchool.Data.JHCourseRecord> >(); //學生修習的課程對應的評量設定細節 Dictionary <string, List <JHAEIncludeRecord> > courseAe = new Dictionary <string, List <JHSchool.Data.JHAEIncludeRecord> >(); //學生的評量成績記錄 Dictionary <string, List <JHSCETakeRecord> > existSces = new Dictionary <string, List <JHSchool.Data.JHSCETakeRecord> >(); //所有試別 Dictionary <string, JHExamRecord> exams = new Dictionary <string, JHSchool.Data.JHExamRecord>(); // 取得努力程度對照 K12.Data.Configuration.ConfigData cd = K12.Data.School.Configuration["努力程度對照表"]; if (!string.IsNullOrEmpty(cd["xml"])) { XmlElement element = XmlHelper.LoadXml(cd["xml"]); foreach (XmlElement each in element.SelectNodes("Effort")) { int code = int.Parse(each.GetAttribute("Code")); decimal score; if (!decimal.TryParse(each.GetAttribute("Score"), out score)) { score = 0; } if (!_EffortDict.ContainsKey(score)) { _EffortDict.Add(score, code); } } _ScoreList.AddRange(_EffortDict.Keys); _ScoreList.Reverse(); } wizard.PackageLimit = 3000; wizard.ImportableFields.AddRange("學年度", "學期", "課程名稱", "評量名稱", "分數評量", "努力程度", "文字描述"); wizard.RequiredFields.AddRange("學年度", "學期", "課程名稱", "評量名稱"); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { #region 取得學生資訊 foreach (JHStudentRecord stu in JHStudent.SelectByIDs(e.List)) { if (!students.ContainsKey(stu.ID)) { students.Add(stu.ID, stu); } } #endregion #region 取得修課記錄 MultiThreadWorker <string> loader1 = new MultiThreadWorker <string>(); loader1.MaxThreads = 3; loader1.PackageSize = 250; loader1.PackageWorker += delegate(object sender1, PackageWorkEventArgs <string> e1) { foreach (JHSCAttendRecord record in JHSCAttend.SelectByStudentIDAndCourseID(e1.List, new string[] { })) { if (!scattends.ContainsKey(record.RefStudentID)) { scattends.Add(record.RefStudentID, new List <JHSchool.Data.JHSCAttendRecord>()); } scattends[record.RefStudentID].Add(record); if (!courses.ContainsKey(record.RefCourseID)) { courses.Add(record.RefCourseID, null); } } }; loader1.Run(e.List); #endregion #region 取得課程資訊 MultiThreadWorker <string> loader2 = new MultiThreadWorker <string>(); loader2.MaxThreads = 3; loader2.PackageSize = 250; loader2.PackageWorker += delegate(object sender2, PackageWorkEventArgs <string> e2) { foreach (JHCourseRecord record in JHCourse.SelectByIDs(new List <string>(e2.List))) { if (courses.ContainsKey(record.ID)) { courses[record.ID] = record; } } }; loader2.Run(courses.Keys); foreach (JHCourseRecord course in JHCourse.SelectAll()) { string key = course.SchoolYear + "_" + course.Semester; if (!allcourses.ContainsKey(key)) { allcourses.Add(key, new Dictionary <string, JHSchool.Data.JHCourseRecord>()); } if (!allcourses[key].ContainsKey(course.Name)) { allcourses[key].Add(course.Name, course); } } #endregion #region 取得目前評量成績記錄 MultiThreadWorker <string> loader3 = new MultiThreadWorker <string>(); loader3.MaxThreads = 3; loader3.PackageSize = 250; loader3.PackageWorker += delegate(object sender3, PackageWorkEventArgs <string> e3) { foreach (JHSCETakeRecord sce in JHSCETake.SelectByStudentIDs(e3.List)) { if (!existSces.ContainsKey(sce.RefSCAttendID)) { existSces.Add(sce.RefSCAttendID, new List <JHSchool.Data.JHSCETakeRecord>()); } existSces[sce.RefSCAttendID].Add(sce); } }; loader3.Run(e.List); #endregion #region 取得評量設定 foreach (JHAEIncludeRecord ae in JHAEInclude.SelectAll()) { if (!courseAe.ContainsKey(ae.RefAssessmentSetupID)) { courseAe.Add(ae.RefAssessmentSetupID, new List <JHSchool.Data.JHAEIncludeRecord>()); } courseAe[ae.RefAssessmentSetupID].Add(ae); } #endregion #region 取得試別 foreach (JHExamRecord exam in JHExam.SelectAll()) { if (!exams.ContainsKey(exam.ID)) { exams.Add(exam.ID, exam); } } #endregion }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { int i; decimal d; #region 檢查學生是否存在 JHStudentRecord student = null; if (students.ContainsKey(e.Data.ID)) { student = students[e.Data.ID]; } else { e.ErrorMessage = "壓根就沒有這個學生" + e.Data.ID; return; } #endregion #region 驗證各個欄位格式 bool inputFormatPass = true; foreach (string field in e.SelectFields) { string value = e.Data[field]; switch (field) { default: break; case "學年度": case "學期": if (value == "" || !int.TryParse(value, out i)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入整數"); } break; case "課程名稱": if (value == "") { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入課程名稱"); } break; case "評量名稱": if (value == "") { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入評量名稱"); } break; case "分數評量": if (value != "" && !decimal.TryParse(value, out d)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入空白或數值"); } break; case "努力程度": if (value != "" && !int.TryParse(value, out i)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入空白或整數"); } break; case "文字描述": break; } } #endregion //輸入格式正確才會針對情節做檢驗 #region 驗證各種情節 if (inputFormatPass) { string errorMessage = ""; string sy = e.Data["學年度"]; string se = e.Data["學期"]; string key = e.Data.ID + "_" + sy + "_" + se; string courseName = e.Data["課程名稱"]; string semsKey = sy + "_" + se; string examName = e.Data["評量名稱"]; //int schoolyear = Framework.Int.ParseInt(sy); //int semester = Framework.Int.ParseInt(se); #region 檢查課程是否存在系統中 bool noCourse = false; if (!allcourses.ContainsKey(semsKey)) { noCourse = true; errorMessage += (errorMessage == "" ? "" : "\n") + " 系統中找不到該課程"; } else if (!allcourses[semsKey].ContainsKey(courseName)) { noCourse = true; errorMessage += (errorMessage == "" ? "" : "\n") + " 系統中找不到該課程"; } else { } #endregion #region 檢查學生是否有修此課程 & 評量是否存在 bool attended = false; JHCourseRecord attendCourse = null; if (scattends.ContainsKey(e.Data.ID)) { foreach (JHSCAttendRecord record in scattends[e.Data.ID]) { bool HasRec = false; // 當有學年度學期課程名稱相同 if (courses[record.RefCourseID].Name == courseName && courses[record.RefCourseID].SchoolYear.HasValue && courses[record.RefCourseID].Semester.HasValue) { if ((courses[record.RefCourseID].SchoolYear.Value.ToString().Trim() == sy.Trim()) && courses[record.RefCourseID].Semester.Value.ToString().Trim() == se.Trim()) { HasRec = true; } } if (HasRec && courses.ContainsKey(record.RefCourseID)) { attendCourse = courses[record.RefCourseID]; } } } else //學生沒修半堂課 { } if (attendCourse == null && !noCourse) { if (!e.ErrorFields.ContainsKey("無修課記錄")) { e.ErrorFields.Add("無修課記錄", "學生在此學期並無修習此課程"); } } else if (attendCourse != null) { #region 驗證評量是否存在 if (string.IsNullOrEmpty(attendCourse.RefAssessmentSetupID)) { if (!e.ErrorFields.ContainsKey("無評量設定")) { e.ErrorFields.Add("無評量設定", "課程(" + attendCourse.Name + ")無評量設定"); } } else { if (!courseAe.ContainsKey(attendCourse.RefAssessmentSetupID)) { if (!e.ErrorFields.ContainsKey("無評量設定")) { e.ErrorFields.Add("無評量設定", "課程(" + attendCourse.Name + ")無評量設定"); } } else { bool examValid = false; foreach (JHAEIncludeRecord ae in courseAe[attendCourse.RefAssessmentSetupID]) { if (!exams.ContainsKey(ae.RefExamID)) { continue; } // 2016/7/26,穎驊新增,由於高雄國中希望可以加入匯出匯入"平時評量的功能",因此必須要在原本的Exam.Name驗證 // 加上 ||examName =="平時評量" ,避免平時評量的欄位被擋掉 if (exams[ae.RefExamID].Name == examName || examName == "平時評量") { examValid = true; } } if (!examValid) { if (!e.ErrorFields.ContainsKey("評量名稱無效")) { e.ErrorFields.Add("評量名稱無效", "評量名稱(" + examName + ")不存在系統中"); } } } } #endregion } #endregion e.ErrorMessage = errorMessage; } #endregion }; wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { Dictionary <string, List <RowData> > id_Rows = new Dictionary <string, List <RowData> >(); #region 分包裝 foreach (RowData data in e.Items) { if (!id_Rows.ContainsKey(data.ID)) { id_Rows.Add(data.ID, new List <RowData>()); } id_Rows[data.ID].Add(data); } #endregion List <KH.JHSCETakeRecord> insertList = new List <KH.JHSCETakeRecord>(); List <KH.JHSCETakeRecord> updateList = new List <KH.JHSCETakeRecord>(); //交叉比對各學生資料 #region 交叉比對各學生資料 foreach (string id in id_Rows.Keys) { JHStudentRecord studentRec = students[id]; foreach (RowData data in id_Rows[id]) { string examName = data["評量名稱"]; string courseName = data["課程名稱"]; string SchoolYear = data["學年度"]; string Semester = data["學期"]; // 2016/7/26,穎驊新增bool值避免 在有"平時評量"的評量名稱Row 進入算評量成績的判斷式 bool isOrdinarilyScore = false; if (!scattends.ContainsKey(id)) { continue; } foreach (JHSCAttendRecord record in scattends[id]) { if (!courses.ContainsKey(record.RefCourseID)) { continue; } JHCourseRecord course = courses[record.RefCourseID]; //if (course.Name != courseName) continue; string sy = "", ss = ""; if (course.SchoolYear.HasValue) { sy = course.SchoolYear.Value.ToString(); } if (course.Semester.HasValue) { ss = course.Semester.Value.ToString(); } if (SchoolYear != sy || Semester != ss || course.Name != courseName) { continue; } KH.JHSCETakeRecord currentSCE = null; if (SchoolYear == sy && Semester == ss && course.Name == courseName) { // 2016/7/26,穎驊新增,由於高雄國中希望可以加入匯出匯入"平時評量的功能",在原本的Code努力尋找見縫插針的位子, //因為"平時評量"與一般的"評量成績"處理邏輯要分開 //後來決定這邊是最佳位子,邏輯為,當程序在一條一條讀取Excel Row時,讀到欄位"評量名稱"值為 "平時評量" //則進入我們處理平時評量的程序,如果欄位"評量名稱"值非為 "平時評量" 則使用它原本的邏輯處理 // 上面的CODE會幫忙進行學年、學期、課程的驗證,確保是同一門課程成績資料, //而 JHSCAttendRecord record內意外發現剛好有 平時評量OrdinarilyScore的欄位 //因此只要指定欄位為新的Excel 內的值,最後 使用JHSCAttend.Update(record) 更新即可 if (data["評量名稱"] == "平時評量") { if (data["分數評量"] != null && data["分數評量"] != "") { decimal d; // 使用TryParse 的轉換,是因為可能會有Row 的分數評量欄位是空的(EX: 社團成績) ,直接Parse會爆 if (decimal.TryParse(data["分數評量"], out d)) { record.OrdinarilyScore = d; } } if (data["努力程度"] != null) { int i; if (int.TryParse(data["努力程度"], out i)) { record.OrdinarilyEffort = i; } } if (data["文字描述"] != null) { record.Text = data["文字描述"].ToString(); } JHSCAttend.Update(record); isOrdinarilyScore = true; currentSCE = null; } else { if (existSces.ContainsKey(record.ID)) { foreach (KH.JHSCETakeRecord sce in existSces[record.ID].AsKHJHSCETakeRecords()) { if (!exams.ContainsKey(sce.RefExamID)) { continue; } if (exams[sce.RefExamID].Name == examName) { currentSCE = sce; } } } } } // 2016/7/26,穎驊新增bool值避免 在有"平時評量"的評量名稱Row 進入算評量成績的判斷式 if (currentSCE != null && isOrdinarilyScore == false) { bool changed = false; #region 填入資料 foreach (string field in e.ImportFields) { string value = data[field]; switch (field) { case "分數評量": if ("" + currentSCE.Score != value) { decimal d; if (decimal.TryParse(value, out d)) { currentSCE.Score = d; } else { currentSCE.Score = null; } changed = true; } break; case "努力程度": if ("" + currentSCE.Effort != value) { int i; if (int.TryParse(value, out i)) { currentSCE.Effort = i; } else { currentSCE.Effort = null; } changed = true; } break; case "文字描述": if (currentSCE.Text != value) { currentSCE.Text = value; changed = true; } break; } } #endregion if (changed) { updateList.Add(currentSCE); } } // 2016/7/26,穎驊新增bool值避免 在有"平時評量"的評量名稱Row 進入算評量成績的判斷式 if (currentSCE == null && isOrdinarilyScore == false) { KH.JHSCETakeRecord newSCE = new KH.JHSCETakeRecord(new JHSCETakeRecord()); newSCE.RefStudentID = id; newSCE.RefSCAttendID = record.ID; newSCE.RefCourseID = record.RefCourseID; foreach (JHExamRecord exam in exams.Values) { if (exam.Name == examName) { newSCE.RefExamID = exam.ID; break; } } #region 填入資料 foreach (string field in e.ImportFields) { string value = data[field]; switch (field) { case "分數評量": if (value != "") { decimal d; if (decimal.TryParse(value, out d)) { newSCE.Score = d; } else { newSCE.Score = null; } } else { newSCE.Score = null; } break; case "努力程度": if (value != "") { int i; if (int.TryParse(value, out i)) { newSCE.Effort = i; } else { newSCE.Effort = null; } } else { newSCE.Effort = null; } break; case "文字描述": newSCE.Text = value; break; } } #endregion if (newSCE.RefExamID != "") { insertList.Add(newSCE); } } } } } try { // 解析並填入轉換空白的努力程度 foreach (KH.JHSCETakeRecord rec in updateList) { // 當努力程度沒有值卻有成績。 if ((rec.Effort.HasValue == false) && rec.Score.HasValue) { rec.Effort = ConvertEffort(rec.Score.Value); } } foreach (KH.JHSCETakeRecord rec in insertList) { // 當努力程度沒有值卻有成績。 if ((rec.Effort.HasValue == false) && rec.Score.HasValue) { rec.Effort = ConvertEffort(rec.Score.Value); } } if (updateList.Count > 0) { #region 分批次兩路上傳 List <List <KH.JHSCETakeRecord> > updatePackages = new List <List <KH.JHSCETakeRecord> >(); List <List <KH.JHSCETakeRecord> > updatePackages2 = new List <List <KH.JHSCETakeRecord> >(); { List <KH.JHSCETakeRecord> package = null; int count = 0; foreach (KH.JHSCETakeRecord var in updateList) { if (count == 0) { package = new List <KH.JHSCETakeRecord>(30); count = 30; if ((updatePackages.Count & 1) == 0) { updatePackages.Add(package); } else { updatePackages2.Add(package); } } package.Add(var); count--; } } Thread threadUpdateSemesterSubjectScore = new Thread(new ParameterizedThreadStart(Update)); threadUpdateSemesterSubjectScore.IsBackground = true; threadUpdateSemesterSubjectScore.Start(updatePackages); Thread threadUpdateSemesterSubjectScore2 = new Thread(new ParameterizedThreadStart(Update)); threadUpdateSemesterSubjectScore2.IsBackground = true; threadUpdateSemesterSubjectScore2.Start(updatePackages2); threadUpdateSemesterSubjectScore.Join(); threadUpdateSemesterSubjectScore2.Join(); #endregion } } catch (Exception ex) { } if (insertList.Count > 0) { #region 分批次兩路上傳 List <List <KH.JHSCETakeRecord> > insertPackages = new List <List <KH.JHSCETakeRecord> >(); List <List <KH.JHSCETakeRecord> > insertPackages2 = new List <List <KH.JHSCETakeRecord> >(); { List <KH.JHSCETakeRecord> package = null; int count = 0; foreach (KH.JHSCETakeRecord var in insertList) { if (count == 0) { package = new List <KH.JHSCETakeRecord>(30); count = 30; if ((insertPackages.Count & 1) == 0) { insertPackages.Add(package); } else { insertPackages2.Add(package); } } package.Add(var); count--; } } Thread threadInsertSemesterSubjectScore = new Thread(new ParameterizedThreadStart(Insert)); threadInsertSemesterSubjectScore.IsBackground = true; threadInsertSemesterSubjectScore.Start(insertPackages); Thread threadInsertSemesterSubjectScore2 = new Thread(new ParameterizedThreadStart(Insert)); threadInsertSemesterSubjectScore2.IsBackground = true; threadInsertSemesterSubjectScore2.Start(insertPackages2); threadInsertSemesterSubjectScore.Join(); threadInsertSemesterSubjectScore2.Join(); #endregion } FISCA.LogAgent.ApplicationLog.Log("成績系統.匯入匯出", "匯入評量成績", "總共匯入" + (insertList.Count + updateList.Count) + "筆評量成績。"); #endregion }; }
public static void SaveCourseRecordEditor(IEnumerable <CourseRecordEditor> editors) { MultiThreadWorker <CourseRecordEditor> worker = new MultiThreadWorker <CourseRecordEditor>(); worker.MaxThreads = 3; worker.PackageSize = 100; worker.PackageWorker += delegate(object sender, PackageWorkEventArgs <CourseRecordEditor> e) { DSXmlHelper updateHelper = new DSXmlHelper("Request"); DSXmlHelper insertHelper = new DSXmlHelper("Request"); DSXmlHelper deleteHelper = new DSXmlHelper("Request"); List <string> synclist = new List <string>(); bool hasUpdate = false, hasInsert = false, hasDelete = false; foreach (var editor in e.List) { #region 更新 if (editor.EditorStatus == JHSchool.Editor.EditorStatus.Update) { updateHelper.AddElement("Course"); updateHelper.AddElement("Course", "Field"); updateHelper.AddElement("Course/Field", "CourseName", editor.Name); updateHelper.AddElement("Course/Field", "SchoolYear", editor.SchoolYear.ToString()); updateHelper.AddElement("Course/Field", "Semester", editor.Semester.ToString()); updateHelper.AddElement("Course/Field", "Subject", editor.Subject); updateHelper.AddElement("Course/Field", "Domain", editor.Domain); updateHelper.AddElement("Course/Field", "Period", editor.Period); updateHelper.AddElement("Course/Field", "Credit", editor.Credit); updateHelper.AddElement("Course/Field", "RefClassID", editor.RefClassID); updateHelper.AddElement("Course/Field", "RefExamTemplateID", editor.RefAssessmentSetupID); updateHelper.AddElement("Course/Field", "ScoreCalcFlag", editor.CalculationFlag); updateHelper.AddElement("Course", "Condition"); updateHelper.AddElement("Course/Condition", "ID", editor.ID); hasUpdate = true; synclist.Add(editor.ID); } #endregion #region 新增 if (editor.EditorStatus == JHSchool.Editor.EditorStatus.Insert) { insertHelper.AddElement("Course"); //insertHelper.AddElement("Course", "Field"); insertHelper.AddElement("Course", "CourseName", editor.Name); insertHelper.AddElement("Course", "SchoolYear", editor.SchoolYear.ToString()); insertHelper.AddElement("Course", "Semester", editor.Semester.ToString()); insertHelper.AddElement("Course", "Subject", editor.Subject); insertHelper.AddElement("Course", "Domain", editor.Domain); insertHelper.AddElement("Course", "Period", editor.Period); insertHelper.AddElement("Course", "Credit", editor.Credit); insertHelper.AddElement("Course", "RefClassID", editor.RefClassID); insertHelper.AddElement("Course", "RefExamTemplateID", editor.RefAssessmentSetupID); insertHelper.AddElement("Course", "ScoreCalcFlag", editor.CalculationFlag); hasInsert = true; //synclist.Add(editor.ID); } #endregion #region 刪除 if (editor.EditorStatus == JHSchool.Editor.EditorStatus.Delete) { deleteHelper.AddElement("Course"); deleteHelper.AddElement("Course", "ID", editor.ID); hasDelete = true; synclist.Add(editor.ID); } #endregion } if (hasUpdate) { DSAServices.CallService("SmartSchool.Course.Update", new DSRequest(updateHelper.BaseElement)); } if (hasInsert) { DSXmlHelper response = DSAServices.CallService("SmartSchool.Course.Insert", new DSRequest(insertHelper.BaseElement)).GetContent(); foreach (XmlElement each in response.GetElements("NewID")) { synclist.Add(each.InnerText); } } if (hasDelete) { DSAServices.CallService("SmartSchool.Course.Delete", new DSRequest(deleteHelper.BaseElement)); } Course.Instance.SyncDataBackground(synclist); }; List <PackageWorkEventArgs <CourseRecordEditor> > packages = worker.Run(editors); foreach (PackageWorkEventArgs <CourseRecordEditor> each in packages) { if (each.HasException) { throw each.Exception; } } }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { //學生資訊 Dictionary <string, Data.JHStudentRecord> students = new Dictionary <string, JHSchool.Data.JHStudentRecord>(); //學生修課資訊 studentID -> List:SCAttendRecord Dictionary <string, List <Data.JHSCAttendRecord> > scattends = new Dictionary <string, List <JHSchool.Data.JHSCAttendRecord> >(); //學生修習的課程 courseID -> CourseRecord Dictionary <string, Data.JHCourseRecord> courses = new Dictionary <string, JHSchool.Data.JHCourseRecord>(); //所有課程(依學年度學期分開) schoolYear_semester -> (courseName -> CourseRecord) Dictionary <string, Dictionary <string, Data.JHCourseRecord> > allcourses = new Dictionary <string, Dictionary <string, JHSchool.Data.JHCourseRecord> >(); //studentID_schoolYear_semester -> List:courseName Dictionary <string, List <string> > semesterCourseName = new Dictionary <string, List <string> >(); //準備加入修課的資料 studentID -> (schoolYear_semester_courseName -> RowData) Dictionary <string, Dictionary <string, RowData> > prepareAttends = new Dictionary <string, Dictionary <string, RowData> >(); wizard.PackageLimit = 3000; if (Item != "社團") { wizard.ImportableFields.Add("課程系統編號"); } wizard.ImportableFields.AddRange("學年度", "學期"); if (Item != "社團") { wizard.ImportableFields.Add("課程名稱"); } else { wizard.ImportableFields.Add("社團名稱"); } wizard.ImportableFields.AddRange("班級", "座號"); wizard.RequiredFields.AddRange("學年度", "學期"); if (Item != "社團") { wizard.RequiredFields.Add("課程名稱"); } else { wizard.RequiredFields.Add("社團名稱"); } wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { #region 取得學生資訊 foreach (Data.JHStudentRecord stu in Data.JHStudent.SelectByIDs(e.List)) { if (!students.ContainsKey(stu.ID)) { students.Add(stu.ID, stu); } } #endregion #region 取得修課記錄 MultiThreadWorker <string> loader1 = new MultiThreadWorker <string>(); loader1.MaxThreads = 3; loader1.PackageSize = 250; loader1.PackageWorker += delegate(object sender1, PackageWorkEventArgs <string> e1) { foreach (Data.JHSCAttendRecord record in Data.JHSCAttend.SelectByStudentIDAndCourseID(e1.List, new string[] { })) { if (!scattends.ContainsKey(record.RefStudentID)) { scattends.Add(record.RefStudentID, new List <JHSchool.Data.JHSCAttendRecord>()); } scattends[record.RefStudentID].Add(record); if (!courses.ContainsKey(record.RefCourseID)) { courses.Add(record.RefCourseID, null); } } }; loader1.Run(e.List); #endregion #region 取得課程資訊 MultiThreadWorker <string> loader2 = new MultiThreadWorker <string>(); loader2.MaxThreads = 3; loader2.PackageSize = 250; loader2.PackageWorker += delegate(object sender2, PackageWorkEventArgs <string> e2) { foreach (Data.JHCourseRecord record in Data.JHCourse.SelectByIDs(new List <string>(e2.List))) { if (courses.ContainsKey(record.ID)) { courses[record.ID] = record; } } }; loader2.Run(courses.Keys); foreach (Data.JHCourseRecord course in Data.JHCourse.SelectAll()) { string key = course.SchoolYear + "_" + course.Semester; if (!allcourses.ContainsKey(key)) { allcourses.Add(key, new Dictionary <string, JHSchool.Data.JHCourseRecord>()); } if (!allcourses[key].ContainsKey(course.Name)) { allcourses[key].Add(course.Name, course); } } #endregion }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { int i; #region 檢查學生是否存在 Data.JHStudentRecord student = null; if (students.ContainsKey(e.Data.ID)) { student = students[e.Data.ID]; } else { e.ErrorMessage = "壓根就沒有這個學生" + e.Data.ID; return; } #endregion #region 驗證各個欄位格式 bool inputFormatPass = true; foreach (string field in e.SelectFields) { string value = e.Data[field]; switch (field) { default: break; case "學年度": case "學期": if (value == "" || !int.TryParse(value, out i)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入整數"); } break; case "課程名稱": if (value == "") { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入課程名稱"); } break; case "社團名稱": if (value == "") { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入社團名稱"); } break; case "班級": if (value == "") { } break; case "座號": if (value != "" && !int.TryParse(value, out i)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入空白或整數"); } break; } } #endregion //輸入格式正確才會針對情節做檢驗 #region 驗證各種情節 if (inputFormatPass) { string errorMessage = ""; string sy = e.Data["學年度"]; string se = e.Data["學期"]; string courseName = (Item != "社團") ? e.Data["課程名稱"] : e.Data["社團名稱"]; string key = e.Data.ID + "_" + sy + "_" + se; string semsKey = sy + "_" + se; //int schoolyear = Framework.Int.ParseInt(sy); //int semester = Framework.Int.ParseInt(se); #region 一個學年度學期不能有重覆的課程名稱 if (!semesterCourseName.ContainsKey(key)) { semesterCourseName.Add(key, new List <string>()); } if (semesterCourseName[key].Contains(courseName)) { if (Item != "社團") { errorMessage += (errorMessage == "" ? "" : "\n") + " 同一學年度學期不允許修習多筆相同名稱的課程"; } else { errorMessage += (errorMessage == "" ? "" : "\n") + " 同一學年度學期不允許參與多個相同名稱的社團"; } } else { semesterCourseName[key].Add(courseName); } #endregion #region 檢查課程是否存在系統中 bool noCourse = false; if (!allcourses.ContainsKey(semsKey)) { noCourse = true; if (Item != "社團") { errorMessage += (errorMessage == "" ? "" : "\n") + " 系統中找不到該課程"; } else { errorMessage += (errorMessage == "" ? "" : "\n") + " 系統中找不到該社團"; } } else if (!allcourses[semsKey].ContainsKey(courseName)) { noCourse = true; if (Item != "社團") { errorMessage += (errorMessage == "" ? "" : "\n") + " 系統中找不到該課程"; } else { errorMessage += (errorMessage == "" ? "" : "\n") + " 系統中找不到該社團"; } } else { } #endregion #region 檢查學生是否有修此課程 bool attended = false; if (scattends.ContainsKey(e.Data.ID)) { foreach (Data.JHSCAttendRecord record in scattends[e.Data.ID]) { if (courses[record.RefCourseID].Name == courseName && "" + courses[record.RefCourseID].SchoolYear == sy && "" + courses[record.RefCourseID].Semester == se) { attended = true; } } } else //學生沒修半堂課 { } if (!attended && !noCourse) { if (Item != "社團") { if (!e.WarningFields.ContainsKey("無修課記錄")) { e.WarningFields.Add("無修課記錄", "學生在此學期並無修習此課程,將會新增修課記錄"); } } else { if (!e.WarningFields.ContainsKey("無參與記錄")) { e.WarningFields.Add("無參與記錄", "學生在此學期並無參與此社團,將會新增參與記錄"); } } if (!prepareAttends.ContainsKey(e.Data.ID)) { prepareAttends.Add(e.Data.ID, new Dictionary <string, RowData>()); } if (!prepareAttends[e.Data.ID].ContainsKey(semsKey + "_" + courseName)) { prepareAttends[e.Data.ID].Add(semsKey + "_" + courseName, e.Data); } } #endregion e.ErrorMessage = errorMessage; } #endregion }; wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { Dictionary <string, List <RowData> > id_Rows = new Dictionary <string, List <RowData> >(); #region 分包裝 foreach (RowData data in e.Items) { if (!id_Rows.ContainsKey(data.ID)) { id_Rows.Add(data.ID, new List <RowData>()); } id_Rows[data.ID].Add(data); } #endregion List <Data.JHSCAttendRecord> insertList = new List <JHSchool.Data.JHSCAttendRecord>(); List <Data.JHSCAttendRecord> updateList = new List <JHSchool.Data.JHSCAttendRecord>(); //交叉比對各學生資料 #region 交叉比對各學生資料 foreach (string id in id_Rows.Keys) { Data.JHStudentRecord studentRec = students[id]; #region 處理要新增的修課記錄 if (prepareAttends.ContainsKey(id)) { foreach (RowData data in prepareAttends[id].Values) { string sy = data["學年度"]; string se = data["學期"]; string semsKey = sy + "_" + se; string courseName = (Item != "社團") ? data["課程名稱"] : data["社團名稱"]; if (allcourses.ContainsKey(semsKey) && allcourses[semsKey].ContainsKey(courseName)) { Data.JHSCAttendRecord record = new JHSchool.Data.JHSCAttendRecord(); record.RefStudentID = id; record.RefCourseID = allcourses[semsKey][courseName].ID; insertList.Add(record); } } } #endregion } try { if (updateList.Count > 0) { #region 分批次兩路上傳 List <List <Data.JHSCAttendRecord> > updatePackages = new List <List <JHSchool.Data.JHSCAttendRecord> >(); List <List <Data.JHSCAttendRecord> > updatePackages2 = new List <List <JHSchool.Data.JHSCAttendRecord> >(); { List <Data.JHSCAttendRecord> package = null; int count = 0; foreach (Data.JHSCAttendRecord var in updateList) { if (count == 0) { package = new List <Data.JHSCAttendRecord>(30); count = 30; if ((updatePackages.Count & 1) == 0) { updatePackages.Add(package); } else { updatePackages2.Add(package); } } package.Add(var); count--; } } Thread threadUpdateSemesterSubjectScore = new Thread(new ParameterizedThreadStart(Update)); threadUpdateSemesterSubjectScore.IsBackground = true; threadUpdateSemesterSubjectScore.Start(updatePackages); Thread threadUpdateSemesterSubjectScore2 = new Thread(new ParameterizedThreadStart(Update)); threadUpdateSemesterSubjectScore2.IsBackground = true; threadUpdateSemesterSubjectScore2.Start(updatePackages2); threadUpdateSemesterSubjectScore.Join(); threadUpdateSemesterSubjectScore2.Join(); #endregion } } catch (Exception ex) { } if (insertList.Count > 0) { #region 分批次兩路上傳 List <List <Data.JHSCAttendRecord> > insertPackages = new List <List <Data.JHSCAttendRecord> >(); List <List <Data.JHSCAttendRecord> > insertPackages2 = new List <List <Data.JHSCAttendRecord> >(); { List <Data.JHSCAttendRecord> package = null; int count = 0; foreach (Data.JHSCAttendRecord var in insertList) { if (count == 0) { package = new List <Data.JHSCAttendRecord>(30); count = 30; if ((insertPackages.Count & 1) == 0) { insertPackages.Add(package); } else { insertPackages2.Add(package); } } package.Add(var); count--; } } Thread threadInsertSemesterSubjectScore = new Thread(new ParameterizedThreadStart(Insert)); threadInsertSemesterSubjectScore.IsBackground = true; threadInsertSemesterSubjectScore.Start(insertPackages); Thread threadInsertSemesterSubjectScore2 = new Thread(new ParameterizedThreadStart(Insert)); threadInsertSemesterSubjectScore2.IsBackground = true; threadInsertSemesterSubjectScore2.Start(insertPackages2); threadInsertSemesterSubjectScore.Join(); threadInsertSemesterSubjectScore2.Join(); #endregion } if (Item != "社團") { FISCA.LogAgent.ApplicationLog.Log("成績系統.匯入匯出", "匯入課程修課學生", "總共匯入" + (insertList.Count + updateList.Count) + "筆課程修課學生。"); } #endregion }; }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { // 取得學生資料 Dictionary <string, JHStudentRecord> Students = new Dictionary <string, JHStudentRecord>(); // 取得異動資料 Dictionary <string, List <JHUpdateRecordRecord> > UpdateRecs = new Dictionary <string, List <JHUpdateRecordRecord> >(); wizard.PackageLimit = 3000; wizard.ImportableFields.AddRange("學年度", "學期", "異動年級", "異動日期", "備註", "異動班級", "異動姓名", "異動身分證號", "異動學號", "異動性別", "異動生日", "異動地址", "核准日期", "核准文號", "學籍核准日期", "學籍核准文號", "異動座號", "異動類別"); wizard.RequiredFields.AddRange("異動類別", "異動日期", "學年度", "學期"); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { Students.Clear(); UpdateRecs.Clear(); // 取得學生資料 foreach (JHStudentRecord studRec in JHStudent.SelectByIDs(e.List)) { if (!Students.ContainsKey(studRec.ID)) { Students.Add(studRec.ID, studRec); } } foreach (string str in Students.Keys) { List <JHUpdateRecordRecord> UpdRecList = new List <JHUpdateRecordRecord>(); UpdateRecs.Add(str, UpdRecList); } // 取得異動 MultiThreadWorker <string> loader1 = new MultiThreadWorker <string>(); loader1.MaxThreads = 3; loader1.PackageSize = 250; loader1.PackageWorker += delegate(object sender1, PackageWorkEventArgs <string> e1) { foreach (JHUpdateRecordRecord UpdRec in JHUpdateRecord.SelectByStudentIDs(e.List)) { // 續讀 if (UpdRec.UpdateCode == "8") { if (UpdateRecs.ContainsKey(UpdRec.StudentID)) { UpdateRecs[UpdRec.StudentID].Add(UpdRec); } } } }; loader1.Run(e.List); }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { int i = 0; DateTime dt; // 檢查學生是否存在 JHStudentRecord studRec = null; if (Students.ContainsKey(e.Data.ID)) { studRec = Students[e.Data.ID]; } else { e.ErrorMessage = "沒有這位學生" + e.Data.ID; return; } // 驗證格式資料 bool InputFormatPass = true; foreach (string field in e.SelectFields) { string value = e.Data[field].Trim(); //// 驗證$無法匯入 //if (value.IndexOf('$') > -1) //{ // e.ErrorFields.Add(field, "儲存格有$無法匯入."); // break; //} switch (field) { default: break; case "異動類別": if (value != "續讀") { InputFormatPass &= false; e.ErrorFields.Add(field, "必須填入續讀"); } break; case "學年度": int.TryParse(value, out i); if (string.IsNullOrEmpty(value) || i < 1) { InputFormatPass &= false; e.ErrorFields.Add(field, "必須填入整數"); } break; case "學期": int.TryParse(value, out i); if (string.IsNullOrEmpty(value) || i < 1) { InputFormatPass &= false; e.ErrorFields.Add(field, "必須填入整數"); } if (i > 2) { InputFormatPass &= false; e.ErrorFields.Add(field, "必須填入整數,1或2"); } break; case "異動年級": int.TryParse(value, out i); if (string.IsNullOrEmpty(value) || i < 1) { InputFormatPass &= false; e.WarningFields.Add(field, "請填入整數"); } break; case "異動座號": int.TryParse(value, out i); if (string.IsNullOrEmpty(value) || i < 1) { e.WarningFields.Add(field, "請填入整數"); } break; case "異動日期": if (string.IsNullOrEmpty(value) || DateTime.TryParse(value, out dt) == false) { InputFormatPass &= false; e.ErrorFields.Add(field, "必須填入日期,例如2009/1/1"); } break; case "異動生日": if (!string.IsNullOrEmpty(value)) { if (DateTime.TryParse(value, out dt) == false) { InputFormatPass &= false; e.ErrorFields.Add(field, "必須填入日期,例如2009/1/1"); } } break; case "學籍核准日期": if (!string.IsNullOrEmpty(value)) { if (DateTime.TryParse(value, out dt) == false) { InputFormatPass &= false; e.ErrorFields.Add(field, "必須填入日期,例如2009/1/1"); } } break; case "核准日期": if (!string.IsNullOrEmpty(value)) { if (DateTime.TryParse(value, out dt) == false) { InputFormatPass &= false; e.ErrorFields.Add(field, "必須填入日期,例如2009/1/1"); } } break; case "異動性別": if (value == "男" || value == "女" || value == "") { } else { e.WarningFields.Add(field, "請填入男或女"); } break; } } }; wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { Dictionary <string, List <RowData> > id_Rows = new Dictionary <string, List <RowData> >(); foreach (RowData data in e.Items) { if (!id_Rows.ContainsKey(data.ID)) { id_Rows.Add(data.ID, new List <RowData>()); } id_Rows[data.ID].Add(data); } List <JHUpdateRecordRecord> InsertList = new List <JHUpdateRecordRecord>(); List <JHUpdateRecordRecord> UpdateList = new List <JHUpdateRecordRecord>(); foreach (string id in id_Rows.Keys) { int schoolYear, Semester; string GrYear = ""; DateTime dt; foreach (RowData data in id_Rows[id]) { if (!UpdateRecs.ContainsKey(id)) { continue; } int.TryParse(data["學年度"], out schoolYear); int.TryParse(data["學期"], out Semester); DateTime.TryParse(data["異動日期"], out dt); if (data.ContainsKey("異動年級")) { GrYear = data["異動年級"]; } JHUpdateRecordRecord updateRec = null; foreach (JHUpdateRecordRecord urr in UpdateRecs[id]) { if (urr.SchoolYear == schoolYear && urr.Semester == Semester) { DateTime dt1; DateTime.TryParse(urr.UpdateDate, out dt1); if (dt == dt1) { updateRec = urr; } } } bool isInsert = true; if (updateRec == null) { updateRec = new JHUpdateRecordRecord(); updateRec.StudentID = id; } else { isInsert = false; } bool checkData = false; foreach (string field in e.ImportFields) { string value = data[field].Trim(); switch (field) { case "異動類別": if (value == "續讀") { updateRec.UpdateCode = "8"; checkData = true; } break; case "學年度": int scYear; if (int.TryParse(value, out scYear)) { updateRec.SchoolYear = scYear; checkData = true; } break; case "學期": int Sems; if (int.TryParse(value, out Sems)) { updateRec.Semester = Sems; checkData = true; } break; case "異動年級": updateRec.GradeYear = GrYear; break; case "異動日期": DateTime dtd; if (DateTime.TryParse(value, out dtd)) { updateRec.UpdateDate = dtd.ToShortDateString(); } break; case "備註": updateRec.Comment = value; break; case "學籍核准日期": DateTime dtLD; if (DateTime.TryParse(value, out dtLD)) { updateRec.LastADDate = dtLD.ToShortDateString(); } break; case "學籍核准文號": updateRec.LastADNumber = value; break; case "異動班級": updateRec.OriginClassName = value; break; case "異動姓名": updateRec.StudentName = value; break; case "異動身分證號": updateRec.IDNumber = value; break; case "異動地址": updateRec.OriginAddress = value; break; case "異動學號": updateRec.StudentNumber = value; break; case "異動性別": if (value == "男" || value == "女" || value == "") { updateRec.Gender = value; } break; case "異動生日": DateTime dtb; if (DateTime.TryParse(value, out dtb)) { updateRec.Birthdate = dtb.ToShortDateString(); } break; case "異動座號": int no; if (int.TryParse(value, out no)) { updateRec.SeatNo = no + ""; } break; case "核准日期": DateTime dtAd; if (DateTime.TryParse(value, out dtAd)) { updateRec.ADDate = dtAd.ToShortDateString(); } break; case "核准文號": updateRec.ADNumber = value; break; } } if (string.IsNullOrEmpty(updateRec.StudentID) || string.IsNullOrEmpty(updateRec.UpdateDate) || string.IsNullOrEmpty(updateRec.UpdateCode)) { continue; } else { if (isInsert) { InsertList.Add(updateRec); } else { UpdateList.Add(updateRec); } } } } try { if (InsertList.Count > 0) { Insert(InsertList); } if (UpdateList.Count > 0) { Update(UpdateList); } JHSchool.PermRecLogProcess prlp = new JHSchool.PermRecLogProcess(); prlp.SaveLog("學生.匯入異動", "匯入續讀異動", "匯入續讀異動:共新增" + InsertList.Count + "筆資料,共更新:" + UpdateList.Count + "筆資料"); JHSchool.Student.Instance.SyncAllBackground(); } catch (Exception ex) { } }; }
/// <summary> /// 儲存所有教授設定。 /// </summary> /// <param name="records"></param> public static void SaveAllEditors(this IEnumerable <TCInstructRecordEditor> records) { MultiThreadWorker <TCInstructRecordEditor> worker = new MultiThreadWorker <TCInstructRecordEditor>(); worker.MaxThreads = 3; worker.PackageSize = 100; worker.PackageWorker += delegate(object sender, PackageWorkEventArgs <TCInstructRecordEditor> e) { DSXmlHelper updateHelper = new DSXmlHelper("Request"); DSXmlHelper insertHelper = new DSXmlHelper("Request"); DSXmlHelper deleteHelper = new DSXmlHelper("Request"); List <string> synclist = new List <string>(); bool hasUpdate = false; bool hasInsert = false; bool hasRemove = false; foreach (var editor in e.List) { if (editor.EditorStatus == EditorStatus.Insert) { #region 新增修課 insertHelper.AddElement("Instruct"); insertHelper.AddElement("Instruct", "RefTeacherID", editor.RefTeacherID); insertHelper.AddElement("Instruct", "RefCourseID", editor.RefCourseID); insertHelper.AddElement("Instruct", "Sequence", editor.Sequence); hasInsert = true; #endregion } if (editor.EditorStatus == EditorStatus.Update) { #region 修改 updateHelper.AddElement("Instruct"); updateHelper.AddElement("Instruct", "RefTeacherID", editor.RefTeacherID); updateHelper.AddElement("Instruct", "RefCourseID", editor.RefCourseID); updateHelper.AddElement("Instruct", "Sequence", editor.Sequence); updateHelper.AddElement("Instruct", "Condition"); updateHelper.AddElement("Instruct/Condition", "ID", editor.TCInstructRecord.ID); synclist.Add(editor.TCInstructRecord.ID); hasUpdate = true; #endregion } if (editor.EditorStatus == EditorStatus.Delete) { #region 刪除 deleteHelper.AddElement("Instruct"); deleteHelper.AddElement("Instruct", "ID", editor.TCInstructRecord.ID); synclist.Add(editor.TCInstructRecord.ID); hasRemove = true; #endregion } } if (hasInsert) { DSResponse resp = FISCA.Authentication.DSAServices.CallService("SmartSchool.Course.InsertTCInstruct", new DSRequest(insertHelper.BaseElement)); foreach (var item in resp.GetContent().GetElements("NewID")) { synclist.Add(item.InnerText); } } if (hasUpdate) { FISCA.Authentication.DSAServices.CallService("SmartSchool.Course.UpdateTCInstruct", new DSRequest(updateHelper.BaseElement)); } if (hasRemove) { FISCA.Authentication.DSAServices.CallService("SmartSchool.Course.DeleteTCInstruct", new DSRequest(deleteHelper.BaseElement)); } if (synclist.Count > 0) { TCInstruct.Instance.SyncDataBackground(synclist); } }; List <PackageWorkEventArgs <TCInstructRecordEditor> > packages = worker.Run(records); foreach (PackageWorkEventArgs <TCInstructRecordEditor> each in packages) { if (each.HasException) { throw each.Exception; } } }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { Dictionary <string, int> _ID_SchoolYear_Semester_GradeYear = new Dictionary <string, int>(); Dictionary <string, List <string> > _ID_SchoolYear_Semester_Subject = new Dictionary <string, List <string> >(); Dictionary <string, JHStudentRecord> _StudentCollection = new Dictionary <string, JHStudentRecord>(); Dictionary <JHStudentRecord, Dictionary <int, decimal> > _StudentPassScore = new Dictionary <JHStudentRecord, Dictionary <int, decimal> >(); wizard.PackageLimit = 3000; wizard.ImportableFields.AddRange("領域", "分數評量"); wizard.RequiredFields.AddRange("領域", "分數評量"); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { #region ValidateStart _ID_SchoolYear_Semester_GradeYear.Clear(); _ID_SchoolYear_Semester_Subject.Clear(); _StudentCollection.Clear(); List <JHStudentRecord> list = JHStudent.SelectByIDs(e.List); MultiThreadWorker <JHStudentRecord> loader = new MultiThreadWorker <JHStudentRecord>(); loader.MaxThreads = 3; loader.PackageSize = 250; loader.PackageWorker += delegate(object sender1, PackageWorkEventArgs <JHStudentRecord> e1) { GradScore.Instance.SyncDataBackground(e.List); }; loader.Run(list); foreach (JHStudentRecord stu in list) { if (!_StudentCollection.ContainsKey(stu.ID)) { _StudentCollection.Add(stu.ID, stu); } } #endregion }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { #region ValidateRow int t; decimal d; JHStudentRecord student; if (_StudentCollection.ContainsKey(e.Data.ID)) { student = _StudentCollection[e.Data.ID]; } else { e.ErrorMessage = "壓根就沒有這個學生" + e.Data.ID; return; } bool inputFormatPass = true; #region 驗各欄位填寫格式 foreach (string field in e.SelectFields) { string value = e.Data[field]; switch (field) { default: break; case "領域": //if (value == "") //{ // inputFormatPass &= false; // e.ErrorFields.Add(field, "必須填寫"); //} //else if (!Domains.Contains(value)) //{ // inputFormatPass &= false; // e.ErrorFields.Add(field, "必須為七大領域、學習領域、課程學習"); //} break; case "分數評量": if (value != "" && !decimal.TryParse(value, out d)) { inputFormatPass &= false; e.ErrorFields.Add(field, "必須填入空白或數值"); } break; } } #endregion //輸入格式正確才會針對情節做檢驗 if (inputFormatPass) { string errorMessage = ""; string key = e.Data.ID; string skey = e.Data["領域"]; if (!_ID_SchoolYear_Semester_Subject.ContainsKey(key)) { _ID_SchoolYear_Semester_Subject.Add(key, new List <string>()); } if (_ID_SchoolYear_Semester_Subject[key].Contains(skey)) { errorMessage += (errorMessage == "" ? "" : "\n") + "同一學生不允許多筆相同畢業領域的資料"; } else { _ID_SchoolYear_Semester_Subject[key].Add(skey); } e.ErrorMessage = errorMessage; } #endregion }; wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { #region ImportPackage Dictionary <string, List <RowData> > id_Rows = new Dictionary <string, List <RowData> >(); #region 分包裝 foreach (RowData data in e.Items) { if (!id_Rows.ContainsKey(data.ID)) { id_Rows.Add(data.ID, new List <RowData>()); } id_Rows[data.ID].Add(data); } #endregion Dictionary <string, GradScoreRecordEditor> gradDict = new Dictionary <string, GradScoreRecordEditor>(); //交叉比對各學生資料 #region 交叉比對各學生資料 foreach (string id in id_Rows.Keys) { JHStudentRecord studentRec = _StudentCollection[id]; GradScoreRecord record = GradScore.Instance.Items[studentRec.ID]; GradScoreRecordEditor editor = null; if (record != null) { editor = record.GetEditor(); } else { editor = new GradScoreRecordEditor(Student.Instance.Items[studentRec.ID]); } if (!gradDict.ContainsKey(studentRec.ID)) { gradDict.Add(studentRec.ID, editor); } //要匯入的學期科目成績 Dictionary <string, RowData> importScoreDictionary = new Dictionary <string, RowData>(); #region 整理要匯入的資料 foreach (RowData row in id_Rows[id]) { int t; string domain = row["領域"]; if (!importScoreDictionary.ContainsKey(domain)) { importScoreDictionary.Add(domain, row); } } #endregion //開始處理ImportScore foreach (string domain in importScoreDictionary.Keys) { RowData data = importScoreDictionary[domain]; if (domain == "學習領域") { decimal d; if (decimal.TryParse(data["分數評量"], out d)) { editor.LearnDomainScore = d; } else { editor.LearnDomainScore = null; } } else if (domain == "課程學習") { decimal d; if (decimal.TryParse(data["分數評量"], out d)) { editor.CourseLearnScore = d; } else { editor.CourseLearnScore = null; } } else { if (!editor.Domains.ContainsKey(domain)) { editor.Domains.Add(domain, new GradDomainScore(domain)); } decimal d; if (decimal.TryParse(data["分數評量"], out d)) { editor.Domains[domain].Score = d; } else { editor.Domains[domain].Score = null; } } } } #endregion if (gradDict.Values.Count > 0) { #region 分批次兩路上傳 List <List <GradScoreRecordEditor> > updatePackages = new List <List <GradScoreRecordEditor> >(); List <List <GradScoreRecordEditor> > updatePackages2 = new List <List <GradScoreRecordEditor> >(); { List <GradScoreRecordEditor> package = null; int count = 0; foreach (GradScoreRecordEditor var in gradDict.Values) { if (count == 0) { package = new List <GradScoreRecordEditor>(30); count = 30; if ((updatePackages.Count & 1) == 0) { updatePackages.Add(package); } else { updatePackages2.Add(package); } } package.Add(var); count--; } } Thread threadUpdateSemesterSubjectScore = new Thread(new ParameterizedThreadStart(updateSemesterSubjectScore)); threadUpdateSemesterSubjectScore.IsBackground = true; threadUpdateSemesterSubjectScore.Start(updatePackages); Thread threadUpdateSemesterSubjectScore2 = new Thread(new ParameterizedThreadStart(updateSemesterSubjectScore)); threadUpdateSemesterSubjectScore2.IsBackground = true; threadUpdateSemesterSubjectScore2.Start(updatePackages2); threadUpdateSemesterSubjectScore.Join(); threadUpdateSemesterSubjectScore2.Join(); #endregion } FISCA.LogAgent.ApplicationLog.Log("成績系統.匯入匯出", "匯入畢業成績", "總共匯入" + gradDict.Values.Count + "筆畢業成績。"); #endregion }; wizard.ImportComplete += delegate { //EventHub.Instance.InvokScoreChanged(new List<string>(_StudentCollection.Keys).ToArray()); }; }
/// <summary> /// 批次儲存多個Editor /// </summary> /// <param name="editors"></param> internal static void SaveAttendanceRecordEditor(IEnumerable <AttendanceRecordEditor> editors) { MultiThreadWorker <AttendanceRecordEditor> worker = new MultiThreadWorker <AttendanceRecordEditor>(); worker.MaxThreads = 3; worker.PackageSize = 100; worker.PackageWorker += delegate(object sender, PackageWorkEventArgs <AttendanceRecordEditor> e) { List <string> primarykeys = new List <string>(); DSXmlHelper insertHelper = new DSXmlHelper("Request"); DSXmlHelper updateHelper = new DSXmlHelper("Request"); DSXmlHelper deleteHelper = new DSXmlHelper("Request"); bool hasInsert = false; bool hasUpdate = false; bool hasRemove = false; foreach (var editor in e.List) { primarykeys.Add(editor.RefStudentID); switch (editor.EditorStatus) { #region 新增 case EditorStatus.Insert: insertHelper.AddElement("Attendance"); insertHelper.AddElement("Attendance", "Field"); insertHelper.AddElement("Attendance/Field", "RefStudentID", editor.RefStudentID); insertHelper.AddElement("Attendance/Field", "SchoolYear", editor.SchoolYear); insertHelper.AddElement("Attendance/Field", "Semester", editor.Semester); insertHelper.AddElement("Attendance/Field", "OccurDate", editor.OccurDate); insertHelper.AddElement("Attendance/Field", "Detail"); insertHelper.AddElement("Attendance/Field/Detail", "Attendance"); foreach (var period in editor.PeriodDetail) { XmlElement node = insertHelper.AddElement("Attendance/Field/Detail/Attendance", "Period", period.Period); node.SetAttribute("AbsenceType", period.AbsenceType); //node.SetAttribute("AttendanceType", period.AttendanceType); } hasInsert = true; break; #endregion #region 修改 case EditorStatus.Update: updateHelper.AddElement("Attendance"); updateHelper.AddElement("Attendance", "Field"); updateHelper.AddElement("Attendance/Field", "RefStudentID", editor.RefStudentID); updateHelper.AddElement("Attendance/Field", "SchoolYear", editor.SchoolYear); updateHelper.AddElement("Attendance/Field", "Semester", editor.Semester); updateHelper.AddElement("Attendance/Field", "OccurDate", editor.OccurDate); updateHelper.AddElement("Attendance/Field", "Detail"); updateHelper.AddElement("Attendance/Field/Detail", "Attendance"); foreach (var period in editor.PeriodDetail) { XmlElement node = updateHelper.AddElement("Attendance/Field/Detail/Attendance", "Period", period.Period); node.SetAttribute("AbsenceType", period.AbsenceType); //node.SetAttribute("AttendanceType", period.AttendanceType); } updateHelper.AddElement("Attendance", "Condition"); updateHelper.AddElement("Attendance/Condition", "ID", editor.ID); updateHelper.AddElement("Attendance/Condition", "RefStudentID", editor.RefStudentID); hasUpdate = true; break; #endregion #region 刪除 case EditorStatus.Delete: deleteHelper.AddElement("Attendance"); deleteHelper.AddElement("Attendance", "ID", editor.ID); hasRemove = true; break; #endregion } } if (hasInsert) { K12.Data.Utility.DSAServices.CallService(INSERT_ATTENDANCE, new DSRequest(insertHelper.BaseElement)); } if (hasUpdate) { K12.Data.Utility.DSAServices.CallService(UPDATE_ATTENDANCE, new DSRequest(updateHelper.BaseElement)); } if (hasRemove) { K12.Data.Utility.DSAServices.CallService(DELETE_ATTENDANCE, new DSRequest(deleteHelper.BaseElement)); } if (primarykeys.Count > 0) { //Attendance.Instance.SyncDataBackground(primarykeys.ToArray()); } }; List <PackageWorkEventArgs <AttendanceRecordEditor> > packages = worker.Run(editors); foreach (PackageWorkEventArgs <AttendanceRecordEditor> each in packages) { if (each.HasException) { throw each.Exception; } } }
public static void SaveCourseRecordEditor(IEnumerable<CourseRecordEditor> editors) { MultiThreadWorker<CourseRecordEditor> worker = new MultiThreadWorker<CourseRecordEditor>(); worker.MaxThreads = 3; worker.PackageSize = 100; worker.PackageWorker += delegate(object sender, PackageWorkEventArgs<CourseRecordEditor> e) { DSXmlHelper updateHelper = new DSXmlHelper("Request"); DSXmlHelper insertHelper = new DSXmlHelper("Request"); DSXmlHelper deleteHelper = new DSXmlHelper("Request"); List<string> synclist = new List<string>(); bool hasUpdate = false, hasInsert = false, hasDelete = false; foreach (var editor in e.List) { #region 更新 if (editor.EditorStatus == SchoolCore.Editor.EditorStatus.Update) { updateHelper.AddElement("Course"); updateHelper.AddElement("Course", "Field"); updateHelper.AddElement("Course/Field", "CourseName", editor.Name); updateHelper.AddElement("Course/Field", "SchoolYear", editor.SchoolYear.ToString()); updateHelper.AddElement("Course/Field", "Semester", editor.Semester.ToString()); updateHelper.AddElement("Course/Field", "Subject", editor.Subject); updateHelper.AddElement("Course/Field", "Domain", editor.Domain); updateHelper.AddElement("Course/Field", "Period", editor.Period); updateHelper.AddElement("Course/Field", "Credit", editor.Credit); updateHelper.AddElement("Course/Field", "RefClassID", editor.RefClassID); updateHelper.AddElement("Course/Field", "RefExamTemplateID", editor.RefAssessmentSetupID); updateHelper.AddElement("Course/Field", "ScoreCalcFlag", editor.CalculationFlag); updateHelper.AddElement("Course", "Condition"); updateHelper.AddElement("Course/Condition", "ID", editor.ID); hasUpdate = true; synclist.Add(editor.ID); } #endregion #region 新增 if (editor.EditorStatus == SchoolCore.Editor.EditorStatus.Insert) { insertHelper.AddElement("Course"); //insertHelper.AddElement("Course", "Field"); insertHelper.AddElement("Course", "CourseName", editor.Name); insertHelper.AddElement("Course", "SchoolYear", editor.SchoolYear.ToString()); insertHelper.AddElement("Course", "Semester", editor.Semester.ToString()); insertHelper.AddElement("Course", "Subject", editor.Subject); insertHelper.AddElement("Course", "Domain", editor.Domain); insertHelper.AddElement("Course", "Period", editor.Period); insertHelper.AddElement("Course", "Credit", editor.Credit); insertHelper.AddElement("Course", "RefClassID", editor.RefClassID); insertHelper.AddElement("Course", "RefExamTemplateID", editor.RefAssessmentSetupID); insertHelper.AddElement("Course", "ScoreCalcFlag", editor.CalculationFlag); hasInsert = true; //synclist.Add(editor.ID); } #endregion #region 刪除 if (editor.EditorStatus == SchoolCore.Editor.EditorStatus.Delete) { deleteHelper.AddElement("Course"); deleteHelper.AddElement("Course", "ID", editor.ID); hasDelete = true; synclist.Add(editor.ID); } #endregion } if (hasUpdate) DSAServices.CallService("SmartSchool.Course.Update", new DSRequest(updateHelper.BaseElement)); if (hasInsert) { DSXmlHelper response = DSAServices.CallService("SmartSchool.Course.Insert", new DSRequest(insertHelper.BaseElement)).GetContent(); foreach (XmlElement each in response.GetElements("NewID")) synclist.Add(each.InnerText); } if (hasDelete) DSAServices.CallService("SmartSchool.Course.Delete", new DSRequest(deleteHelper.BaseElement)); Course.Instance.SyncDataBackground(synclist); }; List<PackageWorkEventArgs<CourseRecordEditor>> packages = worker.Run(editors); foreach (PackageWorkEventArgs<CourseRecordEditor> each in packages) { if (each.HasException) throw each.Exception; } }
void _BWResitScoreImport_DoWork(object sender, DoWorkEventArgs e) { object[] objectValue = (object[])e.Argument; int schoolyear = (int)objectValue[0]; int semester = (int)objectValue[1]; _BWResitScoreImport.ReportProgress(0); #region 取得所有學生以及補考資訊 AccessHelper helper = new AccessHelper(); List <StudentRecord> allStudents = new List <StudentRecord>(); List <ClassRecord> allClasses = helper.ClassHelper.GetAllClass(); WearyDogComputer computer = new WearyDogComputer(); double currentClass = 1; double totalClasses = allClasses.Count; List <StudentRecord> loadCourseStudents = new List <StudentRecord>(); foreach (ClassRecord aClass in allClasses) { List <StudentRecord> classStudents = aClass.Students; computer.FillSemesterSubjectScoreInfoWithResit(helper, true, classStudents); helper.StudentHelper.FillField("及格標準", classStudents); allStudents.AddRange(classStudents); foreach (StudentRecord aStudent in classStudents) { foreach (SemesterSubjectScoreInfo info in aStudent.SemesterSubjectScoreList) { if (info.SchoolYear == schoolyear && info.Semester == semester) { if (!info.Pass && info.Detail.HasAttribute("達補考標準") && info.Detail.GetAttribute("達補考標準") == "是") { if (!loadCourseStudents.Contains(aStudent)) { loadCourseStudents.Add(aStudent); } } } } } _BWResitScoreImport.ReportProgress((int)(currentClass++ *90.0 / totalClasses)); } MultiThreadWorker <StudentRecord> multiThreadWorker = new MultiThreadWorker <StudentRecord>(); multiThreadWorker.MaxThreads = 3; multiThreadWorker.PackageSize = 80; multiThreadWorker.PackageWorker += new EventHandler <PackageWorkEventArgs <StudentRecord> >(multiThreadWorker_PackageWorker); multiThreadWorker.Run(loadCourseStudents, new object[] { schoolyear, semester, helper }); double currentStudent = 1; double totalStudents = allStudents.Count; #endregion #region 產生表格並填入資料 Workbook template = new Workbook(); template.Open(new MemoryStream(Properties.Resources.補考成績匯入), FileFormatType.Excel2003); Workbook wb = new Workbook(); wb.Copy(template); Worksheet ws = wb.Worksheets[0]; Dictionary <string, int> columnIndexTable = new Dictionary <string, int>(); int headerIndex = 0; string headerString = template.Worksheets[0].Cells[0, headerIndex].StringValue; while (!string.IsNullOrEmpty(headerString)) { columnIndexTable.Add(headerString, headerIndex); headerString = template.Worksheets[0].Cells[0, ++headerIndex].StringValue; } foreach (StudentRecord aStudent in loadCourseStudents) { foreach (SemesterSubjectScoreInfo info in aStudent.SemesterSubjectScoreList) { if (info.SchoolYear == schoolyear && info.Semester == semester) { if (!info.Pass && info.Detail.HasAttribute("達補考標準") && info.Detail.GetAttribute("達補考標準") == "是") { #region 搜尋授課教師 foreach (StudentAttendCourseRecord attendCourse in aStudent.AttendCourseList) { if (attendCourse.SchoolYear == schoolyear && attendCourse.Semester == semester && attendCourse.Subject == info.Subject && attendCourse.SubjectLevel == info.Level) { List <TeacherRecord> teachers = helper.TeacherHelper.GetLectureTeacher(attendCourse); if (teachers.Count > 0) { info.Detail.SetAttribute("授課教師", teachers[0].TeacherName); } } } #endregion machine.AddSubject(aStudent, info); } } } _BWResitScoreImport.ReportProgress(90 + (int)(currentStudent++ *10.0 / totalStudents)); } machine.Sort(); int index = 1; foreach (Dictionary <string, string> info in machine.GetSubjects()) { foreach (string key in info.Keys) { ws.Cells[index, columnIndexTable[key]].PutValue(info[key]); } index++; } #endregion e.Result = wb; }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { // 取得學生資料 Dictionary<string, StudentRecord> Students = new Dictionary<string, StudentRecord>(); // 取得自訂資料欄位資料 Dictionary<string,List<DAL.UserDefData>> UserDefDataDict = new Dictionary<string,List<UserDefineData.DAL.UserDefData>> (); // 取得使用這設定 Dictionary<string, string> UserSetDataTypeDict = new Dictionary<string, string>(); wizard.PackageLimit = 3000; wizard.ImportableFields.AddRange("欄位名稱","值"); wizard.RequiredFields.AddRange("欄位名稱"); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { Students.Clear(); UserDefDataDict.Clear(); UserSetDataTypeDict.Clear(); UserSetDataTypeDict = Global.GetUserConfigData(); // 取得學生資料 foreach (StudentRecord studRec in Student.SelectByIDs(e.List)) if (!Students.ContainsKey(studRec.ID)) Students.Add(studRec.ID, studRec); // 取得自訂資料欄位 MultiThreadWorker<string> loader1 = new MultiThreadWorker<string>(); loader1.MaxThreads = 3; loader1.PackageSize = 250; loader1.PackageWorker += delegate(object sender1, PackageWorkEventArgs<string> e1) { foreach (DAL.UserDefData udd in UDTTransfer.GetDataFromUDT(e.List.ToList<string>())) { if(UserDefDataDict.ContainsKey(udd.RefID )) UserDefDataDict[udd.RefID].Add(udd); else { List<DAL.UserDefData> dd = new List<UserDefineData.DAL.UserDefData>(); dd.Add(udd); UserDefDataDict.Add(udd.RefID,dd); } } }; loader1.Run(e.List); }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { int i = 0; // 檢查學生是否存在 StudentRecord studRec = null; if (Students.ContainsKey(e.Data.ID)) studRec = Students[e.Data.ID]; else { e.ErrorMessage = "沒有這位學生" + e.Data.ID; return; } // 驗證格式資料 // 檢查每位學生欄位是否有重複 List<string> CheckSameList = new List<string>(); bool InputFormatPass = true; foreach (string field in e.SelectFields) { string value = e.Data[field].Trim(); switch (field) { default: break; case "欄位名稱": if (string.IsNullOrEmpty(value)) { InputFormatPass &= false; e.ErrorFields.Add(field, "不允許空白"); } string key = e.Data.ID + value; if (CheckSameList.Contains(key)) { InputFormatPass &= false; e.ErrorFields.Add(field, "欄位名稱:"+value+" 不允許重複"); } CheckSameList.Add(key); break; case "值": decimal dd; DateTime dt; if (!string.IsNullOrEmpty(value)) { if (e.Data.ContainsKey("欄位名稱")) { string str = e.Data["欄位名稱"]; if (UserSetDataTypeDict.ContainsKey(str)) { if (UserSetDataTypeDict[str] == "Number") { if (!decimal.TryParse(value, out dd)) { e.ErrorFields.Add(field, "非數字型態"); InputFormatPass &= false; break; } } if (UserSetDataTypeDict[str] == "Date") { if (!DateTime.TryParse(value, out dt)) { e.ErrorFields.Add(field, "非日期型態"); InputFormatPass &= false; break; } } } } } break; } } }; wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { Dictionary<string, List<RowData>> id_Rows = new Dictionary<string, List<RowData>>(); foreach (RowData data in e.Items) { if (!id_Rows.ContainsKey(data.ID)) id_Rows.Add(data.ID, new List<RowData>()); id_Rows[data.ID].Add(data); } List<DAL.UserDefData> InsertList = new List<UserDefineData.DAL.UserDefData> (); List<DAL.UserDefData> DeleteList = new List<UserDefineData.DAL.UserDefData>(); foreach (string id in id_Rows.Keys) { foreach (RowData data in id_Rows[id]) { string FName = string.Empty, Value = string.Empty; if (data.ContainsKey("欄位名稱")) FName = data["欄位名稱"]; if (data.ContainsKey("值")) Value = data["值"]; // 將需要刪除放入 if (UserDefDataDict.ContainsKey(id)) foreach (DAL.UserDefData udd in UserDefDataDict[id]) if (udd.FieldName == FName) { udd.Deleted = true; DeleteList.Add(udd); } // 新增資料 DAL.UserDefData uddNew = new UserDefineData.DAL.UserDefData(); uddNew.FieldName = FName; uddNew.RefID = id; uddNew.Value = Value; InsertList.Add(uddNew); } } try { // 先刪除舊的資料在新增新的 if(DeleteList.Count >0) UDTTransfer.DeleteDataToUDT(DeleteList); if (InsertList.Count > 0) UDTTransfer.InsertDataToUDT(InsertList ); JHSchool.Student.Instance.SyncAllBackground(); } catch (Exception ex) { } }; }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { // 取得學生資料 Dictionary <string, StudentRecord> Students = new Dictionary <string, StudentRecord>(); // 取得自訂資料欄位資料 Dictionary <string, List <DAL.UserDefData> > UserDefDataDict = new Dictionary <string, List <UserDefineData.DAL.UserDefData> > (); // 取得使用這設定 Dictionary <string, string> UserSetDataTypeDict = new Dictionary <string, string>(); wizard.PackageLimit = 3000; wizard.ImportableFields.AddRange("欄位名稱", "值"); wizard.RequiredFields.AddRange("欄位名稱"); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { Students.Clear(); UserDefDataDict.Clear(); UserSetDataTypeDict.Clear(); UserSetDataTypeDict = Global.GetUserConfigData(); // 取得學生資料 foreach (StudentRecord studRec in Student.SelectByIDs(e.List)) { if (!Students.ContainsKey(studRec.ID)) { Students.Add(studRec.ID, studRec); } } // 取得自訂資料欄位 MultiThreadWorker <string> loader1 = new MultiThreadWorker <string>(); loader1.MaxThreads = 3; loader1.PackageSize = 250; loader1.PackageWorker += delegate(object sender1, PackageWorkEventArgs <string> e1) { foreach (DAL.UserDefData udd in UDTTransfer.GetDataFromUDT(e.List.ToList <string>())) { if (UserDefDataDict.ContainsKey(udd.RefID)) { UserDefDataDict[udd.RefID].Add(udd); } else { List <DAL.UserDefData> dd = new List <UserDefineData.DAL.UserDefData>(); dd.Add(udd); UserDefDataDict.Add(udd.RefID, dd); } } }; loader1.Run(e.List); }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { int i = 0; // 檢查學生是否存在 StudentRecord studRec = null; if (Students.ContainsKey(e.Data.ID)) { studRec = Students[e.Data.ID]; } else { e.ErrorMessage = "沒有這位學生" + e.Data.ID; return; } // 驗證格式資料 // 檢查每位學生欄位是否有重複 List <string> CheckSameList = new List <string>(); bool InputFormatPass = true; foreach (string field in e.SelectFields) { string value = e.Data[field].Trim(); switch (field) { default: break; case "欄位名稱": if (string.IsNullOrEmpty(value)) { InputFormatPass &= false; e.ErrorFields.Add(field, "不允許空白"); } string key = e.Data.ID + value; if (CheckSameList.Contains(key)) { InputFormatPass &= false; e.ErrorFields.Add(field, "欄位名稱:" + value + " 不允許重複"); } CheckSameList.Add(key); break; case "值": decimal dd; DateTime dt; if (!string.IsNullOrEmpty(value)) { if (e.Data.ContainsKey("欄位名稱")) { string str = e.Data["欄位名稱"]; if (UserSetDataTypeDict.ContainsKey(str)) { if (UserSetDataTypeDict[str] == "Number") { if (!decimal.TryParse(value, out dd)) { e.ErrorFields.Add(field, "非數字型態"); InputFormatPass &= false; break; } } if (UserSetDataTypeDict[str] == "Date") { if (!DateTime.TryParse(value, out dt)) { e.ErrorFields.Add(field, "非日期型態"); InputFormatPass &= false; break; } } } } } break; } } }; wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { Dictionary <string, List <RowData> > id_Rows = new Dictionary <string, List <RowData> >(); foreach (RowData data in e.Items) { if (!id_Rows.ContainsKey(data.ID)) { id_Rows.Add(data.ID, new List <RowData>()); } id_Rows[data.ID].Add(data); } List <DAL.UserDefData> InsertList = new List <UserDefineData.DAL.UserDefData> (); List <DAL.UserDefData> DeleteList = new List <UserDefineData.DAL.UserDefData>(); foreach (string id in id_Rows.Keys) { foreach (RowData data in id_Rows[id]) { string FName = string.Empty, Value = string.Empty; if (data.ContainsKey("欄位名稱")) { FName = data["欄位名稱"]; } if (data.ContainsKey("值")) { Value = data["值"]; } // 將需要刪除放入 if (UserDefDataDict.ContainsKey(id)) { foreach (DAL.UserDefData udd in UserDefDataDict[id]) { if (udd.FieldName == FName) { udd.Deleted = true; DeleteList.Add(udd); } } } // 新增資料 DAL.UserDefData uddNew = new UserDefineData.DAL.UserDefData(); uddNew.FieldName = FName; uddNew.RefID = id; uddNew.Value = Value; InsertList.Add(uddNew); } } try { // 先刪除舊的資料在新增新的 if (DeleteList.Count > 0) { UDTTransfer.DeleteDataToUDT(DeleteList); } if (InsertList.Count > 0) { UDTTransfer.InsertDataToUDT(InsertList); } JHSchool.Student.Instance.SyncAllBackground(); } catch (Exception ex) { } }; }