王樹(shù)賢 羅鋒 覃云韜
[摘 要] 流行的企業(yè)考勤系統(tǒng)多與排班系統(tǒng)關(guān)聯(lián),在有復(fù)雜排班情況的企業(yè)里,排班系統(tǒng)因數(shù)據(jù)錄入工作量太大而多被棄用,導(dǎo)致考勤系統(tǒng)統(tǒng)計(jì)功能喪失,人工統(tǒng)計(jì)效率非常低下。通過(guò)將考勤系統(tǒng)與排班系統(tǒng)分離,并經(jīng)方案優(yōu)化和算法優(yōu)化,極大地提高了統(tǒng)計(jì)效率。
[關(guān)鍵詞] 企業(yè);考勤;排班;統(tǒng)計(jì);優(yōu)化
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2018. 07. 036
[中圖分類號(hào)] TP311 [文獻(xiàn)標(biāo)識(shí)碼] A [文章編號(hào)] 1673 - 0194(2018)07- 0087- 04
1 引 言
目前,通過(guò)引入考勤機(jī)來(lái)監(jiān)控員工的出勤紀(jì)律,已經(jīng)十分普及??记跈C(jī)設(shè)備也發(fā)展出了刷卡式、指紋式、甚至人像識(shí)別式等多種先進(jìn)型號(hào),在事業(yè)型單位、一班制的企業(yè)等簡(jiǎn)單環(huán)境下的應(yīng)用,已經(jīng)相當(dāng)?shù)某墒?。但是,針?duì)有多班次倒班、允許員工私下調(diào)班等具有復(fù)雜排班模式的企業(yè)單位,考勤系統(tǒng)在考勤數(shù)據(jù)的整理、出勤時(shí)間的統(tǒng)計(jì)、異常數(shù)據(jù)的發(fā)現(xiàn)等方面,統(tǒng)計(jì)算法還遠(yuǎn)未成熟。
2 目前考勤系統(tǒng)存在的問(wèn)題
為了應(yīng)對(duì)多班次倒班等復(fù)雜的排班情況,目前流行的考勤系統(tǒng)主要通過(guò)和排班系統(tǒng)結(jié)合起來(lái)的方式來(lái)實(shí)現(xiàn)數(shù)據(jù)的關(guān)聯(lián)。即把所有員工的班次信息也錄入系統(tǒng),這樣,某員工上班和下班預(yù)設(shè)的時(shí)間段就確定了下來(lái),考勤數(shù)據(jù)與這個(gè)預(yù)設(shè)的時(shí)間段相對(duì)比,得到正常出勤和非正常出勤的情況。
這種模式的缺點(diǎn)有如下幾個(gè)方面:
(1)根據(jù)實(shí)際生產(chǎn)情況,員工的排班情況是多變的。可能這幾天生產(chǎn)任務(wù)緊需要3班倒,過(guò)兩天不太緊張了只需要上2班;某員工這一周上晚班,下周又可能上白班。這就需要不斷地往系統(tǒng)里錄入大量的排班信息,工作量很大,生產(chǎn)管理人員對(duì)于數(shù)據(jù)錄入的積極性不高。
(2)對(duì)于員工眾多的企業(yè),某員工因有私事私下和工友調(diào)班是允許的,否則管理起來(lái)更加復(fù)雜。這樣就使得系統(tǒng)里排班數(shù)據(jù)和考勤數(shù)據(jù)對(duì)不上,還是不能自動(dòng)處理。
(3)多班次倒班時(shí),員工上班時(shí)間和下班時(shí)間可能已不在同一天,即跨日期上下班。這給數(shù)據(jù)統(tǒng)計(jì)也帶來(lái)了一些麻煩。
(4)員工難免有漏刷卡、重復(fù)刷卡的現(xiàn)象,當(dāng)考勤數(shù)據(jù)不成對(duì)兒出現(xiàn)時(shí),對(duì)上班刷卡還是下班刷卡的判斷也會(huì)出現(xiàn)問(wèn)題。
鑒于上述種種原因,許多企業(yè)已經(jīng)放棄了考勤系統(tǒng)的統(tǒng)計(jì)功能,而僅僅是從系統(tǒng)中導(dǎo)出考勤記錄,在Excel中手工逐條處理數(shù)據(jù),工作量之大可想而知。
3 改進(jìn)思路
3.1 措施一:上下班考勤機(jī)分離
針對(duì)以上問(wèn)題,一個(gè)有效的改進(jìn)途徑是上下班考勤機(jī)分離,即上班和下班分別刷不同的考勤機(jī)。這樣可以大幅降低系統(tǒng)處理的復(fù)雜度,目前已有考勤系統(tǒng)支持這種方式。
通過(guò)上下班考勤機(jī)分離,使得原來(lái)復(fù)雜的業(yè)務(wù)邏輯大幅簡(jiǎn)化。理論上,如果員工刷卡沒(méi)有錯(cuò)誤,就可以很容易計(jì)算出出勤時(shí)間。即使出現(xiàn)漏刷卡、多刷卡等異常情況,系統(tǒng)也很容易排查出異常,甚至可以判斷錯(cuò)誤原因,免除手工排查的大量工作。嚴(yán)格執(zhí)行上下班分離的刷卡考勤制度,或者與門禁系統(tǒng)相結(jié)合,就可以隨時(shí)計(jì)算出車間在崗人員數(shù)量,甚至可以列出在崗人員名單,使車間管理更加精細(xì)、更加直觀。
上下班考勤機(jī)分離也有缺點(diǎn)。如果考勤機(jī)安裝位置設(shè)計(jì)不夠合理,員工不能輕易清晰的區(qū)分上班考勤機(jī)和下班考勤機(jī),員工刷卡時(shí)會(huì)把上班和下班弄反,同樣會(huì)導(dǎo)致考勤數(shù)據(jù)的錯(cuò)亂。所以,考勤機(jī)安裝位置的設(shè)計(jì)非常關(guān)鍵,一定要考慮人們的思維習(xí)慣,一般設(shè)計(jì)在出入方向的右手邊,并用醒目的文字標(biāo)注,同時(shí)配合有效的培訓(xùn)和出錯(cuò)懲罰的管理制度??记跈C(jī)上下班分離方案,能夠以較小的投入換來(lái)較大的改進(jìn)效果。
3.2 措施二:考勤數(shù)據(jù)統(tǒng)計(jì)算法的優(yōu)化
3.2.1 與排班系統(tǒng)分離
為了有效減少系統(tǒng)維護(hù)的數(shù)據(jù)量,針對(duì)有復(fù)雜排班需求的生產(chǎn)型企業(yè),果斷放棄考勤系統(tǒng)與排班系統(tǒng)的集成,單從考勤數(shù)據(jù)中提取員工的出勤情況。
3.2.2 考勤數(shù)據(jù)的整理
在生成報(bào)表前,先對(duì)考勤數(shù)據(jù)進(jìn)行預(yù)處理。比如剔除無(wú)效數(shù)據(jù)、補(bǔ)充遺漏數(shù)據(jù)等。當(dāng)然首先是提取出某時(shí)間段數(shù)據(jù),再針對(duì)該部分?jǐn)?shù)據(jù)進(jìn)行處理。實(shí)踐中,一般以一個(gè)月為一個(gè)統(tǒng)計(jì)周期。代碼略。
3.2.2.1 無(wú)效刷卡數(shù)據(jù)的剔除
針對(duì)員工難免出現(xiàn)的重復(fù)刷卡的現(xiàn)象,系統(tǒng)盡可能的刪除無(wú)效刷卡數(shù)據(jù)??梢圆扇〉牟呗杂校?/p>
(1)間隔5分鐘內(nèi)重復(fù)刷上班卡,以最后1次為準(zhǔn)(代碼以SQL Server為例,下同)。
DELETE a
FROM #t a JOIN #t b
ON a.工號(hào)=b.工號(hào) AND a.日期=b.日期 AND a.考勤機(jī)=b.考勤機(jī)
WHERE DATEDIFF(ss, a.日期時(shí)間, b.日期時(shí)間) BETWEEN 1 AND 300
AND a.刷卡用途='上班';
(2)間隔5分鐘內(nèi)重復(fù)刷下班卡,以第1次為準(zhǔn)。
DELETE a
FROM #t a JOIN #t b
ON a.工號(hào)=b.工號(hào) AND a.日期=b.日期 AND a.考勤機(jī)=b.考勤機(jī)
WHERE DATEDIFF(ss, b.日期時(shí)間, a.日期時(shí)間) BETWEEN 1 AND 300
AND a.刷卡用途='下班';
注意DATEDIFF()函數(shù)中,日期時(shí)間的參數(shù)順序與第(1)條的順序相反。
(3)間隔2分鐘內(nèi)刷上班和下班卡,以最后1次為準(zhǔn)。
DELETE a
FROM #t a JOIN #t b
ON a.工號(hào)=b.工號(hào) AND a.日期=b.日期
WHERE DATEDIFF(ss, a.日期時(shí)間, b.日期時(shí)間) BETWEEN 1 AND 120;
3.2.2.2 跨日期上下班考勤數(shù)據(jù)的預(yù)處理
最直觀的報(bào)表形式為每日出勤情況,所以針對(duì)跨日期上下班考勤數(shù)據(jù),需要進(jìn)行一些預(yù)處理。
(1)一天第1次刷卡為下班卡的,若為9點(diǎn)之前下班,則認(rèn)為是跨零點(diǎn)上班,即前一天上班當(dāng)天下班。當(dāng)天從零點(diǎn)計(jì)算出勤時(shí)間。系統(tǒng)補(bǔ)零點(diǎn)上班卡。
INSERT INTO #t(工號(hào), 姓名, 部門, 二級(jí)部門, 三級(jí)部門
, 日期, 序號(hào), 視同時(shí)間, 刷卡用途
)
SELECT 工號(hào), 姓名, 部門, 二級(jí)部門, 三級(jí)部門, 日期, 0 序號(hào)
, CASE WHEN 刷卡時(shí)間<'09:00:00' THEN '0:00:00' END 視同時(shí)間
, '上班' 刷卡用途
FROM #t
WHERE 序號(hào)=1 AND 刷卡用途='下班';
(2)一天最后1次刷卡為上班卡的,若為15點(diǎn)之后上班,則認(rèn)為是跨零點(diǎn)上班,即當(dāng)天上班第二天下班。當(dāng)天計(jì)算出勤時(shí)間到24點(diǎn),系統(tǒng)補(bǔ)24點(diǎn)下班卡。
with t AS
(
SELECT 工號(hào), 日期
, MAX(序號(hào)) 序號(hào)
FROM #t
GROUP BY 工號(hào), 日期
), t2 AS
(
SELECT #t.工號(hào), #t.姓名, #t.部門, #t.二級(jí)部門, #t.三級(jí)部門
, #t.日期, #t.序號(hào), #t.刷卡時(shí)間
FROM #t JOIN t ON #t.工號(hào)=t.工號(hào) AND #t.日期=t.日期
AND #t.序號(hào)=t.序號(hào) AND 刷卡用途='上班'
)
INSERT INTO #t(工號(hào), 姓名, 部門, 二級(jí)部門, 三級(jí)部門
, 日期, 序號(hào), 視同時(shí)間, 刷卡用途
)
SELECT 工號(hào), 姓名, 部門, 二級(jí)部門, 三級(jí)部門
, 日期
, 序號(hào)+1 序號(hào)
, CASE WHEN 刷卡時(shí)間>'15:00:00' THEN '23:59:59' END 視同時(shí)間
, '下班' 刷卡用途
FROM t2;
3.2.2.3 漏刷卡數(shù)據(jù)處理
經(jīng)過(guò)上述數(shù)據(jù)處理之后,相鄰兩次刷卡刷卡用途還相同,即均為上班卡或均為下班卡的,則認(rèn)為中間缺一次刷卡操作,系統(tǒng)補(bǔ)1次時(shí)間為空的刷卡記錄。
(1)重新整理序號(hào),方便后面相鄰兩次相同用途刷卡數(shù)據(jù)處理。
;with t AS
(
SELECT 工號(hào), 日期, 序號(hào)
, rn=ROW_NUMBER() OVER(PARTITION BY 工號(hào), 日期 ORDER BY 序號(hào))
FROM #t
)
UPDATE #t
SET #t.序號(hào)=t.rn
FROM #t JOIN t ON #t.工號(hào)=t.工號(hào)
AND #t.日期=t.日期 AND #t.序號(hào)=t.序號(hào);
(2)補(bǔ)1次時(shí)間為空的刷卡記錄,用以報(bào)表中提示缺1次刷卡操作。
INSERT INTO #t(工號(hào), 姓名, 部門, 二級(jí)部門, 三級(jí)部門
, 日期, 序號(hào), 刷卡用途
)
SELECT a.工號(hào), a.姓名, a.部門, a.二級(jí)部門, a.三級(jí)部門
, a.日期
, a.序號(hào)-0.5 序號(hào)
, CASE a.刷卡用途 WHEN '下班' THEN '上班' ELSE '下班' END 刷卡用途
FROM #t a JOIN #t b ON a.工號(hào)=b.工號(hào) AND a.日期=b.日期
AND a.序號(hào)=b.序號(hào)+1
WHERE a.刷卡用途=b.刷卡用途;
3.2.2.4 數(shù)據(jù)預(yù)處理注意事項(xiàng)
以上數(shù)據(jù)預(yù)處理步驟,充分運(yùn)用了順序號(hào)這一字段。所以,維護(hù)好順序號(hào),是數(shù)據(jù)處理的關(guān)鍵。不同目的數(shù)據(jù)處理操作的先后順序,也要仔細(xì)考量。
3.2.3 生成出勤報(bào)表
經(jīng)過(guò)上述一系列的數(shù)據(jù)處理,系統(tǒng)終于可以生成出勤數(shù)據(jù)報(bào)表了。
with t1 AS
(
SELECT 工號(hào), 姓名, 部門, 二級(jí)部門, 三級(jí)部門, 日期, 視同時(shí)間, 刷卡用途
, Row_Number()Over(partition by 工號(hào), 日期, 刷卡用途 order by 序號(hào)) 序號(hào)
FROM #t
), t2 AS
(
SELECT 工號(hào), 姓名, 部門, 二級(jí)部門, 三級(jí)部門, 日期, 序號(hào)
, CASE WHEN 序號(hào)=1 AND 刷卡用途='上班' THEN 視同時(shí)間 END 上班1
, CASE WHEN 序號(hào)=1 AND 刷卡用途='下班' THEN 視同時(shí)間 END 下班1
, CASE WHEN 序號(hào)=2 AND 刷卡用途='上班' THEN 視同時(shí)間 END 上班2
, CASE WHEN 序號(hào)=2 AND 刷卡用途='下班' THEN 視同時(shí)間 END 下班2
, CASE WHEN 序號(hào)=3 AND 刷卡用途='上班' THEN 視同時(shí)間 END 上班3
, CASE WHEN 序號(hào)=3 AND 刷卡用途='下班' THEN 視同時(shí)間 END 下班3
, CASE WHEN 序號(hào)=4 AND 刷卡用途='上班' THEN 視同時(shí)間 END 上班4
, CASE WHEN 序號(hào)=4 AND 刷卡用途='下班' THEN 視同時(shí)間 END 下班4
, CASE WHEN 序號(hào)=5 AND 刷卡用途='上班' THEN 視同時(shí)間 END 上班5
, CASE WHEN 序號(hào)=5 AND 刷卡用途='下班' THEN 視同時(shí)間 END 下班5
, CASE WHEN 序號(hào)=6 AND 刷卡用途='上班' THEN 視同時(shí)間 END 上班6
, CASE WHEN 序號(hào)=6 AND 刷卡用途='下班' THEN 視同時(shí)間 END 下班6
FROM t1
), t3 AS
(
SELECT 工號(hào), 姓名, 部門, 二級(jí)部門, 三級(jí)部門, 日期
, MAX(上班1) 上班1
, MAX(下班1) 下班1
, MAX(上班2) 上班2
, MAX(下班2) 下班2
, MAX(上班3) 上班3
, MAX(下班3) 下班3
, MAX(上班4) 上班4
, MAX(下班4) 下班4
, MAX(上班5) 上班5
, MAX(下班5) 下班5
, MAX(上班6) 上班6
, MAX(下班6) 下班6
FROM t2
GROUP BY 工號(hào), 姓名, 部門, 二級(jí)部門, 三級(jí)部門, 日期
)
SELECT 工號(hào), 姓名, 部門, 二級(jí)部門, 三級(jí)部門, 日期
, 上班1, 下班1
, 上班2, 下班2
, 上班3, 下班3
, 上班4, 下班4
, 上班5, 下班5
, 上班6, 下班6
, ROUND((ISNULL(DateDiff(n, 上班1, 下班1), 0)
+ISNULL(DateDiff(n, 上班2, 下班2), 0)
+ISNULL(DateDiff(n, 上班3, 下班3), 0)
+ISNULL(DateDiff(n, 上班4, 下班4), 0)
+ISNULL(DateDiff(n, 上班5, 下班5), 0)
+ISNULL(DateDiff(n, 上班6, 下班6), 0)
) * 1.0 / 60, 1) 出勤時(shí)間
FROM t3
ORDER BY 工號(hào), 日期;
某一天的出勤數(shù)據(jù)報(bào)表預(yù)覽示例如表1所示。
通過(guò)報(bào)表預(yù)覽可以很明顯的發(fā)現(xiàn),工號(hào)為2010023的員工盤××漏刷了一次下班卡。后來(lái)通過(guò)視頻監(jiān)控錄像證實(shí)了該員工正常按時(shí)下班,因漏刷卡對(duì)該員工給予警告處理。在手工補(bǔ)齊下班考勤數(shù)據(jù)后,即可正式生成報(bào)表。
經(jīng)過(guò)數(shù)據(jù)整理,針對(duì)部分重復(fù)刷卡的無(wú)效數(shù)據(jù)已經(jīng)剔除,漏刷卡情況也給與明確提示。通過(guò)報(bào)表預(yù)覽,可以快速的發(fā)現(xiàn)數(shù)據(jù)錯(cuò)誤,進(jìn)行手工的數(shù)據(jù)處理后再生成最終報(bào)表,統(tǒng)計(jì)效率得以極大改善。
4 結(jié) 論
經(jīng)某企業(yè)的應(yīng)用實(shí)踐證明,通過(guò)方案改進(jìn)和算法改進(jìn),對(duì)于復(fù)雜排班環(huán)境下的生產(chǎn)型企業(yè),考勤系統(tǒng)的實(shí)用性大大提高,考勤統(tǒng)計(jì)人員的工作量大幅減少,極大地提高了工作效率,得到用戶的好評(píng)。