diff --git a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java index 5fed1203e..ef001a3a4 100644 --- a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java +++ b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java @@ -1,6 +1,7 @@ package com.zhgd.xmgl.call; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -12,6 +13,8 @@ import com.zhgd.xmgl.base.HikvisionCarInfo; import com.zhgd.xmgl.base.HikvisionEventsPictureRq; import com.zhgd.xmgl.base.HikvisionOrganization; import com.zhgd.xmgl.base.SubscribeEventQo; +import com.zhgd.xmgl.modules.basicdata.entity.HikvisionRequestRetry; +import com.zhgd.xmgl.modules.basicdata.mapper.HikvisionRequestRetryMapper; import com.zhgd.xmgl.modules.car.entity.CarInfo; import com.zhgd.xmgl.modules.car.entity.CarPassRecord; import com.zhgd.xmgl.modules.car.mapper.CarPassRecordMapper; @@ -32,16 +35,14 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Scheduled; 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.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Objects; +import java.util.*; @Slf4j @RestController @@ -61,6 +62,21 @@ public class HikvisionCall { @Autowired @Lazy private CarPassRecordMapper carPassRecordMapper; + @Autowired + @Lazy + private HikvisionRequestRetryMapper hikvisionRequestRetryMapper; + + /** + * 海康请求失败重试定时 + */ + @Scheduled(cron = "4 0 0 * * ?") + public void getMonthAmmeterTask() { + List hikvisionRequestRetries = hikvisionRequestRetryMapper.selectList(new LambdaQueryWrapper() + .lt(HikvisionRequestRetry::getRequestNum, 4)); + for (HikvisionRequestRetry retry : hikvisionRequestRetries) { + HikvisionUtil.doPost(retry.getHost(), retry.getPath(), retry.getBody(), null, retry.getAppKey(), retry.getAppSecret()); + } + } public void addWorkerForHikvision(WorkerInfo workerInfo) { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, workerInfo.getProjectSn())); @@ -120,6 +136,18 @@ public class HikvisionCall { String host = "https://" + project.getArtemisConfigHost(); String body = getWorkerJson(workerInfo); HikvisionUtil.doPost(host, path, body, null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); + + editWorkerFace(workerInfo, project); + } + + private void editWorkerFace(WorkerInfo workerInfo, Project project) { + final String ARTEMIS_PATH = "/artemis"; + final String path = ARTEMIS_PATH + "/api/resource/v1/face/single/update"; + String host = "https://" + project.getArtemisConfigHost(); + JSONObject jo = new JSONObject(); + jo.put("personId", workerInfo.getId()); + jo.put("faceData", Base64Util.convertFileToBase64(PathUtil.reviseSlash(imageUrlPrefix + "/" + workerInfo.getFieldAcquisitionUrl()))); + HikvisionUtil.doPost(host, path, jo.toJSONString(), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); } @@ -135,6 +163,51 @@ public class HikvisionCall { jsonBody.put("personIds", Arrays.asList(workerInfo.getId())); String body = jsonBody.toJSONString(); HikvisionUtil.doPost(host, path, body, null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); + + deleteWorkerFace(workerInfo, project); + + } + + private void deleteWorkerFace(WorkerInfo workerInfo, Project project) { + ArrayList workerFaceIds = getWorkerFaceIds(workerInfo, project); + if (CollUtil.isNotEmpty(workerFaceIds)) { + for (String workerFaceId : workerFaceIds) { + sendDeleteWorkerFace(project, workerFaceId); + } + } + } + + private void sendDeleteWorkerFace(Project project, String workerFaceId) { + final String ARTEMIS_PATH = "/artemis"; + final String path = ARTEMIS_PATH + "/api/resource/v1/face/single/delete"; + String host = "https://" + project.getArtemisConfigHost(); + JSONObject jo = new JSONObject(); + jo.put("faceId", workerFaceId); + HikvisionUtil.doPost(host, path, jo.toJSONString(), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); + } + + private ArrayList getWorkerFaceIds(WorkerInfo workerInfo, Project project) { + final String ARTEMIS_PATH = "/artemis"; + final String path = ARTEMIS_PATH + "/api/resource/v1/person/condition/personInfo"; + String host = "https://" + project.getArtemisConfigHost(); + JSONObject jo = new JSONObject(); + jo.put("paramName", "personId"); + jo.put("paramValue", Arrays.asList(String.valueOf(workerInfo.getId()))); + String rs = HikvisionUtil.doPost(host, path, jo.toJSONString(), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); + JSONObject joData = HikvisionUtil.getJSONObjectData(rs); + ArrayList ids = new ArrayList<>(); + if (joData != null) { + Integer total = joData.getInteger("total"); + if (Objects.equals(total, 1)) { + JSONArray jsonArray = joData.getJSONArray("list"); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + ids.add(jsonObject.getString("personPhotoIndexCode")); + } + + } + } + return ids; } public void addCarInfoForHikvision(CarInfo carInfo) { diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/HikvisionRequestRetry.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/HikvisionRequestRetry.java new file mode 100644 index 000000000..8e71475eb --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/HikvisionRequestRetry.java @@ -0,0 +1,100 @@ +package com.zhgd.xmgl.modules.basicdata.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @Description: 海康请求重试表 + * @author: pds + * @date: 2024-03-01 + * @version: V1.0 + */ +@Data +@TableName("hikvision_request_retry") +@ApiModel(value = "HikvisionRequestRetry实体类", description = "HikvisionRequestRetry") +public class HikvisionRequestRetry implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private Long id; + private String host; + private String path; + /** + * 请求URL + */ + @Excel(name = "请求URL", width = 15) + @ApiModelProperty(value = "请求URL") + private String url; + /** + * 请求方法:1GET2POST + */ + @Excel(name = "请求方法:1GET2POST", width = 15) + @ApiModelProperty(value = "请求方法:1GET2POST") + private Integer method; + /** + * 请求参数 + */ + @Excel(name = "请求参数", width = 15) + @ApiModelProperty(value = "请求参数") + private String param; + /** + * 请求body + */ + @Excel(name = "请求body", width = 15) + @ApiModelProperty(value = "请求body") + private String body; + /** + * 上次请求结果 + */ + @Excel(name = "上次请求结果", width = 15) + @ApiModelProperty(value = "上次请求结果") + private String lastResult; + /** + * 请求次数 + */ + @Excel(name = "请求次数", width = 15) + @ApiModelProperty(value = "请求次数") + private Integer requestNum; + /** + * appKey + */ + @Excel(name = "appKey", width = 15) + @ApiModelProperty(value = "appKey") + private String appKey; + /** + * appSecret + */ + @Excel(name = "appSecret", width = 15) + @ApiModelProperty(value = "appSecret") + private String appSecret; + /** + * 创建时间 + */ + @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private Date createTime; + /** + * 更新时间 yyyy-MM-dd HH:mm:ss + */ + @Excel(name = "更新时间 yyyy-MM-dd HH:mm:ss", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间 yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/HikvisionRequestRetryMapper.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/HikvisionRequestRetryMapper.java new file mode 100644 index 000000000..0fda13885 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/HikvisionRequestRetryMapper.java @@ -0,0 +1,19 @@ +package com.zhgd.xmgl.modules.basicdata.mapper; + +import java.util.List; + +import com.zhgd.xmgl.modules.basicdata.entity.HikvisionRequestRetry; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 海康请求重试表 + * @author: pds + * @date: 2024-03-01 + * @version: V1.0 + */ +@Mapper +public interface HikvisionRequestRetryMapper extends BaseMapper { + +} diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/xml/HikvisionRequestRetryMapper.xml b/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/xml/HikvisionRequestRetryMapper.xml new file mode 100644 index 000000000..5f1942ff6 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/xml/HikvisionRequestRetryMapper.xml @@ -0,0 +1,4 @@ + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/IHikvisionRequestRetryService.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/IHikvisionRequestRetryService.java new file mode 100644 index 000000000..70a725085 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/IHikvisionRequestRetryService.java @@ -0,0 +1,25 @@ +package com.zhgd.xmgl.modules.basicdata.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.zhgd.xmgl.modules.basicdata.entity.HikvisionRequestRetry; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: 海康请求重试表 + * @author: pds + * @date: 2024-03-01 + * @version: V1.0 + */ +public interface IHikvisionRequestRetryService extends IService { + + IPage queryPageList(HashMap paramMap); + + List queryList(HashMap paramMap); + + void add(HikvisionRequestRetry hikvisionRequestRetry); + + void edit(HikvisionRequestRetry hikvisionRequestRetry); +} diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/HikvisionRequestRetryServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/HikvisionRequestRetryServiceImpl.java new file mode 100644 index 000000000..e0b6a443c --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/HikvisionRequestRetryServiceImpl.java @@ -0,0 +1,69 @@ +package com.zhgd.xmgl.modules.basicdata.service.impl; + +import com.zhgd.xmgl.modules.basicdata.entity.HikvisionRequestRetry; +import com.zhgd.xmgl.modules.basicdata.mapper.HikvisionRequestRetryMapper; +import com.zhgd.xmgl.modules.basicdata.service.IHikvisionRequestRetryService; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.zhgd.jeecg.common.system.query.QueryGenerator; +import com.zhgd.xmgl.util.PageUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.HashMap; +import java.util.List; + +import com.zhgd.xmgl.util.RefUtil; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: 海康请求重试表 + * @author: pds + * @date: 2024-03-01 + * @version: V1.0 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class HikvisionRequestRetryServiceImpl extends ServiceImpl implements IHikvisionRequestRetryService { + @Autowired + private HikvisionRequestRetryMapper hikvisionRequestRetryMapper; + + @Override + public IPage queryPageList(HashMap paramMap) { + QueryWrapper queryWrapper = getQueryWrapper(paramMap); + Page page = PageUtil.getPage(paramMap); + IPage pageList = this.page(page, queryWrapper); + pageList.setRecords(dealList(pageList.getRecords())); + return pageList; + } + + @Override + public List queryList(HashMap paramMap) { + QueryWrapper queryWrapper = getQueryWrapper(paramMap); + return dealList(this.list(queryWrapper)); + } + + private QueryWrapper getQueryWrapper(HashMap paramMap) { + String alias = ""; + QueryWrapper queryWrapper = QueryGenerator.initPageQueryWrapper(HikvisionRequestRetry.class, paramMap, alias); + queryWrapper.orderByDesc(alias + RefUtil.fieldNameUlc(HikvisionRequestRetry::getId)); + return queryWrapper; + } + + private List dealList(List list) { + return list; + } + + @Override + public void add(HikvisionRequestRetry hikvisionRequestRetry) { + hikvisionRequestRetry.setId(null); + baseMapper.insert(hikvisionRequestRetry); + } + + @Override + public void edit(HikvisionRequestRetry hikvisionRequestRetry) { + baseMapper.updateById(hikvisionRequestRetry); + } +} diff --git a/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java b/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java index 78bf88a8a..81a19e9ef 100644 --- a/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java @@ -1,11 +1,17 @@ package com.zhgd.xmgl.util; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.hikvision.artemis.sdk.Client; import com.hikvision.artemis.sdk.Request; import com.hikvision.artemis.sdk.Response; import com.hikvision.artemis.sdk.constant.Constants; import com.hikvision.artemis.sdk.enums.Method; +import com.zhgd.xmgl.modules.basicdata.entity.HikvisionRequestRetry; +import com.zhgd.xmgl.modules.basicdata.mapper.HikvisionRequestRetryMapper; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; @@ -14,7 +20,16 @@ import java.util.Map; * 海康接口 */ @Slf4j +@Component public class HikvisionUtil { + + private static HikvisionRequestRetryMapper hikvisionRequestRetryMapper; + + @Autowired + public void setHikvisionRequestRetryMapper(HikvisionRequestRetryMapper hikvisionRequestRetryMapper) { + HikvisionUtil.hikvisionRequestRetryMapper = hikvisionRequestRetryMapper; + } + public static String doPost(String host, String path, String body, Map querys, String appKey, String appSecret) { log.info("HikvisionUtil#doPost.url:{}", host + path); String responseStr = null; @@ -31,6 +46,18 @@ public class HikvisionUtil { log.info("HikvisionUtil#doPost.getResponseResult:{}", responseStr); } catch (Exception var10) { var10.printStackTrace(); + HikvisionRequestRetry entity = new HikvisionRequestRetry(); + entity.setUrl(host + path); + entity.setHost(host); + entity.setPath(path); + entity.setMethod(2); + entity.setParam(JSON.toJSONString(querys)); + entity.setBody(body); + entity.setLastResult(null); + entity.setRequestNum(1); + entity.setAppKey(appKey); + entity.setAppSecret(appSecret); + hikvisionRequestRetryMapper.insert(entity); } return responseStr; } @@ -47,4 +74,15 @@ public class HikvisionUtil { return responseStr; } + + public static JSONObject getJSONObjectData(String rs) { + JSONObject rsJo = JSONObject.parseObject(rs); + Integer code = rsJo.getInteger("code"); + if (code == 0) { + return rsJo.getJSONObject("data"); + } else { + log.error("海康解析结果失败:{}", rs); + return null; + } + } }