From 212e3aba4aa2e59f8ed76c599cee4cbad2eb39ad Mon Sep 17 00:00:00 2001 From: guo Date: Wed, 28 Feb 2024 16:28:36 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xmgl/base/HikvisionEventsPictureRq.java | 22 +++ .../com/zhgd/xmgl/call/HikvisionCall.java | 183 +++++++++++++----- 2 files changed, 153 insertions(+), 52 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/base/HikvisionEventsPictureRq.java diff --git a/src/main/java/com/zhgd/xmgl/base/HikvisionEventsPictureRq.java b/src/main/java/com/zhgd/xmgl/base/HikvisionEventsPictureRq.java new file mode 100644 index 000000000..ec4f52018 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/base/HikvisionEventsPictureRq.java @@ -0,0 +1,22 @@ +package com.zhgd.xmgl.base; + +import lombok.Data; + +@Data +public class HikvisionEventsPictureRq { + /** + * 图片存储服务器唯一标识,提供picUri处会提供此字段 + */ + private String svrIndexCode; + /** + * 图片的相对地址 + */ + private String picUri; + /** + * 网络协议: + * “http”:HTTP协议 + * “https”:HTTPS协议 + * 参数不填,优先返回https协议 + */ + private String netProtocol; +} diff --git a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java index 52682bf29..76843e88a 100644 --- a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java +++ b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java @@ -1,82 +1,56 @@ package com.zhgd.xmgl.call; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.hikvision.artemis.sdk.ArtemisHttpUtil; -import com.hikvision.artemis.sdk.config.ArtemisConfig; +import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.xmgl.base.HikvisionCarInfo; +import com.zhgd.xmgl.base.HikvisionEventsPictureRq; import com.zhgd.xmgl.modules.car.entity.CarInfo; +import com.zhgd.xmgl.modules.car.entity.CarPassRecord; +import com.zhgd.xmgl.modules.car.mapper.CarPassRecordMapper; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; +import com.zhgd.xmgl.modules.worker.mapper.WorkerInfoMapper; +import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService; import com.zhgd.xmgl.util.Base64Util; import com.zhgd.xmgl.util.HikvisionUtil; import com.zhgd.xmgl.util.PathUtil; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Objects; @Slf4j -@Component +@RestController +@RequestMapping("/xmgl/hikvision") public class HikvisionCall { @Value("${upload.image.url.prefix:}") private String imageUrlPrefix; - @Autowired private ProjectMapper projectMapper; - - public static String GetCameraPreviewURL() { - - /** - * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数. - */ - ArtemisConfig.host = "127.0.0.1:443"; // 平台的ip端口 - ArtemisConfig.appKey = "29180881"; // 密钥appkey - ArtemisConfig.appSecret = "XO0wCAYGi4KV70ybjznx";// 密钥appSecret - - /** - * STEP2:设置OpenAPI接口的上下文 - */ - final String ARTEMIS_PATH = "/artemis"; - - /** - * STEP3:设置接口的URI地址 - */ - final String previewURLsApi = ARTEMIS_PATH + "/api/video/v1/cameras/previewURLs"; - Map path = new HashMap(2) { - { - put("https://", previewURLsApi);//根据现场环境部署确认是http还是https - } - }; - - /** - * STEP4:设置参数提交方式 - */ - String contentType = "application/json"; - - /** - * STEP5:组装请求参数 - */ - JSONObject jsonBody = new JSONObject(); - jsonBody.put("cameraIndexCode", "748d84750e3a4a5bbad3cd4af9ed5101"); - jsonBody.put("streamType", 0); - jsonBody.put("protocol", "rtsp"); - jsonBody.put("transmode", 1); - jsonBody.put("expand", "streamform=ps"); - String body = jsonBody.toJSONString(); - /** - * STEP6:调用接口 - */ - String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);// post请求application/json类型参数 - return result; - } + @Autowired + private IWorkerAttendanceService workerAttendanceService; + @Autowired + private WorkerInfoMapper workerInfoMapper; + @Autowired + private CarPassRecordMapper carPassRecordMapper; public void addWorkerForHikvision(WorkerInfo workerInfo) { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, workerInfo.getProjectSn())); @@ -239,4 +213,109 @@ public class HikvisionCall { jo.put("vehicleIds", array); HikvisionUtil.doPost(host, path, body, null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); } + + @ApiOperation(value = "海康事件回调", notes = "海康事件回调", httpMethod = "POST") + @PostMapping(value = "/eventCallback") + public Result eventCallback(@ApiIgnore @RequestBody JSONObject jsonObject) { + String method = jsonObject.getString("method"); + if (Objects.equals(method, "OnEventNotify")) { + JSONObject paramsJo = jsonObject.getJSONObject("params"); + String ability = paramsJo.getString("ability"); + //人员通行记录 + if (Objects.equals(ability, "event_acs")) { + JSONArray eventsJa = paramsJo.getJSONArray("events"); + if (eventsJa != null) { + for (int i = 0; i < eventsJa.size(); i++) { + JSONObject jo1 = eventsJa.getJSONObject(i); + JSONObject dataJo = jo1.getJSONObject("data"); + JSONObject extEventIdentityCardInfoJo = dataJo.getJSONObject("ExtEventIdentityCardInfo"); + String idNum = extEventIdentityCardInfoJo.getString("IdNum"); + String extEventPictureURL = extEventIdentityCardInfoJo.getString("ExtEventPictureURL"); + String svrIndexCode = extEventIdentityCardInfoJo.getString("svrIndexCode"); + String extEventCardNo = dataJo.getString("ExtEventCardNo"); + WorkerInfo workerInfo = workerInfoMapper.selectOne(new LambdaQueryWrapper().eq(WorkerInfo::getIdCard, idNum) + .or().eq(WorkerInfo::getIdCard, extEventCardNo).last("limit 1")); + if (workerInfo == null) { + log.info("未找到该人员信息,idCard:{},extEventCardNo:{}", idNum, extEventCardNo); + return null; + } + Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, workerInfo.getProjectSn())); + if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { + log.info("未配置,idCard:{},extEventCardNo:{}", idNum, extEventCardNo); + return null; + } + HikvisionEventsPictureRq rq = new HikvisionEventsPictureRq(); + rq.setPicUri(extEventPictureURL); + rq.setSvrIndexCode(svrIndexCode); + HashMap map = new HashMap<>(); + map.put("passTime", null); + map.put("idCard", idNum); + map.put("attendanceNumber", extEventCardNo); + map.put("direction", getDirection(dataJo)); + map.put("passType", 2); + map.put("projectCode", workerInfo.getProjectSn()); + map.put("devCode", null); + map.put("faceUrl", getHikvisionEventsPicture(rq, project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret())); + workerAttendanceService.saveExternalPassRecord(map); + } + } + } else if (Objects.equals(ability, "event_mpc")) { + JSONArray eventsJa = paramsJo.getJSONArray("events"); + if (eventsJa != null) { + for (int i = 0; i < eventsJa.size(); i++) { + JSONObject jo1 = eventsJa.getJSONObject(i); + JSONObject dataJo = jo1.getJSONObject("data"); + CarPassRecord entity = new CarPassRecord(); + entity.setCarNumber(dataJo.getString("plateNo")); + String imageIndexCode = dataJo.getString("imageIndexCode"); + entity.setType(null); + entity.setPassTime(DateUtil.formatDateTime(DateUtil.parse(dataJo.getString("crossTime")))); + JSONObject picUrlJo = dataJo.getJSONObject("picUrl"); + String vehiclePicUrl = picUrlJo.getString("vehiclePicUrl"); + HikvisionEventsPictureRq rq = new HikvisionEventsPictureRq(); + rq.setPicUri(vehiclePicUrl); + rq.setSvrIndexCode(imageIndexCode); + //entity.setImageUrl(getHikvisionEventsPicture(rq, project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()));//todo + //entity.setPanoramaUrl(); + //entity.setCarColor(); + //entity.setLocation(); + //entity.setProjectSn(); + //entity.setCarLogo(); + //entity.setColor(); + //entity.setCameraId(); + JSONObject personJo = dataJo.getJSONObject("person"); + entity.setDriverData(personJo.getString("personName")); + entity.setIsOpen(1); + carPassRecordMapper.insert(entity); + } + } + } + } + return Result.ok(); + } + + private Integer getDirection(JSONObject dataJo) { + Integer extEventInOut = dataJo.getInteger("ExtEventInOut"); + if (Objects.equals(extEventInOut, 0)) { + return 2; + } else if (Objects.equals(extEventInOut, 1)) { + return 1; + } else { + return null; + } + } + + public static String getHikvisionEventsPicture(HikvisionEventsPictureRq rq, String artemisConfigHost, String artemisConfigAppKey, String artemisConfigAppSecret) {//获取视频事件的图片 + final String ARTEMIS_PATH = "/artemis"; + final String path = ARTEMIS_PATH + "/api/video/v1/events/picture"; + String host = "https://" + artemisConfigHost; + String body = JSONObject.toJSONString(rq); + String rs = HikvisionUtil.doPost(host, path, body, null, artemisConfigAppKey, artemisConfigAppSecret); + JSONObject rsJo = JSONObject.parseObject(rs); + Integer code = rsJo.getInteger("code"); + if (code == 0) { + return rsJo.getJSONObject("data").getString("picUrl"); + } + return null; + } }