public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { eh = FISCA.InteractionService.PublishEvent(EventCode); wizard.PackageLimit = 3000; //可匯入的欄位 wizard.ImportableFields.AddRange("學號", "英文別名", "居留證號", "入學日期", "畢業日期"); //參與比序需於 - 2015/6月開啟本功能 //wizard.ImportableFields.AddRange("學年度", "學期", "幹部類別", "幹部名稱", "說明", "參與比序"); //必需要有的欄位 wizard.RequiredFields.AddRange("學號"); //驗證開始事件 //wizard.ValidateStart += (sender, e) => Keys.Clear(); //驗證每行資料的事件 wizard.ValidateRow += new System.EventHandler <SmartSchool.API.PlugIn.Import.ValidateRowEventArgs>(wizard_ValidateRow); //實際匯入資料的事件 wizard.ImportPackage += new System.EventHandler <SmartSchool.API.PlugIn.Import.ImportPackageEventArgs>(wizard_ImportPackage); //匯入完成 wizard.ImportComplete += (sender, e) => MessageBox.Show("匯入完成!"); }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { wizard.PackageLimit = 3000; //可匯入的欄位 wizard.ImportableFields.AddRange("學年度", "學期", "年級", "當時班級", "當時座號", "當時班導師姓名", "上課天數"); //必需要有的欄位 wizard.RequiredFields.AddRange("學年度", "學期", "年級"); //開始驗證 wizard.ValidateStart += (sender, e) => ValidateKeys.Clear(); //驗證每行資料的事件 wizard.ValidateRow += new System.EventHandler <SmartSchool.API.PlugIn.Import.ValidateRowEventArgs>(wizard_ValidateRow); //實際匯入資料的事件 wizard.ImportPackage += new System.EventHandler <SmartSchool.API.PlugIn.Import.ImportPackageEventArgs>(wizard_ImportPackage); wizard.ImportComplete += (sender, e) => MessageBox.Show("匯入完成!"); }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { wizard.PackageLimit = 3000; //必需要有的欄位 wizard.RequiredFields.AddRange("學號"); //可匯入的欄位 wizard.ImportableFields.AddRange(_FieldNameList); //驗證每行資料的事件 wizard.ValidateRow += wizard_ValidateRow; //實際匯入資料的事件 wizard.ImportPackage += wizard_ImportPackage; //匯入完成 wizard.ImportComplete += (sender, e) => MessageBox.Show("匯入完成!"); }
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.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 == "2") { 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; CheckHasData = false; foreach (string field in e.SelectFields) { string value = e.Data[field].Trim(); //// 驗證$無法匯入 //if (value.IndexOf('$') > -1) //{ // e.ErrorFields.Add(field, "儲存格有$無法匯入."); // break; //} // 檢查系統內是否已經有畢業異動 if (CheckHasData == false) { if (UpdateRecs.ContainsKey(e.Data.ID)) { if (UpdateRecs[e.Data.ID].Count > 0) { e.WarningFields.Add(field, "系統內已有畢業異動,匯入將會取代系統內畢業異動"); CheckHasData = true; } } } switch (field) { default: break; //case "異動類別": // if (value != "畢業") // { // InputFormatPass &= false; // e.ErrorFields.Add(field, "必須填入畢業"); // } // if (value == "畢業") // { // if (UpdateRecs.ContainsKey(e.Data.ID)) // if (UpdateRecs[e.Data.ID].Count > 0) // { // e.WarningFields.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 "異動日期": if (string.IsNullOrEmpty(value) || DateTime.TryParse(value, out dt) == false) { InputFormatPass &= false; e.ErrorFields.Add(field, "必須填入日期,例如2009/1/1"); } break; case "入學年月": int.TryParse(value, out i); if (!string.IsNullOrEmpty(value) && i < 1) { e.WarningFields.Add(field, "必須填入年月格式,例如200901"); } break; case "畢業年月": int.TryParse(value, out i); if (!string.IsNullOrEmpty(value) && i < 1) { e.WarningFields.Add(field, "必須填入年月格式,例如200901"); } 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>(); List <JHUpdateRecordRecord> DelList = 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.UpdateCode == "2") { DelList.Add(urr); } //if (urr.SchoolYear == schoolYear && urr.Semester == Semester && urr.GradeYear == GrYear) //{ // 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; } updateRec.UpdateCode = "2"; // 當已經有畢業異動使用新增方式 if (CheckHasData) { isInsert = true; } bool checkData = false; foreach (string field in e.ImportFields) { string value = data[field].Trim(); switch (field) { //case "異動類別": // if (value == "畢業") // { // updateRec.UpdateCode = "2"; // 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 "入學年月": if (string.IsNullOrEmpty(value)) { updateRec.EnrollmentSchoolYear = string.Empty; } else { updateRec.EnrollmentSchoolYear = value; } break; case "畢業年月": if (string.IsNullOrEmpty(value)) { updateRec.GraduateSchoolYear = string.Empty; } else { updateRec.GraduateSchoolYear = value; } break; case "畢修業別": updateRec.Graduate = value; 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.GraduateCertificateNumber = value; break; case "畢(結)業證書字號": updateRec.GraduateCertificateNumber = value; break; case "異動班級": updateRec.OriginClassName = value; break; case "異動姓名": updateRec.StudentName = value; break; case "異動身分證號": updateRec.IDNumber = value; break; case "異動出生地": updateRec.BirthPlace = 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 "核准日期": 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 (DelList.Count > 0) { Delete(DelList); } 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) {} }; }
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) { List <推甄學生資料> importRecords = new List <推甄學生資料>(); List <string> validatedID = new List <string>(); //可以匯入這麼多欄位喔~ wizard.ImportableFields.AddRange("排名", "總分", "成績內容", "分發校系代碼", "分發學校", "分發科系", "確定分發結果", "組別", "梯次", "備註"); //開始驗證前先收集一些資訊於驗證過程中使用 wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { FISCA.UDT.Condition.InCondition condition = new FISCA.UDT.Condition.InCondition(); condition.Field = "RefStudentID"; condition.Values.AddRange(e.List); importRecords = new AccessHelper().Select <推甄學生資料>(condition); importRecords.取得志願組(); }; //每一列資料會觸發一次驗證 wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { if (validatedID.Contains(e.Data.ID)) { e.ErrorMessage = "同一學生不應出現兩筆資料。"; } else { #region 驗證各欄位資料 validatedID.Add(e.Data.ID); foreach (var field in e.SelectFields) { string value = e.Data[field]; switch (field) { case "排名": int i = 0; if (!int.TryParse(value, out i) || i <= 0) { e.ErrorFields.Add(field, "必需是大於0之整數。"); } break; case "總分": decimal d; if (e.Data[field] != "" && (!decimal.TryParse(value, out d) || d < 0m)) { e.ErrorFields.Add(field, "必需為空白或大於等於0之數字。"); } break; case "成績內容": break; case "分發校系代碼": if (value != "") { if (!校系資料庫.Items.ContainsKey(value)) { e.ErrorFields.Add(field, "查無此校系代碼。"); } else { bool match = false; foreach (var data in importRecords) { if (data.StudentRecord.ID == e.Data.ID) { foreach (var wish in data.志願組) { if (wish.校系資料.代碼 == value) { match = true; break; } } break; } } if (!match) { e.WarningFields.Add(field, "此分發結果不在該學生的志願中,可能導致統計數字錯誤。"); } } } break; case "分發學校": if (!e.SelectFields.Contains("分發校系代碼")) { e.ErrorFields.Add(field, "分發結果必須以校系代碼為主,無法單獨由分發學校判斷。"); } else { if (校系資料庫.Items.ContainsKey(e.Data["分發校系代碼"]) && 校系資料庫.Items[e.Data["分發校系代碼"]].校名 != value) { e.ErrorFields.Add(field, "校名與校系代碼不相同。"); } } break; case "分發科系": if (!e.SelectFields.Contains("分發校系代碼")) { e.ErrorFields.Add(field, "分發結果必須以校系代碼為主,無法單獨由分發科系判斷。"); } else { if (校系資料庫.Items.ContainsKey(e.Data["分發校系代碼"]) && 校系資料庫.Items[e.Data["分發校系代碼"]].系名 != value) { e.ErrorFields.Add(field, "系名與校系代碼不相同。"); } } break; case "確定分發結果": if (value != "" && value != "是" && value != "否" && value.ToLower() != "true" && value.ToLower() != "false") { e.ErrorFields.Add(field, "輸入值不允許,請輸入是或否,若保留空白則視為否。"); } break; case "梯次": int j = 0; if (value != "" && !int.TryParse(value, out j) || j <= 0) { e.ErrorFields.Add(field, "必需是大於0之整數或空白。"); } break; case "備註": break; default: break; } } #endregion } }; //匯入會一次切一個package做批次,每次只處理package的資料匯入即可 wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { List <推甄學生資料> importPackage = new List <推甄學生資料>(); foreach (var rowData in e.Items) { 推甄學生資料 targetData = null; foreach (var rec in importRecords) { if (rec.StudentRecord.ID == rowData.ID) { targetData = rec; break; } } if (targetData == null) { targetData = new 推甄學生資料(); targetData.StudentRecord = K12.Data.Student.SelectByID(rowData.ID); } importPackage.Add(targetData); #region 填入資料 foreach (var field in e.ImportFields) { string value = rowData[field]; switch (field) { case "排名": targetData.排名 = int.Parse(value); break; case "總分": targetData.總分 = (value == "" ? null : new decimal?(decimal.Parse(value))); break; case "成績內容": targetData.成績內容 = value; break; case "分發校系代碼": targetData.分發結果 = (value == "" ? null : 校系資料庫.Items[value]); break; case "分發學校": break; case "分發科系": break; case "確定分發結果": targetData.確定分發結果 = ((value == "" || value == "否" || value.ToLower() == "false") ? false : true); break; case "組別": targetData.組別 = value; break; case "梯次": targetData.梯次 = (value == "" ? null : new int?(int.Parse(value))); break; case "備註": targetData.備註 = value; break; default: break; } } #endregion } importPackage.SaveAll(); }; }
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, 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>(); 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 }; 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)) { 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 { currentSCE.Score = null; } changed = true; } break; case "平時分數": if ("" + currentSCE.AssignmentScore != value) { decimal d; if (decimal.TryParse(value, out d)) { currentSCE.AssignmentScore = d; } 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 { newSCE.Score = null; } } else { newSCE.Score = null; } break; case "平時分數": if (value != "") { decimal d; if (decimal.TryParse(value, out d)) { newSCE.AssignmentScore = d; } 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, 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新增 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; case "成績": if (value != "" && !decimal.TryParse(value, out d)) { 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 != "" && !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; } } #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<SmartSchool.Feature.Score.AddScore.InsertInfo> insertList = new List<SmartSchool.Feature.Score.AddScore.InsertInfo>(); //List<SmartSchool.Feature.Score.EditScore.UpdateInfo> updateList = new List<SmartSchool.Feature.Score.EditScore.UpdateInfo>(); 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]) { int t; 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; case "成績": if ("" + score.Score != value) { decimal d; if (decimal.TryParse(value, out d)) { score.Score = d; } else { score.Score = null; } hasChanged = true; } break; case "原始成績": if ("" + score.ScoreOrigin != value) { decimal d; if (decimal.TryParse(value, out d)) { score.ScoreOrigin = d; } else { score.ScoreOrigin = null; } hasChanged = true; } break; 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; } } #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(); #region 建立newScore //foreach (string field in new string[] { "領域", "科目", "權數", "節數", "分數評量", "努力程度", "文字描述", "註記" }) //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; case "成績": if (decimal.TryParse(value, out d)) { subjectScore.Score = d; } else { subjectScore.Score = null; } break; case "原始成績": if (decimal.TryParse(value, out d)) { subjectScore.ScoreOrigin = d; } else { subjectScore.ScoreOrigin = null; } break; 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; } #endregion } } #endregion //subjectScoreInfo.AppendChild(newScore); 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(); //foreach (string field in new string[] { "領域", "科目", "權數", "節數", "分數評量", "努力程度", "文字描述", "註記" }) //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; case "成績": if (decimal.TryParse(value, out d)) { subjectScore.Score = d; } else { subjectScore.Score = null; } break; case "原始成績": if (decimal.TryParse(value, out d)) { subjectScore.ScoreOrigin = d; } else { subjectScore.ScoreOrigin = null; } break; 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; } } } //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; } 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]); } } } 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]); } } } 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]); } } } } JHSemesterScore.Insert(new List <JHSemesterScoreRecord>(iList.Values)); JHSemesterScore.Update(new List <JHSemesterScoreRecord>(uList.Values)); FISCA.LogAgent.ApplicationLog.Log("成績系統.匯入匯出", "匯入學期科目成績", "總共匯入" + (insertList.Count + updateList.Count) + "筆學期科目成績。"); #endregion }; wizard.ImportComplete += delegate { MsgBox.Show("匯入完成"); }; }
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; // 2018.09.05 [ischoolKingdom] Vicky依據 [02-01][03] 匯入評量成績 項目,移除文字描述。 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 = -1; decimal d = -1; #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, "必須填入空白或整數"); } else { // 2020/10/15 加入檢查,當分數與努力轉換後努力程度不同,需要顯示警告 if (value != "") { int x = ConvertEffort(d); if (x != i) { e.WarningFields.Add(field, "努力程度與使用分數轉換後不一致"); } } } break; // 2018.09.05 [ischoolKingdom] Vicky依據 [02-01][03] 匯入評量成績 項目,移除文字描述。 //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>(); // 檢查是否有努力程度欄位 bool isHasEffortField = false; //交叉比對各學生資料 #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 (isHasEffortField == false) { if (data.ContainsKey("努力程度")) { // 有努力程度這欄位 isHasEffortField = true; } } // 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.ContainsKey("評量名稱")) { if (data["評量名稱"] == "平時評量") { if (data.ContainsKey("分數評量")) { if (data["分數評量"] != null && data["分數評量"] != "") { decimal d; // 使用TryParse 的轉換,是因為可能會有Row 的分數評量欄位是空的(EX: 社團成績) ,直接Parse會爆 if (decimal.TryParse(data["分數評量"], out d)) { record.OrdinarilyScore = d; } } // 當分數評量是空白 if (data["分數評量"] != null && data["分數評量"].Trim() == "") { record.OrdinarilyScore = null; } } if (data.ContainsKey("努力程度")) { if (data["努力程度"] != null && data["努力程度"] != "") { int i; if (int.TryParse(data["努力程度"], out i)) { record.OrdinarilyEffort = i; } } if (data["努力程度"] != null && data["努力程度"].Trim() == "") { record.OrdinarilyEffort = null; } } // 2018.09.05 [ischoolKingdom] Vicky依據 [02-01][03] 匯入評量成績 項目,移除文字描述。 //if (data["文字描述"] != null) //{ // record.Text = data["文字描述"].ToString(); //} // 2020/10/15 宏安與小組會議討論,當沒有努力程度欄位,會使用成績轉換努力程度 if (isHasEffortField == false) { if (record.OrdinarilyScore.HasValue) { record.OrdinarilyEffort = ConvertEffort(record.OrdinarilyScore.Value); } else { record.OrdinarilyEffort = null; } } 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; // 2018.09.05 [ischoolKingdom] Vicky依據 [02-01][03] 匯入評量成績 項目,移除文字描述。 //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; // 2018.09.05 [ischoolKingdom] Vicky依據 [02-01][03] 匯入評量成績 項目,移除文字描述。 //case "文字描述": // newSCE.Text = value; // break; } } #endregion if (newSCE.RefExamID != "") { insertList.Add(newSCE); } } } } } try { // 解析並填入轉換空白的努力程度 // 2020/10/15 透過宏安討論,當沒有努力程度欄位才會使用成績轉換,如果有努力程度欄位不會使用成績轉換。 foreach (KH.JHSCETakeRecord rec in updateList) { //// 當努力程度沒有值卻有成績。 //if ((rec.Effort.HasValue == false) && rec.Score.HasValue) //{ // rec.Effort = ConvertEffort(rec.Score.Value); //} if (isHasEffortField == false) { if (rec.Score.HasValue) { rec.Effort = ConvertEffort(rec.Score.Value); } else { rec.Effort = null; } } } foreach (KH.JHSCETakeRecord rec in insertList) { //// 當努力程度沒有值卻有成績。 //if ((rec.Effort.HasValue == false) && rec.Score.HasValue) //{ // rec.Effort = ConvertEffort(rec.Score.Value); //} if (isHasEffortField == false) { if (rec.Score.HasValue) { rec.Effort = ConvertEffort(rec.Score.Value); } else { rec.Effort = null; } } } 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 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; wizard.ImportableFields.AddRange("學年度", "學期", "課程名稱", "分數評量", "努力程度", "文字描述"); wizard.RequiredFields.AddRange("學年度", "學期", "課程名稱"); 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; decimal d; #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 != "" && !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; //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)) { errorMessage += (errorMessage == "" ? "" : "\n") + " 同一學年度學期不允許多筆相同課程名稱的資料"; } else { semesterCourseName[key].Add(courseName); } #endregion #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; if (scattends.ContainsKey(e.Data.ID)) { foreach (Data.JHSCAttendRecord record in scattends[e.Data.ID]) { if (courses[record.RefCourseID].Name == courseName) { attended = true; } } } else //學生沒修半堂課 { } if (!attended && !noCourse) { 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 = 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; #region 填入資料 foreach (string field in e.ImportFields) { string value = data[field]; switch (field) { case "分數評量": if (value != "") { decimal d; if (decimal.TryParse(value, out d)) { record.Score = d; } else { record.Score = null; } } break; case "努力程度": if (value != "") { int i; if (int.TryParse(value, out i)) { record.Effort = i; } else { record.Effort = null; } } break; case "文字描述": if (value != "") { record.Text = value; } break; } } #endregion insertList.Add(record); } } } #endregion #region 處理要修改的修課記錄 foreach (RowData data in id_Rows[id]) { string sy = data["學年度"]; string se = data["學期"]; string semsKey = sy + "_" + se; string courseName = data["課程名稱"]; //如果是新增修課就略過 if (prepareAttends.ContainsKey(id) && prepareAttends[id].ContainsKey(semsKey + "_" + courseName)) { continue; } if (scattends.ContainsKey(id)) { foreach (Data.JHSCAttendRecord record in scattends[id]) { Data.JHCourseRecord course = courses[record.RefCourseID]; if (course.Name == courseName && "" + course.SchoolYear == sy && "" + course.Semester == se) { #region 填入資料 foreach (string field in e.ImportFields) { string value = data[field]; switch (field) { case "分數評量": if (value != "") { decimal d; if (decimal.TryParse(value, out d)) { record.Score = d; } else { record.Score = null; } } break; case "努力程度": if (value != "") { int i; if (int.TryParse(value, out i)) { record.Effort = i; } else { record.Effort = null; } } break; case "文字描述": if (value != "") { record.Text = value; } break; } } #endregion updateList.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 } FISCA.LogAgent.ApplicationLog.Log("成績系統.匯入匯出", "匯入課程成績", "總共匯入" + (insertList.Count + updateList.Count) + "筆課程成績。"); #endregion }; }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { // 匯入檔按學生資訊 Dictionary <string, StudentInfo> StudentInfoDict = new Dictionary <string, StudentInfo>(); // 所有課程資訊 Dictionary <string, CourseInfo> AllCourseInfoDict = new Dictionary <string, CourseInfo>(); // 學生修課紀錄 Dictionary <string, Dictionary <string, SCAttendInfo> > StudSCAttendDict = new Dictionary <string, Dictionary <string, SCAttendInfo> >(); Dictionary <string, List <string> > semesterCourseName = new Dictionary <string, List <string> >(); List <SCAttendInfo> InsertSCAttendList = new List <SCAttendInfo>(); List <SCAttendInfo> UpdateSCAttendList = new List <SCAttendInfo>(); wizard.PackageLimit = 3000; //wizard.ImportableFields.Add("必選修"); //wizard.ImportableFields.Add("校部訂"); wizard.ImportableFields.Add("及格標準"); wizard.ImportableFields.Add("補考標準"); wizard.ImportableFields.Add("直接指定總成績"); wizard.ImportableFields.Add("備註"); wizard.ImportableFields.Add("科目代碼"); wizard.RequiredFields.AddRange("學年度", "學期"); wizard.RequiredFields.Add("課程名稱"); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { // 開始驗證 #region 取得學生資訊 StudentInfoDict = DataAccess.GetStudentInfoDictByStudentIDList(e.List.ToList()); #endregion // 取得所有課程 AllCourseInfoDict = DataAccess.GetAllCourseInfoDict(); // 取得學生修課資料 StudSCAttendDict = DataAccess.GetSCAttendDictByStudentIDList(e.List.ToList()); }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { int i; decimal d; #region 檢查學生是否存在 // SHStudentRecord student = null; if (StudentInfoDict.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].Trim(); 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 == "" || value == "必修" || value == "選修") // { // } // else // { // inputFormatPass = false; // e.ErrorFields.Add(field, "必須填入必修、選修或空白"); // } // break; //case "校部訂": // if (value == "" || value == "校訂" || value == "部訂") // { // } // else // { // inputFormatPass = false; // e.ErrorFields.Add(field, "必須填入校訂、部訂或空白"); // } // break; case "及格標準": case "補考標準": case "直接指定總成績": if (value != "" && !decimal.TryParse(value, out d)) { inputFormatPass = false; e.ErrorFields.Add(field, "必須填入數值"); } break; case "科目代碼": break; } } #endregion //輸入格式正確才會針對情節做檢驗 #region 驗證各種情節 if (inputFormatPass) { semesterCourseName.Clear(); string errorMessage = ""; string sy = e.Data["學年度"]; string se = e.Data["學期"]; string courseName = e.Data["課程名稱"]; string key = e.Data.ID + "_" + sy + "_" + se; string semsKey = sy + "_" + se; string tmpCourseKey = sy + "_" + se + "_" + courseName; string tmpCourseID = ""; #region 一個學年度學期不能有重覆的課程名稱 if (!semesterCourseName.ContainsKey(key)) { semesterCourseName.Add(key, new List <string>()); } if (semesterCourseName[key].Contains(courseName)) { errorMessage += (errorMessage == "" ? "" : "\n") + " 同一學年度學期不允許修習多筆相同名稱的課程"; } else { semesterCourseName[key].Add(courseName); } #endregion #region 檢查課程是否存在系統中 bool noCourse = false; if (!AllCourseInfoDict.ContainsKey(tmpCourseKey)) { noCourse = true; errorMessage += (errorMessage == "" ? "" : "\n") + " 系統中找不到該課程"; } else { tmpCourseID = AllCourseInfoDict[tmpCourseKey].CourseID; } #endregion #region 檢查學生是否有修此課程 bool attended = false; if (StudSCAttendDict.ContainsKey(e.Data.ID)) { if (StudSCAttendDict[e.Data.ID].ContainsKey(tmpCourseID)) { attended = true; } } else //學生沒修半堂課 { } #endregion e.ErrorMessage = errorMessage; } #endregion }; wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e) { InsertSCAttendList.Clear(); UpdateSCAttendList.Clear(); // 匯入資料 #region 分包裝 foreach (RowData data in e.Items) { string sy = data["學年度"]; string se = data["學期"]; string courseName = data["課程名稱"]; string tmpCourseKey = sy + "_" + se + "_" + courseName; string tmpCourseID = ""; string StudentID = data.ID; SCAttendInfo si = new SCAttendInfo(); si.StudentID = StudentID; si.IsPassingStandardCheck = si.IsMakeupStandardCheck = si.IsSubjectCodeCheck = false; // 有課程才處理 if (AllCourseInfoDict.ContainsKey(tmpCourseKey)) { tmpCourseID = AllCourseInfoDict[tmpCourseKey].CourseID; bool hasAttend = false; if (StudSCAttendDict.ContainsKey(StudentID)) { if (StudSCAttendDict[StudentID].ContainsKey(tmpCourseID)) { hasAttend = true; si = StudSCAttendDict[StudentID][tmpCourseID]; } } if (data.ContainsKey("及格標準")) { if (data["及格標準"] != null) { if (data["及格標準"].ToString() == "") { si.PassingStandard = null; } else { decimal pp; if (decimal.TryParse(data["及格標準"].ToString(), out pp)) { si.PassingStandard = pp; } } } si.IsPassingStandardCheck = true; } if (data.ContainsKey("補考標準")) { if (data["補考標準"] != null) { if (data["補考標準"].ToString() == "") { si.MakeupStandard = null; } else { decimal mm; if (decimal.TryParse(data["補考標準"].ToString(), out mm)) { si.MakeupStandard = mm; } } } si.IsMakeupStandardCheck = true; } if (data.ContainsKey("直接指定總成績")) { if (data["直接指定總成績"] != null) { if (data["直接指定總成績"].ToString() == "") { si.DesignateFinalScore = null; } else { decimal mm; if (decimal.TryParse(data["直接指定總成績"].ToString(), out mm)) { si.DesignateFinalScore = mm; } } } si.IsDesignateFinalScoreCheck = true; } if (data.ContainsKey("科目代碼")) { if (data["科目代碼"] != null) { si.SubjectCode = data["科目代碼"].ToString(); } si.IsSubjectCodeCheck = true; } if (data.ContainsKey("備註")) { if (data["備註"] != null) { si.Remark = data["備註"].ToString(); } si.IsRemarkCheck = true; } si.CourseID = tmpCourseID; // 已經修課需要更新 if (hasAttend) { UpdateSCAttendList.Add(si); } else { InsertSCAttendList.Add(si); } } } #endregion if (InsertSCAttendList.Count > 0) { DataAccess.InsertSCAttendList(InsertSCAttendList); ApplicationLog.Log("成績系統.匯入匯出", "匯入課程修課學生", "總共匯入 新增" + InsertSCAttendList.Count + "筆課程修課學生。"); } if (UpdateSCAttendList.Count > 0) { DataAccess.UpdateSCAttendList(UpdateSCAttendList); ApplicationLog.Log("成績系統.匯入匯出", "匯入課程修課學生", "總共匯入 更新" + UpdateSCAttendList.Count + "筆課程修課學生。"); } }; }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { // 學生 Dictionary <string, JHStudentRecord> students = new Dictionary <string, JHStudentRecord>(); // 畢業資訊 Dictionary <string, JHLeaveInfoRecord> StudJHLeaveInfoRecordDic = new Dictionary <string, JHLeaveInfoRecord>(); // 可匯入項目 List <string> ImportItemList = new List <string>(); ImportItemList.Add("畢業學年度"); ImportItemList.Add("畢業資格"); ImportItemList.Add("畢業證書字號"); ImportItemList.Add("畢業相關訊息"); // 取得可加入學生 TagName wizard.PackageLimit = 3000; wizard.ImportableFields.AddRange(ImportItemList); wizard.RequiredFields.AddRange(); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { // 取得學生資料 students = JHStudent.SelectByIDs(e.List).ToDictionary(x => x.ID); // 取得畢業資訊 StudJHLeaveInfoRecordDic = JHLeaveIfno.SelectByStudentIDs(e.List).ToDictionary(x => x.RefStudentID); }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { int i = 0; // 檢查學生是否存在 JHStudentRecord studRec = null; if (students.ContainsKey(e.Data.ID)) { studRec = students[e.Data.ID]; } else { e.ErrorMessage = "沒有這位學生" + e.Data.ID; return; } }; 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 <JHLeaveInfoRecord> UpdateList = new List <JHLeaveInfoRecord>(); foreach (string id in id_Rows.Keys) { if (StudJHLeaveInfoRecordDic.ContainsKey(id)) { foreach (RowData data in id_Rows[id]) { foreach (string field in e.ImportFields) { if (field == "畢業學年度") { int SchoolYear; if (int.TryParse(data[field], out SchoolYear)) { StudJHLeaveInfoRecordDic[id].SchoolYear = SchoolYear; } else { StudJHLeaveInfoRecordDic[id].SchoolYear = null; } } if (field == "畢業資格") { StudJHLeaveInfoRecordDic[id].Reason = data[field]; } if (field == "畢業證書字號") { StudJHLeaveInfoRecordDic[id].DiplomaNumber = data[field]; } if (field == "畢業相關訊息") { StudJHLeaveInfoRecordDic[id].Memo = data[field]; } } } } } UpdateList = StudJHLeaveInfoRecordDic.Values.ToList(); try { if (UpdateList.Count > 0) { Update(UpdateList); } JHSchool.PermRecLogProcess prlp = new JHSchool.PermRecLogProcess(); prlp.SaveLog("學生.匯入畢業資訊", "匯入學生畢業資訊", "匯入學生畢業資訊:共更新:" + UpdateList.Count + "筆資料"); JHSchool.Student.Instance.SyncAllBackground(); JHSchool.StudentTag.Instance.SyncAllBackground(); JHSchool.Data.JHStudent.RemoveAll(); JHSchool.Data.JHStudent.SelectAll(); } catch (Exception ex) { } }; }
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 == "1" || UpdRec.UpdateCode == "2") { 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; // 檢查學生是否存在 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 (DAL.DALTransfer2.GetUpdateRecCodeByString39(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 (!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; case "異動性別": if (value == "男" || value == "女" || value == "") { } else { e.WarningFields.Add(field, "請填入男或女"); } 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["異動年級"]; } // 異動類別 string UpdateType = string.Empty; if (data.ContainsKey("異動類別")) { UpdateType = data["異動類別"]; } // 取得原因及事項 string UpdateDesc = string.Empty; if (data.ContainsKey("原因及事項")) { UpdateDesc = data["原因及事項"]; } //// 檢查更正學籍 //string checkUpdateCode09Str=string.Empty; //if (data.ContainsKey("新生日")) // checkUpdateCode09Str += data["新生日"].Trim(); //if (data.ContainsKey("新身分證號")) // checkUpdateCode09Str += data["新身分證號"].Trim(); //if (data.ContainsKey("新姓名")) // checkUpdateCode09Str += data["新姓名"].Trim(); //if (data.ContainsKey("新性別")) // checkUpdateCode09Str += data["新性別"].Trim(); JHUpdateRecordRecord updateRec = null; // 判斷學年度+學期+異動日期+異動類別 (如果相同有當更新,不同就新增) foreach (JHUpdateRecordRecord urr in UpdateRecs[id]) { string UpdateStr = DAL.DALTransfer2.GetUpdateRecCodeString(urr.UpdateCode); if (urr.SchoolYear == schoolYear && urr.Semester == Semester && UpdateType == UpdateStr) { DateTime dt1; DateTime.TryParse(urr.UpdateDate, out dt1); if (dt == dt1) { // 使用原因及事項當作Key if (UpdateDesc == urr.UpdateDescription) { updateRec = urr; } ////判斷當異動類別是更正學籍,加入(新生日、新身分證號、新姓名、新性別)判斷,四項內容只要有一個不同就當作新的一筆可匯入。 //if (urr.UpdateCode == "9") //{ // string strKey = urr.NewBirthday.Trim() + urr.NewIDNumber.Trim() + urr.NewName.Trim() + urr.NewGender.Trim (); // if (checkUpdateCode09Str == strKey) // updateRec = urr; //} //else // updateRec = urr; } } } bool isInsert = true; if (updateRec == null) { updateRec = new JHUpdateRecordRecord(); updateRec.StudentID = id; } else { isInsert = false; } bool checkData = false; string Ur03School = "", Ur04School = ""; foreach (string field in e.ImportFields) { string value = data[field].Trim(); switch (field) { case "異動類別": string UrCode = DAL.DALTransfer2.GetUpdateRecCodeByString39(value); if (UrCode != "") { updateRec.UpdateCode = UrCode; } 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.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; case "異動新生日": DateTime dtNB; if (DateTime.TryParse(value, out dtNB)) { updateRec.NewBirthday = dtNB.ToShortDateString(); } break; case "異動新身分證號": updateRec.NewIDNumber = value; break; case "異動新姓名": updateRec.NewName = value; break; case "異動新性別": if (value == "男" || value == "女" || value == "") { updateRec.NewGender = value; } break; case "新生日": DateTime dtNB1; if (DateTime.TryParse(value, out dtNB1)) { updateRec.NewBirthday = dtNB1.ToShortDateString(); } break; case "新身分證號": updateRec.NewIDNumber = value; break; case "新姓名": updateRec.NewName = value; break; case "新性別": if (value == "男" || value == "女" || value == "") { updateRec.NewGender = value; } break; case "出生地": updateRec.BirthPlace = value; break; case "原因及事項": updateRec.UpdateDescription = value; break; case "異動地址": updateRec.OriginAddress = value; break; case "轉入前學校": Ur03School = value; break; case "轉出後學校": Ur04School = value; break; } } // 轉換轉出入學校 if (updateRec.UpdateCode == "3") { updateRec.ImportExportSchool = Ur03School; } if (updateRec.UpdateCode == "4") { updateRec.ImportExportSchool = Ur04School; } 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) { } }; }
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()); }; }
public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard) { Dictionary <string, JHStudentRecord> students = new Dictionary <string, JHStudentRecord>(); Dictionary <string, List <JHStudentTagRecord> > StudTagRecDic = new Dictionary <string, List <JHStudentTagRecord> > (); Dictionary <string, Dictionary <string, string> > StudTagNameDic = DAL.DALTransfer.GetStudentTagNameDic(); // 取得可加入學生 TagName wizard.PackageLimit = 3000; wizard.ImportableFields.AddRange(ImportItemList); wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e) { // 取得學生資料 foreach (JHStudentRecord studRec in JHStudent.SelectByIDs(e.List)) { if (!students.ContainsKey(studRec.ID)) { students.Add(studRec.ID, studRec); StudTagRecDic.Add(studRec.ID, new List <JHStudentTagRecord>()); } } // 取得學生類別 foreach (JHStudentTagRecord studTag in JHStudentTag.SelectByStudentIDs(students.Keys)) { //if (!StudTagRecDic.ContainsKey(studTag.RefStudentID)) //{ // List<JHStudentTagRecord> rec = new List<JHStudentTagRecord> (); // rec.Add(studTag ); // StudTagRecDic.Add(studTag.RefStudentID,rec); //} //else if (StudTagRecDic.ContainsKey(studTag.RefStudentID)) { StudTagRecDic[studTag.RefStudentID].Add(studTag); } } }; wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e) { int i = 0; // 檢查學生是否存在 JHStudentRecord studRec = null; if (students.ContainsKey(e.Data.ID)) { studRec = students[e.Data.ID]; } else { e.ErrorMessage = "沒有這位學生" + e.Data.ID; return; } // 驗證資料 foreach (string field in e.SelectFields) { string value = e.Data[field].Trim(); // 驗證$無法匯入 if (value.IndexOf('$') > -1) { e.ErrorFields.Add(field, "儲存格有$無法匯入."); break; } if (field == "類別名稱") { if (string.IsNullOrEmpty(value)) { e.ErrorFields.Add(field, "不允許空白"); } } } }; 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 <JHStudentTagRecord> InsertList = new List <JHStudentTagRecord>(); // List<JHStudentTagRecord> UpdateList = new List<JHStudentTagRecord>(); // 放需要新增的學生類別 Dictionary <string, List <string> > NeedAddPrefixName = new Dictionary <string, List <string> >(); // 檢查用 List List <string> CheckStudTagName = new List <string>(); foreach (KeyValuePair <string, Dictionary <string, string> > data in StudTagNameDic) { foreach (KeyValuePair <string, string> data1 in data.Value) { CheckStudTagName.Add(data.Key + data1.Key); } } // 檢查類別是否已經存在 foreach (string id in id_Rows.Keys) { if (!StudTagRecDic.ContainsKey(id)) { continue; } foreach (RowData data in id_Rows[id]) { string strPrefix = string.Empty, strName = string.Empty; if (data.ContainsKey("群組")) { strPrefix = data["群組"]; } if (data.ContainsKey("類別名稱")) { strName = data["類別名稱"]; } string FullName = strPrefix + strName; // 需要新增的, if (!CheckStudTagName.Contains(FullName)) { CheckStudTagName.Add(FullName); if ((NeedAddPrefixName.ContainsKey(strPrefix))) { NeedAddPrefixName[strPrefix].Add(strName); } else { List <string> Names = new List <string>(); Names.Add(strName); NeedAddPrefixName.Add(strPrefix, Names); } } } } // 新增至學生類別管理 List <JHTagConfigRecord> Recs = new List <JHTagConfigRecord>(); foreach (KeyValuePair <string, List <string> > data in NeedAddPrefixName) { foreach (string data1 in data.Value) { JHTagConfigRecord rec = new JHTagConfigRecord(); rec.Category = "Student"; rec.Prefix = data.Key; rec.Name = data1; rec.Color = System.Drawing.Color.White; Recs.Add(rec); } } JHTagConfig.Insert(Recs); StudTagNameDic.Clear(); // 重新取得 StudTagNameDic = DAL.DALTransfer.GetStudentTagNameDic(); foreach (string id in id_Rows.Keys) { if (!StudTagRecDic.ContainsKey(id)) { continue; } foreach (RowData data in id_Rows[id]) { string strPrefix = string.Empty, strName = string.Empty; if (data.ContainsKey("群組")) { strPrefix = data["群組"]; } if (data.ContainsKey("類別名稱")) { strName = data["類別名稱"]; } // 欄位有在 Tag Prefix 內 bool isInsert = true; foreach (JHStudentTagRecord rec in StudTagRecDic[id]) { if (rec.Prefix == strPrefix && rec.Name == strName) { isInsert = false; break; } } if (isInsert) { // 學生類別管理名稱對照 if (StudTagNameDic.ContainsKey(strPrefix)) { if (StudTagNameDic[strPrefix].ContainsKey(strName)) { JHStudentTagRecord StudTag = new JHStudentTagRecord(); StudTag.RefEntityID = id; StudTag.RefTagID = StudTagNameDic[strPrefix][strName]; InsertList.Add(StudTag); } } } } } try { if (InsertList.Count > 0) { Insert(InsertList); } //if (UpdateList.Count > 0) // Update(UpdateList); JHSchool.PermRecLogProcess prlp = new JHSchool.PermRecLogProcess(); prlp.SaveLog("學生.匯入類別", "匯入學生類別", "匯入學生類別:共新增" + InsertList.Count + "筆資料"); JHSchool.Student.Instance.SyncAllBackground(); JHSchool.StudentTag.Instance.SyncAllBackground(); JHSchool.Data.JHStudent.RemoveAll(); JHSchool.Data.JHStudent.SelectAll(); } catch (Exception ex) {} }; }