290 lines
9.6 KiB
C#
290 lines
9.6 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// 打卡資料檔
|
|
/// </summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 讀取今天某人員的打卡資料
|
|
/// </summary>
|
|
/// <param name="rcusr">人員編號</param>
|
|
public DataTable ReadToday(string rcusr, DateTime date)
|
|
{
|
|
return ReadByDate(rcusr, date);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 讀取某天某人員的打卡資料
|
|
/// </summary>
|
|
/// <param name="rcusr">人員編號</param>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 讀取日期區間某人員的打卡資料
|
|
/// </summary>
|
|
/// <param name="rcusr">人員編號</param>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 檢查某一天某人員是否有打卡資料
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 打卡
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
/// <param name="time">時間</param>
|
|
/// <param name="fieldName">打卡欄位</param>
|
|
/// <param name="補打">是否為補打卡</param>
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 清除打卡
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
/// <param name="fieldName">打卡欄位</param>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 打上班卡
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
/// <param name="time">時間</param>
|
|
/// <param name="補打"></param>
|
|
public void PunchRCC01(DateAndTime rcdat, string rcusr, string ip, bool 補打)
|
|
{
|
|
Punch(rcdat, rcusr, ip, T01_上班, 補打);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 清除上班卡
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
public void ClearRCC01(DateTime rcdat, string rcusr)
|
|
{
|
|
Clear(rcdat, rcusr, T01_上班);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 打下班卡
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
/// <param name="time">時間</param>
|
|
public void PunchRCC02(DateAndTime rcdat, string rcusr, string ip, bool 補打)
|
|
{
|
|
Punch(rcdat, rcusr, ip, T02_下班, 補打);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 清除下班卡
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
public void ClearRCC02(DateTime rcdat, string rcusr)
|
|
{
|
|
Clear(rcdat, rcusr, T02_下班);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 打出差外出打卡
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
/// <param name="time">時間</param>
|
|
public void PunchRCC07(DateAndTime rcdat, string rcusr, string ip, bool 補打)
|
|
{
|
|
Punch(rcdat, rcusr, ip, T07_出差離開, 補打);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 清除出差外出打卡
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
public void ClearRCC07(DateTime rcdat, string rcusr)
|
|
{
|
|
Clear(rcdat, rcusr, T07_出差離開);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 打出差返回打卡
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
/// <param name="time">時間</param>
|
|
public void PunchRCC08(DateAndTime rcdat, string rcusr, string ip, bool 補打)
|
|
{
|
|
Punch(rcdat, rcusr, ip, T08_出差返回, 補打);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 清除出差返回打卡
|
|
/// </summary>
|
|
/// <param name="rcdat">日期</param>
|
|
/// <param name="rcusr">人員編號</param>
|
|
public void ClearRCC08(DateTime rcdat, string rcusr)
|
|
{
|
|
Clear(rcdat, rcusr, T08_出差返回);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 取得某員工某日期往前6天之內的打卡天數
|
|
/// </summary>
|
|
/// <param name="rcdat"></param>
|
|
/// <param name="rcusr"></param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
} |