因为公司觉得中控考勤机的数据管理软件不好用,于是决定自己做一个.
一,首先需要下载中控机的API JAR包,我这里是下载好后放在项目里直接MAVEVN引用的.具体方法可以见我之前的博客.
<dependency>
<groupId>jacob</groupId>
<artifactId>jacob</artifactId>
<version>3.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/jacob.jar</systemPath>
</dependency>
二.打通中控考勤机的代码
工具类
package com.cosun.cosunp.tool;
import com.cosun.cosunp.entity.ZhongKongBean;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author:homey Wong
* @Date: 2019/10/7 上午 11:20
* @Description:
* @Modified By:
* @Modified-date:
*/
public class ZkemSDKUtils {
private static ActiveXComponent zkem = new ActiveXComponent("zkemkeeper.ZKEM.1");
public static boolean connect(String address, int port) {
boolean result = zkem.invoke("Connect_NET", address, port).getBoolean();
return result;
}
public static boolean readGeneralLogData() {
boolean result = zkem.invoke("ReadGeneralLogData", 1).getBoolean();
return result;
}
public static boolean readLastestLogData(Date lastest) {
boolean result = zkem.invoke("ReadLastestLogData", 2018 - 07 - 24).getBoolean();
return result;
}
public static List<ZhongKongBean> getGeneralLogData(String fromDate, String endDate) {
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<ZhongKongBean> strList = new ArrayList<ZhongKongBean>();
boolean newresult = false;
try {
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;
SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
Date fromDatedateTime = sm.parse(fromDate);
Date endDatedateTime = sm.parse(endDate);
Date valiDateDate = sm.parse(validDate);
if ((endDatedateTime.after(valiDateDate) && fromDatedateTime.before(valiDateDate))) {
ZhongKongBean m = new ZhongKongBean();
m.setEnrollNumber(Integer.valueOf(enrollNumber));
m.setTime(dwYear.getIntRef() + "-" + dwMonth.getIntRef() + "-" + dwDay.getIntRef() + " " + dwHour.getIntRef() + ":" + dwMinute.getIntRef() + ":" + dwSecond.getIntRef());
m.setDateStr(dwYear.getIntRef() + "-" + dwMonth.getIntRef() + "-" + dwDay.getIntRef());
m.setTimeStr(dwHour.getIntRef() + ":" + dwMinute.getIntRef() + ":" + dwSecond.getIntRef());
m.setVerifyMode(dwVerifyMode.getIntRef());
m.setInOutMode(dwInOutMode.getIntRef());
m.setYear(dwYear.getIntRef());
m.setMonth(dwMonth.getIntRef() + "");
m.setDay(dwDay.getIntRef());
m.setHour(dwHour.getIntRef());
m.setMinute(dwMinute.getIntRef());
m.setSecond(dwSecond.getIntRef());
strList.add(m);
}
}
} while (newresult == true);
} catch (Exception e) {
e.printStackTrace();
}
return strList;
}
public static List<ZhongKongBean> getGeneralLogData(String beforDay, Integer num) {
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<ZhongKongBean> strList = new ArrayList<ZhongKongBean>();
boolean newresult = false;
try {
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;
SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat ti = new SimpleDateFormat("HH:mm:ss");
Date endDatedateTime = sm.parse(beforDay);
Date valiDateDate = sm.parse(validDate);
if (valiDateDate.equals(endDatedateTime)) {
ZhongKongBean m = new ZhongKongBean();
m.setEnrollNumber(Integer.valueOf(enrollNumber));
m.setTime(dwYear.getIntRef() + "-" + dwMonth.getIntRef() + "-" + dwDay.getIntRef() + " " + dwHour.getIntRef() + ":" + dwMinute.getIntRef() + ":" + dwSecond.getIntRef());
m.setDateStr(dwYear.getIntRef() + "-" + dwMonth.getIntRef() + "-" + dwDay.getIntRef());
m.setTimeStr(dwHour.getIntRef() + ":" + dwMinute.getIntRef() + ":" + dwSecond.getIntRef());
m.setTimeTime(ti.parse(dwHour.getIntRef() + ":" + dwMinute.getIntRef() + ":" + dwSecond.getIntRef()));
m.setYearMonth(dwYear.getIntRef() + "-" + dwMonth.getIntRef());
m.setVerifyMode(dwVerifyMode.getIntRef());
m.setInOutMode(dwInOutMode.getIntRef());
m.setYear(dwYear.getIntRef());
m.setMonth(dwMonth.getIntRef() + "");
m.setDay(dwDay.getIntRef());
m.setHour(dwHour.getIntRef());
m.setMinute(dwMinute.getIntRef());
m.setSecond(dwSecond.getIntRef());
m.setMachineNum(num);
strList.add(m);
}
}
} while (newresult == true);
} catch (Exception e) {
e.printStackTrace();
}
return strList;
}
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;
}
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;
}
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.2.12", 4370);
// List<ZhongKongBean> strList = new ArrayList<ZhongKongBean>();
// if (connFlag) {
// boolean flag = sdk.readGeneralLogData();
// strList.addAll(sdk.getGeneralLogData("2019-10-07"));
// }
//
// boolean connFlag1 = sdk.connect("192.168.2.10", 4370);
// if (connFlag1) {
// boolean flag = sdk.readGeneralLogData();
// strList.addAll(sdk.getGeneralLogData("2019-10-07"));
// }
//
// boolean connFlag2 = sdk.connect("192.168.2.11", 4370);
// if (connFlag2) {
// boolean flag = sdk.readGeneralLogData();
// strList.addAll(sdk.getGeneralLogData("2019-10-07"));
// }
//
// boolean connFlag3 = sdk.connect("192.168.0.202", 4370);
// if (connFlag3) {
// boolean flag = sdk.readGeneralLogData();
// strList.addAll(sdk.getGeneralLogData("2019-10-07"));
// }
//
//
// //拼装之前排序
// List<ZhongKongBean> newZkbList = new ArrayList<ZhongKongBean>();
// List<ZhongKongBean> secZkbList = new ArrayList<ZhongKongBean>();
// Integer encroNum1 = null;
// Integer encroNum2 = null;
// List<Integer> alreadyHaveNum = new ArrayList<Integer>();
// for (int a = 0; a < strList.size(); a++) {
// encroNum1 = strList.get(a).getEnrollNumber();
// if (!alreadyHaveNum.contains(encroNum1)) {
// for (int b = 0; b < strList.size(); b++) {
// encroNum2 = strList.get(b).getEnrollNumber();
// if (encroNum1.equals(encroNum2)) {
// secZkbList.add(strList.get(b));
// }
// }
//
// for (int i = 0; i < secZkbList.size() - 1; i++) {
// for (int j = 0; j < secZkbList.size() - 1 - i; j++) {
// if (secZkbList.get(j).getTimeTime().after(secZkbList.get(j + 1).getTimeTime())) {
// ZhongKongBean temp = secZkbList.get(j + 1);
// secZkbList.set(j + 1, secZkbList.get(j));
// secZkbList.set(j, temp);
// }
// }
// }
// alreadyHaveNum.add(encroNum1);
// newZkbList.addAll(secZkbList);
// secZkbList.clear();
// }
// secZkbList.clear();
// }
//
// ZhongKongBean zkb01 = null;
// ZhongKongBean zkb02 = null;
// ZhongKongBean zkb = null;
// List<ZhongKongBean> toDataBaseList = new ArrayList<ZhongKongBean>();
// boolean isHave;
// for (int a = 0; a < newZkbList.size(); a++) {
// zkb01 = newZkbList.get(a);
// newZkbList.remove(a);
// a--;
// isHave = false;
// for (int b = 0; b < toDataBaseList.size(); b++) {
// zkb02 = toDataBaseList.get(b);
// if (zkb01.getEnrollNumber().equals(zkb02.getEnrollNumber()) && zkb01.getDateStr().equals(zkb02.getDateStr())) {
// isHave = true;
// zkb02.setTimeStr(zkb02.getTimeStr() + " " + zkb01.getTimeStr());
// }
// }
// if (!isHave) {
// zkb = new ZhongKongBean();
// zkb.setEnrollNumber(zkb01.getEnrollNumber());
// zkb.setDateStr(zkb01.getDateStr());
// zkb.setTimeStr(zkb01.getTimeStr());
// toDataBaseList.add(zkb);
// }
// }
//
// System.out.println(toDataBaseList.size() + "***");
// for (int a = 0; a < toDataBaseList.size(); a++) {
// System.out.println(toDataBaseList.get(a).getEnrollNumber() + " " + toDataBaseList.get(a).getDateStr() + " "
// + toDataBaseList.get(a).getTimeStr());
// }
}
}
从中控机上拿数据代码
public void getBeforeDayZhongKongData() throws Exception {
//String beforDay = DateUtil.getBeforeDay();
String beforDay = "2019-11-08";
String[] afterDay = beforDay.split("-");
Map<String, Object> map = new HashMap<String, Object>();
boolean connFlag = ZkemSDKUtils.connect("192.168.2.12", 4370);
// 1办公室 0.202 2 2号厂房钣金部 2.10 3 3号厂房门口 2.11 4.3号厂房精工部 2.12
List<ZhongKongBean> strList = new ArrayList<ZhongKongBean>();
if (connFlag) {
boolean flag = ZkemSDKUtils.readGeneralLogData();
strList.addAll(ZkemSDKUtils.getGeneralLogData(beforDay, 4));
}
boolean connFlag1 = ZkemSDKUtils.connect("192.168.2.10", 4370);
if (connFlag1) {
boolean flag = ZkemSDKUtils.readGeneralLogData();
strList.addAll(ZkemSDKUtils.getGeneralLogData(beforDay, 2));
}
boolean connFlag2 = ZkemSDKUtils.connect("192.168.2.11", 4370);
if (connFlag2) {
boolean flag = ZkemSDKUtils.readGeneralLogData();
strList.addAll(ZkemSDKUtils.getGeneralLogData(beforDay, 3));
}
boolean connFlag3 = ZkemSDKUtils.connect("192.168.0.202", 4370);
if (connFlag3) {
boolean flag = ZkemSDKUtils.readGeneralLogData();
strList.addAll(ZkemSDKUtils.getGeneralLogData(beforDay, 1));
}
//后续可以对集合进行加工并保存在数据库,这代码我就不贴上了
}