commit d567d9ea0bd9a6452887621eff4958ef3d16e29c Author: zhangming <965499528@qq.com> Date: Wed Sep 10 11:17:02 2025 +0800 海康数据同步 diff --git a/WEB-INF/lib/artemis-http-client-1.1.15.RELEASE-javadoc.jar b/WEB-INF/lib/artemis-http-client-1.1.15.RELEASE-javadoc.jar new file mode 100644 index 0000000..67ae3e6 Binary files /dev/null and b/WEB-INF/lib/artemis-http-client-1.1.15.RELEASE-javadoc.jar differ diff --git a/WEB-INF/lib/artemis-http-client-1.1.15.RELEASE-sources.jar b/WEB-INF/lib/artemis-http-client-1.1.15.RELEASE-sources.jar new file mode 100644 index 0000000..0eceff0 Binary files /dev/null and b/WEB-INF/lib/artemis-http-client-1.1.15.RELEASE-sources.jar differ diff --git a/WEB-INF/lib/artemis-http-client-1.1.15.RELEASE.jar b/WEB-INF/lib/artemis-http-client-1.1.15.RELEASE.jar new file mode 100644 index 0000000..503017a Binary files /dev/null and b/WEB-INF/lib/artemis-http-client-1.1.15.RELEASE.jar differ diff --git a/WEB-INF/prop/hikvision_zm_prop.properties b/WEB-INF/prop/hikvision_zm_prop.properties new file mode 100644 index 0000000..606ca05 --- /dev/null +++ b/WEB-INF/prop/hikvision_zm_prop.properties @@ -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 \ No newline at end of file diff --git a/src/weaver/interfaces/jthr/cron/door/SyncDoorDataJob.java b/src/weaver/interfaces/jthr/cron/door/SyncDoorDataJob.java new file mode 100644 index 0000000..07a0d81 --- /dev/null +++ b/src/weaver/interfaces/jthr/cron/door/SyncDoorDataJob.java @@ -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 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 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 map = new HashMap(); + 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 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 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(); + 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 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(); + 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); + } +} diff --git a/src/weaver/interfaces/jthr/cron/utils/HikVisionApiUtil.java b/src/weaver/interfaces/jthr/cron/utils/HikVisionApiUtil.java new file mode 100644 index 0000000..7190797 --- /dev/null +++ b/src/weaver/interfaces/jthr/cron/utils/HikVisionApiUtil.java @@ -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 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 path = new HashMap(2) { + { + put(finalHttpType, getCamsApi); + } + }; + baseBean.writeLog("callPostApiList:" + HOST + "、" + JSONObject.toJSONString(path)); + return ArtemisHttpUtil.doPostStringArtemis(config, path, JSON.toJSON(map).toString(), + null, null, "application/json"); + } +} +