コード例 #1
0
        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("匯入完成!");
        }
コード例 #2
0
 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("匯入完成!");
 }
コード例 #3
0
        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("匯入完成!");
        }
コード例 #4
0
        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) {}
            };
        }
コード例 #5
0
        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) { }
            };
        }
コード例 #6
0
        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();
            };
        }
コード例 #7
0
        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) { }
            };
        }
コード例 #8
0
        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
            };
        }
コード例 #9
0
        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("匯入完成");
            };
        }
コード例 #10
0
        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
            };
        }
コード例 #11
0
        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
            };
        }
コード例 #12
0
        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 + "筆課程修課學生。");
                }
            };
        }
コード例 #13
0
        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) { }
            };
        }
コード例 #14
0
        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) { }
            };
        }
コード例 #15
0
        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());
            };
        }
コード例 #16
0
        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) {}
            };
        }