中控考勤机Java二次开发(附Demo)

中控考勤机Java⼆次开发(附Demo)
前⾔:前⼏天项⽬改造,需要将中控702设备集成到⽹站后台上去;官⽅、电话客服、售后技术QQ都表⽰只提供C#语⾔的Demo,⽆奈只能去度娘各种解决⽅案,⽹上相关教程较多 也挺杂的,最后终于好了!
1. jacob-1.18版本
2. jdk1.732位
3. 将jacob.jar 放⼊项⽬ WEB-INFO/lib下导⼊
4. 将jacob-1.18-x64.dll 放⼊32位 jdk/bin⽬录下,我的是:C:\Program Files (x86)\Java\jdk1.7.0_79\bin;
5. 将中控考勤机sdk 的dll⽂件全部放⼊ c:\windows\syswow64 ⽬录下(我的是64位系统,32位的话没测试,放⼊system32⽬录
下);
6. 运⾏cmd 注册zkemkeeper.dll —>regsvr32 c:\windows\syswow64\zkemkeeper.dll
下载DEMO包:
详细:
附四个类:
1:ZkemUtils⼯具类:主要是⼀些常⽤的⽅法,
如:
1: 获取所有⽤户信息----getUserInfo
2: 根据单个⽤户ID获取⽤户信息----getUserInfoByNumber
3: 创建、修改⽤户信息----setUserInfo
4: 获取当天打卡信息----getUserOneDayInfo(Object userNumber )传⼊“⽤户ID”只返回当天当前⽤户的打卡信息,传“null”返当天所有的打卡信息
5:删除⽤户信息----delectUserById(String dwEnrollNumber)传⼊需要删除的⽤户ID。
使⽤前先在构造快中配置考勤机的IP和端⼝
ZkemUtils⼯具类:
;
import date.DateUtil;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.Dispatch;
import com.jacob.DispatchEvents;
import com.jacob.STA;
import com.jacob.Variant;
po.LogData;
po.UserInfo;
import java.util.*;
植物仿生学>长江经济带发展规划纲要public class ZkemSDKUtils {
public static void main(String[] args) {
ZkemSDKUtils sk = new ZkemSDKUtils();
boolean flag = readGeneralLogData();
List<LogData> userOneDayInfo = getUserOneDayInfo(null);
System.out.String());
boolean auth = ZkemSDKUtils.setUserInfo("6", "唐涛", null, 0, true);
System.out.println(auth);
List<UserInfo> userInfo = UserInfo();
System.out.String());
System.out.String());
regEvent();
}
{
boolean connect = connect("192.168.1.18", 4370);
}
//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;
}
/**
* 启动事件监听
*/
public static void  regEvent(){
zkem.invoke("RegEvent", new Variant(1), new Variant(1));
zkem.invoke("ReadRTLog", new Variant(1));
zkem.invoke("GetRTLog", new Variant(1));
new Object(), new SensorEvents());
new STA().doMessagePump();
}
/**
* 读取考勤记录到pc缓存。配合getGeneralLogData使⽤
*
* @return
*/
public static boolean readGeneralLogData() {
boolean result = zkem.invoke("ReadGeneralLogData", 4).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"    验证⽅式  1:指纹 2:⾯部识别
* "InOutMode"      考勤状态 0:上班 1:下班 2:外出 3:外出返回 4:加班签到 5:加班签退
* "Year"          考勤时间:年
* "Month"        考勤时间:⽉
* "Day"          考勤时间:⽇
* "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, dwEnrollNu
mber, dwVerifyMode, dwInOutMode, dwYear, d wMonth, dwDay, dwHour, dwMinute, dwSecond, dwWorkCode);
newresult = Boolean();
if (newresult) {
String enrollNumber = StringRef();
//如果没有编号,则跳过。
if (enrollNumber == null || im().length() == 0)
continue;
String month = IntRef() + "";
String day = IntRef() + "";
if (IntRef() < 10) {
month = "0" + IntRef();
}
if (IntRef() < 10) {
day = "0" + IntRef();
绿故事}
String validDate = IntRef() + "-" + month + "-" + day;
//String currentDate = CurrentTime("yyyy-MM-dd");
String currentDate = day();
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", IntRef() + "-" + IntRef() + "-" + IntRef() + " " + IntRef() + ":" + IntRef() + ":" + IntRef());
马兰士c150m.put("VerifyMode", IntRef());
m.put("InOutMode", IntRef());
m.put("Year", IntRef());
m.put("Month", IntRef());
m.put("Day", IntRef());
m.put("Hour", IntRef());
m.put("Minute", IntRef());
m.put("Second", IntRef());
strList.add(m);
}
}
} while (newresult == true);
return strList;
}
/**
* 获取⽤户信息
*
* @return 返回的Map中,包含以下键值:
* @return 返回的Map中,包含以下键值:
* "EnrollNumber"  ⼈员编号
* "Name"          ⼈员姓名
* "Password"      ⼈员密码
* "Privilege"    特权 0位普通 3特权
* "Enabled"      是否启⽤
*/
public static List<UserInfo> getUserInfo() {
List<UserInfo> userInfoList = new LinkedList<>();
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 = StringRef();
if (enrollNumber == null || im().length() == 0)
continue;
//由于名字后⾯会产⽣乱码,所以这⾥采⽤了截取字符串的办法把后⾯的乱码去掉了,以后有待考察更好的办法。
//只⽀持2位、3位、4位长度的中⽂名字。
String name = StringRef();
int index = name.indexOf("\0");
String newStr = "";
if (index>-1){
name = name.substring(0,index);
}
if (StringRef().length() > 4) {
name = StringRef().substring(0, 4);
}
//如果没有名字,跳过。
if (im().length() == 0)
continue;
UserInfo userInfo = new UserInfo();
userInfo.setEnrollNumber(enrollNumber);
userInfo.setName(name);
userInfo.StringRef());
userInfo.IntRef());
userInfo.setEnabled((BooleanRef());
userInfoList.add(userInfo);
}
return userInfoList;
}
/**
* 设置⽤户信息
*
* @param number
* @param name
唐英* @param password
* @param isPrivilege 0為普通⽤⼾,3為管理員;
* @param enabled 是否啟⽤
* @return
*/
水处理控制系统
public static boolean setUserInfo(String number, String name, String password, int isPrivilege, boolean enabled) {

本文发布于:2024-09-21 16:42:18,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/116949.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:考勤   信息   考勤机   获取   时间   加班   没有   缓存
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议