1.工具类---ZkemSDKUtils

package com.XXX.gasstation.commons.utils;import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import com.XXX.gasstation.commons.utils.lang.DateUtils;
import net.sf.json.JSONObject;
import java.util.*;/*** @ClassName:${type_name}* @Description:${todo}(连接、获取考勤机数据)* @author: ZHOUPAN* @date ${date} ${time}* @Copyright: 2018 www.zsplat.com Inc. All rights reserved.* ${tags}*/
public class ZkemSDKUtils {//zkemkeeper.ZKEM.1 为zkemkeeper.dll 注册成功后 在注册表可以查看:HKEY_CLASSES_ROOT最下面private static ActiveXComponent zkem = new ActiveXComponent("zkemkeeper.ZKEM.1");/*** 连接考勤机** @param address 考勤机地址* @param port    端口号* @return*/public static boolean connect(String address, int port) {boolean result = zkem.invoke("Connect_NET", address, port).getBoolean();return result;}/*** 读取考勤记录到pc缓存。配合getGeneralLogData使用** @return*/public static boolean readGeneralLogData() {boolean result = zkem.invoke("ReadGeneralLogData", 1).getBoolean();return result;}/*** 读取该时间之后的最新考勤数据。 配合getGeneralLogData使用。//网上说有这个方法,但是我用的开发文档没有这个方法,也调用不到,我在controller中处理获取当天数据** @param lastest* @return*/public static boolean readLastestLogData(Date lastest) {boolean result = zkem.invoke("ReadLastestLogData", 2018 - 07 - 24).getBoolean();return result;}/*** 获取缓存中的考勤数据。配合readGeneralLogData / readLastestLogData使用。** @return 返回的map中,包含以下键值:* "EnrollNumber"   人员编号* "Time"           考勤时间串,格式: yyyy-MM-dd HH:mm:ss* "VerifyMode"* "InOutMode"* "Year"          考勤时间:年* "Month"         考勤时间:月* "Day"           考勤时间:日* "Hour"            考勤时间:时* "Minute"        考勤时间:分* "Second"        考勤时间:秒*/public static List<Map<String, Object>> getGeneralLogData() {Variant dwMachineNumber = new Variant(1, true);//机器号Variant dwEnrollNumber = new Variant("", true);Variant dwVerifyMode = new Variant(0, true);Variant dwInOutMode = new Variant(0, true);Variant dwYear = new Variant(0, true);Variant dwMonth = new Variant(0, true);Variant dwDay = new Variant(0, true);Variant dwHour = new Variant(0, true);Variant dwMinute = new Variant(0, true);Variant dwSecond = new Variant(0, true);Variant dwWorkCode = new Variant(0, true);List<Map<String, Object>> strList = new ArrayList<Map<String, Object>>();boolean newresult = false;do {Variant vResult = Dispatch.call(zkem, "SSR_GetGeneralLogData", dwMachineNumber, dwEnrollNumber, dwVerifyMode, dwInOutMode, dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond, dwWorkCode);newresult = vResult.getBoolean();if (newresult) {String enrollNumber = dwEnrollNumber.getStringRef();//如果没有编号,则跳过。if (enrollNumber == null || enrollNumber.trim().length() == 0)continue;String month = dwMonth.getIntRef() + "";String day = dwDay.getIntRef() + "";if (dwMonth.getIntRef() < 10) {month = "0" + dwMonth.getIntRef();}if (dwDay.getIntRef() < 10) {day = "0" + dwDay.getIntRef();}String validDate = dwYear.getIntRef() + "-" + month + "-" + day;String currentDate = DateUtils.getCurrentTime("yyyy-MM-dd");if (currentDate.equals(validDate)) {Map<String, Object> m = new HashMap<String, Object>();//Map<String, Object> user = getUserInfoByNumber(enrollNumber);m.put("EnrollNumber", enrollNumber);m.put("Time", dwYear.getIntRef() + "-" + dwMonth.getIntRef() + "-" + dwDay.getIntRef() + " " + dwHour.getIntRef() + ":" + dwMinute.getIntRef() + ":" + dwSecond.getIntRef());m.put("VerifyMode", dwVerifyMode.getIntRef());m.put("InOutMode", dwInOutMode.getIntRef());m.put("Year", dwYear.getIntRef());m.put("Month", dwMonth.getIntRef());m.put("Day", dwDay.getIntRef());m.put("Hour", dwHour.getIntRef());m.put("Minute", dwMinute.getIntRef());m.put("Second", dwSecond.getIntRef());strList.add(m);}}} while (newresult == true);return strList;}/*** 获取用户信息** @return 返回的Map中,包含以下键值:* "EnrollNumber"  人员编号* "Name"          人员姓名* "Password"      人员密码* "Privilege"* "Enabled"       是否启用*/public static List<Map<String, Object>> getUserInfo() {List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();//将用户数据读入缓存中。boolean result = zkem.invoke("ReadAllUserID", 1).getBoolean();Variant v0 = new Variant(1);Variant sdwEnrollNumber = new Variant("", true);Variant sName = new Variant("", true);Variant sPassword = new Variant("", true);Variant iPrivilege = new Variant(0, true);Variant bEnabled = new Variant(false, true);while (result) {//从缓存中读取一条条的用户数据result = zkem.invoke("SSR_GetAllUserInfo", v0, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled).getBoolean();//如果没有编号,跳过。String enrollNumber = sdwEnrollNumber.getStringRef();if (enrollNumber == null || enrollNumber.trim().length() == 0)continue;//由于名字后面会产生乱码,所以这里采用了截取字符串的办法把后面的乱码去掉了,以后有待考察更好的办法。//只支持2位、3位、4位长度的中文名字。String name = sName.getStringRef();if (sName.getStringRef().length() > 4) {name = sName.getStringRef().substring(0, 4);}//如果没有名字,跳过。if (name.trim().length() == 0)continue;Map<String, Object> m = new HashMap<String, Object>();m.put("EnrollNumber", enrollNumber);m.put("Name", name);m.put("Password", sPassword.getStringRef());m.put("Privilege", iPrivilege.getIntRef());m.put("Enabled", bEnabled.getBooleanRef());resultList.add(m);}return resultList;}/*** 设置用户信息** @param number* @param name* @param password* @param isPrivilege* @param enabled* @return*/public static boolean setUserInfo(String number, String name, String password, int isPrivilege, boolean enabled) {Variant v0 = new Variant(1);Variant sdwEnrollNumber = new Variant(number, true);Variant sName = new Variant(name, true);Variant sPassword = new Variant(password, true);Variant iPrivilege = new Variant(isPrivilege, true);Variant bEnabled = new Variant(enabled, true);boolean result = zkem.invoke("SSR_SetUserInfo", v0, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled).getBoolean();return result;}/*** 获取用户信息** @param number 考勤号码* @return*/public static Map<String, Object> getUserInfoByNumber(String number) {Variant v0 = new Variant(1);Variant sdwEnrollNumber = new Variant(number, true);Variant sName = new Variant("", true);Variant sPassword = new Variant("", true);Variant iPrivilege = new Variant(0, true);Variant bEnabled = new Variant(false, true);boolean result = zkem.invoke("SSR_GetUserInfo", v0, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled).getBoolean();if (result) {Map<String, Object> m = new HashMap<String, Object>();m.put("EnrollNumber", number);m.put("Name", sName.getStringRef());m.put("Password", sPassword.getStringRef());m.put("Privilege", iPrivilege.getIntRef());m.put("Enabled", bEnabled.getBooleanRef());return m;}return null;}public static void main(String[] args) {ZkemSDKUtils sdk = new ZkemSDKUtils();Map<String, Object> map = new HashMap<String, Object>();boolean connFlag = sdk.connect("192.168.1.201", 4370);if (connFlag) {boolean flag = sdk.readGeneralLogData();List<Map<String, Object>> strList = sdk.getGeneralLogData();map.put("strList", strList);System.out.println("flag" + flag);System.out.println(JSONObject.fromObject(map).toString());}}}2. Controller层
@ResponseBody@RequestMapping(value = "/queryAttendance", method = RequestMethod.POST)public String queryAttendance(@RequestBody String params, HttpServletRequest request, HttpServletResponse response) {String returnString = null;Map<String, Object> map = new HashMap<String, Object>();List<Map<String,Object>> attendanceList = new ArrayList<Map<String,Object>>();int realCount =0;try {//是否连接考勤机String address = PropertiesUtil.loadResource("ZKE_IP", "config/config.properties");int port =Integer.parseInt(PropertiesUtil.loadResource("PORT", "config/config.properties"));boolean  connFlag = ZkemSDKUtils.connect(address, port);if(connFlag){boolean flag = ZkemSDKUtils.readGeneralLogData();List<Map<String,Object>> userList = ZkemSDKUtils.getUserInfo();//获取所有用户List<Map<String,Object>> strList = ZkemSDKUtils.getGeneralLogData();//获取所有数据Map<String, Object> mapAll = new HashMap<String, Object>();for (int i = 0; i < userList.size(); i++) {Map<String, Object> userMap = userList.get(i);// 用户真实数据mapAll = new HashMap<String, Object>();mapAll.put("EnrollNumber",MapUtils.getString(userMap, "EnrollNumber"));mapAll.put("Name",MapUtils.getString(userMap, "Name"));mapAll.put("Privilege",MapUtils.getString(userMap, "Privilege"));String EnrollNumber1 = MapUtils.getString(userMap, "EnrollNumber");List<Map<String, Object>> infoList = new ArrayList<Map<String, Object>>();for (int j = 0;  j < strList.size(); j++) {Map<String, Object> strMap = strList.get(j);String EnrollNumber2 =MapUtils.getString(strMap, "EnrollNumber");if (EnrollNumber1.equals(EnrollNumber2)){infoList.add(strMap);//这个人所有的打卡数据}}if (infoList.size()==0){mapAll.put("startTime","");mapAll.put("endTime","");}if (infoList.size()==1){Map<String, Object> strMap = infoList.get(0);String startTime = MapUtils.getString(strMap, "Time");mapAll.put("startTime",startTime);mapAll.put("endTime","");realCount++;}if (infoList.size()>1){Map<String, Object> strMap0 = infoList.get(0);Map<String, Object> strMap1 = infoList.get(infoList.size()-1);String startTime = MapUtils.getString(strMap0, "Time");String endTime = MapUtils.getString(strMap1, "Time");mapAll.put("startTime",startTime);mapAll.put("endTime",endTime);realCount++;}//mapAll.put("timeList",infoList);attendanceList.add(mapAll);}//第一个人打卡的开始时间,最后一个人结束时间if (strList.size()>1){Map<String, Object> strMap0 = strList.get(0);Map<String, Object> strMap1 = strList.get(strList.size()-1);String startTime = MapUtils.getString(strMap0, "Time");String endTime = MapUtils.getString(strMap1, "Time");map.put("startTime",startTime);map.put("endTime",endTime);}map.put(STATUS, STATUS_TRUE);map.put(DATA, attendanceList);map.put(COUNT, attendanceList.size());map.put("realCount", realCount);}} catch (NullPointerException e) {SystemLogger.error("appController.queryAttendance", e);map.put(STATUS, STATUS_FALSE);map.put(MSG, ERROR_PARAM_NULL);} catch (ClassCastException e) {SystemLogger.error("appController.queryAttendance", e);map.put(STATUS, STATUS_FALSE);map.put(MSG, ERROR_PARAM_CLASS_CAST);} catch (Exception e) {SystemLogger.error("appController.queryAttendance.Exception", e);map.put(STATUS, STATUS_FALSE);map.put(MSG, ERROR_EXCEPTION);}returnString = JSONObject.fromObject(map).toString();returnString = JSAESUtils.aesEncrypt(returnString);return returnString;}

zkteco iface702 中控考勤机java开发步骤二---获取考勤机 的考勤数据相关推荐

  1. zkteco iface702 中控考勤机java开发步骤一---连接考勤机

    送您一个最高1888元的阿里云大礼包,快来领取吧~ java使用jacob调用中控考勤机sdk方法 1.jacob-1.19版本 2.jdk1.8 64位(经过测试jacob.1.19支持64为jdk ...

  2. Thrift实现C#调用Java开发步骤详解

    概述 Thrift实现C#调用Java开发步骤详解 详细 代码下载:http://www.demodashi.com/demo/10946.html Apache Thrift 是 Facebook ...

  3. 记京东Java开发实习生二面

    京东Java开发实习生二面已挂,心情虽然失落,但是还是要在这里做一点作结,以便日后做些参考.让每一次失败都变的有意义! 面试流程 这次面试的流程比较简洁,首先问了两道技术问题,然后面试官对于我的简历中 ...

  4. 华为Java开发一面二面 附笔试(OD)

    华为Java开发一面二面(OD)4.3 面试的是1-3年工作经验的岗位 一面:45min     主要是问项目和平时用到的一些工具之类的,因为我写的比较少,所以基本上都是问的springboot和sp ...

  5. 从零搭建一个java开发环境: 二、下载安装mysql数据库

    前言 这是从零搭建一个java开发环境的第二篇,这篇文章将介绍mysql数据库的下载安装.在关系型数据库中,使用较多的是mysql和oracle,我自己用一般装mysql.oracle占用内存太大,自 ...

  6. java开发微信二维码

    要用到一个jar包QRcode.jar 主要用到了com.swetake.util.Qrcode这个类.API链接如下: http://www.swetake.com/qrcode/java/docs ...

  7. World Wind Java开发之二 使用Winbuilders设计图形用户界面(转)

    http://blog.csdn.net/giser_whu/article/details/40892955 在eclipse中使用WindowsBuildes可以像在VS中一样,拖拽用户图形界面. ...

  8. java开发_mysql中获取数据库表描述_源码下载

    功能描述: 在mysql数据库中,有两张表: data_element_config , test_table 我们需要获取表:test_table表的描述信息,然后把描述信息插入到表:data_el ...

  9. java获取access token_微信java 开发4 access_token获取

    首先你得有url吧 public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/toke ...

最新文章

  1. android 防止连点的方法
  2. jxl解析excel
  3. [新功能]根据预览图片选择Skin
  4. 6. Oracle闪回特性
  5. JS 事件冒泡和事件捕获
  6. JDK8 Stream 效率如何?
  7. idea的logback的getter和setter方法失效
  8. 方法入门_方法的调用
  9. 定位pure virtual method called问题
  10. JQUERY插件JqueryAjaxFileUplaoder----更简单的异步文件上传
  11. shiro、cas、pac4j 实现单点登陆
  12. 【VS Code配置matlab】手把手教学,matlab也能自动补全+瞬间启动+代码整理!
  13. OpenCV之图像二值化与去噪
  14. 2048小游戏微信小程序源码
  15. Cognos函数(二十二) - ancestor
  16. 自然语言处理(一)——中英文分词
  17. Windows7,8,10 启用网络发现却无法保存设置-----解决办法
  18. 使用Python获取微信朋友圈的内容
  19. 决斗小游戏代码html,《游戏王:决斗链接》的基础玩法介绍
  20. Ubuntu 18.04 进入 Recovery 模式

热门文章

  1. position属性与z-index属性详解,如何比较z-index值确定覆盖关系,为何z-index属性不生效。
  2. 纪念Dropbox君
  3. 计算机专业大学生应该买什么样的电脑?
  4. 《证券投资二十四堂课》读书笔记
  5. 182_赵陈雄_java核心编程实验
  6. Android 计时器实现
  7. Windows - 百度网盘限速下载慢解决方案(官方提速方法)
  8. 免费修复受损的mp4视频文件
  9. 怎么更改计算机开机用户名和密码,小编详解怎么修改电脑开机密码
  10. String.getBytes()