public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            wizard.ExportableFields.AddRange(ExportItemList);
            wizard.ExportPackage += delegate(object sender, SmartSchool.API.PlugIn.Export.ExportPackageEventArgs e)
            {
                int RowCount = 0;
                foreach (DAL.UserDefData udd in UDTTransfer.GetDataFromUDT(e.List))
                {
                    RowData row = new RowData();
                    row.ID = udd.RefID;

                    foreach (string field in e.ExportFields)
                    {
                        if (wizard.ExportableFields.Contains(field))
                        {
                            switch (field)
                            {
                                case "欄位名稱": row.Add(field, udd.FieldName); break;
                                case "值": row.Add(field, udd.Value); break;
                            }
                        }

                    }
                    RowCount++;
                    e.Items.Add(row);
                }
            };
        }
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            wizard.ExportableFields.AddRange(ExportItemList);
            wizard.ExportPackage += delegate(object sender, SmartSchool.API.PlugIn.Export.ExportPackageEventArgs e)
            {
                int RowCount = 0;

                List<DAO.UDT_CounselUserDefDataDef> CounselUserDefDataList = _UDTTransfer.GetCounselUserDefineDataByStudentIDList(e.List);

                foreach (DAO.UDT_CounselUserDefDataDef udd in CounselUserDefDataList)
                {
                    RowData row = new RowData();
                    row.ID = udd.StudentID.ToString ();

                    foreach (string field in e.ExportFields)
                    {
                        if (wizard.ExportableFields.Contains(field))
                        {
                            switch (field)
                            {
                                case "欄位名稱": row.Add(field, udd.FieldName); break;
                                case "值": row.Add(field, udd.Value); break;
                                case "狀態":
                                    row.Add(field, udd.StudentStatus);
                                    break;

                            }
                        }

                    }
                    RowCount++;
                    e.Items.Add(row);
                }
            };
        }
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            wizard.ExportableFields.AddRange(_ExportList);
            wizard.ExportPackage += delegate(object sender, SmartSchool.API.PlugIn.Export.ExportPackageEventArgs e)
            {
                // 取得異動代碼
                XElement _UpdateCode=DAL.DALTransfer.GetUpdateCodeList();
                List<string> UpdateCodeList = (from elm in _UpdateCode.Elements("異動") where elm.Element("分類").Value == "新生異動" select elm.Element("代號").Value).ToList();
                // 取得學生新生異動
                List<SHUpdateRecordRecord> updateRecList = (from data in SHUpdateRecord.SelectByStudentIDs(e.List) where UpdateCodeList.Contains(data.UpdateCode) select data).ToList();
            Dictionary<string, string> StudentStatusDict = DAL.FDQuery.GetAllStudentStatus1Dict();

            foreach (SHUpdateRecordRecord rec in updateRecList)
            {
                RowData row = new RowData();
                row.ID = rec.StudentID;
                foreach (string field in e.ExportFields)
                {
                    if (wizard.ExportableFields.Contains(field))
                    {
                        switch(field)
                        {
                            case "學年度":
                                if(rec.SchoolYear.HasValue )
                                    row.Add(field, rec.SchoolYear.Value.ToString ()); break;
                            case "學期":
                                if(rec.Semester.HasValue )
                                    row.Add(field, rec.Semester.Value.ToString ()); break;
                            case "年級": row.Add(field, rec.GradeYear); break;
                            case "異動代碼": row.Add(field, rec.UpdateCode); break;
                            case "原因及事項": row.Add(field, rec.UpdateDescription); break;
                            case "異動日期": row.Add(field, rec.UpdateDate); break;
                            case "備註": row.Add(field, rec.Comment); break;
                            case "班別": row.Add(field, rec.ClassType); break;
                            case "科別": row.Add(field, rec.Department); break;
                            case "特殊身分代碼": row.Add(field, rec.SpecialStatus); break;
                            case "入學資格證明文件": row.Add(field, rec.GraduateDocument); break;
                            case "異動姓名": row.Add(field, rec.StudentName); break;
                            case "異動學號": row.Add(field, rec.StudentNumber); break;
                            case "異動身分證字號": row.Add(field, rec.IDNumber); break;
                            case "異動生日": row.Add(field, rec.Birthdate); break;
                            case "異動身分證註記": row.Add(field, rec.IDNumberComment); break;
                            case "異動性別": row.Add(field, rec.Gender); break;
                            case "畢業國中": row.Add(field, rec.GraduateSchool); break;
                            case "畢業國中所在地代碼": row.Add(field, rec.GraduateSchoolLocationCode); break;
                            case "畢業國中學校代碼": row.Add(field, rec.GraduateSchoolCode); break;
                            case "畢業國中畢業學年度": row.Add(field, rec.GraduateSchoolYear); break;
                            case "畢業國中入學資格註記": row.Add(field, rec.GraduateComment); break;
                            case "核准日期": row.Add(field, rec.ADDate); break;
                            case "核准文號": row.Add(field, rec.ADNumber); break;
                            case "狀態":
                                if(StudentStatusDict.ContainsKey(rec.StudentID))
                                    row.Add(field, StudentStatusDict[rec.StudentID]); break;
                        }
                    }
                }
                e.Items.Add(row);
            }
            };
        }
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            wizard.ExportableFields.AddRange(ExportItemList);

            wizard.ExportPackage += delegate(object sender, SmartSchool.API.PlugIn.Export.ExportPackageEventArgs e)
            {
                // 學生類別組合
                Dictionary<string, StudentTagEntity> StudTagDict = new Dictionary<string, StudentTagEntity>();

                // 取得學生類別
                foreach (StudentTagRecord studTagRec in StudentTag.SelectByStudentIDs(e.List))
                {
                    if (StudTagDict.ContainsKey(studTagRec.RefStudentID))
                        StudTagDict[studTagRec.RefStudentID].AddPrefixName(studTagRec.Prefix, studTagRec.Name);
                    else
                    {
                        StudentTagEntity stn = new StudentTagEntity();
                        stn.StudentID = studTagRec.RefStudentID;
                        stn.AddPrefixName(studTagRec.Prefix, studTagRec.Name);
                        StudTagDict.Add(studTagRec.RefStudentID, stn);
                    }
                }

                // 讀取組合後的學生類別
                foreach (StudentTagEntity ste in StudTagDict.Values)
                {
                    foreach (KeyValuePair<string, List<string>> data in ste.GetPrefixNameDic())
                    {
                        // 當群組空白
                        string key = string.Empty;
                        if (data.Key != " ")
                            key = data.Key;

                        // 類別名稱
                        foreach (string str in data.Value)
                        {
                            RowData row = new RowData();
                            foreach (string field in e.ExportFields)
                            {
                                row.ID = ste.StudentID;

                                if (field == "群組")
                                    row.Add(field, key);

                                if (field == "類別名稱")
                                    row.Add(field, str);
                            }
                            e.Items.Add(row);
                        }
                    }
                }

                PermRecLogProcess prlp = new PermRecLogProcess();
                prlp.SaveLog("學生.匯出類別", "匯出", "共匯出" + StudTagDict.Values.Count + "筆學生類別資料.");
            };
        }
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            wizard.ExportableFields.AddRange(ExportItemList);

            wizard.ExportPackage += delegate(object sender, SmartSchool.API.PlugIn.Export.ExportPackageEventArgs e)
            {
                // 教師類別組合
                Dictionary<string, TeacherTagEntity> teachTagDict = new Dictionary<string, TeacherTagEntity>();
                // 取得教師類別
                foreach (TeacherTagRecord teachTagRec in TeacherTag.SelectByTeacherIDs(e.List))
                {
                    if (teachTagDict.ContainsKey(teachTagRec.RefTeacherID))
                        teachTagDict[teachTagRec.RefTeacherID].AddPrefixName(teachTagRec.Prefix, teachTagRec.Name);
                    else
                    {
                        TeacherTagEntity stn = new TeacherTagEntity();
                        stn.TeacherID = teachTagRec.RefTeacherID;
                        stn.AddPrefixName(teachTagRec.Prefix, teachTagRec.Name);
                        teachTagDict.Add(teachTagRec.RefTeacherID, stn);
                    }
                }

                // 讀取組合後的教師類別
                foreach (TeacherTagEntity teach in teachTagDict.Values)
                {
                    foreach (KeyValuePair<string, List<string>> data in teach.GetPrefixNameDic())
                    {
                        // 當群組空白
                        string key = string.Empty;
                        if (data.Key != " ")
                            key = data.Key;

                        // 類別名稱
                        foreach (string str in data.Value)
                        {
                            RowData row = new RowData();
                            foreach (string field in e.ExportFields)
                            {
                                row.ID = teach.TeacherID;

                                if (field == "群組")
                                    row.Add(field, key);

                                if (field == "類別名稱")
                                    row.Add(field, str);
                            }
                            e.Items.Add(row);
                        }
                    }
                }

                PermRecLogProcess prlp = new PermRecLogProcess();
                prlp.SaveLog("教師.匯出類別", "匯出", "共匯出" + teachTagDict.Values.Count + "筆教師類別資料.");
            };
        }
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            wizard.ExportableFields.AddRange(ExportItemList);

            wizard.ExportPackage += delegate(object sender, SmartSchool.API.PlugIn.Export.ExportPackageEventArgs e)
            {
                // 班級類別組合
                Dictionary<string, CourseTagEntity> courTagDict = new Dictionary<string, CourseTagEntity>();
                // 取得班級類別
                foreach (CourseTagRecord courTagRec in CourseTag.SelectByCourseIDs(e.List))
                {
                    if (courTagDict.ContainsKey(courTagRec.RefCourseID))
                        courTagDict[courTagRec.RefCourseID].AddPrefixName(courTagRec.Prefix, courTagRec.Name);
                    else
                    {
                        CourseTagEntity cou = new CourseTagEntity();
                        cou.ClassID = courTagRec.RefCourseID;
                        cou.AddPrefixName(courTagRec.Prefix, courTagRec.Name);
                        courTagDict.Add(courTagRec.RefCourseID, cou);
                    }
                }

                // 讀取組合後的學生類別
                foreach (CourseTagEntity cour in courTagDict.Values)
                {
                    foreach (KeyValuePair<string, List<string>> data in cour.GetPrefixNameDic())
                    {
                        // 當群組空白
                        string key = string.Empty;
                        if (data.Key != " ")
                            key = data.Key;

                        // 類別名稱
                        foreach (string str in data.Value)
                        {
                            RowData row = new RowData();
                            foreach (string field in e.ExportFields)
                            {
                                row.ID = cour.ClassID;

                                if (field == "群組")
                                    row.Add(field, key);

                                if (field == "類別名稱")
                                    row.Add(field, str);
                            }
                            e.Items.Add(row);
                        }
                    }
                }

                PermRecLogProcess prlp = new PermRecLogProcess();
                prlp.SaveLog("課程.匯出類別", "匯出", "共匯出" + courTagDict.Values.Count + "筆課程類別資料.");
            };
        }
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            wizard.ExportableFields.AddRange(ExportItemList);
            wizard.ExportPackage += delegate(object sender, SmartSchool.API.PlugIn.Export.ExportPackageEventArgs e)
            {
                RowData row = new RowData();

                foreach (string field in e.ExportFields)
                {
                    if (wizard.ExportableFields.Contains(field))
                    {
                        switch (field)
                        {
                            case "": break;
                        }
                    }
                }
                e.Items.Add(row);

                // 寫 Log
                // ApplicationLog.Log();
            };
        }
        public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard)
        {
            // 取得學生資料
            Dictionary<string, StudentRecord> Students = new Dictionary<string, StudentRecord>();

            // 取得自訂資料欄位資料
            Dictionary<string,List<DAL.UserDefData>> UserDefDataDict = new Dictionary<string,List<UserDefineData.DAL.UserDefData>> ();

            // 取得使用這設定
            Dictionary<string, string> UserSetDataTypeDict = new Dictionary<string, string>();

            wizard.PackageLimit = 3000;
            wizard.ImportableFields.AddRange("欄位名稱","值");
            wizard.RequiredFields.AddRange("欄位名稱");
            wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e)
            {
                Students.Clear();
                UserDefDataDict.Clear();
                UserSetDataTypeDict.Clear();

                UserSetDataTypeDict = Global.GetUserConfigData();

                // 取得學生資料
                foreach (StudentRecord studRec in Student.SelectByIDs(e.List))
                    if (!Students.ContainsKey(studRec.ID))
                        Students.Add(studRec.ID, studRec);

                // 取得自訂資料欄位
                MultiThreadWorker<string> loader1 = new MultiThreadWorker<string>();
                loader1.MaxThreads = 3;
                loader1.PackageSize = 250;
                loader1.PackageWorker += delegate(object sender1, PackageWorkEventArgs<string> e1)
                {
                    foreach (DAL.UserDefData udd in UDTTransfer.GetDataFromUDT(e.List.ToList<string>()))
                    {
                        if(UserDefDataDict.ContainsKey(udd.RefID ))
                            UserDefDataDict[udd.RefID].Add(udd);
                        else
                        {
                            List<DAL.UserDefData> dd = new List<UserDefineData.DAL.UserDefData>();
                            dd.Add(udd);
                            UserDefDataDict.Add(udd.RefID,dd);
                        }
                    }
                };
                loader1.Run(e.List);
            };

            wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e)
            {
                int i = 0;
                // 檢查學生是否存在
                StudentRecord studRec = null;
                if (Students.ContainsKey(e.Data.ID))
                    studRec = Students[e.Data.ID];
                else
                {
                    e.ErrorMessage = "沒有這位學生" + e.Data.ID;
                    return;
                }

                // 驗證格式資料
                // 檢查每位學生欄位是否有重複
                List<string> CheckSameList = new List<string>();
                bool InputFormatPass = true;
                foreach (string field in e.SelectFields)
                {
                    string value = e.Data[field].Trim();
                    switch (field)
                    {
                        default:
                            break;

                        case "欄位名稱":
                            if (string.IsNullOrEmpty(value))
                            {
                                InputFormatPass &= false;
                                e.ErrorFields.Add(field, "不允許空白");
                            }
                            string key = e.Data.ID + value;
                            if (CheckSameList.Contains(key))
                            {
                                InputFormatPass &= false;
                                e.ErrorFields.Add(field, "欄位名稱:"+value+" 不允許重複");
                            }
                            CheckSameList.Add(key);
                            break;
                        case "值":
                            decimal dd; DateTime dt;
                            if (!string.IsNullOrEmpty(value))
                            {
                                if (e.Data.ContainsKey("欄位名稱"))
                                {
                                    string str = e.Data["欄位名稱"];

                                    if (UserSetDataTypeDict.ContainsKey(str))
                                    {
                                        if (UserSetDataTypeDict[str] == "Number")
                                        {
                                            if (!decimal.TryParse(value, out dd))
                                            {
                                                e.ErrorFields.Add(field, "非數字型態");
                                                InputFormatPass &= false;
                                                break;
                                            }
                                        }

                                        if (UserSetDataTypeDict[str] == "Date")
                                        {
                                            if (!DateTime.TryParse(value, out dt))
                                            {
                                                e.ErrorFields.Add(field, "非日期型態");
                                                InputFormatPass &= false;
                                                break;
                                            }
                                        }
                                    }
                                }
                            }

                            break;
                    }
                }

            };

            wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e)
            {

                Dictionary<string, List<RowData>> id_Rows = new Dictionary<string, List<RowData>>();
                foreach (RowData data in e.Items)
                {
                    if (!id_Rows.ContainsKey(data.ID))
                        id_Rows.Add(data.ID, new List<RowData>());
                    id_Rows[data.ID].Add(data);
                }

                List<DAL.UserDefData> InsertList = new List<UserDefineData.DAL.UserDefData> ();
                List<DAL.UserDefData> DeleteList = new List<UserDefineData.DAL.UserDefData>();

                foreach (string id in id_Rows.Keys)
                {
                    foreach (RowData data in id_Rows[id])
                    {
                        string FName = string.Empty, Value = string.Empty;
                        if (data.ContainsKey("欄位名稱"))
                            FName = data["欄位名稱"];

                        if (data.ContainsKey("值"))
                            Value = data["值"];

                        // 將需要刪除放入
                        if (UserDefDataDict.ContainsKey(id))
                        foreach (DAL.UserDefData udd in UserDefDataDict[id])
                            if (udd.FieldName == FName)
                            {
                                udd.Deleted = true;
                                DeleteList.Add(udd);
                            }

                        // 新增資料
                        DAL.UserDefData uddNew = new UserDefineData.DAL.UserDefData();
                        uddNew.FieldName = FName;
                        uddNew.RefID = id;
                        uddNew.Value = Value;
                        InsertList.Add(uddNew);
                    }
                }

                try
                {
                    // 先刪除舊的資料在新增新的
                    if(DeleteList.Count >0)
                        UDTTransfer.DeleteDataToUDT(DeleteList);

                    if (InsertList.Count > 0)
                        UDTTransfer.InsertDataToUDT(InsertList );

                    JHSchool.Student.Instance.SyncAllBackground();
                }
                catch (Exception ex) { }

            };
        }
 public void AddWarning(SmartSchool.API.PlugIn.RowData rowData, string message)
 {
     throw new Exception("The method or operation is not implemented.");
 }
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            List<string> SelectedFields = new List<string>() { "學生系統編號", "學號", "班級", "座號", "姓名" };
            List<string> SelectableFields = new List<string>(){"領域","科目","學年度", "學期","權數","節數" , "成績" , "GPA" ,"Level"};

            wizard.SelectedFields.AddRange(SelectedFields);
            wizard.ExportableFields.AddRange(SelectableFields);

            wizard.ExportPackage += delegate(object sender, SmartSchool.API.PlugIn.Export.ExportPackageEventArgs e)
            {
                try
                {
                    List<string> StudentIDs = e.List;

                    string strScoreSQL = "select ref_student_id,school_year,semester,score_info from sems_subj_score where ref_student_id in (" + string.Join(",", StudentIDs.ToArray()) + ")";

                    QueryHelper QueryHelper = Utility.QueryHelper;

                    //學生系統編號 學號 班級 座號 姓名 領域 科目	學年度 學期 權數 節數 成績 GPA Level

                    DataTable tblScore = QueryHelper.Select(strScoreSQL);

                    foreach (DataRow row in tblScore.Rows)
                    {
                        string StudentID = row.Field<string>("ref_student_id");
                        string SchoolYear = row.Field<string>("school_year");
                        string Semester = row.Field<string>("semester");
                        string ScoreInfo = "<root>" + row.Field<string>("score_info") + "</root>";

                        XElement elmScoreInfo = XElement.Load(new StringReader(ScoreInfo));

                        foreach (XElement elmSubject in elmScoreInfo
                            .Element("SemesterSubjectScoreInfo")
                            .Elements("Subject"))
                        {
                            RowData vRow = new RowData();

                            //<Subject GPA=""4.5"" Level=""11"" 努力程度="""" 成績=""100"" 文字描述="""" 權數=""1"" 科目=""物理"" 節數=""1"" 註記="""" 領域=""""/>
                            // "學年度", "學期","領域","科目","權數","節數" , "成績" , "GPA" ,"Level"

                            vRow.ID = StudentID;
                            string Subject = elmSubject.AttributeText("科目");
                            string Score = elmSubject.AttributeText("成績");
                            string Period = elmSubject.AttributeText("節數");
                            string Domain = elmSubject.AttributeText("領域");
                            string Grade = Score;

                            vRow.Add("學年度", SchoolYear);
                            vRow.Add("學期", Semester);
                            vRow.Add("領域", Domain);
                            vRow.Add("科目", Subject);
                            vRow.Add("權數", elmSubject.AttributeText("權數"));
                            vRow.Add("節數", elmSubject.AttributeText("節數"));
                            vRow.Add("成績", elmSubject.AttributeText("成績"));
                            vRow.Add("GPA", elmSubject.AttributeText("GPA"));
                            vRow.Add("Level", elmSubject.AttributeText("Level"));

                            e.Items.Add(vRow);
                        }
                    }
                }
                catch (Exception ve)
                {
                    MessageBox.Show(ve.Message);
                }
            };
        }
        //覆寫
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            List<string> FieldList = new List<string>();
            FieldList.Add("学年度"); //目前字段
            FieldList.Add("学期"); //目前字段
            FieldList.Add("课程名称"); //目前字段
            FieldList.Add("代码");
            FieldList.Add("场地");
            FieldList.Add("类型");

            FieldList.Add("长短课程");
            FieldList.Add("课程领域");
            FieldList.Add("课程属性");
            FieldList.Add("上课形式");

            FieldList.Add("老师1");
            FieldList.Add("老师2");
            FieldList.Add("老师3");

            FieldList.Add("总课时数");
            FieldList.Add("简介");

            FieldList.Add("限制:一年级选课人数限制");
            FieldList.Add("限制:二年级选课人数限制");
            FieldList.Add("限制:三年级选课人数限制");
            FieldList.Add("限制:四年级选课人数限制");
            FieldList.Add("限制:五年级选课人数限制");

            FieldList.Add("限制:一年级选课人数男生限制");
            FieldList.Add("限制:二年级选课人数男生限制");
            FieldList.Add("限制:三年级选课人数男生限制");
            FieldList.Add("限制:四年级选课人数男生限制");
            FieldList.Add("限制:五年级选课人数男生限制");

            FieldList.Add("限制:一年级选课人数女生限制");
            FieldList.Add("限制:二年级选课人数女生限制");
            FieldList.Add("限制:三年级选课人数女生限制");
            FieldList.Add("限制:四年级选课人数女生限制");
            FieldList.Add("限制:五年级选课人数女生限制");


            //取得教師
            TeacherDic = GetTeacher();



            wizard.ExportableFields.AddRange(FieldList);

            wizard.ExportPackage += (sender, e) =>
            {
                //取得學生清單

                AccessHelper helper = new AccessHelper();

                string strCondition = string.Join("','", e.List);
                List<CLUBRecord> records = helper.Select<CLUBRecord>("uid in ('" + strCondition + "')");

                for (int i = 0; i < records.Count; i++)
                {
                    RowData row = new RowData();
                    row.ID = records[i].UID;

                    string teacher1 = "";
                    string teacher2 = "";
                    string teacher3 = "";
                    if (TeacherDic.ContainsKey(records[i].RefTeacherID))
                        teacher1 = TeacherDic[records[i].RefTeacherID];

                    if (TeacherDic.ContainsKey(records[i].RefTeacherID2))
                        teacher2 = TeacherDic[records[i].RefTeacherID2];

                    if (TeacherDic.ContainsKey(records[i].RefTeacherID3))
                        teacher3 = TeacherDic[records[i].RefTeacherID3];

                    foreach (string field in e.ExportFields)
                    {
                        if (wizard.ExportableFields.Contains(field))
                        {
                            switch (field)
                            {
                                case "学年度": row.Add(field, "" + records[i].SchoolYear); break;
                                case "学期": row.Add(field, "" + records[i].Semester); break;
                                case "课程名称": row.Add(field, records[i].ClubName); break;
                                case "代码": row.Add(field, records[i].ClubNumber); break;
                                case "场地": row.Add(field, records[i].Location); break;
                                case "类型": row.Add(field, records[i].ClubCategory); break;

                                case "长短课程": row.Add(field, records[i].FullPhase.HasValue && records[i].FullPhase.Value ? "长课程" : ""); break;
                                case "课程领域": row.Add(field, records[i].Domain); break;
                                case "课程属性": row.Add(field, records[i].Type); break;
                                case "上课形式": row.Add(field, records[i].Formal); break;


                                case "老师1": row.Add(field, teacher1); break;
                                case "老师2": row.Add(field, teacher2); break;
                                case "老师3": row.Add(field, teacher3); break;
                                case "总课时数": row.Add(field, records[i].TotalNumberHours.HasValue ? records[i].TotalNumberHours.Value.ToString() : ""); break;
                                case "简介": row.Add(field, records[i].About); break;

                                case "限制:一年级选课人数限制": row.Add(field, records[i].Grade1Limit.HasValue ? "" + records[i].Grade1Limit.Value : ""); break;
                                case "限制:二年级选课人数限制": row.Add(field, records[i].Grade2Limit.HasValue ? "" + records[i].Grade2Limit.Value : ""); break;
                                case "限制:三年级选课人数限制": row.Add(field, records[i].Grade3Limit.HasValue ? "" + records[i].Grade3Limit.Value : ""); break;
                                case "限制:四年级选课人数限制": row.Add(field, records[i].Grade4Limit.HasValue ? "" + records[i].Grade4Limit.Value : ""); break;
                                case "限制:五年级选课人数限制": row.Add(field, records[i].Grade5Limit.HasValue ? "" + records[i].Grade5Limit.Value : ""); break;

                                case "限制:一年级选课人数男生限制": row.Add(field, records[i].Grade1BoyLimit.HasValue ? "" + records[i].Grade1BoyLimit.Value : ""); break;
                                case "限制:二年级选课人数男生限制": row.Add(field, records[i].Grade2BoyLimit.HasValue ? "" + records[i].Grade2BoyLimit.Value : ""); break;
                                case "限制:三年级选课人数男生限制": row.Add(field, records[i].Grade3BoyLimit.HasValue ? "" + records[i].Grade3BoyLimit.Value : ""); break;
                                case "限制:四年级选课人数男生限制": row.Add(field, records[i].Grade4BoyLimit.HasValue ? "" + records[i].Grade4BoyLimit.Value : ""); break;
                                case "限制:五年级选课人数男生限制": row.Add(field, records[i].Grade5BoyLimit.HasValue ? "" + records[i].Grade5BoyLimit.Value : ""); break;

                                case "限制:一年级选课人数女生限制": row.Add(field, records[i].Grade1GirlLimit.HasValue ? "" + records[i].Grade1GirlLimit.Value : ""); break;
                                case "限制:二年级选课人数女生限制": row.Add(field, records[i].Grade2GirlLimit.HasValue ? "" + records[i].Grade2GirlLimit.Value : ""); break;
                                case "限制:三年级选课人数女生限制": row.Add(field, records[i].Grade3GirlLimit.HasValue ? "" + records[i].Grade3GirlLimit.Value : ""); break;
                                case "限制:四年级选课人数女生限制": row.Add(field, records[i].Grade4GirlLimit.HasValue ? "" + records[i].Grade4GirlLimit.Value : ""); break;
                                case "限制:五年级选课人数女生限制": row.Add(field, records[i].Grade5GirlLimit.HasValue ? "" + records[i].Grade5GirlLimit.Value : ""); break;

                            }
                        }
                    }
                    e.Items.Add(row);
                }
            };
        }
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            AccessHelper helper = new AccessHelper();

            Dictionary<string, CLUBRecord> AllClubDic = new Dictionary<string, CLUBRecord>();
            Dictionary<string, List<string>> SemesterClub = new Dictionary<string, List<string>>();
            //社團基本資料
            List<CLUBRecord> ClubList = helper.Select<CLUBRecord>();
            foreach (CLUBRecord each in ClubList)
            {
                if (!AllClubDic.ContainsKey(each.UID))
                {
                    AllClubDic.Add(each.UID, each);
                }

                string SchoolYearSemester = each.SchoolYear.ToString().PadLeft(3, ' ') + "学年度 第" + each.Semester.ToString() + "学期";

                if (!SemesterClub.ContainsKey(SchoolYearSemester))
                {
                    //學年度學期名稱/當學期的社團課程ID清單
                    SemesterClub.Add(SchoolYearSemester, new List<string>());
                }

                SemesterClub[SchoolYearSemester].Add(each.UID);
            }

            var FiltedSemester = School.DefaultSchoolYear.ToString().PadLeft(3, ' ') + "学年度 第" + School.DefaultSemester + "学期";
            List<string> list = new List<string>();

            foreach (string item in SemesterClub.Keys)
            {
                list.Add(item);
            }
            list.Sort();
            if (list.Count > 0 && !list.Contains(FiltedSemester))
                FiltedSemester = list[0];

            foreach (string item in list)
            {
                SmartSchool.API.PlugIn.VirtualRadioButton radioSem = new VirtualRadioButton(item);
                wizard.Options.Add(radioSem);
                if (item == FiltedSemester)
                    radioSem.Checked = true;
                radioSem.CheckedChanged += delegate(object sender1, EventArgs e1)
                {
                    var target = sender1 as SmartSchool.API.PlugIn.VirtualRadioButton;
                    if (target.Checked)
                        FiltedSemester = target.Text;
                };
                //MenuButton mb = e.VirtualButtons[item];
                //mb.AutoCheckOnClick = true;
                //mb.AutoCollapseOnClick = true;
                //mb.Checked = (item == FiltedSemester);
                //mb.Tag = item;
                //mb.CheckedChanged += delegate(object sender1, EventArgs e1)
                //{
                //    MenuButton mb1 = sender1 as MenuButton;
                //    SetClubList(mb1.Text);
                //    FiltedSemester = FilterMenu.Text = mb1.Text;
                //    mb1.Checked = true;
                //};
            }

            wizard.ExportableFields.AddRange(new string[]{
                "班级",
                "学号",
                "姓名",
                "学籍号",
                "性别",
                "第一阶段",
                "第二阶段"
            });
            wizard.ExportPackage += (sender, e) =>
            {
                Dictionary<string, CLUBRecord> ClubRefIDList = new Dictionary<string, CLUBRecord>();
                //List<CLUBRecord> CLUBRecordList = helper.Select<CLUBRecord>(string.Format("uid in ('{0}')", string.Join("','", e.List)));
                //foreach (CLUBRecord record in CLUBRecordList)
                //{
                //    if (!ClubRefIDList.ContainsKey(record.UID))
                //    {
                //        ClubRefIDList.Add(record.UID, record);
                //    }
                //}
                foreach (CLUBRecord each in ClubList)
                {
                    string SchoolYearSemester = each.SchoolYear.ToString().PadLeft(3, ' ') + "学年度 第" + each.Semester.ToString() + "学期";
                    if (FiltedSemester == SchoolYearSemester)
                    {
                        ClubRefIDList.Add(each.UID, each);
                    }
                }

                string ClubIdString = string.Join("','", ClubRefIDList.Keys);
                List<SCJoin> Scjoin = helper.Select<SCJoin>(string.Format("ref_club_id in ('{0}') and ref_student_id in ('{1}')", ClubIdString, string.Join("','", e.List)));

                Dictionary<string, List<SCJoin>> StudentScjoinDic = new Dictionary<string, List<SCJoin>>();
                foreach (SCJoin join in Scjoin)
                {
                    if (!StudentScjoinDic.ContainsKey(join.RefStudentID))
                    {
                        StudentScjoinDic.Add(join.RefStudentID, new List<SCJoin>());
                    }
                    StudentScjoinDic[join.RefStudentID].Add(join);
                }

                var studentList = K12.Data.Student.SelectByIDs(e.List);
                foreach (var stuRec in studentList)
                {
                    RowData row = new RowData();

                    foreach (string field in e.ExportFields)
                    {
                        if (wizard.ExportableFields.Contains(field))
                        {
                            switch (field)
                            {
                                case "班级":
                                    row.Add(field, stuRec.Class == null ? "" : stuRec.Class.Name);
                                    break;
                                case "学号":
                                    row.Add(field, "" + stuRec.SeatNo);
                                    break;
                                case "姓名":
                                    row.Add(field, "" + stuRec.Name);
                                    break;
                                case "学籍号":
                                    row.Add(field, "" + stuRec.StudentNumber);
                                    break;
                                case "性别":
                                    row.Add(field, "" + stuRec.Gender);
                                    break;
                                case "第一阶段":
                                    if (StudentScjoinDic.ContainsKey(stuRec.ID))
                                    {
                                        foreach (var item in StudentScjoinDic[stuRec.ID])
                                        {
                                            if (item.Phase == 1)
                                            {
                                                if (row.ContainsKey(field))
                                                    row[field] += "," + ClubRefIDList[item.RefClubID].ClubName;
                                                else
                                                    row.Add(field, ClubRefIDList[item.RefClubID].ClubName);
                                            }
                                        }
                                    }
                                    break;
                                case "第二阶段":
                                    if (StudentScjoinDic.ContainsKey(stuRec.ID))
                                    {
                                        foreach (var item in StudentScjoinDic[stuRec.ID])
                                        {
                                            if (item.Phase == 1 && ClubRefIDList[item.RefClubID].FullPhase.HasValue && ClubRefIDList[item.RefClubID].FullPhase.Value == true)
                                            {
                                                if (row.ContainsKey(field))
                                                    row[field] += ",--";
                                                else
                                                    row.Add(field, "--");
                                            }
                                            if (item.Phase == 2)
                                            {
                                                if (row.ContainsKey(field))
                                                    row[field] += "," + ClubRefIDList[item.RefClubID].ClubName;
                                                else
                                                    row.Add(field, ClubRefIDList[item.RefClubID].ClubName);
                                            }
                                        }
                                    }
                                    break;
                            }
                        }
                    }
                    e.Items.Add(row);
                }
            };
        }
        public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard)
        {
            // 取得學生資料
            Dictionary<string, SHStudentRecord> Students = new Dictionary<string, SHStudentRecord>();

            // 取得異動資料
            Dictionary<string, List<SHUpdateRecordRecord>> UpdateRecs = new Dictionary<string, List<SHUpdateRecordRecord>>();
            wizard.PackageLimit = 3000;
            wizard.ImportableFields.AddRange("班別", "特殊身份代碼", "異動科別", "年級", "異動學號", "異動姓名", "身分證號", "註1", "異動代碼", "異動日期", "原因及事項", "新學號", "更正後資料", "舊班別", "舊科別代碼", "備查日期", "備查文號", "核准日期", "核准文號", "備註");
            wizard.RequiredFields.AddRange("異動代碼", "異動日期");
            wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e)
            {
                Students.Clear();
                UpdateRecs.Clear();

                // 取得學生資料
                foreach (SHStudentRecord studRec in SHStudent.SelectByIDs(e.List))
                    if (!Students.ContainsKey(studRec.ID))
                        Students.Add(studRec.ID, studRec);
                foreach (string str in Students.Keys)
                {
                    List<SHUpdateRecordRecord> UpdRecList = new List<SHUpdateRecordRecord>();
                    UpdateRecs.Add(str, UpdRecList);
                }

                // 取得異動
                MultiThreadWorker<string> loader1 = new MultiThreadWorker<string>();
                loader1.MaxThreads = 3;
                loader1.PackageSize = 250;
                loader1.PackageWorker += delegate(object sender1, PackageWorkEventArgs<string> e1)
                {
                    foreach (SHUpdateRecordRecord UpdRec in SHUpdateRecord.SelectByStudentIDs(e.List))
                    {

                        // 過濾非符合標準的異動(目前是學籍)
                        if(!_UpdateCodeList.Contains(UpdRec.UpdateCode))
                            continue;

                            if (UpdateRecs.ContainsKey(UpdRec.StudentID))
                                UpdateRecs[UpdRec.StudentID].Add(UpdRec);
                    }
                };
                loader1.Run(e.List);
            };

            wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e)
            {
                int i = 0;
                DateTime dt;
                // 檢查學生是否存在
                SHStudentRecord studRec = null;
                if (Students.ContainsKey(e.Data.ID))
                    studRec = Students[e.Data.ID];
                else
                {
                    e.ErrorMessage = "沒有這位學生" + e.Data.ID;
                    return;
                }

                // 驗證格式資料
                bool InputFormatPass = true;
                foreach (string field in e.SelectFields)
                {
                    string value = e.Data[field].Trim();
                    //// 驗證$無法匯入
                    //if (value.IndexOf('$') > -1)
                    //{
                    //    e.ErrorFields.Add(field, "儲存格有$無法匯入.");
                    //    break;
                    //}
                    switch (field)
                    {
                        default:
                            break;

                        //// 班別
                        //case "班別": break;
                        //// 特殊身份代碼
                        //case "特殊身份代碼": break;
                        //// 異動科別
                        //case "異動科別": break;
                        //// 年級
                        //case "年級": break;
                        //// 異動學號
                        //case "異動學號": break;
                        //// 異動姓名
                        //case "異動姓名": break;
                        //// 身分證號
                        //case "身分證號": break;
                        //// 註1
                        //case "註1": break;
                        //// 異動種類
                        //case "異動種類": break;
                        // 異動代碼
                        case "異動代碼":
                            if (!_UpdateCodeList.Contains(value))
                            {
                                InputFormatPass &= false;
                                e.ErrorFields.Add(field, "非學籍異動代碼!");
                            }
                            break;
                        // 異動日期(必填)
                        case "異動日期":
                            DateTime dtC1;
                            if (DateTime.TryParse(value, out dtC1))
                            { }
                            else
                            {
                                InputFormatPass &= false;
                                e.ErrorFields.Add(field, "日期錯誤!");
                            }

                            break;

                        case "備查日期":
                        case "核准日期":
                            DateTime dtC2;
                            if (value.Trim() != "")
                            {
                                if (DateTime.TryParse(value, out dtC2))
                                { }
                                else
                                {
                                    InputFormatPass &= false;
                                    e.ErrorFields.Add(field, "日期錯誤!");
                                }
                            }
                            break;
                        //// 原因及事項
                        //case "原因及事項": break;
                        //// 新學號
                        //case "新學號": break;
                        //// 更正後資料
                        //case "更正後資料": break;
                        //// 舊班別
                        //case "舊班別": break;
                        //// 舊科別代碼
                        //case "舊科別代碼": break;
                        //// 備查日期
                        //case "備查日期":
                        //    break;
                        //// 備查文號
                        //case "備查文號": break;
                        //// 核准日期
                        //case "核准日期": break;
                        //// 核准文號
                        //case "核准文號": break;
                        //// 備註
                        //case "備註": break;
                    }
                }

            };

            wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e)
            {
                Dictionary<string, List<RowData>> id_Rows = new Dictionary<string, List<RowData>>();
                foreach (RowData data in e.Items)
                {
                    if (!id_Rows.ContainsKey(data.ID))
                        id_Rows.Add(data.ID, new List<RowData>());
                    id_Rows[data.ID].Add(data);
                }

                List<SHUpdateRecordRecord> InsertList = new List<SHUpdateRecordRecord>();
                List<SHUpdateRecordRecord> UpdateList = new List<SHUpdateRecordRecord>();

                // 檢查新增或更新方式:
                // 每筆 Key 為:異動日期+異動代碼+原因及事項,如果三者內容相同更新,如果不同就新增。
                foreach (string id in id_Rows.Keys)
                {
                    DateTime dt;

                    // 讀取工作表內資料
                    foreach (RowData data in id_Rows[id])
                    {
                        // 當異動記錄內沒有工作表讀取轉換後學生ID,就跳過。
                        if (!UpdateRecs.ContainsKey(id))
                            continue;

                        DateTime.TryParse(data["異動日期"], out dt);

                        // 異動代碼
                        string UpdateCode = string.Empty;
                        if (data.ContainsKey("異動代碼"))
                            UpdateCode = data["異動代碼"];

                        // 取得原因及事項
                        string UpdateDesc = string.Empty;
                        if (data.ContainsKey("原因及事項"))
                            UpdateDesc = data["原因及事項"];

                        SHUpdateRecordRecord updateRec = null;
                        // 異動日期+異動代碼 (如果相同有當更新,不同就新增)
                        foreach (SHUpdateRecordRecord urr in UpdateRecs[id])
                        {
                            if (UpdateCode == urr.UpdateCode)
                            {
                                DateTime dt1;
                                DateTime.TryParse(urr.UpdateDate, out dt1);
                                if (dt == dt1)
                                {
                                    // 使用原因及事項當作Key
                                    if(UpdateDesc == urr.UpdateDescription )
                                        updateRec = urr;
                                }
                            }
                        }
                        bool isInsert = true;

                        if (updateRec == null)
                        {
                            updateRec = new SHUpdateRecordRecord();
                            updateRec.StudentID = id;
                        }
                        else
                            isInsert = false;

                        // 這段在做資料填入異動紀錄
                        foreach (string field in e.ImportFields)
                        {
                            string value = data[field].Trim();
                            switch (field)
                            {
                                // 班別
                                case "班別":
                                    updateRec.ClassType = value;
                                    break;
                                // 特殊身份代碼
                                case "特殊身份代碼":
                                    updateRec.SpecialStatus = value;
                                    break;
                                // 異動科別
                                case "異動科別":
                                    updateRec.Department = value;
                                    break;
                                // 年級
                                case "年級":
                                    updateRec.GradeYear = value;
                                    break;
                                // 異動學號
                                case "異動學號":
                                    updateRec.StudentNumber = value;
                                    break;
                                // 異動姓名
                                case "異動姓名":
                                    updateRec.StudentName = value;
                                    break;
                                // 身分證號
                                case "身分證號":
                                    updateRec.IDNumber = value;
                                    break;
                                // 註1
                                case "註1":
                                    updateRec.IDNumberComment = value;
                                    break;
                                //// 異動種類
                                //case "異動種類":
                                //    break;
                                // 異動代碼
                                case "異動代碼":
                                    updateRec.UpdateCode = value;
                                    break;
                                // 異動日期
                                case "異動日期":
                                    DateTime dt1;
                                    if (DateTime.TryParse(value, out dt1))
                                        updateRec.UpdateDate = dt1.ToShortDateString();
                                    break;
                                // 原因及事項
                                case "原因及事項":
                                    updateRec.UpdateDescription = value;
                                    break;
                                // 新學號
                                case "新學號":
                                    updateRec.NewStudentNumber = value;
                                    break;
                                // 更正後資料
                                case "更正後資料":
                                    updateRec.NewData = value;
                                    break;
                                // 舊班別
                                case "舊班別":
                                    updateRec.OldClassType = value;
                                    break;
                                // 舊科別代碼
                                case "舊科別代碼":
                                    updateRec.OldDepartmentCode = value;
                                    break;
                                // 備查日期
                                case "備查日期":
                                    DateTime dt2;
                                    if (DateTime.TryParse(value,out dt2))
                                        updateRec.LastADDate = dt2.ToShortDateString ();
                                    break;
                                // 備查文號
                                case "備查文號":
                                    updateRec.LastADNumber = value;
                                    break;
                                // 核准日期
                                case "核准日期":
                                    DateTime dt3;
                                    if(DateTime.TryParse(value, out dt3))
                                        updateRec.ADDate = dt3.ToShortDateString();
                                    break;
                                // 核准文號
                                case "核准文號":
                                    updateRec.ADNumber = value;
                                    break;
                                // 備註
                                case "備註":
                                    updateRec.GraduateComment = value;
                                    break;
                            }
                        }

                        if (string.IsNullOrEmpty(updateRec.StudentID) || string.IsNullOrEmpty(updateRec.UpdateDate) || string.IsNullOrEmpty(updateRec.UpdateCode))
                            continue;
                        else
                        {
                            if (isInsert)
                                InsertList.Add(updateRec);
                            else
                                UpdateList.Add(updateRec);
                        }
                    }

                }

                try
                {
                    if (InsertList.Count > 0)
                        Insert(InsertList);

                    if (UpdateList.Count > 0)
                        Update(UpdateList);

                    PermRecLogProcess prlp = new PermRecLogProcess();
                    prlp.SaveLog("學生.匯入異動", "匯入學籍異動", "匯入學籍異動:共新增" + InsertList.Count + "筆資料,共更新:" + UpdateList.Count + "筆資料");
                    SmartSchool.StudentRelated.Student.Instance.SyncAllBackground();
                }
                catch (Exception ex) { }
            };
        }
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            wizard.ExportableFields.AddRange(ExportItemList);
            wizard.ExportPackage += delegate(object sender,SmartSchool.API.PlugIn.Export.ExportPackageEventArgs e)
            {
                // 依學生ID取得優先關懷
                List<DAO.UDT_CounselCareRecordDef> _CounselCareRecordList = _UDTTransfer.GetCareRecordsByStudentIDList(e.List);

                // 學生ID List
                List<int> studIdList = (from data in _CounselCareRecordList select data.StudentID).ToList();

                // 取得學生名稱log 用
                Dictionary<string, string> StudentNameDict = new Dictionary<string, string>();
                foreach (KeyValuePair<int, string> data in Utility.GetConvertStringDict1fromDB(studIdList))
                    StudentNameDict.Add(data.Key.ToString(), data.Value);

                // 記錄匯出 log 細項用
                Dictionary<string, StringBuilder> logData = new Dictionary<string, StringBuilder>();

                // 匯出總筆數
                int totalCount = 0;

                foreach (DAO.UDT_CounselCareRecordDef ccrd in _CounselCareRecordList)
                {
                    RowData row = new RowData();
                    totalCount++;

                    row.ID = ccrd.StudentID.ToString();
                    foreach (string field in e.ExportFields)
                    {
                        if (wizard.ExportableFields.Contains(field))
                        {
                            switch(field)
                            {
                                case "代號":
                                    row.Add(field, ccrd.CodeName);
                                    break;
                                case "立案日期":
                                    if(ccrd.FileDate.HasValue)
                                        row.Add(field, ccrd.FileDate.Value.ToShortDateString());
                                    break;
                                case "個案類別":
                                    row.Add(field, ccrd.CaseCategory);
                                    break;
                                case "個案類別備註":
                                    row.Add(field, ccrd.CaseCategoryRemark);
                                    break;
                                case "個案來源":
                                    row.Add(field, ccrd.CaseOrigin);
                                    break;
                                case "個案來源備註":
                                    row.Add(field, ccrd.CaseOriginRemark);
                                    break;
                                case "優勢能力及財力":
                                    row.Add(field, ccrd.Superiority);
                                    break;
                                case "弱勢能力及財力":
                                    row.Add(field, ccrd.Weakness);
                                    break;
                                case "輔導人員輔導目標":
                                    row.Add(field, ccrd.CounselGoal);
                                    break;
                                case "校外協輔機構":
                                    row.Add(field, ccrd.OtherInstitute);
                                    break;
                                case "輔導人員輔導方式":
                                    row.Add(field, ccrd.CounselType);
                                    break;
                                case "協同輔導人員協助導師事項":
                                    row.Add(field, ccrd.AssistedMatter);
                                    break;
                                case "記錄者":
                                    row.Add(field, ccrd.AuthorID);
                                    break;
                                case "記錄者姓名":
                                    row.Add(field, ccrd.AuthorName);
                                    break;
                                case "狀態":
                                    row.Add(field, ccrd.StudentStatus);
                                    break;
                            }
                        }
                    }
                    e.Items.Add(row);
                }
                // 處理 log 細項
                foreach (RowData rd in e.Items)
                {
                    // 收集 log
                    StringBuilder sb = new StringBuilder();
                    if (StudentNameDict.ContainsKey(rd.ID))
                        sb.AppendLine(StudentNameDict[rd.ID]);
                    sb.AppendLine(this.Text);
                    foreach (KeyValuePair<string, string> data in rd)
                        sb.AppendLine(data.Key + ":" + data.Value);

                    // 加入 log
                    if (logData.ContainsKey(rd.ID))
                    {
                        sb.AppendLine();
                        logData[rd.ID].AppendLine(sb.ToString());
                    }
                    else
                        logData.Add(rd.ID, sb);
                }

                // 寫入 log
                DAO.LogTransfer log = new DAO.LogTransfer();
                foreach (KeyValuePair<string, StringBuilder> data in logData)
                    log.SaveLog("輔導系統." + this.Text, "匯出", "student", data.Key, data.Value);

                StringBuilder sbT= new StringBuilder ();
                sbT.AppendLine(this.Text);
                sbT.AppendLine("總共匯出"+logData.Keys.Count+"位學生 , 共"+totalCount+"筆");
                sbT.AppendLine("匯出學生名單..");
                foreach (KeyValuePair<string, string> data in StudentNameDict)
                    if (logData.ContainsKey(data.Key))
                        sbT.AppendLine(data.Value);

                log.SaveLog("輔導系統." + this.Text, "匯出","student","",sbT);

            };
        }
        public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard)
        {
            Dictionary<string, TeacherRecord> Teachers = new Dictionary<string, TeacherRecord>();
            Dictionary<string, List<TeacherTagRecord>> TeacherTagRecDic = new Dictionary<string, List<TeacherTagRecord>>();

            Dictionary<string, Dictionary<string, string>> TeachTagNameDic = DATeacherTransfer.GetTeacherTagNameDic();

            // 取得可加入學生 TagName
            wizard.PackageLimit = 3000;
            wizard.ImportableFields.AddRange(ImportItemList);
            wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e)
            {
                // 取得學生資料
                foreach (TeacherRecord TeacherRec in Teacher.SelectByIDs(e.List))
                    if (!Teachers.ContainsKey(TeacherRec.ID))
                    {
                        Teachers.Add(TeacherRec.ID, TeacherRec);
                        TeacherTagRecDic.Add(TeacherRec.ID, new List<TeacherTagRecord>());
                    }

                // 取得學生類別
                foreach (TeacherTagRecord teachTag in TeacherTag.SelectByTeacherIDs(Teachers.Keys))
                {
                    //if (!StudTagRecDic.ContainsKey(studTag.RefStudentID))
                    //{
                    //    List<JHStudentTagRecord> rec = new List<JHStudentTagRecord> ();
                    //    rec.Add(studTag );
                    //    StudTagRecDic.Add(studTag.RefStudentID,rec);
                    //}
                    //else
                    if (TeacherTagRecDic.ContainsKey(teachTag.RefTeacherID))
                        TeacherTagRecDic[teachTag.RefTeacherID].Add(teachTag);
                }
            };

            wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e)
            {
                int i = 0;

                // 檢查學生是否存在
                TeacherRecord teachRec = null;
                if (Teachers.ContainsKey(e.Data.ID))
                    teachRec = Teachers[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<TeacherTagRecord> InsertList = new List<TeacherTagRecord>();
                //                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 TeachTagNameDic)
                {
                    foreach (KeyValuePair<string, string> data1 in data.Value)
                        CheckStudTagName.Add(data.Key + data1.Key);
                }

                // 檢查類別是否已經存在
                foreach (string id in id_Rows.Keys)
                {
                    if (!TeacherTagRecDic.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<TagConfigRecord> Recs = new List<TagConfigRecord>();
                foreach (KeyValuePair<string, List<string>> data in NeedAddPrefixName)
                {
                    foreach (string data1 in data.Value)
                    {
                        TagConfigRecord rec = new TagConfigRecord();
                        rec.Category = "Teacher";
                        rec.Prefix = data.Key;
                        rec.Name = data1;
                        rec.Color = System.Drawing.Color.White;
                        Recs.Add(rec);
                    }
                }
                TagConfig.Insert(Recs);

                TeachTagNameDic.Clear();

                // 重新取得
                TeachTagNameDic = DATeacherTransfer.GetTeacherTagNameDic();

                foreach (string id in id_Rows.Keys)
                {
                    if (!TeacherTagRecDic.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 (TeacherTagRecord rec in TeacherTagRecDic[id])
                        {
                            if (rec.Prefix == strPrefix && rec.Name == strName)
                            {
                                isInsert = false;
                                break;
                            }
                        }

                        if (isInsert)
                        {
                            // 學生類別管理名稱對照
                            if (TeachTagNameDic.ContainsKey(strPrefix))
                            {
                                if (TeachTagNameDic[strPrefix].ContainsKey(strName))
                                {
                                    TeacherTagRecord TeachTag = new TeacherTagRecord();
                                    TeachTag.RefEntityID = id;
                                    TeachTag.RefTagID = TeachTagNameDic[strPrefix][strName];
                                    InsertList.Add(TeachTag);
                                }
                            }
                        }
                    }
                }

                try
                {
                    if (InsertList.Count > 0)
                        Insert(InsertList);

                    //if (UpdateList.Count > 0)
                    //    Update(UpdateList);

                    Tagging.PermRecLogProcess prlp = new Tagging.PermRecLogProcess();
                    prlp.SaveLog("教師.匯入類別", "匯入教師類別", "共新增" + InsertList.Count + "筆資料");
                    K12.Data.Teacher.RemoveAll();
                    K12.Data.Teacher.SelectAll();

                }
                catch (Exception ex) { }

            };
        }
        public override void InitializeExport(SmartSchool.API.PlugIn.Export.ExportWizard wizard)
        {
            wizard.ExportableFields.AddRange(ExportItemList);
            wizard.ExportPackage += delegate(object sender, SmartSchool.API.PlugIn.Export.ExportPackageEventArgs e)
               {
               // 依學生ID取得晤談紀錄
                List<DAO.UDT_CounselStudentInterviewRecordDef> _StudentInterviewRecordList = _UDTTransfer.GetCounselStudentInterviewRecordByStudentIDList(e.List);

                // 取得教師ID與名稱對照
                Dictionary<int, string> TeacherNameDict = Utility.GetTeacherIDNameDict();

               Dictionary<string, string> item_AttendessDict = new Dictionary<string, string>();
                Dictionary<string, string> item_CounselTypeDict = new Dictionary<string, string>();
                Dictionary<string, string> item_CounselTypeKindDict = new Dictionary<string, string>();

                // 學生ID List
                List<int> studIdList = (from data in _StudentInterviewRecordList select data.StudentID).ToList();

                // 取得學生名稱log 用
                Dictionary<string, string> StudentNameDict = new Dictionary<string, string>();
                foreach (KeyValuePair<int, string> data in Utility.GetConvertStringDict1fromDB(studIdList))
                    StudentNameDict.Add(data.Key.ToString(), data.Value);

                // 記錄匯出 log 細項用
                Dictionary<string, StringBuilder> logData = new Dictionary<string, StringBuilder>();

                // 匯出總筆數
                int totalCount = 0;

                foreach (DAO.UDT_CounselStudentInterviewRecordDef csir in _StudentInterviewRecordList)
                {

                    // 取得 XML 解析後
                    item_AttendessDict = Utility.GetConvertCounselXMLVal_Attendees(csir.Attendees);
                    item_CounselTypeDict = Utility.GetConvertCounselXMLVal_CounselType(csir.CounselType);
                    item_CounselTypeKindDict = Utility.GetConvertCounselXMLVal_CounselTypeKind(csir.CounselTypeKind);

                    RowData row = new RowData();
                    row.ID = csir.StudentID.ToString();
                     foreach (string field in e.ExportFields)
                     {
                         if (wizard.ExportableFields.Contains(field))
                         {
                             // 參與人員
                             if (item_AttendessDict.ContainsKey(field))
                                 row.Add(field, item_AttendessDict[field]);

                             // 輔導方式
                             if (item_CounselTypeDict.ContainsKey(field))
                                 row.Add(field, item_CounselTypeDict[field]);

                             // 輔導歸類
                             if (item_CounselTypeKindDict.ContainsKey(field))
                                 row.Add(field, item_CounselTypeKindDict[field]);

                             switch (field)
                             {
                                 case "晤談編號":
                                     row.Add(field, csir.InterviewNo);
                                     break;
                                 case "晤談老師":
                                     // 需轉換
                                   if(TeacherNameDict.ContainsKey(csir.TeacherID))
                                       row.Add(field, TeacherNameDict[csir.TeacherID]);
                                     break;
                                 case "晤談方式":
                                     row.Add(field, csir.InterviewType);
                                     break;
                                 case "晤談對象":
                                     row.Add(field, csir.IntervieweeType);
                                     break;
                                 case "日期":
                                     if(csir.InterviewDate.HasValue )
                                        row.Add(field, csir.InterviewDate.Value.ToShortDateString());
                                     break;
                                 case "時間":
                                     row.Add(field, csir.InterviewTime);
                                     break;
                                 case "地點":
                                     row.Add(field, csir.Place);
                                     break;
                                 case "晤談事由":
                                     row.Add(field, csir.Cause);
                                     break;
                                 case "參與人員":
                                     // 解析 XML
                                     row.Add(field,Utility.AttendeesXMLToString(csir.Attendees));
                                     break;
                                 case "輔導方式":
                                     // 解析 XML
                                     row.Add(field, Utility.CounselTypeXMLToString(csir.CounselType));
                                     break;
                                 case "輔導歸類":
                                     // 解析 XML
                                     row.Add(field, Utility.CounselTypeKindXMLToString(csir.CounselTypeKind));
                                     break;
                                 case "內容要點":
                                     row.Add(field, csir.ContentDigest);
                                     break;

                                 case "記錄者":
                                     row.Add(field, csir.AuthorID);
                                     break;

                                 case "記錄者姓名":
                                     row.Add(field, csir.AuthorName);
                                     break;

                                 case "狀態":
                                     row.Add(field, csir.StudentStatus);
                                     break;

                             }
                         }
                     }
                     e.Items.Add(row);
                }
                // 處理 log 細項
                foreach (RowData rd in e.Items)
                {
                    // 收集 log
                    StringBuilder sb = new StringBuilder();
                    if (StudentNameDict.ContainsKey(rd.ID))
                        sb.AppendLine(StudentNameDict[rd.ID]);
                    sb.AppendLine(this.Text);
                    foreach (KeyValuePair<string, string> data in rd)
                        sb.AppendLine(data.Key + ":" + data.Value);

                    // 加入 log
                    if (logData.ContainsKey(rd.ID))
                    {
                        sb.AppendLine();
                        logData[rd.ID].AppendLine(sb.ToString());
                    }
                    else
                        logData.Add(rd.ID, sb);
                }

                // 寫入 log
                DAO.LogTransfer log = new DAO.LogTransfer();
                foreach (KeyValuePair<string, StringBuilder> data in logData)
                    log.SaveLog("輔導系統." + this.Text, "匯出", "student", data.Key, data.Value);

                StringBuilder sbT = new StringBuilder();
                sbT.AppendLine(this.Text);
                sbT.AppendLine("總共匯出" + logData.Keys.Count + "位學生 , 共" + totalCount + "筆");
                sbT.AppendLine("匯出學生名單..");
                foreach (KeyValuePair<string, string> data in StudentNameDict)
                    if (logData.ContainsKey(data.Key))
                        sbT.AppendLine(data.Value);

                log.SaveLog("輔導系統." + this.Text, "匯出", "student", "", sbT);
               };
        }
        public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard)
        {
            // 學生資料, 準備用來判斷學生是否存在
            // key: 學生系統ID ; value: 學生資料
            Dictionary<string, StudentRecord> studentDic = new Dictionary<string, StudentRecord>();
            // key: 學生系統ID ; Value: 離校資訊
            Dictionary<string, SHLeaveInfoRecord> leaveInfoDic = new Dictionary<string, SHLeaveInfoRecord>();
            // 用來檢查是否有重複的資料
            List<string> checkSameList = new List<string>();

            wizard.PackageLimit = 300;
            // 離校學年度, 離校類別, 離校科別, 離校班級, 畢業證書字號
            wizard.ImportableFields.AddRange(new string[] { Global._ColLeaveScholYear,
                                                            Global._ColLeaveReason,
                                                            Global._ColLeaveDept,
                                                            Global._ColLeaveClassName,
                                                            Global._ColDiplomaNumber
                                                            });
            //wizard.RequiredFields.AddRange("欄位名稱");
            
            //#region 說明按鈕的內容
            //wizard.HelpButtonVisible = true;
            //wizard.HelpButtonClick += delegate(object sender, EventArgs e)
            //{
            //    new FrmHelp(new List<string>(),
            //                wizard.ImportableFields.ToList<string>()).ShowDialog();
            //};
            //#endregion 說明按鈕的內容

            #region "準備驗證資料"的事件
            wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e)
            {
                // 初始資料
                studentDic.Clear();
                leaveInfoDic.Clear();
                checkSameList.Clear();
                _LogHelper = new LogHelper();
                _UpdateRecList = new List<SHLeaveInfoRecord>();

                #region 取得需要的資料
                // 取得學生資料
                foreach (StudentRecord studRec in Student.SelectByIDs(e.List))
                    if (!studentDic.ContainsKey(studRec.ID))
                        studentDic.Add(studRec.ID, studRec);

                // 取得學生的離校資訊
                List<SHLeaveInfoRecord> leaveInfoList = SHLeaveInfo.SelectByStudentIDs(e.List);
                foreach (SHLeaveInfoRecord rec in leaveInfoList)
                {
                    if (!leaveInfoDic.ContainsKey(rec.RefStudentID))
                        leaveInfoDic.Add(rec.RefStudentID, rec);
                }
                #endregion
            };
            #endregion

            #region "開始驗證每一條row"的事件
            wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e)
            {
                #region 檢查學生是否存在
                if (!studentDic.ContainsKey(e.Data.ID))
                {
                    e.ErrorMessage = "沒有這位學生" + e.Data.ID;
                    return;
                }
                #endregion

                #region 檢查是否有重複的學生系統編號
                if (checkSameList.Contains(e.Data.ID))
                {
                    e.ErrorFields.Add(Global._ColStudentId, e.Data.ID + " 不允許重複");
                }
                else
	              {
                    checkSameList.Add(e.Data.ID);
	              }
                #endregion

                #region 檢查是否有這個學生的離校資訊
                if (!leaveInfoDic.ContainsKey(e.Data.ID))
                {
                    e.ErrorMessage = "無法取得這位學生" + e.Data.ID + "離校資訊";
                    return;
                }
                #endregion

                #region 驗證格式資料
                
                foreach (string field in e.SelectFields)
                {
                    string value = e.Data[field].Trim();
                    switch (field)
                    {
                        case Global._ColLeaveScholYear:
                            if (!string.IsNullOrEmpty(value) &&     // 非空字串
                                (Utility.ConvertStringToInt(value) == null) )   // 轉數字失敗
                            {
                                e.ErrorFields.Add(field, "非數字型態");
                            }
                            
                            break;
                        default:
                            break;
                    }
                }
                #endregion
            };
            #endregion

            #region "開始匯入資料"的事件
            wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e)
            {
                #region 處理每一筆row
                foreach (RowData row in e.Items)
                {
                    string studentId = row.ID;

                    // 取得該位學生的離校資訊
                    SHLeaveInfoRecord rec = leaveInfoDic[studentId];
                    
                    // [Log]儲存學生資料
                    _LogHelper.SaveStudentRecForLog(studentDic[studentId]);
                    // [Log]先儲存原本的資料
                    _LogHelper.SaveOldRecForLog(rec);

                    #region 處理需要更新資料
                    foreach (string field in e.ImportFields)
                    {
                        string value = row[field];
                        // 假如內容為空, 不處理
                        if (string.IsNullOrEmpty(value)) continue;

                        switch (field)
                        {
                            // 離校學年度
                            case Global._ColLeaveScholYear:
                                int? tmp = Utility.ConvertStringToInt(value);
                                rec.SchoolYear = tmp;
                                break;
                            // 離校類別
                            case Global._ColLeaveReason:
                                rec.Reason = value;
                                break;
                            // 離校科別
                            case Global._ColLeaveDept:
                                rec.DepartmentName = value;
                                break;
                            // 離校班級
                            case Global._ColLeaveClassName:
                                rec.ClassName = value;
                                break;
                            // 畢業證書字號
                            case Global._ColDiplomaNumber:
                                rec.DiplomaNumber = value;
                                break;
                            default:
                                break;
                        }

                    }
                    #endregion 處理需要更新資料

                    // [Log]儲存更新後的資料
                    _LogHelper.SaveNewRecForLog(rec);

                    // 加入更新名單
                    _UpdateRecList.Add(rec);
                }
                #endregion 處理每一筆row

                #region 更新DB資料
                if (_UpdateRecList.Count > 0)
                {
                    // 更新DB資料
                    SHLeaveInfo.Update(_UpdateRecList);

                    #region 處理Log
                    StringBuilder sb = new StringBuilder();
                    sb.AppendLine("更新" + Global._Title + ":");
                    foreach (SHLeaveInfoRecord rec in _UpdateRecList)
                    {
                        if (_LogHelper.LeaveInfoPairDic.ContainsKey(rec.RefStudentID))
                            sb.AppendLine(_LogHelper.ComposeUpdateLogString(_LogHelper.LeaveInfoPairDic[rec.RefStudentID]));
                    }

                    FISCA.LogAgent.ApplicationLog.Log("學生." + Global._Title + "-匯入", "更新匯入", sb.ToString());
                    #endregion 處理Log
                }
                #endregion 更新DB資料
            };
            #endregion "開始匯入資料"的事件

            #region "匯入結束"的事件
            wizard.ImportComplete += delegate(object sender, EventArgs e)
            {
                // 更新系統暫存資料
                SmartSchool.Broadcaster.Events.Items["學生/資料變更"].Invoke(studentDic.Keys.ToList<string>());
            };
            #endregion "匯入結束"的事件
        }