using System; using System.Data; using System.Configuration; using System.Data.Common; using System.Collections; using System.Collections.Generic; using Wellan.Data; using Wellan.Common; using System.Linq; /// /// 節假日設定檔 /// public class BhrdDAC : Wellan.Data.WDAC { private Hashtable bhrdData = new Hashtable(); private string nationalHolidays = "0101,0228,0501,1010"; public const string 排休 = "排休"; public const string 例假日 = "例假日"; public const string 休假日 = "休假日"; public const string 國定假日 = "國定假日"; public static readonly List 休假日班表 = new List { 排休, 例假日, 休假日, 國定假日 }; public BhrdDAC() { } public BhrdDAC(string connectionConfig, string connectionConfigName) : this() { this._connectionConfig = connectionConfig; this._connectionConfigName = connectionConfigName; } public BhrdDAC(WQuery query) { this._query = query; } public DataTable GetAll() { return Query.Select("SELECT BHYER, BHHRD FROM BHRD ORDER BY BHYER"); } public string[] GetYear(int Year) { DbCommand cmd = Query.NewCommand("SELECT BHYER, BHHRD FROM BHRD WHERE BHYER=@BHYER"); cmd.Parameters.Add(Query.NewParameter("BHYER", Year)); DataTable bhrd = Query.Select(cmd); string yearData; // 有資料,取出該年資料 if (bhrd.Rows.Count != 0) { yearData = bhrd.Rows[0]["BHHRD"].ToString(); } // 無資料,回傳預設資料 else { char[] tmp = new char[366]; for (int i = 0; i < tmp.Length; i++) { tmp[i] = ' '; } DateTime aDate = new DateTime(Year, 1, 1); for (int i = 0; i < tmp.Length; i++) { if (aDate.DayOfWeek == DayOfWeek.Sunday || aDate.DayOfWeek == DayOfWeek.Saturday) tmp[i] = (char)HolidayType.Holiday; else if (nationalHolidays.Contains(String.Format("{0:00}{1:00}", aDate.Month, aDate.Day))) tmp[i] = (char)HolidayType.NationalHoliday; else tmp[i] = (char)HolidayType.WorkDay; aDate = aDate.AddDays(1); if (aDate.Year != Year) break; } yearData = new String(tmp); } string[] result = new string[12]; for (int m = 1; m <= 12; m++) { DateTime aDate = new DateTime(Year, m, 1); result[m - 1] = yearData.Substring(aDate.DayOfYear - 1, WGuard1.GetMonthEnd(aDate, 0).Day); } return result; } private void SetYear(int Year, string[] YearData) { DbCommand cmd = Query.NewCommand("SELECT COUNT(1) FROM BHRD WHERE BHYER=@BHYER"); cmd.Parameters.Add(Query.NewParameter("BHYER", Year)); int count; ExecuteScalar(cmd, out count); if (count == 0) { cmd.CommandText = "INSERT INTO BHRD (BHYER, BHHRD, TRDAT, TRMOD, TRUSR) VALUES (@BHYER, @BHHRD, GETDATE(), 'INSERT', 'X001')"; } else { cmd.CommandText = "UPDATE BHRD SET BHHRD=@BHHRD, TRDAT=GETDATE(), TRMOD='MODIFY', TRUSR='X001' WHERE BHYER=@BHYER"; } cmd.Parameters.Add(Query.NewParameter("BHHRD", String.Concat(YearData))); Query.ExecuteNonQuery(cmd); } public string GetMonth(int Year, int Month) { string[] YearData = GetYear(Year); return YearData[Month - 1]; } public void SetMonth(int Year, int Month, string Value) { string[] YearData = GetYear(Year); YearData[Month - 1] = Value; SetYear(Year, YearData); } public HolidayType GetDayHolidayType(DateTime aDateTime) { string bhhrd = ""; if (!bhrdData.Contains(aDateTime.Year)) { DbCommand cmd = Query.NewCommand("SELECT BHHRD FROM BHRD WHERE BHYER=@BHYER"); cmd.Parameters.Add(Query.NewParameter("BHYER", aDateTime.Year)); if (ExecuteScalar(cmd, out bhhrd)) bhrdData.Add(aDateTime.Year, bhhrd); } else { bhhrd = bhrdData[aDateTime.Year].ToString(); } if (bhhrd != "") { // 有節假日資料,找出該日之節假日資料 char theDay; try { theDay = bhhrd[aDateTime.DayOfYear - 1]; } catch { theDay = ' '; } switch ((HolidayType)theDay) { case HolidayType.WorkDay: // 上班日 case HolidayType.CompensatoryWorkDay: // 補班 case HolidayType.NationalHoliday: // 國定假日或民俗假 case HolidayType.Holiday: // 例假日 case HolidayType.ElasticRest: // 彈性休假 case HolidayType.TyphoonRest: // 颱風假 case HolidayType.VoteRest: // 選舉假 case HolidayType.CompanyActivity: // 公司活動 return (HolidayType)theDay; default: if (nationalHolidays.Contains(aDateTime.ToString("MMdd"))) return HolidayType.NationalHoliday; else if (aDateTime.DayOfWeek == DayOfWeek.Sunday || aDateTime.DayOfWeek == DayOfWeek.Saturday) return HolidayType.Holiday; else return HolidayType.WorkDay; } } else { // 若無節假日資料,則週六、週日為假日 if (nationalHolidays.Contains(aDateTime.ToString("MMdd"))) return HolidayType.NationalHoliday; else if (aDateTime.DayOfWeek == DayOfWeek.Sunday || aDateTime.DayOfWeek == DayOfWeek.Saturday) return HolidayType.Holiday; else return HolidayType.WorkDay; } } public bool IsHoliday(string bpeno, DateTime aDateTime) { // 先看班表有沒有資料 RtmeDAC rtmeDao = new RtmeDAC(); var rtme = rtmeDao.SelectDay(bpeno, aDateTime).FirstOrDefault(); if (rtme != null && !string.IsNullOrEmpty(rtme.RTTID.Trim())) { return ItemIsHoliday(rtme.RTTID.Trim()); } // 若沒有班表資料,用行事曆資料判斷是否需要上班 HolidayType theDay = GetDayHolidayType(aDateTime); switch (theDay) { case HolidayType.WorkDay: // 上班日 case HolidayType.CompensatoryWorkDay: // 補班 return false; case HolidayType.NationalHoliday: // 國定假日或民俗假 case HolidayType.Holiday: // 例假日 case HolidayType.ElasticRest: // 彈性休假 case HolidayType.TyphoonRest: // 颱風假 case HolidayType.VoteRest: // 選舉假 case HolidayType.CompanyActivity: // 公司活動 return true; default: return false; } } public static bool ItemIsHoliday(string item) { return 休假日班表.IndexOf(item.Trim()) >= 0; } } public enum HolidayType { /// /// 無資料 /// Null = ' ', /// /// 上班日 /// WorkDay = '-', /// /// 補班 /// CompensatoryWorkDay = 'B', /// /// 國定假日或民俗假 /// NationalHoliday = 'N', /// /// 例假日 /// Holiday = 'H', /// /// 彈性休假 /// ElasticRest = 'V', /// /// 颱風假 /// TyphoonRest = 'T', /// /// 選舉假 /// VoteRest = 'E', /// /// 公司活動 /// CompanyActivity = 'A' }