From 967793853339eb71294b75733f2dfa0787bd018c Mon Sep 17 00:00:00 2001 From: GUO <1923636941@qq.com> Date: Sun, 16 Jun 2024 13:36:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=B7=E5=BA=B7=E4=B8=8B=E5=8F=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhgd/xmgl/async/AsyncHikvision.java | 54 ++++++++++++++---- .../java/com/zhgd/xmgl/async/AsyncWorker.java | 4 ++ .../com/zhgd/xmgl/call/HikvisionCall.java | 6 +- .../impl/ProjectUfaceConfigServiceImpl.java | 4 +- .../worker/service/IWorkerInfoService.java | 3 +- .../service/impl/UfaceDevServiceImpl.java | 10 +++- .../service/impl/WorkerInfoServiceImpl.java | 57 +++++++++++++++++-- .../xz/mapper/xml/XzHikvisionSyncMapper.xml | 2 +- src/main/resources/logback-spring.xml | 10 ++-- 9 files changed, 116 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java b/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java index 5e61db952..1e6a5be66 100644 --- a/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java +++ b/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java @@ -496,7 +496,7 @@ public class AsyncHikvision { * @param allDevList * @param workerList 下发的人员 * @param workerAndDevSnList 构建的下发的人员和设备的关系 - * @param userId + * @param userId 批量下发的通知的人 * @param checkEditWorkers * @param sendNotice */ @@ -507,11 +507,17 @@ public class AsyncHikvision { ProjectInfoExtVo project = projectService.getProjectInfoBySn(projectSn); //判断人员的图片存在isc Map workerIdMap = workerList.stream().collect(Collectors.toMap(workerInfo -> workerInfo.getId() + "", Function.identity())); + ArrayList futures = new ArrayList<>(); if (checkEditWorkers) { ArrayList needEditWorkers = getNeedEditWorkers(workerList, project, workerIdMap); if (CollUtil.isNotEmpty(needEditWorkers)) { for (WorkerInfo workerInfo : needEditWorkers) { - workerInfoService.editWorkerForSendBatchAuth(workerInfo); + Future future = workerInfoService.editWorkerAsyncForSendBatchAuth(workerInfo); + futures.add(future); + } + } + for (Future future : futures) { + while (!future.isDone()) { } } } @@ -529,9 +535,9 @@ public class AsyncHikvision { o1.putAll(o2); return o1; })); - ArrayList futures = new ArrayList<>(); + futures = new ArrayList<>(); for (Map.Entry> entry : devSnToJoMap.entrySet()) { - Future future = asyncHikvision.sendBatchWorkersForOneDevAsync(workerIdMap, devSnMap, project, devSnToIscDevSnMap, iscDevSnToMyMap, entry, projectSn, sendNotice); + Future future = asyncHikvision.sendBatchWorkersForOneDevAsync(workerIdMap, devSnMap, project, devSnToIscDevSnMap, entry, projectSn, sendNotice, workerList); futures.add(future); } for (Future future : futures) { @@ -559,6 +565,31 @@ public class AsyncHikvision { log.error("批量下发权限失败:", e); hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, workerList, 1, 1); hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, workerList, 1, 3); + sendExcNotice(e, workerList, null); + } + } + + /** + * 发送异常通知 + * + * @param e + * @param workerList + * @param dev + */ + private void sendExcNotice(Exception e, List workerList, UfaceDev dev) { + String exc; + if (HttpUtils.isTimeOut(e)) { + exc = ",网络异常"; + } else { + exc = ",下发异常"; + } + List failWorkers = workerList.stream().filter(workerInfo -> !Objects.equals(workerInfo.getSendSuccessStatus(), 1)).collect(Collectors.toList()); + for (WorkerInfo workerInfo : failWorkers) { + if (ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class) != null) { + noticeService.addUserNotice(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId(), + StrUtil.format("{}{}设备下发权限失败{}", workerInfo.getWorkerName(), dev != null ? dev.getDevName() : "有些", exc), + "人员下发设备提醒", "1"); + } } } @@ -597,12 +628,14 @@ public class AsyncHikvision { * @param devSnMap * @param project * @param devSnToIscDevSnMap - * @param iscDevSnToMyMap * @param devSnToJoEntry * @param sendNotice + * @param workerList */ @Async("workerAuthHkExecutor") - public Future sendBatchWorkersForOneDevAsync(Map workerIdMap, Map devSnMap, ProjectInfoExtVo project, Map devSnToIscDevSnMap, Map> iscDevSnToMyMap, Map.Entry> devSnToJoEntry, String projectSn, boolean sendNotice) { + public Future sendBatchWorkersForOneDevAsync(Map workerIdMap, Map devSnMap, ProjectInfoExtVo project, Map devSnToIscDevSnMap, Map.Entry> devSnToJoEntry, String projectSn, boolean sendNotice, List workerList) { + String devSn = devSnToJoEntry.getKey(); + UfaceDev dev = devSnMap.get(devSn); try { //【添加权限配置】(人员列表,设备列表),这个接口只要没报错,你就直接去下一步就行了。 List addAuthWorkerIds = devSnToJoEntry.getValue().stream().filter(jo -> jo.getBoolean(Cts.IS_ADD_AUTH)).map(jsonObject -> jsonObject.getString("workerId")).collect(Collectors.toList()); @@ -619,7 +652,6 @@ public class AsyncHikvision { JSONObject aaRJo = HikvisionUtil.deleteAuth(project, getAddOrDeleteAuthParam(devSnToJoEntry, deleteAuthWorkerIds, devSnToIscDevSnMap)); HikvisionUtil.getJSONObjectData(aaRJo); } - String devSn = devSnToJoEntry.getKey(); //然后调用【根据出入权限配置快捷下载】(设备列表)(【添加权限配置】+【快捷下发】这是一个流程,你添加了几个权限,下发成功之后,就清零了) JSONObject daJo = HikvisionUtil.downloadAuth(project, getQueryDownloadProgressParam(devSnToJoEntry, devSnToIscDevSnMap)); JSONObject daRtJo = HikvisionUtil.getJSONObjectData(daJo); @@ -639,7 +671,7 @@ public class AsyncHikvision { Set rtWorkerIdSet; if (CollUtil.isNotEmpty(qaiList)) { for (int i = 0; i < qaiList.size(); i++) { - handlerBatchWorkersResult(workerIdMap, devSnMap, qaiList, i, devSn, projectSn, addAuthWorkerIds,sendNotice); + handlerBatchWorkersResult(workerIdMap, qaiList, i, devSn, projectSn, addAuthWorkerIds, sendNotice, dev); } rtWorkerIdSet = qaiList.stream().map(o -> ((JSONObject) o).getString("personId")).collect(Collectors.toSet()); } else { @@ -671,6 +703,7 @@ public class AsyncHikvision { log.error("批量下发权限失败:", e); hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, new ArrayList<>(workerIdMap.values()), 1, 1); hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, new ArrayList<>(workerIdMap.values()), 1, 3); + sendExcNotice(e, workerList, dev); } return null; } @@ -679,15 +712,15 @@ public class AsyncHikvision { * 处理结果:一个设备批量下发人员 * * @param workerIdMap - * @param devSnMap * @param qaiList * @param i * @param devSn * @param projectSn * @param addAuthWorkerIds * @param sendNotice + * @param dev */ - public void handlerBatchWorkersResult(Map workerIdMap, Map devSnMap, JSONArray qaiList, int i, String devSn, String projectSn, List addAuthWorkerIds, boolean sendNotice) { + public void handlerBatchWorkersResult(Map workerIdMap, JSONArray qaiList, int i, String devSn, String projectSn, List addAuthWorkerIds, boolean sendNotice, UfaceDev dev) { JSONObject jo = qaiList.getJSONObject(i); String personId = jo.getString("personId"); //人脸状态 @@ -700,7 +733,6 @@ public class AsyncHikvision { //2. 删除以后,删除的权限状态是 4未配置 //3. 这个人的权限都没了以后,你就查不到这个权限条目了 Integer faceStatus = jo.getInteger("faceStatus"); - UfaceDev dev = devSnMap.get(devSn); if (sendNotice) { if (addAuthWorkerIds.contains(personId)) { //添加权限 diff --git a/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java b/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java index 80cddd8b7..c0c75b643 100644 --- a/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java +++ b/src/main/java/com/zhgd/xmgl/async/AsyncWorker.java @@ -72,6 +72,10 @@ public class AsyncWorker { } } + public void sendBatchWokerDev(Map map, ProjectUfaceConfig projectUfaceConfig, List allDevList) { + this.sendBatchWokerDevAsync(map, projectUfaceConfig, allDevList); + } + /** * 批量数据发送任务 * diff --git a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java index 536202edf..769062117 100644 --- a/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java +++ b/src/main/java/com/zhgd/xmgl/call/HikvisionCall.java @@ -80,7 +80,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Async; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -1177,18 +1176,17 @@ public class HikvisionCall { .isNull(XzHikvisionSync::getIsSuccess) .eq(XzHikvisionSync::getType, 3) .eq(XzHikvisionSync::getOperate, operate) - .eq(XzHikvisionSync::getProjectSn, projectSn) .eq(XzHikvisionSync::getWhoId, whoId) + .eq(XzHikvisionSync::getBigType, bigType) ); this.updateTotalStatus(projectSn, whoId, bigType); } - @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) + @Transactional(rollbackFor = Exception.class) public void updateAllFailStatusIfNull(String projectSn, Long whoId, Integer bigType) { xzHikvisionSyncMapper.update(null, new LambdaUpdateWrapper() .set(XzHikvisionSync::getIsSuccess, 0) .isNull(XzHikvisionSync::getIsSuccess) - .eq(XzHikvisionSync::getProjectSn, projectSn) .eq(XzHikvisionSync::getWhoId, whoId) .eq(XzHikvisionSync::getBigType, bigType) ); 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 b4d8fcab6..5f75ecd81 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 @@ -33,7 +33,6 @@ 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.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.*; @@ -490,7 +489,7 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl() @@ -512,7 +511,6 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl allDevList, List workerList, Long userId) { //构建workerAndDevSnList List workerAndDevSnList = new ArrayList<>(); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java index 32c5a6767..02177efd1 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerInfoService.java @@ -15,6 +15,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.Future; /** * @Description: 劳务人员 @@ -159,7 +160,7 @@ public interface IWorkerInfoService extends IService { void deleteWorkerForHikvision(String uniqueId, WorkerInfo workerInfo); - void editWorkerForSendBatchAuth(WorkerInfo workerInfo); + Future editWorkerAsyncForSendBatchAuth(WorkerInfo workerInfo); void editWorkerForHikvision(WorkerInfo workerInfo); 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 9d7c9adc1..14cd95ad5 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 @@ -200,16 +200,20 @@ public class UfaceDevServiceImpl extends ServiceImpl i public void sendBatchWokerDev(Map map) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(ProjectUfaceConfig::getProjectSn, MapUtils.getString(map, "projectSn")); - ProjectUfaceConfig tempProjectUfaceConfig = projectUfaceConfigService.getOne(queryWrapper); + ProjectUfaceConfig ufaceConfig = projectUfaceConfigService.getOne(queryWrapper); ThreadLocalUtil.addInKey("now", new Date()); - if (tempProjectUfaceConfig != null && tempProjectUfaceConfig.getIssueDev() == 1) { + if (ufaceConfig != null && ufaceConfig.getIssueDev() == 1) { QueryWrapper qw = new QueryWrapper<>(); qw.lambda().eq(UfaceDev::getProjectSn, MapUtils.getString(map, "projectSn")); List list = ufaceDevMapper.selectList(qw); if (list == null || list.size() == 0) { throw new OpenAlertException("请先添加设备"); } - asyncWorker.sendBatchWokerDevAsync(map, tempProjectUfaceConfig, list); + if (ufaceConfig.getSupplierType() == 9) { + asyncWorker.sendBatchWokerDev(map, ufaceConfig, list); + } else { + asyncWorker.sendBatchWokerDevAsync(map, ufaceConfig, list); + } } else { throw new OpenAlertException("项目配置不下发设备或未配置参数"); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java index 7db213976..19f8e1317 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java @@ -69,6 +69,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpStatus; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -82,6 +83,7 @@ import java.math.BigDecimal; import java.nio.charset.Charset; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; @@ -104,94 +106,135 @@ public class WorkerInfoServiceImpl extends ServiceImpl diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 917cfbd12..68d12b97a 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -6,7 +6,7 @@ - %green(%d{yyyy-MM-dd HH:mm:ss} [%X{requestId}][%thread] %-5level %logger{0}.%method:%L) - %highlight(%msg) %X{stackInfo} %n + %green(%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}][%thread] %-5level %logger{0}.%method:%L) - %highlight(%msg) %X{stackInfo} %n @@ -19,7 +19,7 @@ ${log.path}/zhgd-debug.log - %d{yyyy-MM-dd HH:mm:ss} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n UTF-8 @@ -46,7 +46,7 @@ ${log.path}/zhgd-info.log - %d{yyyy-MM-dd HH:mm:ss} [%X{requestId}] [%thread] %-5level %logger{56}.%method:%L - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{56}.%method:%L - %msg%n UTF-8 @@ -72,7 +72,7 @@ ${log.path}/zhgd-error.log - %d{yyyy-MM-dd HH:mm:ss} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n UTF-8 @@ -98,7 +98,7 @@ ${log.path}/zhgd-all.log - %d{yyyy-MM-dd HH:mm:ss} [%X{requestId}] [%thread] %highlight(%-5level) %method:%L %cyan(%logger{50}) - %highlight(%msg) %n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %highlight(%-5level) %method:%L %cyan(%logger{50}) - %highlight(%msg) %n UTF-8