using NPOI.SS.Formula.Functions; using System; using System.Collections; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.Common; using Wellan.Common; using Wellan.Data; /// /// 打卡資料檔 /// public class RcrdDAC : Wellan.Data.WDAC { public const string T01_上班 = "01"; public const string T02_下班 = "02"; public const string T03_中午休息 = "03"; public const string T04_下午上班 = "04"; public const string T05_加班上班 = "05"; public const string T06_加班下班 = "06"; public const string T07_出差離開 = "07"; public const string T08_出差返回 = "08"; public RcrdDAC() { } public RcrdDAC(string connectionConfig, string connectionConfigName) : this() { this._connectionConfig = connectionConfig; this._connectionConfigName = connectionConfigName; } public RcrdDAC(WQuery query) { this._query = query; } /// /// 讀取今天某人員的打卡資料 /// /// 人員編號 public DataTable ReadToday(string rcusr, DateTime date) { return ReadByDate(rcusr, date); } /// /// 讀取某天某人員的打卡資料 /// /// 人員編號 public DataTable ReadByDate(string rcusr, DateTime date) { DbCommand cmd = Query.NewCommand(); cmd.CommandText = @"SELECT RCDAT, RCUSR, RCC01, RCC02, RCC03, RCC04, RCC05, RCC06, RCC07, RCC08, RCP01, RCP02, RCP03, RCP04, RCP05, RCP06, RCP07, RCP08 FROM RCRD WHERE RCDAT = @RCDAT AND RCUSR = @RCUSR "; Query.AddParam(cmd, "RCDAT", date); Query.AddParam(cmd, "RCUSR", rcusr); return Query.Select(cmd); } /// /// 讀取日期區間某人員的打卡資料 /// /// 人員編號 public DataTable SelectPeriod(string rcusr, DateTime rcdat1, DateTime rcdat2) { DbCommand cmd = Query.NewCommand(); cmd.CommandText = @"SELECT RCDAT, RCUSR, RCC01, RCC02, RCC03, RCC04, RCC05, RCC06, RCC07, RCC08, RCP01, RCP02, RCP03, RCP04, RCP05, RCP06, RCP07, RCP08 FROM RCRD WHERE RCUSR = @RCUSR AND RCDAT >= @RCDAT1 AND RCDAT < @RCDAT2"; Query.AddParam(cmd, "RCUSR", rcusr); Query.AddParam(cmd, "RCDAT1", rcdat1.Date); Query.AddParam(cmd, "RCDAT2", rcdat2.Date.AddDays(1)); return Query.Select(cmd); } /// /// 檢查某一天某人員是否有打卡資料 /// /// 日期 /// 人員編號 /// public bool CheckExists(DateTime rcdat, string rcusr) { DbCommand cmd = Query.NewCommand(); cmd.CommandText = "SELECT COUNT(1) FROM RCRD WHERE RCDAT = @RCDAT AND RCUSR = @RCUSR "; Query.AddParam(cmd, "RCDAT", rcdat.Date); Query.AddParam(cmd, "RCUSR", rcusr); int c = WQuery.GetInt32Value(Query.ExecuteScalar(cmd)); return c > 0; } /// /// 打卡 /// /// 日期 /// 人員編號 /// 時間 /// 打卡欄位 /// 是否為補打卡 private void Punch(DateAndTime rcdat, string rcusr, string ip, string fieldName, bool 補打) { DbCommand cmd = Query.NewCommand(); var d = ReadByDate(rcusr, rcdat.CardDate); if (d.Rows.Count == 0) { cmd.CommandText = String.Format(@"INSERT INTO RCRD (TRDAT, TRMOD, TRUSR, RCDAT, RCUSR, RCC{0}, RCP{0}, RCZ{0}) VALUES (GETDATE(), 'INSERT', @TRUSR, @RCDAT, @RCUSR, @TIME, @IP, @TIMEZONE)", fieldName); cmd.Parameters.Clear(); Query.AddParam(cmd, "TRUSR", rcusr); Query.AddParam(cmd, "RCDAT", rcdat.CardDate); Query.AddParam(cmd, "RCUSR", rcusr); Query.AddParam(cmd, "TIME", rcdat.LocalTime); Query.AddParam(cmd, "IP", ip); Query.AddParam(cmd, "TIMEZONE", rcdat.TimezoneName); Query.ExecuteNonQuery(cmd); } else { if (String.IsNullOrEmpty(WDAC.GetStringValue(d.Rows[0]["RCC" + fieldName]))) { cmd.CommandText = String.Format(@"UPDATE RCRD SET TRDAT = GETDATE() , TRMOD = 'UPDATE' , TRUSR = @TRUSR , RCC{0} = @TIME , RCP{0} = @IP , RCZ{0} = @TIMEZONE WHERE RCDAT = @RCDAT AND RCUSR = @RCUSR", fieldName); cmd.Parameters.Clear(); Query.AddParam(cmd, "TRUSR", rcusr); Query.AddParam(cmd, "TIME", rcdat.LocalTime); Query.AddParam(cmd, "IP", ip); Query.AddParam(cmd, "TIMEZONE", rcdat.TimezoneName); Query.AddParam(cmd, "RCDAT", rcdat.CardDate); Query.AddParam(cmd, "RCUSR", rcusr); Query.ExecuteNonQuery(cmd); } } } /// /// 清除打卡 /// /// 日期 /// 人員編號 /// 打卡欄位 private void Clear(DateTime rcdat, string rcusr, string fieldName) { DbCommand cmd = Query.NewCommand(); cmd.CommandText = String.Format(@"UPDATE RCRD SET TRDAT = GETDATE() , TRMOD = 'UPDATE' , TRUSR = @TRUSR , RCC{0} = NULL , RCP{0} = NULL WHERE RCDAT = @RCDAT AND RCUSR = @RCUSR", fieldName); cmd.Parameters.Clear(); Query.AddParam(cmd, "TRUSR", rcusr); Query.AddParam(cmd, "RCDAT", rcdat); Query.AddParam(cmd, "RCUSR", rcusr); Query.ExecuteNonQuery(cmd); } /// /// 打上班卡 /// /// 日期 /// 人員編號 /// 時間 /// public void PunchRCC01(DateAndTime rcdat, string rcusr, string ip, bool 補打) { Punch(rcdat, rcusr, ip, T01_上班, 補打); } /// /// 清除上班卡 /// /// 日期 /// 人員編號 public void ClearRCC01(DateTime rcdat, string rcusr) { Clear(rcdat, rcusr, T01_上班); } /// /// 打下班卡 /// /// 日期 /// 人員編號 /// 時間 public void PunchRCC02(DateAndTime rcdat, string rcusr, string ip, bool 補打) { Punch(rcdat, rcusr, ip, T02_下班, 補打); } /// /// 清除下班卡 /// /// 日期 /// 人員編號 public void ClearRCC02(DateTime rcdat, string rcusr) { Clear(rcdat, rcusr, T02_下班); } /// /// 打出差外出打卡 /// /// 日期 /// 人員編號 /// 時間 public void PunchRCC07(DateAndTime rcdat, string rcusr, string ip, bool 補打) { Punch(rcdat, rcusr, ip, T07_出差離開, 補打); } /// /// 清除出差外出打卡 /// /// 日期 /// 人員編號 public void ClearRCC07(DateTime rcdat, string rcusr) { Clear(rcdat, rcusr, T07_出差離開); } /// /// 打出差返回打卡 /// /// 日期 /// 人員編號 /// 時間 public void PunchRCC08(DateAndTime rcdat, string rcusr, string ip, bool 補打) { Punch(rcdat, rcusr, ip, T08_出差返回, 補打); } /// /// 清除出差返回打卡 /// /// 日期 /// 人員編號 public void ClearRCC08(DateTime rcdat, string rcusr) { Clear(rcdat, rcusr, T08_出差返回); } /// /// 取得某員工某日期往前6天之內的打卡天數 /// /// /// /// public int PunchDaysIn7Days(DateTime rcdat, string rcusr, bool includeLastDay) { DbCommand cmd = Query.NewCommand(); cmd.CommandText = string.Format(@"SELECT COUNT(1) FROM RCRD WHERE RCUSR = @RCUSR AND RCDAT >= @RCDAT1 AND RCDAT {0} @RCDAT2 AND (RCC01 IS NOT NULL AND RCC01 <> '' OR RCC02 IS NOT NULL AND RCC02 <> '' OR RCC07 IS NOT NULL AND RCC07 <> '' OR RCC08 IS NOT NULL AND RCC08 <> '')", (includeLastDay ? "<=": "<")); Query.AddParam(cmd, "RCUSR", rcusr); Query.AddParam(cmd, "RCDAT1", rcdat.Date.AddDays(-6)); Query.AddParam(cmd, "RCDAT2", rcdat.Date); int c = WQuery.GetInt32Value(Query.ExecuteScalar(cmd)); return c; } }