1.工具類---ZkemSDKUtils java
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; }