diff --git a/src/main/java/com/zhgd/xmgl/base/HikvisionEventsPictureRq.java b/src/main/java/com/zhgd/xmgl/base/HikvisionEventsPictureRq.java index 993430084..8b74a6163 100644 --- a/src/main/java/com/zhgd/xmgl/base/HikvisionEventsPictureRq.java +++ b/src/main/java/com/zhgd/xmgl/base/HikvisionEventsPictureRq.java @@ -11,11 +11,11 @@ import lombok.NoArgsConstructor; @NoArgsConstructor public class HikvisionEventsPictureRq { /** - * 图片存储服务器唯一标识,提供picUri处会提供此字段 + * 图片存储服务器唯一标识,提供picUri处会提供此字段,如49a6fec4-e368-428d-baff-4189a1383829 */ private String svrIndexCode; /** - * 图片的相对地址 + * 图片的相对地址,如/pic?bd00=c002l7f-do061b*91ee599f-2857f96b7*571==sp**117==t1*7117827221l6*2111=5o9*41b-=37be87pi11do=0-f90040 */ private String picUri; /** diff --git a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java index ab7b53ef0..46fcbd96f 100644 --- a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java +++ b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java @@ -31,12 +31,12 @@ import com.zhgd.xmgl.modules.worker.mapper.WorkerInfoMapper; import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService; import com.zhgd.xmgl.modules.worker.service.impl.WorkerAttendanceServiceImpl; import com.zhgd.xmgl.security.util.SecurityUtils; -import com.zhgd.xmgl.util.Base64Util; -import com.zhgd.xmgl.util.HikvisionUtil; -import com.zhgd.xmgl.util.PathUtil; -import com.zhgd.xmgl.util.X509TrustManagerUtil; +import com.zhgd.xmgl.util.*; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -260,6 +260,86 @@ public class HikvisionCall { return Result.ok(); } + @ApiOperation(value = "服务挂了主动获取门禁点事件的人员通行记录", notes = "服务挂了主动获取门禁点事件的人员通行记录", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "body", required = true, dataType = "String"), + }) + @PostMapping(value = "/getDoorEvents") + public Result getDoorEvents(@ApiIgnore @RequestBody HashMap paramMap) { + String startTime = MapUtils.getString(paramMap, "startTime"); + String endTime = MapUtils.getString(paramMap, "endTime"); + DateUtils.checkLegalDate19(startTime); + DateUtils.checkLegalDate19(endTime); + JSONObject param = new JSONObject(); + param.put("startTime", DateUtils.getISO8601Str(DateUtil.parse(startTime))); + param.put("endTime", DateUtils.getISO8601Str(DateUtil.parse(endTime))); + String projectSn = MapUtils.getString(paramMap, "projectSn"); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(Project::getSyncHikvision, 1); + if (StringUtils.isNotBlank(projectSn)) { + queryWrapper.eq(Project::getProjectSn, projectSn); + } + List projects = projectMapper.selectList(queryWrapper); + for (Project project : projects) { + List ufaceDevs = ufaceDevMapper.selectList(new LambdaQueryWrapper() + .eq(UfaceDev::getProjectSn, project.getProjectSn())); + for (UfaceDev ufaceDev : ufaceDevs) { + param.put("doorIndexCode", ufaceDev.getDevSn()); + param.put("pageNo", 1); + Integer total = 0; + do { + String rs = getDoorEventsForHttp(project, param); + JSONObject joData = HikvisionUtil.getJSONObjectData(rs); + if (joData != null) { + total = joData.getInteger("total"); + if (!Objects.equals(total, 0)) { + JSONArray listJa = joData.getJSONArray("list"); + for (int i = 0; i < listJa.size(); i++) { + JSONObject listJo = listJa.getJSONObject(i); + String eventTime = listJo.getString("eventTime"); + String personId = listJo.getString("personId"); + String personName = listJo.getString("personName"); + String doorIndexCode = listJo.getString("doorIndexCode"); + String picUri = listJo.getString("picUri"); + String svrIndexCode = listJo.getString("svrIndexCode"); + WorkerInfo workerInfo = workerInfoMapper.selectById(personId); + if (workerInfo == null) { + log.error("未找到该人员信息,personName:{}", personName); + continue; + } + HashMap map = new HashMap<>(); + String time = DateUtil.formatDateTime(DateUtil.parse(eventTime)); + map.put("passTime", time); + map.put("idCard", workerInfo.getIdCard()); + map.put("attendanceNumber", workerInfo.getAttendanceNumber()); + int passType = workerAttendanceServiceImpl.getPassType(ufaceDev, time); + map.put("direction", passType); + map.put("passType", 2); + map.put("projectCode", workerInfo.getProjectSn()); + map.put("devCode", doorIndexCode); + + try { + HikvisionEventsPictureRq rq = new HikvisionEventsPictureRq(); + rq.setPicUri(picUri); + rq.setSvrIndexCode(svrIndexCode); + map.put("faceUrl", saveToLocal(getHikvisionEventsPicture(rq, project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); + } catch (Exception e) { + e.printStackTrace(); + } + + workerAttendanceService.saveExternalPassRecord(map); + } + param.put("pageNo", param.getIntValue("pageNo") + 1); + } + } + } while (total > 0); + } + } + return Result.ok(); + } + /** * 测试查询组织 * @@ -1049,6 +1129,9 @@ public class HikvisionCall { String host = "https://" + artemisConfigHost; String body = JSONObject.toJSONString(rq); String rs = HikvisionUtil.doPost(host, path, body, null, artemisConfigAppKey, artemisConfigAppSecret); + if (rs == null) { + return null; + } JSONObject rsJo = JSONObject.parseObject(rs); String code = rsJo.getString("code"); if (Objects.equals(code, "0")) { @@ -1517,5 +1600,27 @@ public class HikvisionCall { return null; } + /** + * 查询门禁点事件v2 + * + * @param project + * @param param + */ + public String getDoorEventsForHttp(Project project, JSONObject param) { + if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { + return null; + } + final String ARTEMIS_PATH = "/artemis"; + final String path = ARTEMIS_PATH + "/api/acs/v2/door/events"; + String host = "https://" + project.getArtemisConfigHost(); + JSONObject jo = new JSONObject(); + jo.put("pageNo", param.getIntValue("pageNo")); + jo.put("pageSize", 500); + //ISO8601时间格式 + jo.put("startTime", param.getString("startTime")); + jo.put("endTime", param.getString("endTime")); + jo.put("doorIndexCode", param.getString("doorIndexCode")); + return HikvisionUtil.doPost(host, path, jo.toJSONString(), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); + } } diff --git a/src/main/java/com/zhgd/xmgl/call/HousingDataCall.java b/src/main/java/com/zhgd/xmgl/call/HousingDataCall.java index baa222f2b..4cc7486f8 100644 --- a/src/main/java/com/zhgd/xmgl/call/HousingDataCall.java +++ b/src/main/java/com/zhgd/xmgl/call/HousingDataCall.java @@ -17,6 +17,7 @@ import com.zhgd.xmgl.modules.worker.mapper.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -381,4 +382,5 @@ public class HousingDataCall { } uploadExecuteRecordMapper.insert(uploadExecuteRecord); } + } diff --git a/src/main/java/com/zhgd/xmgl/util/DateUtils.java b/src/main/java/com/zhgd/xmgl/util/DateUtils.java index 41cf66898..a3af4ec12 100644 --- a/src/main/java/com/zhgd/xmgl/util/DateUtils.java +++ b/src/main/java/com/zhgd/xmgl/util/DateUtils.java @@ -4,6 +4,8 @@ package com.zhgd.xmgl.util; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; +import com.zhgd.jeecg.common.execption.OpenAlertException; +import org.apache.commons.lang3.time.DateFormatUtils; import java.text.DateFormat; import java.text.ParseException; @@ -559,11 +561,6 @@ public class DateUtils { return DateUtil.parse(str); } - public static void main(String[] args) { - System.out.println(getNowWeekAllDayList()); - System.out.println(getDateTimeStrList(100, "HH:mm")); - } - /** * 是否正确的日期格式:1:yyyy-MM-dd * @@ -587,4 +584,57 @@ public class DateUtils { } return false; } + + /** + * 获取ISO8601时间,秒级,如2024-04-10T09:57:41+08:00 + * + * @return + */ + public static String getISO8601Str(Date date) { + String pattern = "YYYY-MM-dd'T'HH:mm:ssZZ"; + return DateFormatUtils.format(date, pattern); + } + + + /** + * 判断时间格式 格式必须为“yyyy-MM-dd HH:mm:ss” + * + * @param sDate + * @return + */ + public static void checkLegalDate19(String sDate) { + int legalLen = 19; + if ((sDate == null) || (sDate.length() != legalLen)) { + throw new OpenAlertException("时间格式格式必须为yyyy-MM-dd HH:mm:ss"); + } + DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date = formatter.parse(sDate); + boolean equals = sDate.equals(formatter.format(date)); + if (!equals) { + throw new OpenAlertException("时间格式格式必须为yyyy-MM-dd HH:mm:ss"); + } + } catch (Exception e) { + throw new OpenAlertException("时间格式格式必须为yyyy-MM-dd HH:mm:ss"); + } + } + + public static void main(String[] args) { + try { + checkLegalDate19("2024-04-10"); + } catch (Exception e) { + e.printStackTrace(); + } + try { + checkLegalDate19("2024-04-10 00-00:00"); + } catch (Exception e) { + e.printStackTrace(); + } + try { + checkLegalDate19("2024-04-10 00:00:00"); + } catch (Exception e) { + e.printStackTrace(); + } + + } } diff --git a/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java b/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java index 6278cd89e..0f93d2e34 100644 --- a/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java @@ -1,5 +1,6 @@ package com.zhgd.xmgl.util; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -101,6 +102,9 @@ public class HikvisionUtil { * @return */ public static JSONObject getJSONObjectData(String rs) { + if (StrUtil.isBlank(rs)) { + return null; + } JSONObject rsJo = JSONObject.parseObject(rs); String code = rsJo.getString("code"); if (Objects.equals(code, "0")) { @@ -112,6 +116,9 @@ public class HikvisionUtil { } public static JSONArray getJSONArrayData(String rs) { + if (StrUtil.isBlank(rs)) { + return null; + } JSONObject rsJo = JSONArray.parseObject(rs); String code = rsJo.getString("code"); if (Objects.equals(code, "0")) {