From 808b64bd4071492d0aa1aab0ce6c4deff290ebbf Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Wed, 12 Jun 2024 21:55:13 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B5=B7=E5=BA=B7=E4=B8=8B=E5=8F=91bug?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhgd/xmgl/async/AsyncHikvision.java | 8 +- .../java/com/zhgd/xmgl/async/AsyncWorker.java | 35 +- .../com/zhgd/xmgl/call/HikvisionCall.java | 21 +- .../com/zhgd/xmgl/config/AsyncConfig.java | 30 +- .../service/impl/NoticeServiceImpl.java | 1 + .../service/IProjectUfaceConfigService.java | 6 +- .../impl/ProjectUfaceConfigServiceImpl.java | 302 ++++++++++++++---- .../service/impl/UfaceDevServiceImpl.java | 8 +- .../com/zhgd/xmgl/util/HikvisionUtil.java | 75 ++++- 9 files changed, 358 insertions(+), 128 deletions(-) diff --git a/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java b/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java index 18640bf78..103899445 100644 --- a/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java +++ b/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java @@ -363,7 +363,7 @@ public class AsyncHikvision { } else { noticeService.addUserNotice(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId(), e.getMessage(), "人员下发设备提醒", "1"); } - hikvisionCall.updateAllFailStatusIfNullForAuth(workerInfo.getProjectSn(), workerInfo.getId(), 1, 1, getSyncTimeWithInitIfAbsent(1, workerInfo.getId())); + hikvisionCall.updateAllFailStatusIfNullForAuth(workerInfo.getProjectSn(), workerInfo.getId(), 1, 1); return; } @@ -383,7 +383,7 @@ public class AsyncHikvision { if (ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class) != null) { noticeService.addUserNotice(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId(), StringUtils.substring(msg, 0, msg.length() - 1), title, type); } - hikvisionCall.updateAllFailStatusIfNullForAuth(workerInfo.getProjectSn(), workerInfo.getId(), 1, 1, getSyncTimeWithInitIfAbsent(1, workerInfo.getId())); + hikvisionCall.updateAllFailStatusIfNullForAuth(workerInfo.getProjectSn(), workerInfo.getId(), 1, 1); } catch (Exception e) { log.error("海康:", e); } @@ -412,7 +412,7 @@ public class AsyncHikvision { } else { noticeService.addUserNotice(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId(), e.getMessage(), "人员下发设备提醒", "1"); } - hikvisionCall.updateAllFailStatusIfNullForAuth(workerInfo.getProjectSn(), workerInfo.getId(), 1, 3, getSyncTimeWithInitIfAbsent(1, workerInfo.getId())); + hikvisionCall.updateAllFailStatusIfNullForAuth(workerInfo.getProjectSn(), workerInfo.getId(), 1, 3); return; } @@ -432,7 +432,7 @@ public class AsyncHikvision { if (ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class) != null) { noticeService.addUserNotice(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId(), StringUtils.substring(msg, 0, msg.length() - 1), title, type); } - hikvisionCall.updateAllFailStatusIfNullForAuth(workerInfo.getProjectSn(), workerInfo.getId(), 1, 3, getSyncTimeWithInitIfAbsent(1, workerInfo.getId())); + hikvisionCall.updateAllFailStatusIfNullForAuth(workerInfo.getProjectSn(), workerInfo.getId(), 1, 3); } catch (Exception e) { log.error("海康:", e); } diff --git a/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java b/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java index 3d889d00e..ed5780b95 100644 --- a/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java +++ b/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java @@ -67,30 +67,31 @@ public class AsyncWorker { } } - public void sendBatchWokerDev(Map map, ProjectUfaceConfig projectUfaceConfig, List devList) { - sendBatchWokerDevAsync(map, projectUfaceConfig, devList); - } - /** * 批量数据发送任务 * * @param */ @Async("sendWorkerExecutor") - public void sendBatchWokerDevAsync(Map map, ProjectUfaceConfig projectUfaceConfig, List devList) { + public void sendBatchWokerDevAsync(Map map, ProjectUfaceConfig projectUfaceConfig, List allDevList) { try { Long userId = MapUtils.getLong(map, "userId"); - List list = workerInfoMapper.selectProjectWorkerInfoList(map); - if (list.size() > 0) { - for (WorkerInfo info : list) { - try { - info.setNoticeUserId(userId); - projectUfaceConfigService.sendBatchWorkerInfo(info, projectUfaceConfig, devList); - workerInfoService.resetHkStatus(info); - } catch (Exception e) { - log.error("下发人员异常,人员名称:{}", info.getWorkerName() + "," + e.getMessage()); - noticeFail(info.getWorkerName(), userId, e); - log.error("error:", e); + List workerList = workerInfoMapper.selectProjectWorkerInfoList(map); + if (workerList.size() > 0) { + if (projectUfaceConfig.getSupplierType() == 9) { + //isc下发 + projectUfaceConfigService.sendBatchWorkerInfo(map, projectUfaceConfig, allDevList, workerList); + } else { + for (WorkerInfo info : workerList) { + try { + info.setNoticeUserId(userId); + projectUfaceConfigService.sendBatchWorkerInfo(info, projectUfaceConfig, allDevList); + workerInfoService.resetHkStatus(info); + } catch (Exception e) { + log.error("下发人员异常,人员名称:{}", info.getWorkerName() + "," + e.getMessage()); + noticeFail(info.getWorkerName(), userId, e); + log.error("error:", e); + } } } } @@ -98,7 +99,7 @@ public class AsyncWorker { java.text.DateFormat format1 = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Notice notice = new Notice(); notice.setAccountId(userId); - notice.setMsg("已经完成批量向设备下发" + list.size() + "个人"); + notice.setMsg("已经完成批量向设备下发" + workerList.size() + "个人"); notice.setTitle("人员批量下发设备提醒"); notice.setSendTime(format1.format(new Date())); notice.setType("1"); diff --git a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java index b60f39a1a..63dd2879a 100644 --- a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java +++ b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java @@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.execption.OpenPromptException; import com.zhgd.redis.lock.RedisRepository; import com.zhgd.xmgl.async.AsyncAiAnalyse; @@ -1136,7 +1137,13 @@ public class HikvisionCall { } } - public void updateAllFailStatusIfNullForAuth(String projectSn, Long whoId, Integer bigType, Integer operate, Date now) { + public void updateAllFailStatusIfNullForAuth(String projectSn, List workerList, Integer bigType, Integer operate) { + for (WorkerInfo workerInfo : workerList) { + updateAllFailStatusIfNullForAuth(projectSn, workerInfo.getId(), bigType, operate); + } + } + + public void updateAllFailStatusIfNullForAuth(String projectSn, Long whoId, Integer bigType, Integer operate) { xzHikvisionSyncMapper.update(null, new LambdaUpdateWrapper() .set(XzHikvisionSync::getIsSuccess, 0) .isNull(XzHikvisionSync::getIsSuccess) @@ -1144,7 +1151,6 @@ public class HikvisionCall { .eq(XzHikvisionSync::getOperate, operate) .eq(XzHikvisionSync::getProjectSn, projectSn) .eq(XzHikvisionSync::getWhoId, whoId) - .eq(XzHikvisionSync::getCreateDate, now) ); updateTotalStatus(projectSn, whoId, bigType); } @@ -2138,17 +2144,11 @@ public class HikvisionCall { " }\n" + " ],\n" + "}"; - JSONObject rs = HikvisionUtil.doorSearchV2(project, JSONObject.parseObject(json)); - if (HikvisionUtil.isFail(rs)) { - log.error(workerInfo.getWorkerName() + "," + dev.getDevName() + " fail:" + rs.toJSONString() + ","); - failSb.append(workerInfo.getWorkerName() + "," + dev.getDevName() + ",失败原因:下发异常;"); - return; - } + JSONObject rs = HikvisionUtil.getDoorsV2(project, JSONObject.parseObject(json)); JSONObject jo = HikvisionUtil.getJSONObjectData(rs); JSONArray listJa = jo.getJSONArray("list"); if (CollUtil.isEmpty(listJa)) { - failSb.append(workerInfo.getWorkerName() + "," + dev.getDevName() + ",失败信息:isc不存在该设备;"); - return; + throw new OpenAlertException("失败信息:isc不存在该设备"); } String channelNo = listJa.getJSONObject(0).getString("channelNo"); String sdStr = "{\n" + @@ -2194,5 +2194,4 @@ public class HikvisionCall { private void updateSucForUpdatePersonAuth(WorkerInfo workerInfo, String devSn, int i) { updateSuccessStatus(workerInfo.getProjectSn(), workerInfo.getId(), 3, i == 0 ? 1 : 3, devSn); } - } diff --git a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java index ae41d6334..c30ab530a 100644 --- a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java +++ b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java @@ -44,7 +44,7 @@ public class AsyncConfig { @Primary @Bean("taskExecutor") public ThreadPoolTaskExecutor taskExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -69,7 +69,7 @@ public class AsyncConfig { @Bean("doubleCarbonExecutor") public ThreadPoolTaskExecutor doubleCarbonExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -88,7 +88,7 @@ public class AsyncConfig { @Bean("countAttendanceExecutor") public ThreadPoolTaskExecutor attendanceExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -107,7 +107,7 @@ public class AsyncConfig { @Bean("sendAttendanceExecutor") public ThreadPoolTaskExecutor sendAttendanceExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -126,7 +126,7 @@ public class AsyncConfig { @Bean("sendWorkerExecutor") public ThreadPoolTaskExecutor sendWorkerExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -145,7 +145,7 @@ public class AsyncConfig { @Bean("sendExitWorkerExecutor") public ThreadPoolTaskExecutor sendExitWorkerExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -164,7 +164,7 @@ public class AsyncConfig { @Bean("environmentNoiseDataExecutor") public ThreadPoolTaskExecutor sendEnvironmentNoiseDataExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -183,7 +183,7 @@ public class AsyncConfig { @Bean("electricalExecutor") public ThreadPoolTaskExecutor sendElectricalExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -202,7 +202,7 @@ public class AsyncConfig { @Bean("towerExecutor") public ThreadPoolTaskExecutor sendTowerExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -221,7 +221,7 @@ public class AsyncConfig { @Bean("lifterExecutor") public ThreadPoolTaskExecutor sendLifterExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -240,7 +240,7 @@ public class AsyncConfig { @Bean("devExcavationExecutor") public ThreadPoolTaskExecutor sendDevExcavationEExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -259,7 +259,7 @@ public class AsyncConfig { @Bean("gantryCraneExecutor") public ThreadPoolTaskExecutor sendGantryCraneExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -278,7 +278,7 @@ public class AsyncConfig { @Bean("fileExecutor") public ThreadPoolTaskExecutor fileExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -297,7 +297,7 @@ public class AsyncConfig { @Bean("asyncExecutor") public ThreadPoolTaskExecutor asyncExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ @@ -317,7 +317,7 @@ public class AsyncConfig { @Primary @Bean("bimExecutor") public ThreadPoolTaskExecutor bimExecutor() { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/NoticeServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/NoticeServiceImpl.java index 5bd3d7d1a..a49df70e2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/NoticeServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/NoticeServiceImpl.java @@ -25,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; import java.util.Date; 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 2fd327134..66e94ecd7 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 @@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.zhgd.xmgl.modules.worker.entity.UfaceDev; import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; -import java.util.Date; import java.util.List; +import java.util.Map; /** * @Description: 项目对应的人脸设备配置 @@ -34,5 +34,9 @@ public interface IProjectUfaceConfigService extends IService void addPersonAuth(WorkerInfo workerInfo, String devSn); + void addHikvisionSyncForDev(WorkerInfo workerInfo, String devSns); + void deletePersonAuth(WorkerInfo workerInfo, String devSns); + + void sendBatchWorkerInfo(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 2a3a30900..a0630f18f 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,12 +2,18 @@ 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; 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; @@ -19,9 +25,14 @@ 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; @@ -29,6 +40,7 @@ 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; @@ -43,10 +55,17 @@ import static com.zhgd.xmgl.async.AsyncHikvision.getSyncTimeWithInitIfAbsent; @Slf4j @Transactional(rollbackFor = Exception.class) public class ProjectUfaceConfigServiceImpl extends ServiceImpl implements IProjectUfaceConfigService { + @Lazy @Autowired XzHikvisionSyncMapper xzHikvisionSyncMapper; @Lazy @Autowired + ProjectServiceImpl projectService; + @Autowired + @Lazy + HikvisionCall hikvisionCall; + @Lazy + @Autowired private WorkerInfoServiceImpl workerInfoService; @Autowired private ProjectUfaceConfigMapper projectUfaceConfigMapper; @@ -64,6 +83,9 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl list) { + public Pair getSendBatchDevSnsAndDevIds(WorkerInfo workerInfo, List allDevList) { + String rtDevSn = null; + String rtDevId = null; if ("0".equals(workerInfo.getUfaceDevId())) { workerInfo.setUfaceDevId(null); } - StringBuilder devBuilder = new StringBuilder(); - StringBuilder devIdBuilder = new StringBuilder(); - if (StringUtils.isNotEmpty(workerInfo.getUfaceDevId())) { - String[] devId = workerInfo.getUfaceDevId().split(","); - for (UfaceDev dev : list) { - for (String id : devId) { - if (id.equals(dev.getId().toString())) { - if (devBuilder.length() > 0) { - devBuilder.append(","); + if (Objects.equals(workerInfo.getDevType(), 1)) { + StringBuilder devBuilder = new StringBuilder(); + StringBuilder devIdBuilder = new StringBuilder(); + if (StringUtils.isNotEmpty(workerInfo.getUfaceDevId())) { + String[] devId = workerInfo.getUfaceDevId().split(","); + for (UfaceDev dev : allDevList) { + for (String id : devId) { + if (id.equals(dev.getId().toString())) { + if (devBuilder.length() > 0) { + devBuilder.append(","); + } + if (devIdBuilder.length() > 0) { + devIdBuilder.append(","); + } + devBuilder.append(dev.getDevSn()); + devIdBuilder.append(dev.getDeviceId()); } - if (devIdBuilder.length() > 0) { - devIdBuilder.append(","); + } + } + } else { + for (UfaceDev dev : allDevList) { + if (devBuilder.length() > 0) { + devBuilder.append(","); + } + if (devIdBuilder.length() > 0) { + devIdBuilder.append(","); + } + devBuilder.append(dev.getDevSn()); + devIdBuilder.append(dev.getDeviceId()); + } + } + rtDevSn = devBuilder.toString(); + rtDevId = devIdBuilder.toString(); + } else { + //设备分组情况 + String ufaceDevGroupId = workerInfo.getUfaceDevGroupId(); + if (StringUtils.isNotBlank(ufaceDevGroupId)) { + 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<>(); + param.put("projectSn", workerInfo.getProjectSn()); + param.put("devIds", StringUtils.join(ufaceIds, ",")); + param.put("accountType", 2); + List list1 = ufaceDevMapper.selectUserUfaceDevList(param); + if (CollUtil.isNotEmpty(list1)) { + StringBuilder devBuilder1 = new StringBuilder(); + StringBuilder devIdBuilder1 = new StringBuilder(); + for (UfaceDev dev : list1) { + if (devBuilder1.length() > 0) { + devBuilder1.append(","); + } + if (devIdBuilder1.length() > 0) { + devIdBuilder1.append(","); + } + devBuilder1.append(dev.getDevSn()); + devIdBuilder1.append(dev.getDeviceId()); } - devBuilder.append(dev.getDevSn()); - devIdBuilder.append(dev.getDeviceId()); + rtDevId = devIdBuilder1.toString(); + rtDevSn = devBuilder1.toString(); } } } - } else { - for (UfaceDev dev : list) { - if (devBuilder.length() > 0) { - devBuilder.append(","); - } - if (devIdBuilder.length() > 0) { - devIdBuilder.append(","); - } - devBuilder.append(dev.getDevSn()); - devIdBuilder.append(dev.getDeviceId()); - } } - String devSn = devBuilder.toString(); - String devId = devIdBuilder.toString(); - log.info("准备下发人员名称:{},devSn:{},devId:{}", workerInfo.getWorkerName(), devSn, devId); - if (Objects.equals(workerInfo.getDevType(), 1)) { - sendDev(projectUfaceConfig, workerInfo, devSn, devId); - } else if (Objects.equals(workerInfo.getDevType(), 2)) { - //设备分组情况! - String ufaceDevGroupId = workerInfo.getUfaceDevGroupId(); - if (StringUtils.isEmpty(ufaceDevGroupId)) { - return; - } - 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; - } - ufaceIds.stream().distinct(); - Map param = new HashMap<>(); - param.put("projectSn", workerInfo.getProjectSn()); - param.put("devIds", StringUtils.join(ufaceIds, ",")); - param.put("accountType", 2); - List list1 = ufaceDevMapper.selectUserUfaceDevList(param); - if (CollUtil.isEmpty(list1)) { - return; - } - StringBuilder devBuilder1 = new StringBuilder(); - StringBuilder devIdBuilder1 = new StringBuilder(); - for (UfaceDev dev : list1) { - if (devBuilder1.length() > 0) { - devBuilder1.append(","); - } - if (devIdBuilder1.length() > 0) { - devIdBuilder1.append(","); - } - devBuilder1.append(dev.getDevSn()); - devIdBuilder1.append(dev.getDeviceId()); - } - sendDev(projectUfaceConfig, workerInfo, devBuilder1.toString(), devIdBuilder1.toString()); + log.info("准备下发人员名称:{},devSn:{},devId:{}", workerInfo.getWorkerName(), rtDevSn, rtDevId); + return new ImmutablePair<>(rtDevSn, rtDevId); + } + + @Override + public void sendBatchWorkerInfo(WorkerInfo workerInfo, ProjectUfaceConfig projectUfaceConfig, List allDevList) { + Pair devSnsAndDevIdsPair = getSendBatchDevSnsAndDevIds(workerInfo, allDevList); + String right = devSnsAndDevIdsPair.getRight(); + if (right != null) { + sendDev(projectUfaceConfig, workerInfo, devSnsAndDevIdsPair.getLeft(), right); } } @@ -514,16 +544,22 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl map, ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList) { + //构建workerAndDevSnList + ArrayList workerAndDevSnList = new ArrayList<>(); + for (WorkerInfo workerInfo : workerList) { + Pair devSnsAndDevIdsPair = this.getSendBatchDevSnsAndDevIds(workerInfo, allDevList); + if (devSnsAndDevIdsPair.getRight() != null) { + String devSns = devSnsAndDevIdsPair.getLeft(); + this.addHikvisionSyncForDev(workerInfo, devSns); + List devSnList = StrUtil.split(devSns, ","); + for (String devSn : devSnList) { + JSONObject jo = new JSONObject(); + jo.put("workerId", workerInfo.getId()); + jo.put("devSn", devSn); + workerAndDevSnList.add(jo); + } + } + } + if (CollUtil.isEmpty(workerAndDevSnList)) { + return; + } + + 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(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()); + } + } 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 a08f323ef..382359443 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 @@ -46,7 +46,7 @@ public class UfaceDevServiceImpl extends ServiceImpl i @Lazy @Autowired private WorkerInfoServiceImpl workerInfoService; - @Autowired + @Autowired private IUserDevAuthorityService userDevAuthorityService; @Autowired private UfaceDevMapper ufaceDevMapper; @@ -209,11 +209,7 @@ public class UfaceDevServiceImpl extends ServiceImpl i if (list == null || list.size() == 0) { throw new OpenAlertException("请先添加设备"); } - if (tempProjectUfaceConfig.getSupplierType() == 9) { - asyncWorker.sendBatchWokerDev(map, tempProjectUfaceConfig, list); - } else { - asyncWorker.sendBatchWokerDevAsync(map, tempProjectUfaceConfig, list); - } + asyncWorker.sendBatchWokerDevAsync(map, tempProjectUfaceConfig, list); } else { throw new OpenAlertException("项目配置不下发设备或未配置参数"); } diff --git a/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java b/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java index 537410e6f..6d3374300 100644 --- a/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/HikvisionUtil.java @@ -89,7 +89,7 @@ public class HikvisionUtil { return rsJo.getJSONObject("data"); } else { log.error("海康返回错误码:{}", rsJo.toJSONString()); - throw new OpenAlertException("海康返回错误码"); + throw new OpenAlertException("下发异常:海康返回错误码"); } } @@ -151,9 +151,10 @@ public class HikvisionUtil { } - public static void addPageParamIfAbsent(JSONObject param) { + public static JSONObject addPageParamIfAbsent(JSONObject param) { param.putIfAbsent("pageNo", 1); param.putIfAbsent("pageSize", 1000); + return param; } /** @@ -615,7 +616,7 @@ public class HikvisionUtil { * @param param * @return */ - public static JSONObject doorSearchV2(Project project, JSONObject param) throws Exception { + public static JSONObject getDoorsV2(Project project, JSONObject param) throws Exception { if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return null; } @@ -634,17 +635,79 @@ public class HikvisionUtil { } /** - * 按人员详情与设备下发 + * 添加权限配置 * * @param project * @param param * @return * @throws Exception */ - public static JSONObject downloadAuthDiy(Project project, JSONObject param) throws Exception { + public static JSONObject addAuth(Project project, JSONObject param) throws Exception { final String ARTEMIS_PATH = "/artemis"; - final String path = ARTEMIS_PATH + "/api/acps/v1/authDownload/special/person/diy"; + final String path = ARTEMIS_PATH + "/api/acps/v1/auth_config/add"; String host = "https://" + project.getArtemisConfigHost(); return doPostRtObj(host, path, JSONArray.toJSONString(param), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); } + + /** + * 删除权限配置 + * + * @param project + * @param param + * @return + * @throws Exception + */ + public static JSONObject deleteAuth(Project project, JSONObject param) throws Exception { + final String ARTEMIS_PATH = "/artemis"; + final String path = ARTEMIS_PATH + "/api/acps/v1/auth_config/delete"; + String host = "https://" + project.getArtemisConfigHost(); + return doPostRtObj(host, path, JSONArray.toJSONString(param), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); + } + + /** + * 根据出入权限配置快捷下载 + * + * @param project + * @param param + * @return + * @throws Exception + */ + public static JSONObject downloadAuth(Project project, JSONObject param) throws Exception { + final String ARTEMIS_PATH = "/artemis"; + final String path = ARTEMIS_PATH + "/api/acps/v1/authDownload/configuration/shortcut"; + String host = "https://" + project.getArtemisConfigHost(); + return doPostRtObj(host, path, JSONArray.toJSONString(param), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); + } + + /** + * 查询下载任务进度 + * + * @param project + * @param param + * @return + * @throws Exception + */ + public static JSONObject queryDownloadProgress(Project project, JSONObject param) throws Exception { + final String ARTEMIS_PATH = "/artemis"; + final String path = ARTEMIS_PATH + "/api/acps/v1/authDownload/task/progress"; + String host = "https://" + project.getArtemisConfigHost(); + return doPostRtObj(host, path, JSONArray.toJSONString(param), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); + } + + + /** + * 查询权限条目列表 + * + * @param project + * @param param + * @return + * @throws Exception + */ + public static JSONObject queryAuthItem(Project project, JSONObject param) throws Exception { + final String ARTEMIS_PATH = "/artemis"; + final String path = ARTEMIS_PATH + "/api/acps/v1/auth_item/list/search"; + String host = "https://" + project.getArtemisConfigHost(); + return doPostRtObj(host, path, JSONArray.toJSONString(param), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); + } + } 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 2/2] =?UTF-8?q?=E6=B5=B7=E5=BA=B7=E4=B8=8B=E5=8F=91?= =?UTF-8?q?=E4=BF=AE=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("项目配置不下发设备或未配置参数"); }