謝亦才
摘要:本值班簽到系統(tǒng)以MVC為開發(fā)模式,采用JSP為前臺(tái)頁面開發(fā)技術(shù)、servlet開發(fā)跳轉(zhuǎn)等流程控制的控制器,Java語言開發(fā)業(yè)務(wù)邏輯等模型,以SQL SERVER2008為數(shù)據(jù)庫,tomcat為WEB服務(wù)器。開發(fā)了用戶管理、值班管理(包括部門排班、節(jié)假日排班、值周排班、生成值班信息等)、人臉識(shí)別設(shè)備管理、微信端值班情況查詢及上報(bào)等功能模塊。實(shí)現(xiàn)了值班簽到的真實(shí)性和無紙化,推進(jìn)了校園信息化建設(shè)。
關(guān)鍵詞:人臉識(shí)別;值班考勤;MVC
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)07-0200-03
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
1 引言
我國(guó)絕大部分大學(xué)都建設(shè)了占地面積大的新校區(qū),需要每天安排值班人員巡查,及時(shí)發(fā)現(xiàn)、報(bào)告、處置各種突發(fā)事件。為了加強(qiáng)對(duì)值班人員的管理,切實(shí)履行值班職責(zé),需要對(duì)值班人員進(jìn)行簽到考勤。傳統(tǒng)的值班簽到考勤,很多采用紙質(zhì)簽名的方式,這種方式浪費(fèi)人力、物力,特別不能解決真實(shí)性問題,很容易代簽、事后補(bǔ)簽。如今可以利用計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)使傳統(tǒng)的紙質(zhì)簽名考勤方式向網(wǎng)絡(luò)化和無紙化方向發(fā)展,有采用一卡通、指紋等打卡[1]的手段,但都無法解決真實(shí)性問題。目前采用人臉識(shí)別手段的值班考勤,能解決真實(shí)性問題,基于人臉識(shí)別的值班簽到系統(tǒng)就是因此而設(shè)計(jì)和開發(fā)的??梢杂行Ы鉀Q代簽、事后補(bǔ)簽等問題,還可以圖文并茂的方式及時(shí)上報(bào)值班情況。
本文根據(jù)學(xué)校值班管理制度的實(shí)際業(yè)務(wù)需求,設(shè)計(jì)并實(shí)現(xiàn)了一套基于人臉識(shí)別的值班簽到系統(tǒng)。系統(tǒng)采用MVC架構(gòu),使用JSP做前臺(tái)WEB頁面、HTML5做微信查看和上報(bào)情況前端、SQL Server2008 作為后臺(tái)數(shù)據(jù)庫、JAVA編程實(shí)現(xiàn)業(yè)務(wù)邏輯。系統(tǒng)有用戶管理、值班管理(包括部門排班、節(jié)假日排班、值周排班、生成值班信息等)、人臉識(shí)別設(shè)備管理、微信端值班情況查詢及上報(bào)等功能模塊。本系統(tǒng)的使用提高了值班人員的便捷性和工作效率。
2 系統(tǒng)架構(gòu)
為了使系統(tǒng)有更好的可擴(kuò)展性,便于后期的維護(hù),本基于人臉識(shí)別的值班簽到系統(tǒng)采用MVC架構(gòu),如圖1所示。
MVC 設(shè)計(jì)模式的核心是實(shí)現(xiàn)三層甚至多層的松散耦合,它將應(yīng)用程序抽象為模型、控制器以及視圖3 個(gè)部分,三者既分工又合作地完成用戶提交的任務(wù)[2]。實(shí)現(xiàn)了視圖層、業(yè)務(wù)層和模型層的分離。
(1)視圖層(View):提供用戶交互界面,包括登錄界面、排班頁面、值班上報(bào)頁面、刷臉記錄頁面、設(shè)備管理頁面等。它依據(jù)模型數(shù)據(jù)創(chuàng)建的,可以從 Model 訪問數(shù)據(jù),并指定如何表示數(shù)據(jù)。
(2)控制器(Controller):負(fù)責(zé)從視圖讀取數(shù)據(jù),并向模型發(fā)送數(shù)據(jù),然后根據(jù)用戶動(dòng)作和 Model 處理的結(jié)果,選擇一個(gè) 視圖作為這個(gè)用戶請(qǐng)求響應(yīng)的一部分。
(3)模型層 (Model):負(fù)責(zé)在數(shù)據(jù)庫中存取數(shù)據(jù),用于處理應(yīng)用程序業(yè)務(wù)邏輯,比如登錄認(rèn)證、排班錄入、生成預(yù)排班記錄、值班上報(bào)、設(shè)置值班類型、查詢值班情況等。
3 功能設(shè)計(jì)
該人臉識(shí)別簽到系統(tǒng)的功能有管理員系統(tǒng)和微信端查詢及上報(bào)情況子系統(tǒng)兩大模塊,其中管理員系統(tǒng)功能包括用戶管理、值班管理(包括部門排班、節(jié)假日排班、值周排班、生成值班信息等)、微信端值班情況查詢及上報(bào)、人臉識(shí)別設(shè)備管理等功能模塊。功能圖2所示:
4 數(shù)據(jù)庫設(shè)計(jì)
依據(jù)系統(tǒng)功能模塊, 按照數(shù)據(jù)庫設(shè)計(jì)規(guī)范[3],數(shù)據(jù)庫主要有用戶表、值班記錄表、值班調(diào)整表、值班類型表、設(shè)備表信息表等。其中以用戶表和值班記錄表為例如表1所示:
5 系統(tǒng)實(shí)現(xiàn)
根據(jù)系統(tǒng)功能和數(shù)據(jù)庫設(shè)計(jì)分析,實(shí)現(xiàn)系統(tǒng)的總體工作流程如圖3所示:
5.1 系統(tǒng)開發(fā)工具
本系統(tǒng)總體采用MVC開發(fā)模式,用JSP技術(shù)開發(fā)視圖層,其中微信端用HTML5,Java語言開發(fā)模型層,Servlet開發(fā)控制層。采用SQL SERVER2008做數(shù)據(jù)庫,TOMCAT做WEB服務(wù)器。
5.2 生成預(yù)值班記錄
系統(tǒng)每天晚上12點(diǎn)根據(jù)值班安排表自動(dòng)生成第二天的值班人員名單,簡(jiǎn)稱為預(yù)值班記錄,該預(yù)值班記錄只有工號(hào)和日期字段值,其他的諸如簽到時(shí)間、簽退時(shí)間、情況報(bào)告和狀態(tài)等字段暫設(shè)置為空,第二天各個(gè)值班人員確實(shí)通過刷臉簽到(退)時(shí)填入。部分核心代碼如下:
public void generateDuty(Integer scheduleId) {
SimpleCondition condition = new SimpleCondition();
condition.andEqual("scheduleId", scheduleId);
List
for (DutyDeptScheduleVO dutyScheduleVO : scheduleList) {
SimpleCondition itemCondition = new SimpleCondition();
itemCondition.andEqual("scheduleId", dutyScheduleVO.getScheduleId());
itemCondition.andEqual("dataFlag", BaseConstant.DATA_FLAG_NORMAL);
itemCondition.orderAsc("dutySort");
List
if (itemList == null) {throw new ProgramException("排班明細(xì)不能為空!"); }
if (itemList != null && dutyScheduleVO.getDutyNum() > itemList.size()) {
throw new ProgramException("值班人數(shù)大于員工數(shù),請(qǐng)重新設(shè)置");}
dutyDeptRecordService.deleteDutyRecordBatch(new Date(), dutyScheduleVO.getOrgId(), DutyTypeEnum.DeptDuty.getIndex());
if (ScheduleTypeEnum.WEEKLOOP.getIndex() == dutyScheduleVO.getSheduleType()) {generateWeekLoop(dutyScheduleVO, itemList);}
else if (ScheduleTypeEnum.DAYLOOP.getIndex() == dutyScheduleVO.getSheduleType()) {generateDayLoop(dutyScheduleVO, itemList);}
else if (ScheduleTypeEnum.FIXED.getIndex() == dutyScheduleVO.getSheduleType()) {generateFixed(dutyScheduleVO, itemList);
} else if (ScheduleTypeEnum.CADRE.getIndex() == dutyScheduleVO.getSheduleType()) {generateCadre(dutyScheduleVO, itemList);}
else if (ScheduleTypeEnum.WEEKEND.getIndex() == dutyScheduleVO.getSheduleType())
{generateWeekend(dutyScheduleVO, itemList); }}PartitiveFields fields = new PartitiveFields();
fields.put("status", 2);UserUtil.initUpdateInfo(fields);updatePartitive(fields, scheduleId); }}
5.3 微信端查詢
微信端查詢包括查看值班人員的簽到簽退時(shí)間和值班情況上報(bào)。這個(gè)功能的實(shí)現(xiàn)主要是在web層使用html5制作頁面,在學(xué)校的微信服務(wù)號(hào)中加鏈接即可實(shí)現(xiàn),如圖4所示:
5.4 刷臉簽到(退)更新策略算法
因?yàn)槭撬⒛樣涗浐灥剑ㄍ耍r(shí)間,而刷臉可能有意無意地會(huì)有多次,不同時(shí)間刷臉的時(shí)間記錄作為簽到還是簽退時(shí)間,后面的刷臉時(shí)間覆蓋前面的時(shí)間還是保持不變等都需要更新策略。刷臉簽到(退)更新策略步驟如下:
第一、獲取當(dāng)前刷臉時(shí)間CurRecTime;
第二、簽到字段是否為空?是,則更新簽到值為當(dāng)前CurRecTime;否,則轉(zhuǎn)入第三步;
第三、簽退字段值是否為空?是,則轉(zhuǎn)入第四步;否,則轉(zhuǎn)入第六步;
第四、簽到記錄值是否在正常簽到時(shí)間之前?是,則轉(zhuǎn)入第五步;否,則更新簽退字段值為當(dāng)前CurRecTime;
第五、CurRecTime是否小于正常右端值?是,則更新簽到字段值為CurRecTime;否,則更新簽退字段值為CurRecTime;
第六、簽退記錄是否在正常簽退時(shí)間區(qū)間?是,不更新簽退值;否,則轉(zhuǎn)入第七步;
第七、簽退記錄時(shí)間小于正常簽退時(shí)間左端?是, 簽退字段值更新為CurRecTime;否,則不更新。
6 結(jié)束語
基于MVC模式開發(fā)的基于人臉識(shí)別的值班簽到系統(tǒng),有效地杜絕了替簽到、事后簽到的問題,從根本上解決了值班真實(shí)性問題。
參考文獻(xiàn):
[1] 江奇峰.高校課堂指紋考勤信息管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2017.13(23):72-73.
[2] 邊霞,趙奎,胡曉勤,等.基于MVC的文件備份后臺(tái)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與技術(shù),2011,32(9):3196.
[3] 亓永剛.SQL Server數(shù)據(jù)庫管理與開發(fā)兵書[M].北京:電子工業(yè)出版社,2013.
【通聯(lián)編輯:梁書】