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

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;
    }

 

原文地址:https://www.cnblogs.com/zhou-pan/p/9376509.html

时间: 2024-11-10 15:56:16

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

JAVA实战教程_JAVA案例开发之JAVA开发微信二维码大数据开发03

大家好,这次是第三个课时的视频,欢迎大家继续学习. 视频简介:本视频是关于JAVA实战教程,JAVA开发微信二维码大数据系统.这个JAVA开发案例可以协助一些从零基础开始学习JAVA,正处于理论走完实践的路程上的初学者能接触到实际开发项目过程中,在实践当中巩固自己的JAVA方面的知识外,更能在项目案例当中学到解决在JAVA学习或者实践当中遇上问题的一些解决方式.仅供参考!自设交流群:457036818,欢迎一起加入交流. PS:该案例共十个课时,本小节为第二课时 课程原地址:http://www

JAVA实战教程_JAVA案例开发之JAVA开发微信二维码大数据系统02

hello,上一次我们上传了第一个课时的视频,现在当然是上传第二个视频咯. 视频简介:本视频是关于JAVA实战教程,JAVA开发微信二维码大数据系统.这个JAVA开发案例可以协助一些从零基础开始学习JAVA,正处于理论走完实践的路程上的初学者能接触到实际开发项目过程中,在实践当中巩固自己的JAVA方面的知识外,更能在项目案例当中学到解决在JAVA学习或者实践当中遇上问题的一些解决方式.仅供参考!自设交流群:457036818,欢迎一起加入交流. PS:该案例共十个课时,本小节为第二课时 课程原地

JavaSE入门学习4:搭建Java开发环境(二)

在上一篇的博文JavaSE入门学习3:搭建Java开发环境(一)中说到我们配置了Path变量的一种方式,再来说说第 二种配置方式,这种配置方式是必须掌握的. path环境变量配置方式2 我们为什么要将第二种配置形式呢?那第一种的配置方式有什么缺点吗?假设我的计算机上安装了两个JDK,一 个是1.7,一个1.8,我刚才配置的是1.8的,那么我需要配置1.7,需要重新配置Path环境变量,有可能在修改Path环 境变量的同时误删其它的东西,所以不建议使用第一种. path环境变量的参照形配置方式的步

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

转载请注明出处:jiq?钦's technical Blog Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 类似的跨语言RPC框架还有ICE.Hessian.Protocol Buffer.Avro等. 1 下载Thrift 下载地址:http://thrift.apache.org/download thrift-0.9.3.exe         用于编译Thrift中间文件生成对应语言代码的工具 thrift-0.9.3.tar

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

http://blog.csdn.net/giser_whu/article/details/40892955 在eclipse中使用WindowsBuildes可以像在VS中一样,拖拽用户图形界面.离线安装包下载地址见:http://download.csdn.net/detail/liushuo_whu/8132231 使用方法见:http://www.blogjava.net/pengo/archive/2010/09/19/332482.html 开发界面如下图所示,选择绝对布局后,在p

World Wind Java开发之二 使用Winbuilders设计图形用户界面

在eclipse中使用WindowsBuildes可以像在VS中一样,拖拽用户图形界面.离线安装包下载地址见:http://download.csdn.net/detail/liushuo_whu/8132231 使用方法见:http://www.blogjava.net/pengo/archive/2010/09/19/332482.html 开发界面如下图所示,选择绝对布局后,在palette拖拽相应的空间即可. 看下运行效果:

java爬虫问题二: 使用jsoup爬取数据class选择器中空格多选择怎么解决

问题描述: 在使用jsoup爬取其他网站数据的时候,发现class是带空格的多选择,如果直接使用doc.getElementsByClass("class的值"),这种方法获取不到想要的数据. 爬取网站页面结构如下: 其中文章列表的div为:<div class="am-cf inner_li inner_li_abtest"></div> 我们可以看到其class的值为:am-cf inner_li inner_li_abtest.带空格的

OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据

由于数据采集站基本都安装在野外或者楼顶,安装位置以及震动对检测数据的准确性有一定影响.所以想要有一个位置状态数据,正好发现麒麟作上有ADXL345,这样一个数字输出的加速度传感器.如图中红框所示: 1.ADXL345概述 ADXL345是ADI公司推出的基于iMEMS技术的3轴.数字输出加速度传感器.该加速度传感器的特点如下: 分辨率高.最高13位分辨率. 量程可变.具有+/-2g,+/-4g,+/-8g,+/-16g可变的测量范围. 灵敏度高.最高达3.9mg/LSB,能测量不到1.0°的倾斜

java 之 servlet如何获取表单的数据

servlet如何获取表单的数据 前端页面通过form表单的形式提交数据 服务端定义servlet接口 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOExcption { // 定义一个用户信息类 Users u = new User(); String username; String password; Date birthday;