From 551ca8ec67badb48fc8ad71383ac49f7449c88d3 Mon Sep 17 00:00:00 2001 From: GUO <1923636941@qq.com> Date: Wed, 12 Jun 2024 23:28:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=B7=E5=BA=B7=E4=B8=8B=E5=8F=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhgd/xmgl/async/AsyncHikvision.java | 158 +++++++++++++++- .../java/com/zhgd/xmgl/async/AsyncWorker.java | 6 +- .../com/zhgd/xmgl/config/AsyncConfig.java | 19 +- .../service/IProjectUfaceConfigService.java | 4 +- .../impl/ProjectUfaceConfigServiceImpl.java | 177 +++--------------- .../service/impl/UfaceDevServiceImpl.java | 2 +- 6 files changed, 201 insertions(+), 165 deletions(-) diff --git a/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java b/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java index 103899445..b57dedffb 100644 --- a/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java +++ b/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java @@ -1,5 +1,8 @@ package com.zhgd.xmgl.async; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zhgd.jeecg.common.execption.OpenPromptException; import com.zhgd.jeecg.common.util.SpringContextUtils; @@ -10,14 +13,14 @@ import com.zhgd.xmgl.modules.basicdata.service.INoticeService; import com.zhgd.xmgl.modules.car.entity.CarInfo; import com.zhgd.xmgl.modules.car.service.impl.CarInfoServiceImpl; import com.zhgd.xmgl.modules.project.entity.Project; +import com.zhgd.xmgl.modules.project.entity.ProjectUfaceConfig; +import com.zhgd.xmgl.modules.project.entity.vo.ProjectInfoExtVo; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.modules.project.service.IProjectUfaceConfigService; +import com.zhgd.xmgl.modules.project.service.impl.ProjectServiceImpl; import com.zhgd.xmgl.modules.video.mapper.ProjectVideoHkVqdMapper; import com.zhgd.xmgl.modules.video.mapper.VideoItemMapper; -import com.zhgd.xmgl.modules.worker.entity.DepartmentInfo; -import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; -import com.zhgd.xmgl.modules.worker.entity.TeamInfo; -import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; +import com.zhgd.xmgl.modules.worker.entity.*; import com.zhgd.xmgl.modules.worker.mapper.EnterpriseInfoMapper; import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl; import com.zhgd.xmgl.modules.xz.entity.XzHikvisionSync; @@ -25,16 +28,22 @@ import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionCompareDataMapper; import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionSyncMapper; import com.zhgd.xmgl.modules.xz.service.impl.XzHikvisionCompareDataServiceImpl; import com.zhgd.xmgl.security.entity.UserInfo; +import com.zhgd.xmgl.util.HikvisionUtil; +import com.zhgd.xmgl.util.JoBuilder; +import com.zhgd.xmgl.util.MapBuilder; import com.zhgd.xmgl.util.ThreadLocalUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; -import java.util.Date; -import java.util.HashMap; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 海康 @@ -68,6 +77,9 @@ public class AsyncHikvision { EnterpriseInfoMapper enterpriseInfoMapper; @Lazy @Autowired + ProjectServiceImpl projectService; + @Lazy + @Autowired private INoticeService noticeService; @Lazy @Autowired @@ -394,14 +406,14 @@ public class AsyncHikvision { } @Async("hikvisionExecutor") - public void deletePersonAuthAsync(WorkerInfo workerInfo, String devSn) { + public void deletePersonAuthAsync(WorkerInfo workerInfo, String devSns) { try { - if (StringUtils.isBlank(devSn)) { + if (StringUtils.isBlank(devSns)) { return; } StringBuilder sucSb = new StringBuilder(); StringBuilder failSb = new StringBuilder(); - String[] devSnArr = StringUtils.split(devSn, ","); + String[] devSnArr = StringUtils.split(devSns, ","); try { for (String ds : devSnArr) { hikvisionCall.updatePersonAuth(workerInfo, ds, sucSb, failSb, 2); @@ -451,4 +463,132 @@ public class AsyncHikvision { public void getDoorEventsAsync(HashMap paramMap) { hikvisionCall.getDoorEvents(paramMap); } + + @Async("sendBatchExecutor") + public void sendBatchWorkerInfoAsync(ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList, List workerAndDevSnList) { + try { + Map workerIdMap = workerList.stream().collect(Collectors.toMap(workerInfo -> workerInfo.getId() + "", Function.identity())); + Map devSnMap = allDevList.stream().collect(Collectors.toMap(UfaceDev::getDevSn, Function.identity())); + ProjectInfoExtVo project = projectService.getProjectInfoBySn(projectUfaceConfig.getProjectSn()); + Map> devSnToJoMap = workerAndDevSnList.stream().collect(Collectors.groupingBy(jsonObject -> jsonObject.getString("devSn"))); + JSONObject gdvJo = HikvisionUtil.getDoorsV2(project, HikvisionUtil.addPageParamIfAbsent(new JSONObject())); + JSONObject gdvDataJo = HikvisionUtil.getJSONObjectData(gdvJo); + //门禁设备编号:parentIndexCode,门禁点编号:indexCode,门禁设备资源通道号:channelNo + Map devSnToIscDevSnMap = gdvDataJo.getJSONArray("list").stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("indexCode"), o -> (JSONObject) o)); + Map> iscDevSnToMyMap = gdvDataJo.getJSONArray("list").stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("parentIndexCode"), o -> { + HashMap m1 = new HashMap<>(); + m1.put(((JSONObject) o).getString("channelNo"), (JSONObject) o); + return m1; + }, (o1, o2) -> { + o1.putAll(o2); + return o1; + })); + for (Map.Entry> entry : devSnToJoMap.entrySet()) { + asyncHikvision.sendBatchWorkersForOneDevAsync(projectUfaceConfig, workerIdMap, devSnMap, project, devSnToIscDevSnMap, iscDevSnToMyMap, entry); + } + } catch (Exception e) { + log.error("批量下发权限失败:", e); + hikvisionCall.updateAllFailStatusIfNullForAuth(projectUfaceConfig.getProjectSn(), workerList, 1, 1); + } + } + + @Async("sendBatchExecutor") + public void sendBatchWorkersForOneDevAsync(ProjectUfaceConfig projectUfaceConfig, Map workerIdMap, Map devSnMap, ProjectInfoExtVo project, Map devSnToIscDevSnMap, Map> iscDevSnToMyMap, Map.Entry> entry) { + try { + //【添加权限配置】(人员列表,设备列表),这个接口只要没报错,你就直接去下一步就行了。 + JSONObject aaRJo = HikvisionUtil.addAuth(project, getAddAuthParam(entry)); + HikvisionUtil.getJSONObjectData(aaRJo); + //然后调用【根据出入权限配置快捷下载】(设备列表)(【添加权限配置】+【快捷下发】这是一个流程,你添加了几个权限,下发成功之后,就清零了) + JSONObject daJo = HikvisionUtil.downloadAuth(project, getQueryDownloadProgressParam(entry)); + JSONObject daRtJo = HikvisionUtil.getJSONObjectData(daJo); + //然后调用【查询下载任务进度】(上面那个的任务) + int totalPercent = 0; + do { + JSONObject qdpJo = HikvisionUtil.queryDownloadProgress(project, new JoBuilder() + .put("taskId", daRtJo.getString("taskId")) + .build()); + totalPercent = HikvisionUtil.getJSONObjectData(qdpJo).getInteger("totalPercent"); + Thread.sleep(1000); + } while (totalPercent != 100); + //权限下发后(进度100后),用【查询权限条目列表】(人员列表,设备列表)接口去查,返回参数有权限状态,返回已下载的就是有权限 + JSONObject qaiJo = HikvisionUtil.queryAuthItem(project, getQueryAuthItemParam(entry, devSnToIscDevSnMap)); + JSONObject qaiRtJo = HikvisionUtil.getJSONObjectData(qaiJo); + JSONArray qaiList = qaiRtJo.getJSONArray("list"); + for (int i = 0; i < qaiList.size(); i++) { + sendBatchWorkersForOneDevOneWorkerAsync(projectUfaceConfig, workerIdMap, devSnMap, iscDevSnToMyMap, qaiList, i); + } + } catch (Exception e) { + log.error("批量下发权限失败:", e); + hikvisionCall.updateAllFailStatusIfNullForAuth(projectUfaceConfig.getProjectSn(), new ArrayList<>(workerIdMap.values()), 1, 1); + } + } + + @Transactional(rollbackFor = Exception.class) + @Async("sendBatchExecutor") + public void sendBatchWorkersForOneDevOneWorkerAsync(ProjectUfaceConfig projectUfaceConfig, Map workerIdMap, Map devSnMap, Map> iscDevSnToMyMap, JSONArray qaiList, int i) { + JSONObject jo = qaiList.getJSONObject(i); + String personId = jo.getString("personId"); + String resourceIndexCode = jo.getString("resourceIndexCode"); + String channelNo = jo.getString("channelNo"); + //人脸状态 + //0:已配置未下载 + //1:更新待下载 + //2:更新待删除 + //3:已下载 + //4:未配置 + Integer faceStatus = jo.getInteger("faceStatus"); + UfaceDev dev = devSnMap.get(iscDevSnToMyMap.get(resourceIndexCode).get(channelNo).getString("indexCode")); + if (ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class) != null) { + noticeService.addUserNotice(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId(), + StrUtil.format("[{}]下发到[{}]{}", + workerIdMap.get(personId).getWorkerName(), + Optional.ofNullable(dev).map(UfaceDev::getDevName).orElse("设备"), + Objects.equals(faceStatus, 3) ? "成功" : "失败,下发异常"), + "人员下发设备提醒", "1"); + } + hikvisionCall.updateSuccessStatus(projectUfaceConfig.getProjectSn(), Long.valueOf(personId), 3, 1, dev.getDevSn()); + } + + @NotNull + private JSONObject getAddAuthParam(Map.Entry> entry) { + JSONObject aaJo = new JSONObject(); + aaJo.put("personDatas", Collections.singletonList(new MapBuilder() + .put("indexCodes", entry.getValue().stream().map(jsonObject -> jsonObject.getString("workerId")).collect(Collectors.toList())) + .put("personDataType", "person") + .build())); + aaJo.put("resourceInfos", getDevRqParam(entry)); + return aaJo; + } + + @NotNull + private List getDevRqParam(Map.Entry> entry) { + return Collections.singletonList(new JoBuilder() + .put("resourceIndexCode", entry.getKey()) + .put("resourceType", "door") + .put("channelNos", Collections.singletonList(1)) + .build()); + } + + private JSONObject getQueryDownloadProgressParam(Map.Entry> entry) { + JSONObject aaJo = new JSONObject(); + aaJo.put("taskType", 4); + aaJo.put("resourceInfos", getDevRqParam(entry)); + return aaJo; + } + + private JSONObject getQueryAuthItemParam(Map.Entry> entry, Map devSnToIscDevSnMap) { + JSONObject aaJo = new JSONObject(); + aaJo.put("personIds", entry.getValue().stream().map(jsonObject -> jsonObject.getString("workerId")).collect(Collectors.toList())); + aaJo.put("resourceInfos", Collections.singletonList(new JoBuilder() + .put("resourceIndexCode", devSnToIscDevSnMap.get(entry.getKey()).getString("parentIndexCode")) + .put("resourceType", "acsDevice") + .put("channelNos", Collections.singletonList(devSnToIscDevSnMap.get(entry.getKey()).getString("channelNo"))) + .build())); + aaJo.put("queryType", "acsDevice"); + aaJo.put("pageNo", 1); + aaJo.put("pageSize", 1000); + return aaJo; + } + + } diff --git a/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java b/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java index ed5780b95..fc472c453 100644 --- a/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java +++ b/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java @@ -67,6 +67,10 @@ public class AsyncWorker { } } + public void sendBatchWokerDev(Map map, ProjectUfaceConfig projectUfaceConfig, List allDevList) { + this.sendBatchWokerDevAsync(map, projectUfaceConfig, allDevList); + } + /** * 批量数据发送任务 * @@ -80,7 +84,7 @@ public class AsyncWorker { if (workerList.size() > 0) { if (projectUfaceConfig.getSupplierType() == 9) { //isc下发 - projectUfaceConfigService.sendBatchWorkerInfo(map, projectUfaceConfig, allDevList, workerList); + projectUfaceConfigService.sendBatchWorkerForHk(map, projectUfaceConfig, allDevList, workerList); } else { for (WorkerInfo info : workerList) { try { diff --git a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java index c30ab530a..63be34780 100644 --- a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java +++ b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java @@ -506,5 +506,22 @@ public class AsyncConfig { } - + @Bean("sendBatchExecutor") + public ThreadPoolTaskExecutor sendBatchExecutor() { + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); + /** 核心线程数(默认线程数) */ + executor.setCorePoolSize(maxPoolSize * 10); + /** 最大线程数 */ + executor.setMaxPoolSize(maxPoolSize * 10); + executor.setQueueCapacity(queueCapacity); + /** 允许线程空闲时间(单位:默认为秒) */ + executor.setKeepAliveSeconds(60); + /** 线程池名前缀 */ + executor.setThreadNamePrefix("sendBatchExecutor-"); + // 线程池对拒绝任务的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); + // 初始化 + executor.initialize(); + return executor; + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/project/service/IProjectUfaceConfigService.java b/src/main/java/com/zhgd/xmgl/modules/project/service/IProjectUfaceConfigService.java index 66e94ecd7..dac295fad 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/service/IProjectUfaceConfigService.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/service/IProjectUfaceConfigService.java @@ -34,9 +34,9 @@ public interface IProjectUfaceConfigService extends IService void addPersonAuth(WorkerInfo workerInfo, String devSn); - void addHikvisionSyncForDev(WorkerInfo workerInfo, String devSns); + void addHkSyncRecordAndResetStatusForDev(WorkerInfo workerInfo, String devSns); void deletePersonAuth(WorkerInfo workerInfo, String devSns); - void sendBatchWorkerInfo(Map map, ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList); + void sendBatchWorkerForHk(Map map, ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList); } diff --git a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectUfaceConfigServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectUfaceConfigServiceImpl.java index a0630f18f..5e757c9bd 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectUfaceConfigServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/service/impl/ProjectUfaceConfigServiceImpl.java @@ -2,7 +2,6 @@ package com.zhgd.xmgl.modules.project.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -10,10 +9,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.xmgl.async.AsyncHikvision; import com.zhgd.xmgl.call.HikvisionCall; -import com.zhgd.xmgl.constant.Cts; import com.zhgd.xmgl.modules.basicdata.service.INoticeService; import com.zhgd.xmgl.modules.project.entity.ProjectUfaceConfig; -import com.zhgd.xmgl.modules.project.entity.vo.ProjectInfoExtVo; import com.zhgd.xmgl.modules.project.mapper.ProjectUfaceConfigMapper; import com.zhgd.xmgl.modules.project.service.IProjectUfaceConfigService; import com.zhgd.xmgl.modules.worker.entity.UfaceDev; @@ -25,14 +22,11 @@ import com.zhgd.xmgl.modules.worker.mapper.UserDevAuthorityMapper; import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl; import com.zhgd.xmgl.modules.xz.entity.XzHikvisionSync; import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionSyncMapper; -import com.zhgd.xmgl.security.entity.UserInfo; import com.zhgd.xmgl.util.*; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -40,7 +34,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; -import java.util.function.Function; import java.util.stream.Collectors; import static com.zhgd.xmgl.async.AsyncHikvision.getSyncTimeWithInitIfAbsent; @@ -181,8 +174,7 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl ufaceIds = ufaceDevToGroupMapper.selectList(new LambdaQueryWrapper() - .in(UfaceDevToGroup::getUfaceDevGroupId, Arrays.asList(StringUtils.split(ufaceDevGroupId, ",")))).stream().map(UfaceDevToGroup::getUfaceDevId).collect(Collectors.toList()); + List ufaceIds = ufaceDevToGroupMapper.selectList(new LambdaQueryWrapper().in(UfaceDevToGroup::getUfaceDevGroupId, Arrays.asList(StringUtils.split(ufaceDevGroupId, ",")))).stream().map(UfaceDevToGroup::getUfaceDevId).collect(Collectors.toList()); if (CollUtil.isEmpty(ufaceIds)) { return; } @@ -279,8 +271,7 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl allList = ufaceDevMapper.selectList(new LambdaQueryWrapper() - .eq(UfaceDev::getProjectSn, workerInfo.getProjectSn())); + List allList = ufaceDevMapper.selectList(new LambdaQueryWrapper().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn())); if (CollUtil.isNotEmpty(allList)) { String devSns = StrUtil.join(",", allList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); this.deletePersonAuth(workerInfo, devSns); @@ -292,14 +283,8 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl existList = ufaceDevMapper.selectList(new LambdaQueryWrapper() - .eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()) - .in(UfaceDev::getId, StrUtil.split(devSns, ",")) - ); - List notExistList = ufaceDevMapper.selectList(new LambdaQueryWrapper() - .eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()) - .notIn(UfaceDev::getId, StrUtil.split(devSns, ",")) - ); + List existList = ufaceDevMapper.selectList(new LambdaQueryWrapper().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()).in(UfaceDev::getId, StrUtil.split(devSns, ","))); + List notExistList = ufaceDevMapper.selectList(new LambdaQueryWrapper().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()).notIn(UfaceDev::getId, StrUtil.split(devSns, ","))); if (CollUtil.isNotEmpty(notExistList)) { notDevSns = StrUtil.join(",", notExistList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); this.deletePersonAuth(workerInfo, notDevSns); @@ -310,8 +295,7 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl notExistList = ufaceDevMapper.selectList(new LambdaQueryWrapper() - .eq(UfaceDev::getProjectSn, workerInfo.getProjectSn())); + List notExistList = ufaceDevMapper.selectList(new LambdaQueryWrapper().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn())); if (CollUtil.isNotEmpty(notExistList)) { notDevSns = StrUtil.join(",", notExistList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); this.deletePersonAuth(workerInfo, notDevSns); @@ -333,9 +317,7 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl notExistList = ufaceDevMapper.selectList(new LambdaQueryWrapper() - .eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()) - ); + List notExistList = ufaceDevMapper.selectList(new LambdaQueryWrapper().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn())); if (CollUtil.isNotEmpty(notExistList)) { notDevSns = StrUtil.join(",", notExistList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); this.deletePersonAuth(workerInfo, notDevSns); @@ -383,9 +365,7 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl ufaceIds = ufaceDevToGroupMapper.selectList(new LambdaQueryWrapper() - .in(UfaceDevToGroup::getUfaceDevGroupId, Arrays.asList(StringUtils.split(ufaceDevGroupId, ",")))).stream().map(UfaceDevToGroup::getUfaceDevId).collect(Collectors.toList()); + List ufaceIds = ufaceDevToGroupMapper.selectList(new LambdaQueryWrapper().in(UfaceDevToGroup::getUfaceDevGroupId, Arrays.asList(StringUtils.split(ufaceDevGroupId, ",")))).stream().map(UfaceDevToGroup::getUfaceDevId).collect(Collectors.toList()); if (CollUtil.isNotEmpty(ufaceIds)) { ufaceIds.stream().distinct(); Map param = new HashMap<>(); @@ -501,10 +479,7 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl() - .eq(ProjectUfaceConfig::getProjectSn, projectSn) - .eq(ProjectUfaceConfig::getSupplierType, 9) - ); + Integer c = baseMapper.selectCount(new LambdaQueryWrapper().eq(ProjectUfaceConfig::getProjectSn, projectSn).eq(ProjectUfaceConfig::getSupplierType, 9)); return c > 0; } @@ -518,12 +493,9 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl map, ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList) { + public void sendBatchWorkerForHk(Map map, ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList) { //构建workerAndDevSnList - ArrayList workerAndDevSnList = new ArrayList<>(); + List workerAndDevSnList = new ArrayList<>(); for (WorkerInfo workerInfo : workerList) { + //海康门禁isc + if (NumberUtils.lt(workerInfo.getSafeScore(), 80D)) { + log.info("安全评分红码不下发权限,名称:{}", workerInfo.getWorkerName()); + continue; + } Pair devSnsAndDevIdsPair = this.getSendBatchDevSnsAndDevIds(workerInfo, allDevList); if (devSnsAndDevIdsPair.getRight() != null) { String devSns = devSnsAndDevIdsPair.getLeft(); - this.addHikvisionSyncForDev(workerInfo, devSns); + //清楚以前的记录 + xzHikvisionSyncMapper.delete(new LambdaQueryWrapper().eq(XzHikvisionSync::getBigType, 1).eq(XzHikvisionSync::getWhoId, workerInfo.getId())); + this.addHkSyncRecordAndResetStatusForDev(workerInfo, devSns); List devSnList = StrUtil.split(devSns, ","); for (String devSn : devSnList) { JSONObject jo = new JSONObject(); @@ -603,112 +583,7 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl workerIdMap = workerList.stream().collect(Collectors.toMap(workerInfo -> workerInfo.getId() + "", Function.identity())); - Map devSnMap = allDevList.stream().collect(Collectors.toMap(UfaceDev::getDevSn, Function.identity())); - ProjectInfoExtVo project = projectService.getProjectInfoBySn(MapUtils.getString(map, "projectSn")); - Map> devSnToJoMap = workerAndDevSnList.stream().collect(Collectors.groupingBy(jsonObject -> jsonObject.getString("devSn"))); - try { - JSONObject gdvJo = HikvisionUtil.getDoorsV2(project, HikvisionUtil.addPageParamIfAbsent(new JSONObject())); - JSONObject gdvDataJo = HikvisionUtil.getJSONObjectData(gdvJo); - //门禁设备编号:parentIndexCode,门禁点编号:indexCode,门禁设备资源通道号:channelNo - Map devSnToIscDevSnMap = gdvDataJo.getJSONArray("list").stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("indexCode"), o -> (JSONObject) o)); - Map> iscDevSnToMyMap = gdvDataJo.getJSONArray("list").stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("parentIndexCode"), o -> { - HashMap m1 = new HashMap<>(); - m1.put(((JSONObject) o).getString("channelNo"), (JSONObject) o); - return m1; - }, (o1, o2) -> { - o1.putAll(o2); - return o1; - })); - for (Map.Entry> entry : devSnToJoMap.entrySet()) { - //【添加权限配置】(人员列表,设备列表),这个接口只要没报错,你就直接去下一步就行了。 - JSONObject aaRJo = HikvisionUtil.addAuth(project, getAddAuthParam(entry)); - HikvisionUtil.getJSONObjectData(aaRJo); - //然后调用【根据出入权限配置快捷下载】(设备列表)(【添加权限配置】+【快捷下发】这是一个流程,你添加了几个权限,下发成功之后,就清零了) - JSONObject daJo = HikvisionUtil.downloadAuth(project, getQueryDownloadProgressParam(entry)); - JSONObject daRtJo = HikvisionUtil.getJSONObjectData(daJo); - //然后调用【查询下载任务进度】(上面那个的任务) - int totalPercent = 0; - do { - JSONObject qdpJo = HikvisionUtil.queryDownloadProgress(project, new JoBuilder() - .put("taskId", daRtJo.getString("taskId")) - .build()); - totalPercent = HikvisionUtil.getJSONObjectData(qdpJo).getInteger("totalPercent"); - Thread.sleep(1000); - } while (totalPercent != 100); - //权限下发后(进度100后),用【查询权限条目列表】(人员列表,设备列表)接口去查,返回参数有权限状态,返回已下载的就是有权限 - JSONObject qaiJo = HikvisionUtil.queryAuthItem(project, getQueryAuthItemParam(entry, devSnToIscDevSnMap)); - JSONObject qaiRtJo = HikvisionUtil.getJSONObjectData(qaiJo); - JSONArray qaiList = qaiRtJo.getJSONArray("list"); - for (int i = 0; i < qaiList.size(); i++) { - JSONObject jo = qaiList.getJSONObject(i); - String personId = jo.getString("personId"); - String resourceIndexCode = jo.getString("resourceIndexCode"); - String channelNo = jo.getString("channelNo"); - //人脸状态 - //0:已配置未下载 - //1:更新待下载 - //2:更新待删除 - //3:已下载 - //4:未配置 - Integer faceStatus = jo.getInteger("faceStatus"); - UfaceDev dev = devSnMap.get(iscDevSnToMyMap.get(resourceIndexCode).get(channelNo).getString("indexCode")); - if (ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class) != null) { - noticeService.addUserNotice(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId(), - StrUtil.format("[{}]下发到[{}]{}", - workerIdMap.get(personId).getWorkerName(), - Optional.ofNullable(dev).map(UfaceDev::getDevName).orElse("设备"), - Objects.equals(faceStatus, 3) ? "成功" : "失败,下发异常"), - "人员下发设备提醒", "1"); - } - hikvisionCall.updateSuccessStatus(projectUfaceConfig.getProjectSn(), Long.valueOf(personId), 3, 1, dev.getDevSn()); - } - } - } catch (Exception e) { - log.error("批量下发权限失败:", e); - hikvisionCall.updateAllFailStatusIfNullForAuth(projectUfaceConfig.getProjectSn(), workerList, 1, 1); - } - } - - private JSONObject getQueryAuthItemParam(Map.Entry> entry, Map devSnToIscDevSnMap) { - JSONObject aaJo = new JSONObject(); - aaJo.put("personIds", entry.getValue().stream().map(jsonObject -> jsonObject.getString("workerId")).collect(Collectors.toList())); - aaJo.put("resourceInfos", Collections.singletonList(new JoBuilder() - .put("resourceIndexCode", devSnToIscDevSnMap.get(entry.getKey()).getString("parentIndexCode")) - .put("resourceType", "acsDevice") - .put("channelNos", Collections.singletonList(devSnToIscDevSnMap.get(entry.getKey()).getString("channelNo"))) - .build())); - aaJo.put("queryType", "acsDevice"); - aaJo.put("pageNo", 1); - aaJo.put("pageSize", 1000); - return aaJo; - } - - private JSONObject getQueryDownloadProgressParam(Map.Entry> entry) { - JSONObject aaJo = new JSONObject(); - aaJo.put("taskType", 4); - aaJo.put("resourceInfos", getDevRqParam(entry)); - return aaJo; - } - - @NotNull - private JSONObject getAddAuthParam(Map.Entry> entry) { - JSONObject aaJo = new JSONObject(); - aaJo.put("personDatas", Collections.singletonList(new MapBuilder() - .put("indexCodes", entry.getValue().stream().map(jsonObject -> jsonObject.getString("workerId")).collect(Collectors.toList())) - .put("personDataType", "person") - .build())); - aaJo.put("resourceInfos", getDevRqParam(entry)); - return aaJo; - } - - @NotNull - private List getDevRqParam(Map.Entry> entry) { - return Collections.singletonList(new JoBuilder() - .put("resourceIndexCode", entry.getKey()) - .put("resourceType", "door") - .put("channelNos", Collections.singletonList(1)) - .build()); + asyncHikvision.sendBatchWorkerInfoAsync(projectUfaceConfig, allDevList, workerList, workerAndDevSnList); } } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java index 382359443..450964d61 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java @@ -209,7 +209,7 @@ public class UfaceDevServiceImpl extends ServiceImpl i if (list == null || list.size() == 0) { throw new OpenAlertException("请先添加设备"); } - asyncWorker.sendBatchWokerDevAsync(map, tempProjectUfaceConfig, list); + asyncWorker.sendBatchWokerDev(map, tempProjectUfaceConfig, list); } else { throw new OpenAlertException("项目配置不下发设备或未配置参数"); }