海康数据同步

This commit is contained in:
zhangming 2025-09-10 11:17:02 +08:00
commit d567d9ea0b
6 changed files with 321 additions and 0 deletions

Binary file not shown.

View File

@ -0,0 +1,12 @@
# 平台的ip端口
HOST=10.57.0.57:443
# 密钥appkey
APP_KEY=27970694
# 秘钥appSecret
APP_SECRET=8BZkFgxTwLzh0KoLz7VC
# 获取指定门禁设备数据,门禁点唯一标识,为空表示全部,多个以英文逗号分隔
DOOR_INDEX_CODES=
# 考勤打卡记录建模ID
kqdkjl_modeId=207
# 考勤打卡记录查询台账ID
kqdkjl_cusId=1254

View File

@ -0,0 +1,264 @@
package weaver.interfaces.jthr.cron.door;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.huawei.shade.org.joda.time.DateTime;
import com.huawei.shade.org.joda.time.format.DateTimeFormat;
import com.huawei.shade.org.joda.time.format.DateTimeFormatter;
import com.weaver.general.Util;
import org.apache.commons.lang.StringUtils;
import org.hsqldb.lib.StringUtil;
import weaver.conn.RecordSet;
import weaver.formmode.setup.ModeRightInfo;
import weaver.general.BaseBean;
import weaver.interfaces.jthr.cron.utils.HikVisionApiUtil;
import weaver.interfaces.schedule.BaseCronJob;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class SyncDoorDataJob extends BaseCronJob {
private String ksrqParam;
private String jsrqParam;
private String ts;
BaseBean baseBean = new BaseBean();
@Override
public void execute() {
baseBean.writeLog("begin do SyncDoorDataJob invoke ...");
baseBean.writeLog("param:" + ksrqParam + "" + jsrqParam + "" + ts);
RecordSet rs = new RecordSet();
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String format = dateFormat.format(date);
LocalDate currentDate = LocalDate.now();
try {
int jgts = 7;
if (StringUtils.isNotEmpty(ts)) {
jgts = Integer.parseInt(ts);
}
// 获取前七天的日期
LocalDate previousDate = currentDate.minusDays(jgts);
java.time.format.DateTimeFormatter formatter = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = previousDate.format(formatter);
if (StringUtils.isNotEmpty(jsrqParam) && StringUtils.isNotEmpty(ksrqParam)) {
format = jsrqParam;
formattedDate = ksrqParam;
}
baseBean.writeLog("SyncDoorDataJob formattedDate is:" + formattedDate + "" + format);
String endTime = format + "T23:59:59+08:00";
String startTime = formattedDate + "T00:00:01+08:00";
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
String modeId = baseBean.getPropValue("hikvision_zm_prop", "kqdkjl_modeId");
String cusId = baseBean.getPropValue("hikvision_zm_prop", "kqdkjl_cusId");
String sql = "select * from uf_kqdkjl where dkrq >= '" + formattedDate + "' and dkrq <= '" + format + "'";
baseBean.writeLog("SyncDoorDataJob sql is:" + sql);
rs.execute(sql);
Set<String> keySet = new HashSet<>();
while (rs.next()) {
String xmTemp = rs.getString("xm");
String zjhmTemp = rs.getString("zjhm");
String dkrgTemp = rs.getString("dkrq");
String dksjTemp = rs.getString("dksj");
keySet.add(xmTemp + "_" + zjhmTemp + "_" + dkrgTemp + "_" + dksjTemp);
}
// 获取身份证与手机号对应关系
Map<String, String> sfzAndSjhMap = new HashMap<>();
rs.execute("select certificatenum, mobile from hrmresource where certificatenum is not null and certificatenum != '' ORDER BY created ASC");
while (rs.next()) {
String certificatenum = rs.getString("certificatenum");
String mobile = rs.getString("mobile");
if (org.apache.commons.lang3.StringUtils.isEmpty(certificatenum) || org.apache.commons.lang3.StringUtils.isEmpty(mobile)) {
continue;
}
sfzAndSjhMap.put(certificatenum, mobile);
}
String doorIndexCodeStr = baseBean.getPropValue("hikvision_zm_prop", "DOOR_INDEX_CODES");
String HOST = baseBean.getPropValue("hikvision_zm_prop", "HOST");
String APP_KEY = baseBean.getPropValue("hikvision_zm_prop", "APP_KEY");
String APP_SECRET = baseBean.getPropValue("hikvision_zm_prop", "APP_SECRET");
String[] doorIndexCodes = null;
Map<String, Object> map = new HashMap<String, Object>();
map.put("startTime", startTime);
map.put("endTime", endTime);
map.put("pageSize", "1000");
if (StringUtils.isNotEmpty(doorIndexCodeStr)) {
doorIndexCodes = doorIndexCodeStr.split(",");
for (String s : doorIndexCodes) {
int pageNo = 1;
boolean isGoing = true;
List<String> tempIndexCodes = new ArrayList<>();
tempIndexCodes.add(s);
map.put("doorIndexCodes", tempIndexCodes.toArray());
while (isGoing) {
try {
map.put("pageNo", String.valueOf(pageNo));
baseBean.writeLog("SyncDoorDataJob map:" + map);
String result = HikVisionApiUtil.callPostApiList("/api/acs/v2/door/events", map, HOST, APP_KEY, APP_SECRET);
JSONObject obj = JSON.parseObject(result);
JSONObject dataObj = obj.getJSONObject("data");
JSONArray jsonList = dataObj.getJSONArray("list");
if (dataObj.getInteger("totalPage") > pageNo) {
pageNo += 1;
} else {
isGoing = false;
}
baseBean.writeLog("jsonList size:" + jsonList.size());
List<List> insertParams = new ArrayList<>();
for (int i = 0; i < jsonList.size(); i++) {
JSONObject jsonObject = jsonList.getJSONObject(i);
String certNo = Util.null2String(jsonObject.getString("certNo"));
if (StringUtil.isEmpty(certNo)) {
continue;
}
String personName = jsonObject.getString("personName");
String eventTime = jsonObject.getString("eventTime");
String[] arr = getDateStrFromIso8601(eventTime).split("\\s+");
String signDate = arr[0];
String signTime = arr[1];
String signTimeNew = signTime;
if (org.apache.commons.lang3.StringUtils.isNotEmpty(signTime)) {
signTime = signTime.substring(0, signTime.length() - 3);
}
String keyTemp = personName + "_" + certNo + "_" + signDate + "_" + signTime;
if ((!org.apache.commons.collections.CollectionUtils.isEmpty(keySet)) && keySet.contains(keyTemp)) {
continue;
}
String sjh = sfzAndSjhMap.get(certNo);
List insertParam = new ArrayList<String>();
insertParam.add(personName);
insertParam.add(certNo);
insertParam.add(signDate);
insertParam.add(signTime);
insertParam.add(signTimeNew);
insertParam.add(sjh);
insertParam.add(modeId);
insertParam.add(UUID.randomUUID().toString());
insertParam.add("1");
insertParam.add("0");
insertParam.add(sdfDate.format(new Date()));
insertParam.add(sdfTime.format(new Date()));
insertParams.add(insertParam);
}
if (!org.apache.commons.collections.CollectionUtils.isEmpty(insertParams)) {
baseBean.writeLog("insertParams result:" + insertParams.size());
String insertSql = "INSERT INTO uf_kqdkjl(xm, zjhm, dkrq, dksj, dksjwb, sjh, formmodeid, MODEUUID, modedatacreater, " +
"modedatacreatertype, modedatacreatedate, modedatacreatetime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
rs.executeBatchSql(insertSql, insertParams);
}
} catch (Exception e) {
isGoing = false;
baseBean.writeLog("SyncDoorDataJob dt error:" + e.getMessage());
}
}
}
//权限重构
ModeRightInfo modeRightInfo = new ModeRightInfo();
modeRightInfo.setNewRight(true);
modeRightInfo.editModeDataShare(1, Integer.parseInt(modeId), Integer.parseInt(cusId));
} else {
int pageNo = 1;
boolean isGoing = true;
while (isGoing) {
try {
map.put("pageNo", String.valueOf(pageNo));
baseBean.writeLog("SyncDoorDataJob map:" + map);
String result = HikVisionApiUtil.callPostApiList("/api/acs/v2/door/events", map, HOST, APP_KEY, APP_SECRET);
JSONObject obj = JSON.parseObject(result);
JSONObject dataObj = obj.getJSONObject("data");
JSONArray jsonList = dataObj.getJSONArray("list");
if (dataObj.getInteger("totalPage") > pageNo) {
pageNo += 1;
} else {
isGoing = false;
}
baseBean.writeLog("jsonList size:" + jsonList.size());
List<List> insertParams = new ArrayList<>();
for (int i = 0; i < jsonList.size(); i++) {
JSONObject jsonObject = jsonList.getJSONObject(i);
if (i == 0) {
baseBean.writeLog("jsonObject:" + jsonObject);
}
String certNo = Util.null2String(jsonObject.getString("certNo"));
if (i == 0) {
baseBean.writeLog("certNo:" + certNo);
}
if (StringUtil.isEmpty(certNo)) {
continue;
}
String personName = jsonObject.getString("personName");
String eventTime = jsonObject.getString("eventTime");
String[] arr = getDateStrFromIso8601(eventTime).split("\\s+");
String signDate = arr[0];
String signTime = arr[1];
String signTimeNew = signTime;
if (org.apache.commons.lang3.StringUtils.isNotEmpty(signTime)) {
signTime = signTime.substring(0, signTime.length() - 3);
}
String keyTemp = personName + "_" + certNo + "_" + signDate + "_" + signTime;
if ((!org.apache.commons.collections.CollectionUtils.isEmpty(keySet)) && keySet.contains(keyTemp)) {
continue;
}
String sjh = sfzAndSjhMap.get(certNo);
List insertParam = new ArrayList<String>();
insertParam.add(personName);
insertParam.add(certNo);
insertParam.add(signDate);
insertParam.add(signTime);
insertParam.add(signTimeNew);
insertParam.add(sjh);
insertParam.add(modeId);
insertParam.add(UUID.randomUUID().toString());
insertParam.add("1");
insertParam.add("0");
insertParam.add(sdfDate.format(new Date()));
insertParam.add(sdfTime.format(new Date()));
insertParams.add(insertParam);
}
if (!org.apache.commons.collections.CollectionUtils.isEmpty(insertParams)) {
baseBean.writeLog("insertParams result:" + insertParams.size());
String insertSql = "INSERT INTO uf_kqdkjl(xm, zjhm, dkrq, dksj, dksjwb, sjh, formmodeid, MODEUUID, modedatacreater, " +
"modedatacreatertype, modedatacreatedate, modedatacreatetime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
rs.executeBatchSql(insertSql, insertParams);
}
} catch (Exception e) {
isGoing = false;
baseBean.writeLog("SyncDoorDataJob dt error:" + e.getMessage());
}
}
}
} catch (Exception e) {
baseBean.writeLog("SyncDoorDataJob error:" + e);
}
baseBean.writeLog("end do SyncDoorDataJob invoke ...");
}
public String getDateStrFromIso8601(String dateStr){
DateTimeFormatter dtf1 = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ");
DateTime dt= dtf1.parseDateTime(dateStr);
DateTimeFormatter dtf2= DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
return dt.toString(dtf2);
}
}

View File

@ -0,0 +1,45 @@
package weaver.interfaces.jthr.cron.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import org.apache.commons.lang3.StringUtils;
import weaver.general.BaseBean;
import java.util.HashMap;
import java.util.Map;
public class HikVisionApiUtil{
static BaseBean baseBean = new BaseBean();
private static int BUFFER = 1024;
private static final String ARTEMIS_PATH = "/artemis";
public static String callPostApiList(String url, Map<String, Object> map, String HOST, String APP_KEY, String APP_SECRET) throws Exception {
ArtemisConfig config = new ArtemisConfig();
config.setHost(HOST);
config.setAppKey(APP_KEY);
config.setAppSecret(APP_SECRET);
final String getCamsApi = ARTEMIS_PATH + url;
String httpType = "https://";
if (StringUtils.isNotEmpty(HOST)) {
String[] split = HOST.split(":");
if (split.length == 2 && !StringUtils.equals(split[1], "443")) {
httpType = "http://";
}
}
String finalHttpType = httpType;
Map<String, String> path = new HashMap<String, String>(2) {
{
put(finalHttpType, getCamsApi);
}
};
baseBean.writeLog("callPostApiList:" + HOST + "" + JSONObject.toJSONString(path));
return ArtemisHttpUtil.doPostStringArtemis(config, path, JSON.toJSON(map).toString(),
null, null, "application/json");
}
}