diff --git a/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java b/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java index b57dedffb..91c0509b9 100644 --- a/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java +++ b/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java @@ -1,5 +1,6 @@ package com.zhgd.xmgl.async; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -9,11 +10,11 @@ import com.zhgd.jeecg.common.util.SpringContextUtils; import com.zhgd.jeecg.common.util.pass.HttpUtils; import com.zhgd.xmgl.call.HikvisionCall; import com.zhgd.xmgl.constant.Cts; +import com.zhgd.xmgl.modules.basicdata.entity.Notice; 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; @@ -28,10 +29,7 @@ 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 com.zhgd.xmgl.util.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; @@ -39,9 +37,11 @@ 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.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.concurrent.Future; import java.util.function.Function; import java.util.stream.Collectors; @@ -57,8 +57,9 @@ public class AsyncHikvision { public CarInfoServiceImpl carInfoService; @Autowired @Lazy - public - WorkerInfoServiceImpl workerInfoService; + public WorkerInfoServiceImpl workerInfoService; + @Autowired + @Lazy public IProjectUfaceConfigService projectUfaceConfigService; @Autowired @Lazy @@ -117,6 +118,13 @@ public class AsyncHikvision { return ThreadLocalUtil.getNotNull().getDate(XZ_HIKVISION_SYNC_TIME); } + @Async("sendWorkerExecutor") + public Future addWorkerAndAuthAsync(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { + addWorkerAsync(workerInfo, true, true); + projectUfaceConfigService.addWorkerInfo(workerInfo); + return null; + } + /** * 添加劳务人员-海康 * @@ -124,8 +132,8 @@ public class AsyncHikvision { * @param isSaveWorker * @param isSaveWorkerFace */ - @Async("hikvisionExecutor") - public void addWorkerForHikvisionAsync(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { + @Async("sendWorkerExecutor") + public void addWorkerAsync(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { try { hikvisionCall.addWorkerForHikvision(workerInfo, isSaveWorker, isSaveWorkerFace); } catch (Exception e) { @@ -134,22 +142,28 @@ public class AsyncHikvision { } } - public void addWorkerForHikvision(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { - this.addWorkerForHikvisionAsync(workerInfo, isSaveWorker, isSaveWorkerFace); + public void addWorker(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { + this.addWorkerAsync(workerInfo, isSaveWorker, isSaveWorkerFace); } - @Async("hikvisionExecutor") - public void editWorkerForHikvisionAsync(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { + @Async("sendWorkerExecutor") + public void editWorkerAndAuthAsync(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { + this.editWorkerAsync(workerInfo, true, true); + projectUfaceConfigService.updateWorkerInfo(workerInfo, workerInfo); + } + + @Async("sendWorkerExecutor") + public void editWorkerAsync(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { try { - hikvisionCall.editWorkerForHikvision(workerInfo, isSaveWorker, isSaveWorkerFace); + hikvisionCall.editWorker(workerInfo, isSaveWorker, isSaveWorkerFace); } catch (Exception e) { log.error("海康:", e); sendNoticeForWorker(workerInfo, e, "更新"); } } - public void editWorkerForHikvision(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { - this.editWorkerForHikvisionAsync(workerInfo, isSaveWorker, isSaveWorkerFace); + public void editWorker(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { + this.editWorkerAsync(workerInfo, isSaveWorker, isSaveWorkerFace); } private void sendNoticeForWorker(WorkerInfo workerInfo, Exception e, String action) { @@ -169,7 +183,7 @@ public class AsyncHikvision { hikvisionCall.updateAllFailStatusIfNull(workerInfo.getProjectSn(), workerInfo.getId(), 1); } - @Async("hikvisionExecutor") + @Async("sendWorkerExecutor") public void deleteWorkerForHikvisionAsync(String uniqueId, WorkerInfo workerInfo) { try { hikvisionCall.deleteWorkerForHikvision(uniqueId, workerInfo); @@ -464,12 +478,24 @@ public class AsyncHikvision { hikvisionCall.getDoorEvents(paramMap); } + public void sendBatchWorkerInfo(List allDevList, List workerList, List workerAndDevSnList, Long userId, String projectSn) { + this.sendBatchWorkerInfoAsync(allDevList, workerList, workerAndDevSnList, userId, projectSn); + } + + /** + * 批量下发人员 + * + * @param allDevList + * @param workerList 下发的人员 + * @param workerAndDevSnList 构建的下发的人员和设备的关系 + * @param userId + */ @Async("sendBatchExecutor") - public void sendBatchWorkerInfoAsync(ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList, List workerAndDevSnList) { + public void sendBatchWorkerInfoAsync(List allDevList, List workerList, List workerAndDevSnList, Long userId, String projectSn) { 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()); + ProjectInfoExtVo project = projectService.getProjectInfoBySn(projectSn); 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); @@ -483,23 +509,69 @@ public class AsyncHikvision { o1.putAll(o2); return o1; })); + ArrayList futures = new ArrayList<>(); for (Map.Entry> entry : devSnToJoMap.entrySet()) { - asyncHikvision.sendBatchWorkersForOneDevAsync(projectUfaceConfig, workerIdMap, devSnMap, project, devSnToIscDevSnMap, iscDevSnToMyMap, entry); + Future future = asyncHikvision.sendBatchWorkersForOneDevAsync(workerIdMap, devSnMap, project, devSnToIscDevSnMap, iscDevSnToMyMap, entry, projectSn); + futures.add(future); + } + for (Future future : futures) { + while (!future.isDone()) { + } + } + //下发完成 + if (userId != null) { + java.text.DateFormat format1 = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String redNotice = ""; + List redNameList = workerList.stream().filter(w -> NumberUtils.lt(w.getSafeScore(), 80D)).map(WorkerInfo::getWorkerName).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(redNameList)) { + redNotice = StrUtil.format(",其中{}是红码不下发", StrUtil.join(",", redNameList)); + } + Notice notice = new Notice(); + notice.setAccountId(userId); + notice.setMsg(StrUtil.format("已经完成批量向设备下发{}个人{}", workerList.size(), redNotice)); + notice.setTitle("人员批量下发设备提醒"); + notice.setSendTime(format1.format(new Date())); + notice.setType("1"); + noticeService.addNotice(notice, true); } } catch (Exception e) { log.error("批量下发权限失败:", e); - hikvisionCall.updateAllFailStatusIfNullForAuth(projectUfaceConfig.getProjectSn(), workerList, 1, 1); + hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, workerList, 1, 1); + hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, workerList, 1, 3); } } + /** + * 一个设备批量下发人员 + * + * @param workerIdMap + * @param devSnMap + * @param project + * @param devSnToIscDevSnMap + * @param iscDevSnToMyMap + * @param devSnToJoEntry + */ @Async("sendBatchExecutor") - public void sendBatchWorkersForOneDevAsync(ProjectUfaceConfig projectUfaceConfig, Map workerIdMap, Map devSnMap, ProjectInfoExtVo project, Map devSnToIscDevSnMap, Map> iscDevSnToMyMap, Map.Entry> entry) { + public Future sendBatchWorkersForOneDevAsync(Map workerIdMap, Map devSnMap, ProjectInfoExtVo project, Map devSnToIscDevSnMap, Map> iscDevSnToMyMap, Map.Entry> devSnToJoEntry, String projectSn) { try { //【添加权限配置】(人员列表,设备列表),这个接口只要没报错,你就直接去下一步就行了。 - JSONObject aaRJo = HikvisionUtil.addAuth(project, getAddAuthParam(entry)); - HikvisionUtil.getJSONObjectData(aaRJo); + List addAuthWorkerIds = devSnToJoEntry.getValue().stream().filter(jo -> jo.getBoolean(Cts.IS_ADD_AUTH)).map(jsonObject -> jsonObject.getString("workerId")).collect(Collectors.toList()); + List deleteAuthWorkerIds = devSnToJoEntry.getValue().stream().filter(jo -> !jo.getBoolean(Cts.IS_ADD_AUTH)).map(jsonObject -> jsonObject.getString("workerId")).collect(Collectors.toList()); + if (CollUtil.isEmpty(addAuthWorkerIds) && CollUtil.isEmpty(deleteAuthWorkerIds)) { + log.error("无权限添加或删除,跳过"); + return null; + } + if (CollUtil.isNotEmpty(addAuthWorkerIds)) { + JSONObject aaRJo = HikvisionUtil.addAuth(project, getAddOrDeleteAuthParam(devSnToJoEntry, addAuthWorkerIds)); + HikvisionUtil.getJSONObjectData(aaRJo); + } + if (CollUtil.isNotEmpty(deleteAuthWorkerIds)) { + JSONObject aaRJo = HikvisionUtil.deleteAuth(project, getAddOrDeleteAuthParam(devSnToJoEntry, deleteAuthWorkerIds)); + HikvisionUtil.getJSONObjectData(aaRJo); + } + String devSn = devSnToJoEntry.getKey(); //然后调用【根据出入权限配置快捷下载】(设备列表)(【添加权限配置】+【快捷下发】这是一个流程,你添加了几个权限,下发成功之后,就清零了) - JSONObject daJo = HikvisionUtil.downloadAuth(project, getQueryDownloadProgressParam(entry)); + JSONObject daJo = HikvisionUtil.downloadAuth(project, getQueryDownloadProgressParam(devSnToJoEntry)); JSONObject daRtJo = HikvisionUtil.getJSONObjectData(daJo); //然后调用【查询下载任务进度】(上面那个的任务) int totalPercent = 0; @@ -511,21 +583,50 @@ public class AsyncHikvision { Thread.sleep(1000); } while (totalPercent != 100); //权限下发后(进度100后),用【查询权限条目列表】(人员列表,设备列表)接口去查,返回参数有权限状态,返回已下载的就是有权限 - JSONObject qaiJo = HikvisionUtil.queryAuthItem(project, getQueryAuthItemParam(entry, devSnToIscDevSnMap)); + JSONObject qaiJo = HikvisionUtil.queryAuthItem(project, getQueryAuthItemParam(devSnToJoEntry, 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); + if (CollUtil.isNotEmpty(qaiList)) { + for (int i = 0; i < qaiList.size(); i++) { + handlerBatchWorkersResultForAddAuth(workerIdMap, devSnMap, iscDevSnToMyMap, qaiList, i, devSn, projectSn); + } + } + //处理删除权限的结果的 + //handlerBatchWorkersResultForDeleteAuth(); + if (CollUtil.isNotEmpty(deleteAuthWorkerIds)) { + for (String workerId : deleteAuthWorkerIds) { + hikvisionCall.updateSuccessStatus(projectSn, Long.valueOf(workerId), 3, 3, devSn); + 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(workerId).getWorkerName(), + devSnMap.get(devSn).getDevName(), + "成功"), + "人员下发设备提醒", "1"); + } + } } } catch (Exception e) { log.error("批量下发权限失败:", e); - hikvisionCall.updateAllFailStatusIfNullForAuth(projectUfaceConfig.getProjectSn(), new ArrayList<>(workerIdMap.values()), 1, 1); + hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, new ArrayList<>(workerIdMap.values()), 1, 1); + hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, new ArrayList<>(workerIdMap.values()), 1, 3); } + return null; } - @Transactional(rollbackFor = Exception.class) - @Async("sendBatchExecutor") - public void sendBatchWorkersForOneDevOneWorkerAsync(ProjectUfaceConfig projectUfaceConfig, Map workerIdMap, Map devSnMap, Map> iscDevSnToMyMap, JSONArray qaiList, int i) { + /** + * 处理结果:一个设备批量下发人员 + * + * @param workerIdMap + * @param devSnMap + * @param iscDevSnToMyMap + * @param qaiList + * @param i + * @param devSn + * @param projectSn + */ + @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) + public void handlerBatchWorkersResultForAddAuth(Map workerIdMap, Map devSnMap, Map> iscDevSnToMyMap, JSONArray qaiList, int i, String devSn, String projectSn) { JSONObject jo = qaiList.getJSONObject(i); String personId = jo.getString("personId"); String resourceIndexCode = jo.getString("resourceIndexCode"); @@ -537,23 +638,23 @@ public class AsyncHikvision { //3:已下载 //4:未配置 Integer faceStatus = jo.getInteger("faceStatus"); - UfaceDev dev = devSnMap.get(iscDevSnToMyMap.get(resourceIndexCode).get(channelNo).getString("indexCode")); + UfaceDev dev = devSnMap.get(devSn); + hikvisionCall.updateSuccessStatus(projectSn, Long.valueOf(personId), 3, 1, dev.getDevSn()); 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("设备"), + dev.getDevName(), Objects.equals(faceStatus, 3) ? "成功" : "失败,下发异常"), "人员下发设备提醒", "1"); } - hikvisionCall.updateSuccessStatus(projectUfaceConfig.getProjectSn(), Long.valueOf(personId), 3, 1, dev.getDevSn()); } @NotNull - private JSONObject getAddAuthParam(Map.Entry> entry) { + private JSONObject getAddOrDeleteAuthParam(Map.Entry> entry, List workerIds) { 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("indexCodes", workerIds) .put("personDataType", "person") .build())); aaJo.put("resourceInfos", getDevRqParam(entry)); diff --git a/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java b/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java index 750e1950c..9338aed96 100644 --- a/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java +++ b/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java @@ -1,7 +1,5 @@ package com.zhgd.xmgl.async; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.zhgd.jeecg.common.util.SpringContextUtils; import com.zhgd.xmgl.call.HousingDataCall; import com.zhgd.xmgl.call.WkServiceuCall; import com.zhgd.xmgl.modules.basicdata.entity.Notice; @@ -12,9 +10,6 @@ import com.zhgd.xmgl.modules.project.service.IProjectUfaceConfigService; import com.zhgd.xmgl.modules.worker.entity.*; import com.zhgd.xmgl.modules.worker.mapper.WorkerInfoMapper; 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.util.NumberUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -72,10 +67,6 @@ public class AsyncWorker { } } - public void sendBatchWokerDev(Map map, ProjectUfaceConfig projectUfaceConfig, List allDevList) { - this.sendBatchWokerDevAsync(map, projectUfaceConfig, allDevList); - } - /** * 批量数据发送任务 * @@ -89,32 +80,31 @@ public class AsyncWorker { if (workerList.size() > 0) { if (projectUfaceConfig.getSupplierType() == 9) { //isc下发 - projectUfaceConfigService.sendBatchWorkerForHk(map, projectUfaceConfig, allDevList, workerList); + projectUfaceConfigService.buildAndSendBatchWorkerForHk(projectUfaceConfig, allDevList, workerList, userId); } 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); } } + if (userId != null) { + java.text.DateFormat format1 = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Notice notice = new Notice(); + notice.setAccountId(userId); + notice.setMsg("已经完成批量向设备下发" + workerList.size() + "个人"); + notice.setTitle("人员批量下发设备提醒"); + notice.setSendTime(format1.format(new Date())); + notice.setType("1"); + noticeService.addNotice(notice, true); + } + log.info("--------------------------------批量向设备下发人员执行完成-------------------------------"); } } - if (userId != null) { - java.text.DateFormat format1 = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - Notice notice = new Notice(); - notice.setAccountId(userId); - notice.setMsg("已经完成批量向设备下发" + workerList.size() + "个人"); - notice.setTitle("人员批量下发设备提醒"); - notice.setSendTime(format1.format(new Date())); - notice.setType("1"); - noticeService.addNotice(notice, true); - } - log.info("--------------------------------批量向设备下发人员执行完成-------------------------------"); } catch (Exception e) { log.error("error:", e); } diff --git a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java index 63dd2879a..c7589ff9c 100644 --- a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java +++ b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java @@ -892,7 +892,7 @@ public class HikvisionCall { * @param isSaveWorker * @param isSaveWorkerFace */ - public void editWorkerForHikvision(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) throws Exception { + public void editWorker(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, workerInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; @@ -1137,6 +1137,14 @@ public class HikvisionCall { } } + /** + * 更新所有未同步失败状态 + * + * @param projectSn + * @param workerList + * @param bigType + * @param operate + */ public void updateAllFailStatusIfNullForAuth(String projectSn, List workerList, Integer bigType, Integer operate) { for (WorkerInfo workerInfo : workerList) { updateAllFailStatusIfNullForAuth(projectSn, workerInfo.getId(), bigType, operate); @@ -1170,6 +1178,15 @@ public class HikvisionCall { updateStatus(projectSn, whoId, type, operate, deviceSn, false); } + /** + * 更新成功状态 + * + * @param projectSn + * @param whoId + * @param type + * @param operate + * @param deviceSn + */ public void updateSuccessStatus(String projectSn, Long whoId, Integer type, Integer operate, String deviceSn) { updateStatus(projectSn, whoId, type, operate, deviceSn, true); } @@ -1199,6 +1216,13 @@ public class HikvisionCall { updateTotalStatus(projectSn, whoId, xzHikvisionSync.getBigType()); } + /** + * 更下总状态 + * + * @param projectSn + * @param whoId + * @param bigType + */ public void updateTotalStatus(String projectSn, Long whoId, Integer bigType) { List xzHikvisionSyncs = xzHikvisionSyncMapper.selectList(new LambdaQueryWrapper() .eq(XzHikvisionSync::getProjectSn, projectSn) diff --git a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java index 63be34780..16740b539 100644 --- a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java +++ b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java @@ -128,10 +128,10 @@ public class AsyncConfig { public ThreadPoolTaskExecutor sendWorkerExecutor() { MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); /** 核心线程数(默认线程数) */ - executor.setCorePoolSize(corePoolSize); + executor.setCorePoolSize(corePoolSize * 10); /** 最大线程数 */ - executor.setMaxPoolSize(maxPoolSize); - executor.setQueueCapacity(queueCapacity); + executor.setMaxPoolSize(maxPoolSize * 10); + executor.setQueueCapacity(queueCapacity * 10); /** 允许线程空闲时间(单位:默认为秒) */ executor.setKeepAliveSeconds(60); /** 线程池名前缀 */ @@ -334,6 +334,11 @@ public class AsyncConfig { return executor; } + /** + * 单个线程 + * + * @return + */ @Bean("hikvisionExecutor") public ThreadPoolTaskExecutor hikvisionExecutor() { MdcThreadPoolTaskExecutor executor = new MdcThreadPoolTaskExecutor(); @@ -341,7 +346,7 @@ public class AsyncConfig { executor.setCorePoolSize(1); /** 最大线程数 */ executor.setMaxPoolSize(1); - executor.setQueueCapacity(100000); + executor.setQueueCapacity(1000); /** 允许线程空闲时间(单位:默认为秒) */ executor.setKeepAliveSeconds(60); /** 线程池名前缀 */ @@ -379,7 +384,7 @@ public class AsyncConfig { executor.setCorePoolSize(maxPoolSize); /** 最大线程数 */ executor.setMaxPoolSize(maxPoolSize); - executor.setQueueCapacity(100000); + executor.setQueueCapacity(1000); /** 允许线程空闲时间(单位:默认为秒) */ executor.setKeepAliveSeconds(60); /** 线程池名前缀 */ @@ -398,7 +403,7 @@ public class AsyncConfig { executor.setCorePoolSize(maxPoolSize); /** 最大线程数 */ executor.setMaxPoolSize(maxPoolSize); - executor.setQueueCapacity(100000); + executor.setQueueCapacity(1000); /** 允许线程空闲时间(单位:默认为秒) */ executor.setKeepAliveSeconds(60); /** 线程池名前缀 */ @@ -417,7 +422,7 @@ public class AsyncConfig { executor.setCorePoolSize(maxPoolSize); /** 最大线程数 */ executor.setMaxPoolSize(maxPoolSize); - executor.setQueueCapacity(100000); + executor.setQueueCapacity(1000); /** 允许线程空闲时间(单位:默认为秒) */ executor.setKeepAliveSeconds(60); /** 线程池名前缀 */ @@ -436,7 +441,7 @@ public class AsyncConfig { executor.setCorePoolSize(maxPoolSize); /** 最大线程数 */ executor.setMaxPoolSize(maxPoolSize); - executor.setQueueCapacity(100000); + executor.setQueueCapacity(1000); /** 允许线程空闲时间(单位:默认为秒) */ executor.setKeepAliveSeconds(60); /** 线程池名前缀 */ @@ -455,7 +460,7 @@ public class AsyncConfig { executor.setCorePoolSize(corePoolSize); /** 最大线程数 */ executor.setMaxPoolSize(maxPoolSize); - executor.setQueueCapacity(100000); + executor.setQueueCapacity(1000); /** 允许线程空闲时间(单位:默认为秒) */ executor.setKeepAliveSeconds(60); /** 线程池名前缀 */ @@ -474,7 +479,7 @@ public class AsyncConfig { executor.setCorePoolSize(1); /** 最大线程数 */ executor.setMaxPoolSize(160); - executor.setQueueCapacity(100000); + executor.setQueueCapacity(1000); /** 允许线程空闲时间(单位:默认为秒) */ executor.setKeepAliveSeconds(60); /** 线程池名前缀 */ @@ -513,7 +518,7 @@ public class AsyncConfig { executor.setCorePoolSize(maxPoolSize * 10); /** 最大线程数 */ executor.setMaxPoolSize(maxPoolSize * 10); - executor.setQueueCapacity(queueCapacity); + executor.setQueueCapacity(queueCapacity * 10); /** 允许线程空闲时间(单位:默认为秒) */ executor.setKeepAliveSeconds(60); /** 线程池名前缀 */ @@ -524,4 +529,5 @@ public class AsyncConfig { executor.initialize(); return executor; } + } diff --git a/src/main/java/com/zhgd/xmgl/constant/Cts.java b/src/main/java/com/zhgd/xmgl/constant/Cts.java index 69f29f152..7205c555a 100644 --- a/src/main/java/com/zhgd/xmgl/constant/Cts.java +++ b/src/main/java/com/zhgd/xmgl/constant/Cts.java @@ -31,13 +31,6 @@ public interface Cts { String MSG = "msg"; String ENTERPRISE_ID = "enterpriseId"; - /** - * 数据校验重试是否成功 - */ - String TL_XZ_HIKVISION_COMPARE_DATA_RETRY = "tl_xz_hikvision_compare_data"; - String TL_IS_FROM_TASK = "isFromTask"; - String TL_IS_FROM_WEB = "isFromWeb"; - String TYPE = "type"; String TEAM_ID = "teamId"; String DEPARTMENT_ID = "departmentId"; @@ -46,4 +39,18 @@ public interface Cts { String YYYY_MM_DD = "yyyy-MM-dd"; String TL_AUTH_USER = "authUser"; String PAGE_NO = "pageNo"; + + + /** + * 数据校验重试是否成功 + */ + String TL_XZ_HIKVISION_COMPARE_DATA_RETRY = "tl_xz_hikvision_compare_data"; + String TL_IS_FROM_TASK = "isFromTask"; + String TL_IS_FROM_WEB = "isFromWeb"; + String TL_SEND_BATCH_WORKER_COUNT_DOWN_LATCH = "sendBatchWorkerCountDownLatch"; + + /** + * 1添加权限2删除权限 + */ + String IS_ADD_AUTH = "isAddAuth"; } 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 dac295fad..800ee6eec 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 @@ -1,17 +1,16 @@ package com.zhgd.xmgl.modules.project.service; -import com.zhgd.xmgl.modules.project.entity.ProjectUfaceConfig; import com.baomidou.mybatisplus.extension.service.IService; +import com.zhgd.xmgl.modules.project.entity.ProjectUfaceConfig; import com.zhgd.xmgl.modules.worker.entity.UfaceDev; import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; import java.util.List; -import java.util.Map; /** * @Description: 项目对应的人脸设备配置 * @author: pds - * @date: 2020-09-23 + * @date: 2020-09-23 * @version: V1.0 */ public interface IProjectUfaceConfigService extends IService { @@ -32,11 +31,20 @@ public interface IProjectUfaceConfigService extends IService boolean isHikvisionConfig(String projectSn); - void addPersonAuth(WorkerInfo workerInfo, String devSn); + void addHkSyncRecordsAndUpdateWorkerStatus(WorkerInfo workerInfo, String devSns); - void addHkSyncRecordAndResetStatusForDev(WorkerInfo workerInfo, String devSns); - void deletePersonAuth(WorkerInfo workerInfo, String devSns); + void buildAndSendBatchWorkerForHk(ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList, Long userId); - void sendBatchWorkerForHk(Map map, ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList); + + void buildAndSendOneWorkerAndDevForHk(List allDevList, WorkerInfo workerInfo, int operate, String devSn, String projectSn); + + /** + * 添加权限的记录 + * + * @param workerInfo + */ + void addHkSyncRecordAndResetStatusForDev(WorkerInfo workerInfo); + + void editHkSyncRecordAndResetStatusForDev(WorkerInfo workerInfo); } 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 5e757c9bd..fe7416b39 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 @@ -9,6 +9,7 @@ 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.mapper.ProjectUfaceConfigMapper; @@ -152,78 +153,31 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl param = new HashMap<>(); - param.put("projectSn", workerInfo.getProjectSn()); - if ("0".equals(ufaceDevId)) { - workerInfo.setUfaceDevId(null); - } - if (StringUtils.isNotEmpty(ufaceDevId)) { - param.put("registerType", workerInfo.getRegisterType()); - } - param.put("accountType", 2); - if (Objects.equals(workerInfo.getDevType(), 1)) { - if (StrUtil.isBlank(ufaceDevId)) { - return; + Map param = new HashMap<>(); + param.put("projectSn", workerInfo.getProjectSn()); + if ("0".equals(ufaceDevId)) { + workerInfo.setUfaceDevId(null); + } + if (StringUtils.isNotEmpty(ufaceDevId)) { + param.put("registerType", workerInfo.getRegisterType()); + param.put("accountType", workerInfo.getAccountType()); + param.put("devIds", ufaceDevId); + } + List list = ufaceDevMapper.selectUserUfaceDevList(param); + if (list != null && list.size() > 0) { + StringBuilder devBuilder = new StringBuilder(); + StringBuilder devIdBuilder = new StringBuilder(); + for (UfaceDev dev : list) { + if (devBuilder.length() > 0) { + devBuilder.append(","); } - param.put("devIds", ufaceDevId); - } else if (Objects.equals(workerInfo.getDevType(), 2)) { - //设备分组情况! - String ufaceDevGroupId = workerInfo.getUfaceDevGroupId(); - if (StringUtils.isEmpty(ufaceDevGroupId)) { - return; + if (devIdBuilder.length() > 0) { + devIdBuilder.append(","); } - 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(); - param.put("devIds", StringUtils.join(ufaceIds, ",")); - } - List list = ufaceDevMapper.selectUserUfaceDevList(param); - if (list != null && list.size() > 0) { - StringBuilder devBuilder = new StringBuilder(); - StringBuilder devIdBuilder = new StringBuilder(); - for (UfaceDev dev : list) { - if (devBuilder.length() > 0) { - devBuilder.append(","); - } - if (devIdBuilder.length() > 0) { - devIdBuilder.append(","); - } - devBuilder.append(dev.getDevSn()); - devIdBuilder.append(dev.getDeviceId()); - } - sendDev(tempProjectUfaceConfig, workerInfo, devBuilder.toString(), devIdBuilder.toString()); - } - } else { - Map param = new HashMap<>(); - param.put("projectSn", workerInfo.getProjectSn()); - if ("0".equals(ufaceDevId)) { - workerInfo.setUfaceDevId(null); - } - if (StringUtils.isNotEmpty(ufaceDevId)) { - param.put("registerType", workerInfo.getRegisterType()); - param.put("accountType", workerInfo.getAccountType()); - param.put("devIds", ufaceDevId); - } - List list = ufaceDevMapper.selectUserUfaceDevList(param); - if (list != null && list.size() > 0) { - StringBuilder devBuilder = new StringBuilder(); - StringBuilder devIdBuilder = new StringBuilder(); - for (UfaceDev dev : list) { - if (devBuilder.length() > 0) { - devBuilder.append(","); - } - if (devIdBuilder.length() > 0) { - devIdBuilder.append(","); - } - devBuilder.append(dev.getDevSn()); - devIdBuilder.append(dev.getDeviceId()); - } - sendDev(tempProjectUfaceConfig, workerInfo, devBuilder.toString(), devIdBuilder.toString()); + devBuilder.append(dev.getDevSn()); + devIdBuilder.append(dev.getDeviceId()); } + sendDev(tempProjectUfaceConfig, workerInfo, devBuilder.toString(), devIdBuilder.toString()); } } } @@ -232,30 +186,29 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(ProjectUfaceConfig::getProjectSn, workerInfo.getProjectSn()); - ProjectUfaceConfig tempProjectUfaceConfig = projectUfaceConfigMapper.selectOne(queryWrapper); + ProjectUfaceConfig ufaceConfig = projectUfaceConfigMapper.selectOne(queryWrapper); //判断是否配置并下发设备 - if (tempProjectUfaceConfig != null && tempProjectUfaceConfig.getIssueDev() == 1) { - QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()); - List list = ufaceDevMapper.selectList(qw); + if (ufaceConfig != null && ufaceConfig.getIssueDev() == 1) { + List list = getAllDevsByProjectSn(workerInfo.getProjectSn()); if (list != null && list.size() > 0) { - if (tempProjectUfaceConfig.getSupplierType() == 1) { - UniUbiUtil.delPerson(null, tempProjectUfaceConfig.getAppId(), tempProjectUfaceConfig.getAppKey(), tempProjectUfaceConfig.getAppSecret(), workerInfo.getIdCard()); - } else if (tempProjectUfaceConfig.getSupplierType() == 4) { - QYUfaceUtil.deleteNewPerson(tempProjectUfaceConfig.getAppId(), tempProjectUfaceConfig.getAppSecret(), workerInfo.getIdCard()); - } else if (tempProjectUfaceConfig.getSupplierType() == 5) { + if (ufaceConfig.getSupplierType() == 1) { + UniUbiUtil.delPerson(null, ufaceConfig.getAppId(), ufaceConfig.getAppKey(), ufaceConfig.getAppSecret(), workerInfo.getIdCard()); + } else if (ufaceConfig.getSupplierType() == 4) { + QYUfaceUtil.deleteNewPerson(ufaceConfig.getAppId(), ufaceConfig.getAppSecret(), workerInfo.getIdCard()); + } else if (ufaceConfig.getSupplierType() == 5) { //佳信捷设备 - JxjUfaceUtil.deleteWorkerInfo(workerInfo, tempProjectUfaceConfig); - } else if (tempProjectUfaceConfig.getSupplierType() == 6) { + JxjUfaceUtil.deleteWorkerInfo(workerInfo, ufaceConfig); + } else if (ufaceConfig.getSupplierType() == 6) { //佳信捷新设备 - JxjNewUfaceDevUtil.deleteWorkerInfo(workerInfo, tempProjectUfaceConfig); - } else if (tempProjectUfaceConfig.getSupplierType() == 7) { + JxjNewUfaceDevUtil.deleteWorkerInfo(workerInfo, ufaceConfig); + } else if (ufaceConfig.getSupplierType() == 7) { //海康门禁sdk - HikvisionUfaceSDKUtil.deletePerson(workerInfo, tempProjectUfaceConfig, workerInfo.getUfaceDevId()); - } else if (tempProjectUfaceConfig.getSupplierType() == 9) { + HikvisionUfaceSDKUtil.deletePerson(workerInfo, ufaceConfig, workerInfo.getUfaceDevId()); + } else if (ufaceConfig.getSupplierType() == 9) { //海康门禁isc - String notDevSns = StrUtil.join(",", list.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); - this.deletePersonAuth(workerInfo, notDevSns); + List ufaceDevs = getAllDevsByProjectSn(ufaceConfig.getProjectSn()); + this.deleteHkSyncRecordAndResetStatusForDev(workerInfo, ufaceDevs); + this.buildAndSendOneWorkerForHk(ufaceDevs, workerInfo, 3, ufaceConfig.getProjectSn()); } } } @@ -265,67 +218,13 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(ProjectUfaceConfig::getProjectSn, workerInfo.getProjectSn()); - ProjectUfaceConfig tempProjectUfaceConfig = projectUfaceConfigMapper.selectOne(queryWrapper); + ProjectUfaceConfig ufaceConfig = projectUfaceConfigMapper.selectOne(queryWrapper); //判断是否配置并下发设备 - if (tempProjectUfaceConfig != null && tempProjectUfaceConfig.getIssueDev() == 1) { - if (tempProjectUfaceConfig.getSupplierType() == 9) { - if (NumberUtils.lt(workerInfo.getSafeScore(), 80D)) { - //红码不能通行 - 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); - } - } else { - //海康门禁isc - String devSns = ""; - String notDevSns = ""; - if (Objects.equals(workerInfo.getDevType(), 1)) { - devSns = workerInfo.getUfaceDevId(); - if (StrUtil.isNotBlank(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); - } - if (CollUtil.isNotEmpty(existList)) { - devSns = StrUtil.join(",", existList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); - this.addPersonAuth(workerInfo, devSns); - } - } else { - //只删除 - 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); - } - } - } else if (Objects.equals(workerInfo.getDevType(), 2)) { - //设备分组情况! - String ufaceDevGroupId = workerInfo.getUfaceDevGroupId(); - if (StrUtil.isNotBlank(ufaceDevGroupId)) { - List listForIsc = ufaceDevMapper.getUfaceDevListForIsc(StrUtil.split(ufaceDevGroupId, ","), workerInfo.getProjectSn()); - List notExistList = ufaceDevMapper.getUfaceDevListForIscNotExist(StrUtil.split(ufaceDevGroupId, ","), workerInfo.getProjectSn()); - if (CollUtil.isNotEmpty(notExistList)) { - notDevSns = StrUtil.join(",", notExistList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); - this.deletePersonAuth(workerInfo, notDevSns); - } - if (CollUtil.isNotEmpty(listForIsc)) { - devSns = StrUtil.join(",", listForIsc.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); - this.addPersonAuth(workerInfo, devSns); - } - } else { - //只删除 - 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); - } - } - } - } - workerInfoService.resetHkStatus(workerInfo); + if (ufaceConfig != null && ufaceConfig.getIssueDev() == 1) { + if (ufaceConfig.getSupplierType() == 9) { + List list = getAllDevsByProjectSn(workerInfo.getProjectSn()); + this.buildAndSendOneWorkerForHk(list, workerInfo, 2, workerInfo.getProjectSn()); + workerInfoService.updateWorkerHkStatus(workerInfo); } else { Map param = new HashMap<>(); param.put("projectSn", workerInfo.getProjectSn()); @@ -358,35 +257,35 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl getSendBatchDevSnsAndDevIds(WorkerInfo workerInfo, List allDevList) { - String rtDevSn = null; - String rtDevId = null; - if ("0".equals(workerInfo.getUfaceDevId())) { - workerInfo.setUfaceDevId(null); + /** + * 查询所有设备列表 + * + * @param projectSn + * @return + */ + private List getAllDevsByProjectSn(String projectSn) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(UfaceDev::getProjectSn, projectSn); + return ufaceDevMapper.selectList(qw); + } + + /** + * 获取下发的设备sns和删除下发的设备sns + * + * @param workerInfo + * @return + */ + public Pair getSendAndDeleteDevSns(WorkerInfo workerInfo) { + //海康门禁isc + String devSns = ""; + String notDevSns = ""; + if (NumberUtils.lt(workerInfo.getSafeScore(), 80D)) { + //红码不能通行 + List allList = ufaceDevMapper.selectList(new LambdaQueryWrapper().eq(UfaceDev::getProjectSn, workerInfo.getProjectSn())); + if (CollUtil.isNotEmpty(allList)) { + notDevSns = StrUtil.join(",", allList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); + } + } else if (Objects.equals(workerInfo.getDevType(), 1)) { + devSns = workerInfo.getUfaceDevId(); + if (StrUtil.isNotBlank(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())); + } + if (CollUtil.isNotEmpty(existList)) { + devSns = StrUtil.join(",", existList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); + } + } else { + //只删除 + 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())); + } + } + } else { + //设备分组情况 + String ufaceDevGroupId = workerInfo.getUfaceDevGroupId(); + if (StrUtil.isNotBlank(ufaceDevGroupId)) { + List listForIsc = ufaceDevMapper.getUfaceDevListForIsc(StrUtil.split(ufaceDevGroupId, ","), workerInfo.getProjectSn()); + List notExistList = ufaceDevMapper.getUfaceDevListForIscNotExist(StrUtil.split(ufaceDevGroupId, ","), workerInfo.getProjectSn()); + if (CollUtil.isNotEmpty(notExistList)) { + notDevSns = StrUtil.join(",", notExistList.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); + } + if (CollUtil.isNotEmpty(listForIsc)) { + devSns = StrUtil.join(",", listForIsc.stream().map(UfaceDev::getDevSn).collect(Collectors.toList())); + } + } else { + //只删除 + 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())); + } + } } + return new ImmutablePair(devSns, notDevSns); + } + + /** + * 获取下发的设备sns和设备ids + * + * @param workerInfo + * @param allDevList + * @return + */ + public Pair getBatchDevSnsAndDevIds(WorkerInfo workerInfo, List allDevList) { + String rtDevSns = null; + String rtDevIds = null; if (Objects.equals(workerInfo.getDevType(), 1)) { + if ("0".equals(workerInfo.getUfaceDevId())) { + workerInfo.setUfaceDevId(null); + } StringBuilder devBuilder = new StringBuilder(); StringBuilder devIdBuilder = new StringBuilder(); if (StringUtils.isNotEmpty(workerInfo.getUfaceDevId())) { @@ -431,8 +406,8 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl(rtDevSn, rtDevId); + log.info("准备下发人员名称:{},devSn:{},devId:{}", workerInfo.getWorkerName(), rtDevSns, rtDevIds); + return new ImmutablePair<>(rtDevSns, rtDevIds); } @Override public void sendBatchWorkerInfo(WorkerInfo workerInfo, ProjectUfaceConfig projectUfaceConfig, List allDevList) { - Pair devSnsAndDevIdsPair = getSendBatchDevSnsAndDevIds(workerInfo, allDevList); + Pair devSnsAndDevIdsPair = getBatchDevSnsAndDevIds(workerInfo, allDevList); String right = devSnsAndDevIdsPair.getRight(); if (right != null) { sendDev(projectUfaceConfig, workerInfo, devSnsAndDevIdsPair.getLeft(), right); @@ -483,79 +458,61 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl 0; } - public void sendDev(ProjectUfaceConfig tempProjectUfaceConfig, WorkerInfo workerInfo, String devSns, String devIds) { - log.info("supplierType:{}", tempProjectUfaceConfig.getSupplierType()); + public void sendDev(ProjectUfaceConfig ufaceConfig, WorkerInfo workerInfo, String devSns, String devIds) { + log.info("supplierType:{}", ufaceConfig.getSupplierType()); //1杭州宇泛智能科技,2用jdpush推送,3.mqtt,4.芊熠智能,5佳信捷,6佳信捷新设备 - if (tempProjectUfaceConfig.getSupplierType() == 1) { + if (ufaceConfig.getSupplierType() == 1) { String image = ""; if (StringUtils.isNotEmpty(workerInfo.getFieldAcquisitionUrl()) && workerInfo.getFieldAcquisitionUrl().startsWith("http")) { image = workerInfo.getFieldAcquisitionUrl(); } else { image = basePath + "/" + workerInfo.getFieldAcquisitionUrl(); } - UniUbiUtil.addPerson(tempProjectUfaceConfig.getAppId(), tempProjectUfaceConfig.getAppKey(), tempProjectUfaceConfig.getAppSecret(), workerInfo.getWorkerName(), workerInfo.getAttendanceNumber(), workerInfo.getIdCard(), image, devSns); - } else if (tempProjectUfaceConfig.getSupplierType() == 4) { - QYUfaceUtil.addOrUpdatePerson(tempProjectUfaceConfig.getAppId(), tempProjectUfaceConfig.getAppSecret(), 1, workerInfo.getIdCard(), workerInfo.getWorkerName(), "", workerInfo.getPhoneNumber(), workerInfo.getIdCard(), workerInfo.getAttendanceNumber(), workerInfo.getNation(), workerInfo.getSex(), workerInfo.getBirthday(), devIds.split(","), basePath + "/" + workerInfo.getFieldAcquisitionUrl()); - } else if (tempProjectUfaceConfig.getSupplierType() == 5) { + UniUbiUtil.addPerson(ufaceConfig.getAppId(), ufaceConfig.getAppKey(), ufaceConfig.getAppSecret(), workerInfo.getWorkerName(), workerInfo.getAttendanceNumber(), workerInfo.getIdCard(), image, devSns); + } else if (ufaceConfig.getSupplierType() == 4) { + QYUfaceUtil.addOrUpdatePerson(ufaceConfig.getAppId(), ufaceConfig.getAppSecret(), 1, workerInfo.getIdCard(), workerInfo.getWorkerName(), "", workerInfo.getPhoneNumber(), workerInfo.getIdCard(), workerInfo.getAttendanceNumber(), workerInfo.getNation(), workerInfo.getSex(), workerInfo.getBirthday(), devIds.split(","), basePath + "/" + workerInfo.getFieldAcquisitionUrl()); + } else if (ufaceConfig.getSupplierType() == 5) { //佳信捷设备 - JxjUfaceUtil.addWorkerInfo(workerInfo, tempProjectUfaceConfig, serverUrl + "/image/"); - } else if (tempProjectUfaceConfig.getSupplierType() == 6) { + JxjUfaceUtil.addWorkerInfo(workerInfo, ufaceConfig, serverUrl + "/image/"); + } else if (ufaceConfig.getSupplierType() == 6) { //佳信捷新设备 - JxjNewUfaceDevUtil.addOrUpdatePerson(workerInfo, tempProjectUfaceConfig, basePath, devSns, jxjDevImageType); - } else if (tempProjectUfaceConfig.getSupplierType() == 7) { + JxjNewUfaceDevUtil.addOrUpdatePerson(workerInfo, ufaceConfig, basePath, devSns, jxjDevImageType); + } else if (ufaceConfig.getSupplierType() == 7) { //海康门禁sdk - HikvisionUfaceSDKUtil.addOrUpdatePerson(workerInfo, tempProjectUfaceConfig, devSns); - } else if (tempProjectUfaceConfig.getSupplierType() == 9) { + HikvisionUfaceSDKUtil.addOrUpdatePerson(workerInfo, ufaceConfig, devSns); + } else if (ufaceConfig.getSupplierType() == 9) { //海康门禁isc - if (NumberUtils.lt(workerInfo.getSafeScore(), 80D)) { - log.info("安全评分红码不下发权限,名称:{}", workerInfo.getWorkerName()); - return; - } - this.addPersonAuth(workerInfo, devSns); + List list = getAllDevsByProjectSn(ufaceConfig.getProjectSn()); + this.buildAndSendOneWorkerForHk(list, workerInfo, 1, ufaceConfig.getProjectSn()); } } - @Override - public void addPersonAuth(WorkerInfo workerInfo, String devSns) { - if (StringUtils.isBlank(devSns)) { - return; - } - addHkSyncRecordAndResetStatusForDev(workerInfo, devSns); - asyncHikvision.addPersonAuthAsync(workerInfo, devSns); - - } - - @Override - public void addHkSyncRecordAndResetStatusForDev(WorkerInfo workerInfo, String devSns) { - getSyncTimeWithInitIfAbsent(1, workerInfo.getId()); - String[] devSnArr = StringUtils.split(devSns, ","); - for (String ds : devSnArr) { - xzHikvisionSyncMapper.insert(new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(1).setWhoId(workerInfo.getId()).setDeviceSn(ds).setBigType(1).setCreateDate(getSyncTimeWithInitIfAbsent(1, workerInfo.getId()))); - } - workerInfoService.resetHkStatus(workerInfo); - } - /** - * 删除 + * 添加海康同步记录和更新劳务人员总状态 * * @param workerInfo * @param devSns */ @Override - public void deletePersonAuth(WorkerInfo workerInfo, String devSns) { - if (StringUtils.isBlank(devSns)) { - return; - } + public void addHkSyncRecordsAndUpdateWorkerStatus(WorkerInfo workerInfo, String devSns) { getSyncTimeWithInitIfAbsent(1, workerInfo.getId()); String[] devSnArr = StringUtils.split(devSns, ","); for (String ds : devSnArr) { - xzHikvisionSyncMapper.insert(new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(3).setWhoId(workerInfo.getId()).setDeviceSn(ds).setBigType(1).setCreateDate(getSyncTimeWithInitIfAbsent(1, workerInfo.getId()))); + xzHikvisionSyncMapper.insert(new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(1).setWhoId(workerInfo.getId()).setDeviceSn(ds).setBigType(1).setCreateDate(getSyncTimeWithInitIfAbsent(1, workerInfo.getId()))); } - asyncHikvision.deletePersonAuthAsync(workerInfo, devSns); + workerInfoService.updateWorkerHkStatus(workerInfo); } + /** + * 构建workerAndDevSnList和下发人员 + * + * @param projectUfaceConfig + * @param allDevList + * @param workerList + * @param userId + */ @Override - public void sendBatchWorkerForHk(Map map, ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList) { + public void buildAndSendBatchWorkerForHk(ProjectUfaceConfig projectUfaceConfig, List allDevList, List workerList, Long userId) { //构建workerAndDevSnList List workerAndDevSnList = new ArrayList<>(); for (WorkerInfo workerInfo : workerList) { @@ -564,17 +521,22 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl devSnsAndDevIdsPair = this.getSendBatchDevSnsAndDevIds(workerInfo, allDevList); + Pair devSnsAndDevIdsPair = this.getBatchDevSnsAndDevIds(workerInfo, allDevList); if (devSnsAndDevIdsPair.getRight() != null) { String devSns = devSnsAndDevIdsPair.getLeft(); - //清楚以前的记录 - xzHikvisionSyncMapper.delete(new LambdaQueryWrapper().eq(XzHikvisionSync::getBigType, 1).eq(XzHikvisionSync::getWhoId, workerInfo.getId())); - this.addHkSyncRecordAndResetStatusForDev(workerInfo, devSns); + //清除以前的记录 + xzHikvisionSyncMapper.delete(new LambdaQueryWrapper() + .eq(XzHikvisionSync::getBigType, 1) + .eq(XzHikvisionSync::getWhoId, workerInfo.getId()) + .eq(XzHikvisionSync::getType, 3) + ); + this.addHkSyncRecordsAndUpdateWorkerStatus(workerInfo, devSns); List devSnList = StrUtil.split(devSns, ","); for (String devSn : devSnList) { JSONObject jo = new JSONObject(); jo.put("workerId", workerInfo.getId()); jo.put("devSn", devSn); + jo.put(Cts.IS_ADD_AUTH, true); workerAndDevSnList.add(jo); } } @@ -583,7 +545,118 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl allDevList, WorkerInfo workerInfo, int model, String projectSn) { + List workerAndDevSnList = new ArrayList<>(); + if (model == 2 || model == 1) { + Pair sendAndDeleteDevSnsPair = getSendAndDeleteDevSns(workerInfo); + String devSns = sendAndDeleteDevSnsPair.getLeft(); + String notDevSns = sendAndDeleteDevSnsPair.getRight(); + if (StrUtil.isNotBlank(devSns)) { + for (String devSn : StrUtil.split(devSns, ",")) { + JSONObject jo = new JSONObject(); + jo.put("workerId", workerInfo.getId()); + jo.put("devSn", devSn); + jo.put(Cts.IS_ADD_AUTH, true); + workerAndDevSnList.add(jo); + } + } + if (model == 2 && StrUtil.isNotBlank(notDevSns)) { + for (String devSn : StrUtil.split(notDevSns, ",")) { + JSONObject jo = new JSONObject(); + jo.put("workerId", workerInfo.getId()); + jo.put("devSn", devSn); + jo.put(Cts.IS_ADD_AUTH, false); + workerAndDevSnList.add(jo); + } + } + } else if (model == 3) { + for (UfaceDev dev : allDevList) { + String devSn = dev.getDevSn(); + JSONObject jo = new JSONObject(); + jo.put("workerId", workerInfo.getId()); + jo.put("devSn", devSn); + jo.put(Cts.IS_ADD_AUTH, false); + workerAndDevSnList.add(jo); + } + } + if (CollUtil.isEmpty(workerAndDevSnList)) { + log.info("未找到设备,无需下发,人员:{}", workerInfo.getWorkerName()); + return; + } + asyncHikvision.sendBatchWorkerInfoAsync(allDevList, Collections.singletonList(workerInfo), workerAndDevSnList, null, projectSn); + } + + /** + * 构建workerAndDevSnList和下发一个人员一个设备 + * + * @param allDevList + * @param workerInfo + */ + @Override + public void buildAndSendOneWorkerAndDevForHk(List allDevList, WorkerInfo workerInfo, int operate, String devSn, String projectSn) { + List workerAndDevSnList = new ArrayList<>(); + if (operate == 1) { + JSONObject jo = new JSONObject(); + jo.put("workerId", workerInfo.getId()); + jo.put("devSn", devSn); + jo.put(Cts.IS_ADD_AUTH, true); + workerAndDevSnList.add(jo); + } else if (operate == 3) { + JSONObject jo = new JSONObject(); + jo.put("workerId", workerInfo.getId()); + jo.put("devSn", devSn); + jo.put(Cts.IS_ADD_AUTH, false); + workerAndDevSnList.add(jo); + } + if (CollUtil.isEmpty(workerAndDevSnList)) { + log.info("未找到设备,无需下发,人员:{}", workerInfo.getWorkerName()); + return; + } + asyncHikvision.sendBatchWorkerInfo(allDevList, Collections.singletonList(workerInfo), workerAndDevSnList, null, projectSn); + } + + + public void deleteHkSyncRecordAndResetStatusForDev(WorkerInfo workerInfo, List allDevList) { + for (UfaceDev dev : allDevList) { + xzHikvisionSyncMapper.insert(new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(3).setWhoId(workerInfo.getId()).setDeviceSn(dev.getDevSn()).setBigType(1).setCreateDate(getSyncTimeWithInitIfAbsent(1, workerInfo.getId()))); + } + workerInfoService.updateWorkerHkStatus(workerInfo); + } + + @Override + public void addHkSyncRecordAndResetStatusForDev(WorkerInfo workerInfo) { + Pair sendAndDeleteDevSnsPair = getSendAndDeleteDevSns(workerInfo); + String devSns = sendAndDeleteDevSnsPair.getLeft(); + String[] devSnArr = StringUtils.split(devSns, ","); + for (String ds : devSnArr) { + xzHikvisionSyncMapper.insert(new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(1).setWhoId(workerInfo.getId()).setDeviceSn(ds).setBigType(1).setCreateDate(getSyncTimeWithInitIfAbsent(1, workerInfo.getId()))); + } + workerInfoService.updateWorkerHkStatus(workerInfo); + } + + @Override + public void editHkSyncRecordAndResetStatusForDev(WorkerInfo workerInfo) { + Pair sendAndDeleteDevSnsPair = getSendAndDeleteDevSns(workerInfo); + String devSns = sendAndDeleteDevSnsPair.getLeft(); + for (String devSn : StrUtil.split(devSns, ",")) { + xzHikvisionSyncMapper.insert(new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(1).setWhoId(workerInfo.getId()).setDeviceSn(devSn).setBigType(1).setCreateDate(getSyncTimeWithInitIfAbsent(1, workerInfo.getId()))); + } + String deleteDevSns = sendAndDeleteDevSnsPair.getRight(); + for (String deleteDevSn : StrUtil.split(deleteDevSns, ",")) { + xzHikvisionSyncMapper.insert(new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(3).setWhoId(workerInfo.getId()).setDeviceSn(deleteDevSn).setBigType(1).setCreateDate(getSyncTimeWithInitIfAbsent(1, workerInfo.getId()))); + } + workerInfoService.updateWorkerHkStatus(workerInfo); + } + + } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/UfaceDevController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/UfaceDevController.java index ea5bb41d2..2c38e857d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/UfaceDevController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/UfaceDevController.java @@ -111,7 +111,8 @@ public class UfaceDevController { @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "enterpriseId", value = "所属企业", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "personType", value = "人员类型 1、劳务人员 2、管理人员", paramType = "body", required = false, dataType = "String"), - @ApiImplicitParam(name = "userId", value = "人员ID", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "userId", value = "通知的人员ID", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "workerIds", value = "下发的劳务人员IDs(多个逗号分割)", paramType = "body", required = false, dataType = "String"), }) @PostMapping(value = "/sendBatchWokerDev") public Result< Map> sendBatchWokerDev(@RequestBody Map map) { diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerInfoMapper.java b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerInfoMapper.java index 81870e760..a8101efe2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerInfoMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerInfoMapper.java @@ -177,6 +177,12 @@ public interface WorkerInfoMapper extends BaseMapper { List selectAllWorkerInfoList(@Param("projectSn") String projectSn); + /** + * 查询下发的劳务人员列表 + * + * @param ma + * @return + */ List selectProjectWorkerInfoList(Map ma); String selectCarDriverNameByWorkerId(@Param("driverWorkerId") String driverWorkerId); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml index 4fbe41b56..c100b4ca7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerInfoMapper.xml @@ -1449,6 +1449,9 @@ and person_type = #{personType} + + and find_in_set(id, #{workerIds}) +