From 55a0cd7710ee2fa32bc0617cb43ec9a8466f3b9b Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Sat, 22 Nov 2025 14:37:56 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E8=BE=91=E4=BA=BA=E5=91=98=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E4=BA=BA=E8=84=B8=E5=B0=B1=E4=B8=8D=E8=A6=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E4=B8=8B=E5=8F=91=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhgd/xmgl/async/AsyncHikvision.java | 38 +++++++------ .../impl/ProjectUfaceConfigServiceImpl.java | 28 ++++++---- .../com/zhgd/xmgl/util/AsyncTaskUtil.java | 54 +++++++++++++++++++ 3 files changed, 94 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/util/AsyncTaskUtil.java diff --git a/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java b/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java index ba3f51c85..1d44d342c 100644 --- a/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java +++ b/src/main/java/com/zhgd/xmgl/async/AsyncHikvision.java @@ -191,17 +191,6 @@ public class AsyncHikvision { projectUfaceConfigService.updateWorkerInfo(workerInfo, workerInfo); } - /** - * 保存人员 - * - * @param workerInfo - * @param isSaveWorker - * @param isSaveWorkerFace - */ - public void saveWorker(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) { - this.saveWorkerAsync(workerInfo, isSaveWorker, isSaveWorkerFace); - } - /** * 异步保存人员 * @@ -860,10 +849,19 @@ public class AsyncHikvision { List workerIds = devSnToJoEntry.getValue().stream().map(jsonObject -> jsonObject.getString("workerId")).collect(Collectors.toList()); JSONArray qaiList = this.queryAuthItemByWorkerList(project, workerIds, getDevRqParam(iscDevSnObj)); Map personId2FaceStatusMap = qaiList.stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("personId"), o -> ((JSONObject) o).getInteger("faceStatus"), (o1, o2) -> o1)); + Map personId2FaceOperatorTypeMap = qaiList.stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("personId"), o -> Optional.ofNullable(((JSONObject) o).getJSONObject("personDownloadDetail")).map(m -> m.getJSONArray("faces")).map(m -> { + if (CollUtil.isNotEmpty(m)) { + //操作类型,0新增;1修改;2删除 + return m.getJSONObject(0).getInteger("operatorType"); + } else { + return null; + } + }).orElse(null), (o1, o2) -> o1)); for (int i = 0; i < workerIds.size(); i++) { String workerId = workerIds.get(i); Integer faceStatus = personId2FaceStatusMap.get(workerId); - handlerBatchWorkersResult(workerIdMap, addAuthWorkerIds, sendNotice, dev, flowStartUser, workerId, faceStatus); + Integer faceOperatorType = personId2FaceOperatorTypeMap.get(workerId); + handlerBatchWorkersResult(workerIdMap, addAuthWorkerIds, sendNotice, dev, flowStartUser, workerId, faceStatus, faceOperatorType); } } catch (Exception e) { log.error("批量下发权限失败:", e); @@ -939,15 +937,23 @@ public class AsyncHikvision { /** * 处理结果:一个设备批量下发人员 * - * @param personId - * @param faceStatus * @param workerIdMap * @param addAuthWorkerIds * @param sendNotice * @param dev * @param flowStartUser + * @param personId + * @param faceStatus + * @param faceOperatorType */ - public void handlerBatchWorkersResult(Map workerIdMap, List addAuthWorkerIds, boolean sendNotice, UfaceDev dev, Long flowStartUser, String personId, Integer faceStatus) { + public void handlerBatchWorkersResult(Map workerIdMap, + List addAuthWorkerIds, + boolean sendNotice, + UfaceDev dev, + Long flowStartUser, + String personId, + Integer faceStatus, + Integer faceOperatorType) { String workerName = workerIdMap.get(personId).getWorkerName(); log.info("处理结果一个设备批量下发人员:{},{}", workerName, dev.getDevName()); String projectSn = dev.getProjectSn(); @@ -964,7 +970,7 @@ public class AsyncHikvision { if (addAuthWorkerIds.contains(personId)) { //添加权限 int addAuth = 3; - if (Objects.equals(faceStatus, addAuth)) { + if (Objects.equals(faceStatus, addAuth) && !Objects.equals(faceOperatorType, 2)) { hikvisionCall.updateSuccessStatus(projectSn, Long.valueOf(personId), 3, 1, dev.getDevSn()); Long syncId = ThreadLocalUtil.getByKey(Cts.TL_HK_SYNC_ID, Long.class); if (syncId != null) { 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 1c88076a7..96e0ad81b 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 @@ -657,16 +657,24 @@ public class ProjectUfaceConfigServiceImpl extends ServiceImpl sendAndDeleteDevSnsPair = getSendAndDeleteDevSns(workerInfo); - String devSns = sendAndDeleteDevSnsPair.getLeft(); - for (String devSn : StrUtil.split(devSns, Cts.COMMA)) { - XzHikvisionSync sync = new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(1).setWhoId(workerInfo.getId()).setDeviceSn(devSn).setBigType(1).setCreateDate(getSyncTimeWithInitAndDeleteSyncIfAbsent(1, workerInfo.getId())); - saveSyncDev(workerInfo, devSn, sync); - } - String deleteDevSns = sendAndDeleteDevSnsPair.getRight(); - for (String deleteDevSn : StrUtil.split(deleteDevSns, Cts.COMMA)) { - XzHikvisionSync sync = new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(3).setWhoId(workerInfo.getId()).setDeviceSn(deleteDevSn).setBigType(1).setCreateDate(getSyncTimeWithInitAndDeleteSyncIfAbsent(1, workerInfo.getId())); - saveSyncDev(workerInfo, deleteDevSn, sync); + if (StrUtil.isNotBlank(workerInfo.getFieldAcquisitionUrl())) { + Pair sendAndDeleteDevSnsPair = getSendAndDeleteDevSns(workerInfo); + String devSns = sendAndDeleteDevSnsPair.getLeft(); + for (String devSn : StrUtil.split(devSns, Cts.COMMA)) { + XzHikvisionSync sync = new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(1).setWhoId(workerInfo.getId()).setDeviceSn(devSn).setBigType(1).setCreateDate(getSyncTimeWithInitAndDeleteSyncIfAbsent(1, workerInfo.getId())); + saveSyncDev(workerInfo, devSn, sync); + } + String deleteDevSns = sendAndDeleteDevSnsPair.getRight(); + for (String deleteDevSn : StrUtil.split(deleteDevSns, Cts.COMMA)) { + XzHikvisionSync sync = new XzHikvisionSync().setProjectSn(workerInfo.getProjectSn()).setType(3).setOperate(3).setWhoId(workerInfo.getId()).setDeviceSn(deleteDevSn).setBigType(1).setCreateDate(getSyncTimeWithInitAndDeleteSyncIfAbsent(1, workerInfo.getId())); + saveSyncDev(workerInfo, deleteDevSn, sync); + } + } else { + xzHikvisionSyncService.remove(new LambdaQueryWrapper() + .eq(XzHikvisionSync::getBigType, 1) + .eq(XzHikvisionSync::getType, 3) + .eq(XzHikvisionSync::getWhoId, workerInfo.getId()) + ); } workerInfoService.updateWorkerHkStatus(workerInfo); } diff --git a/src/main/java/com/zhgd/xmgl/util/AsyncTaskUtil.java b/src/main/java/com/zhgd/xmgl/util/AsyncTaskUtil.java new file mode 100644 index 000000000..50711624f --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/util/AsyncTaskUtil.java @@ -0,0 +1,54 @@ +package com.zhgd.xmgl.util; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Component; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; + +@Component +@Slf4j +public class AsyncTaskUtil { + + private static ThreadPoolTaskExecutor doubleCarbonExecutor; + + /** + * 执行异步任务 + */ + public static CompletableFuture runAsync(Runnable task) { + return runAsync(task, "异步任务执行异常"); + } + + /** + * 执行异步任务 + * + * @param task + * @param errLogName 错误日志名称 + * @return + */ + public static CompletableFuture runAsync(Runnable task, String errLogName) { + return CompletableFuture.runAsync(task, doubleCarbonExecutor).exceptionally(throwable -> { + log.error(errLogName, throwable); + return null; + }); + } + + /** + * 执行异步任务并支持异常处理 + */ + public static CompletableFuture runAsync(Runnable task, Consumer exceptionHandler) { + return CompletableFuture.runAsync(task, doubleCarbonExecutor) + .exceptionally(throwable -> { + exceptionHandler.accept(throwable); + return null; + }); + } + + @Autowired + public void setDoubleCarbonExecutor(@Qualifier("doubleCarbonExecutor") ThreadPoolTaskExecutor executor) { + AsyncTaskUtil.doubleCarbonExecutor = executor; + } +}