谢亦才
摘要:本值班签到系统以MVC为开发模式,采用JSP为前台页面开发技术、servlet开发跳转等流程控制的控制器,Java语言开发业务逻辑等模型,以SQL SERVER2008为数据库,tomcat为WEB服务器。开发了用户管理、值班管理(包括部门排班、节假日排班、值周排班、生成值班信息等)、人脸识别设备管理、微信端值班情况查询及上报等功能模块。实现了值班签到的真实性和无纸化,推进了校园信息化建设。
关键词:人脸识别;值班考勤;MVC
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2019)07-0200-03
开放科学(资源服务)标识码(OSID):
1 引言
我国绝大部分大学都建设了占地面积大的新校区,需要每天安排值班人员巡查,及时发现、报告、处置各种突发事件。为了加强对值班人员的管理,切实履行值班职责,需要对值班人员进行签到考勤。传统的值班签到考勤,很多采用纸质签名的方式,这种方式浪费人力、物力,特别不能解决真实性问题,很容易代签、事后补签。如今可以利用计算机和网络技术使传统的纸质签名考勤方式向网络化和无纸化方向发展,有采用一卡通、指纹等打卡[1]的手段,但都无法解决真实性问题。目前采用人脸识别手段的值班考勤,能解决真实性问题,基于人脸识别的值班签到系统就是因此而设计和开发的。可以有效解决代签、事后补签等问题,还可以图文并茂的方式及时上报值班情况。
本文根据学校值班管理制度的实际业务需求,设计并实现了一套基于人脸识别的值班签到系统。系统采用MVC架构,使用JSP做前台WEB页面、HTML5做微信查看和上报情况前端、SQL Server2008 作为后台数据库、JAVA编程实现业务逻辑。系统有用户管理、值班管理(包括部门排班、节假日排班、值周排班、生成值班信息等)、人脸识别设备管理、微信端值班情况查询及上报等功能模块。本系统的使用提高了值班人员的便捷性和工作效率。
2 系统架构
为了使系统有更好的可扩展性,便于后期的维护,本基于人脸识别的值班签到系统采用MVC架构,如图1所示。
MVC 设计模式的核心是实现三层甚至多层的松散耦合,它将应用程序抽象为模型、控制器以及视图3 个部分,三者既分工又合作地完成用户提交的任务[2]。实现了视图层、业务层和模型层的分离。
(1)视图层(View):提供用户交互界面,包括登录界面、排班页面、值班上报页面、刷脸记录页面、设备管理页面等。它依据模型数据创建的,可以从 Model 访问数据,并指定如何表示数据。
(2)控制器(Controller):负责从视图读取数据,并向模型发送数据,然后根据用户动作和 Model 处理的结果,选择一个 视图作为这个用户请求响应的一部分。
(3)模型层 (Model):负责在数据库中存取数据,用于处理应用程序业务逻辑,比如登录认证、排班录入、生成预排班记录、值班上报、设置值班类型、查询值班情况等。
3 功能设计
该人脸识别签到系统的功能有管理员系统和微信端查询及上报情况子系统两大模块,其中管理员系统功能包括用户管理、值班管理(包括部门排班、节假日排班、值周排班、生成值班信息等)、微信端值班情况查询及上报、人脸识别设备管理等功能模塊。功能图2所示:
4 数据库设计
依据系统功能模块, 按照数据库设计规范[3],数据库主要有用户表、值班记录表、值班调整表、值班类型表、设备表信息表等。其中以用户表和值班记录表为例如表1所示:
5 系统实现
根据系统功能和数据库设计分析,实现系统的总体工作流程如图3所示:
5.1 系统开发工具
本系统总体采用MVC开发模式,用JSP技术开发视图层,其中微信端用HTML5,Java语言开发模型层,Servlet开发控制层。采用SQL SERVER2008做数据库,TOMCAT做WEB服务器。
5.2 生成预值班记录
系统每天晚上12点根据值班安排表自动生成第二天的值班人员名单,简称为预值班记录,该预值班记录只有工号和日期字段值,其他的诸如签到时间、签退时间、情况报告和状态等字段暂设置为空,第二天各个值班人员确实通过刷脸签到(退)时填入。部分核心代码如下:
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("排班明细不能为空!"); }
if (itemList != null && dutyScheduleVO.getDutyNum() > itemList.size()) {
throw new ProgramException("值班人数大于员工数,请重新设置");}
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 微信端查詢
微信端查询包括查看值班人员的签到签退时间和值班情况上报。这个功能的实现主要是在web层使用html5制作页面,在学校的微信服务号中加链接即可实现,如图4所示:
5.4 刷脸签到(退)更新策略算法
因为是刷脸记录签到(退)时间,而刷脸可能有意无意地会有多次,不同时间刷脸的时间记录作为签到还是签退时间,后面的刷脸时间覆盖前面的时间还是保持不变等都需要更新策略。刷脸签到(退)更新策略步骤如下:
第一、获取当前刷脸时间CurRecTime;
第二、签到字段是否为空?是,则更新签到值为当前CurRecTime;否,则转入第三步;
第三、签退字段值是否为空?是,则转入第四步;否,则转入第六步;
第四、签到记录值是否在正常签到时间之前?是,则转入第五步;否,则更新签退字段值为当前CurRecTime;
第五、CurRecTime是否小于正常右端值?是,则更新签到字段值为CurRecTime;否,则更新签退字段值为CurRecTime;
第六、签退记录是否在正常签退时间区间?是,不更新签退值;否,则转入第七步;
第七、签退记录时间小于正常签退时间左端?是, 签退字段值更新为CurRecTime;否,则不更新。
6 结束语
基于MVC模式开发的基于人脸识别的值班签到系统,有效地杜绝了替签到、事后签到的问题,从根本上解决了值班真实性问题。
参考文献:
[1] 江奇峰.高校课堂指纹考勤信息管理系统设计与实现[J].电脑知识与技术,2017.13(23):72-73.
[2] 边霞,赵奎,胡晓勤,等.基于MVC的文件备份后台管理系统的设计与实现[J].计算机工程与技术,2011,32(9):3196.
[3] 亓永刚.SQL Server数据库管理与开发兵书[M].北京:电子工业出版社,2013.
【通联编辑:梁书】