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;
}
}