diff --git a/web-app/src/main/java/com/zcloud/primeport/command/ClosedAreaCarApplyUpdateExe.java b/web-app/src/main/java/com/zcloud/primeport/command/ClosedAreaCarApplyUpdateExe.java index fd5ef1e..6d661f0 100644 --- a/web-app/src/main/java/com/zcloud/primeport/command/ClosedAreaCarApplyUpdateExe.java +++ b/web-app/src/main/java/com/zcloud/primeport/command/ClosedAreaCarApplyUpdateExe.java @@ -8,6 +8,7 @@ import com.zcloud.primeport.domain.gateway.ClosedAreaCarApplyGateway; import com.zcloud.primeport.domain.model.ClosedAreaCarApplyE; import com.zcloud.primeport.dto.ClosedAreaCarApplyAuditCmd; import com.zcloud.primeport.dto.ClosedAreaCarApplyUpdateCmd; +import com.zcloud.primeport.plan.mjDevice.TwoCarUtil; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; @@ -27,6 +28,7 @@ import java.util.Date; public class ClosedAreaCarApplyUpdateExe { private final ClosedAreaCarApplyGateway closedAreaCarApplyGateway; private final TodoListEventPusherUtil todoListEventPusherUtil; + private final TwoCarUtil twoCarUtil; @Transactional(rollbackFor = Exception.class) public void execute(ClosedAreaCarApplyUpdateCmd closedAreaCarApplyUpdateCmd) { @@ -50,6 +52,11 @@ public class ClosedAreaCarApplyUpdateExe { TodoListCompleteEvent todoListCompleteEvent = new TodoListCompleteEvent(); todoListCompleteEvent.setForeignSubsidiaryKey(auditCmd.getId()); todoListEventPusherUtil.sendMessageCompleteEvent(todoListCompleteEvent); + // 审批通过 → 同步门禁权限(二级海康 + 一级车行) + // 根据carBelongType判断车辆类型,内部车不走临时接口,不覆盖一级原有权限 + if (auditCmd.getAuditFlag().equals(2)) { + twoCarUtil.levelTwoCarCompanyByApplyId(auditCmd.getId()); + } } } diff --git a/web-app/src/main/java/com/zcloud/primeport/command/ClosedAreaPersonApplyUpdateExe.java b/web-app/src/main/java/com/zcloud/primeport/command/ClosedAreaPersonApplyUpdateExe.java index 6c6e558..67169ed 100644 --- a/web-app/src/main/java/com/zcloud/primeport/command/ClosedAreaPersonApplyUpdateExe.java +++ b/web-app/src/main/java/com/zcloud/primeport/command/ClosedAreaPersonApplyUpdateExe.java @@ -1,9 +1,13 @@ package com.zcloud.primeport.command; +import com.alibaba.cola.dto.SingleResponse; import com.alibaba.cola.exception.BizException; import com.zcloud.gbscommon.todolistmq.TodoListEventPusherUtil; import com.zcloud.gbscommon.todolistmq.event.TodoListCompleteEvent; import com.zcloud.gbscommon.utils.DateUtil; +import com.zcloud.gbscommon.utils.Tools; +import com.zcloud.gbscommon.zclouduser.facade.ZcloudUserFacade; +import com.zcloud.gbscommon.zclouduser.response.ZcloudUserCo; import com.zcloud.primeport.domain.gateway.ClosedAreaFgsPersonAreaGateway; import com.zcloud.primeport.domain.gateway.ClosedAreaFgsPersonAuthGateway; import com.zcloud.primeport.domain.gateway.ClosedAreaPersonApplyGateway; @@ -13,12 +17,16 @@ import com.zcloud.primeport.domain.model.ClosedAreaPersonApplyE; import com.zcloud.primeport.dto.ClosedAreaPersonApplyAuditCmd; import com.zcloud.primeport.dto.ClosedAreaPersonApplyAuthCmd; import com.zcloud.primeport.dto.ClosedAreaPersonApplyUpdateCmd; +import com.zcloud.primeport.plan.mjDevice.OnePersonUtil; +import com.zcloud.primeport.plan.mjDevice.TwoPersonUtil; import lombok.AllArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; @@ -36,6 +44,11 @@ public class ClosedAreaPersonApplyUpdateExe { private final ClosedAreaFgsPersonAuthGateway areaFgsPersonAuthGateway; private final ClosedAreaFgsPersonAreaGateway areaFgsPersonAreaGateway; private final TodoListEventPusherUtil todoListEventPusherUtil; + private final TwoPersonUtil twoPersonUtil; + private final OnePersonUtil onePersonUtil; + + @DubboReference + private ZcloudUserFacade zcloudUserFacade; @Transactional(rollbackFor = Exception.class) public void execute(ClosedAreaPersonApplyUpdateCmd closedAreaPersonApplyUpdateCmd) { @@ -58,9 +71,10 @@ public class ClosedAreaPersonApplyUpdateExe { TodoListCompleteEvent todoListCompleteEvent = new TodoListCompleteEvent(); todoListCompleteEvent.setForeignSubsidiaryKey(auditCmd.getId()); todoListEventPusherUtil.sendMessageCompleteEvent(todoListCompleteEvent); - // 审批通过赋予权限 + // 审批通过 → 同步门禁权限(二级海康 + 一级大华) + // 内部会先查大华系统判断是否已有权限,不覆盖原有权限 if (auditCmd.getAuditFlag().equals(2)) { - + twoPersonUtil.levelTwoPeopleCompanyByApplyId(auditCmd.getId()); } @@ -86,6 +100,36 @@ public class ClosedAreaPersonApplyUpdateExe { objects.add(closedAreaFgsPersonAreaE); } areaFgsPersonAreaGateway.saveBatch(objects); + // 开启门禁权限时,查一级大华是否有已有权限,不覆盖 + if (cmd.getMkmjPermission() != null && cmd.getMkmjPermission().equals(1)) { + // 获取人员身份证号 + SingleResponse userInfo = zcloudUserFacade.getInfoByUserId(cmd.getUserId()); + if (userInfo != null && userInfo.getData() != null) { + String userCard = userInfo.getData().getUserIdCard(); + String userName = userInfo.getData().getName(); + String userFaceUrl = userInfo.getData().getUserAvatarUrl(); + if (Tools.notEmpty(userCard)) { + // 查询一级门禁(大华)是否已有权限 + try { + cn.hutool.json.JSONArray dahuaUsers = onePersonUtil.getMkmjUserInfoByUserCard(Collections.singletonList(userCard)); + if (dahuaUsers == null || dahuaUsers.isEmpty()) { + // 大华没有该用户 → 新增(有效期按每日任务刷新) + onePersonUtil.dockLongTermUserByUserCardAndFaceImg( + userCard, + "hbqa" + userCard, + userName, + userFaceUrl, + DateUtil.date2Str(new Date(), "yyyy-MM-dd") + " 00:00:00", + DateUtil.date2Str(new Date(), "yyyy-MM-dd") + " 23:59:59" + ); + } + // 已有大华权限 → 保留,不覆盖 + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + } } } diff --git a/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/TwoCarUtil.java b/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/TwoCarUtil.java index ebfda0c..76e92b4 100644 --- a/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/TwoCarUtil.java +++ b/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/TwoCarUtil.java @@ -46,30 +46,36 @@ public class TwoCarUtil { /** * 审批时候的主入口 传一个申请id来 - * - * + * 同步二级门禁(海康) + 一级门禁(车行系统) + * 一级门禁仅对临时/相关方车操作,内部车不操作一级避免覆盖原有权限 */ public void levelTwoCarCompanyByApplyId(Long applyId) { if (!dockFlag.equals(1)) return; ClosedAreaCarApplyDO byId = closedAreaCarApplyRepository.getById(applyId); - if (byId.getCarBelongType().equals(4)) { + Integer carBelongType = byId.getCarBelongType(); + // 二级门禁(海康)同步 — 所有类型都需要 + if (carBelongType.equals(4)) { dockTmpCarLevelTwo(byId.getLicenceNo()); - }else { + } else { dockFgsCarLevelTwo(byId.getLicenceNo()); } - OneLevelCarSaveDto oneLevelCarSaveDto = new OneLevelCarSaveDto(); - oneLevelCarSaveDto.setTruckNo(byId.getLicenceNo()); - oneLevelCarSaveDto.setTruckCardColor(byId.getLicenceType()); - oneLevelCarSaveDto.setTruckTypCod(CarEnum.getMenuKeyByPath(byId.getVehicleType())); - // todo 待确定到底是东港还是西港 - oneLevelCarSaveDto.setPortId("0"); - oneLevelCarSaveDto.setDriverNam(byId.getDrivingUserName()); - oneLevelCarSaveDto.setLinkTel(byId.getUserPhone()); - oneLevelCarSaveDto.setValidDte(DateUtil.date2Str(new Date(),"yyyy-MM-dd")); - oneLevelCarSaveDto.setRecTim(DateUtil.date2Str(new Date())); - oneLevelCarSaveDto.setYqlCheckFlag("1"); - oneLevelCarSaveDto.setIsNeedCheck("0"); - tmpVehicleSave(oneLevelCarSaveDto); + // 一级门禁(车行系统)同步 — 仅临时/相关方车需要开通一级临时权限 + // 内部车(1股份/2分公司/5分公司内部)已有独立的一级权限管理,不操作避免覆盖 + if (carBelongType.equals(3) || carBelongType.equals(4)) { + OneLevelCarSaveDto oneLevelCarSaveDto = new OneLevelCarSaveDto(); + oneLevelCarSaveDto.setTruckNo(byId.getLicenceNo()); + oneLevelCarSaveDto.setTruckCardColor(byId.getLicenceType()); + oneLevelCarSaveDto.setTruckTypCod(CarEnum.getMenuKeyByPath(byId.getVehicleType())); + // todo 待确定到底是东港还是西港 + oneLevelCarSaveDto.setPortId("0"); + oneLevelCarSaveDto.setDriverNam(byId.getDrivingUserName()); + oneLevelCarSaveDto.setLinkTel(byId.getUserPhone()); + oneLevelCarSaveDto.setValidDte(DateUtil.date2Str(new Date(),"yyyy-MM-dd")); + oneLevelCarSaveDto.setRecTim(DateUtil.date2Str(new Date())); + oneLevelCarSaveDto.setYqlCheckFlag("1"); + oneLevelCarSaveDto.setIsNeedCheck("0"); + tmpVehicleSave(oneLevelCarSaveDto); + } } // 对接一级口门车辆 diff --git a/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/TwoPersonUtil.java b/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/TwoPersonUtil.java index 45e91c4..bf1153e 100644 --- a/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/TwoPersonUtil.java +++ b/web-infrastructure/src/main/java/com/zcloud/primeport/plan/mjDevice/TwoPersonUtil.java @@ -68,6 +68,14 @@ public class TwoPersonUtil { userList = closedAreaPersonApplyRepository.getDockAuthInfoById(applyId); } dockUserReal(userList); + // 同步一级门禁(大华) — 先查大华系统是否有已有权限,不覆盖原有权限 + for (TwoLevelUser item : userList) { + try { + dockOneLevelPerson(item.getUserCard(), item.getUserFaceImages(), item.getUserUid(), item.getUserName()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } } @@ -88,6 +96,33 @@ public class TwoPersonUtil { TwoPersonUtil twoPersonUtil = new TwoPersonUtil(); // twoPersonUtil.dockOneLevelPerson("130324199407282111"); // twoPersonUtil.dockOneLevelPerson("130324199407282112"); + // 身份证解码 +// String s = Base64.decodeToString("MTMwMzI0MTk5NTA2MDQwNjE4"); +// System.out.println(s); + + // 调用 HKDeviceUtil.saveUser 进行人员录入 +// System.out.println("开始调用 HKDeviceUtil.saveUser ..."); +// try { +// String personName = "wwz_普通用户"; +// String certificateNo = "130324199506040618"; +// String phoneNo = "15128544996"; +// String faceBase64 = "/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAKIBIADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAryn9qv8AbT+Fn7D/AMO38VfFfx1oHgnRwGMTX8/+kXrKMlLeBQZZ3x/BEjN3xXxz/wAFbf8AgvTpP7HPjKH4L/BPQz8X/wBpTxFILKw8O6dG93b6HM4+VrsR/M8uPmFupDbRudo12lvAvgH/AMEEBdaJ4q/ah/4KB+JLv4ufELT9LuPEd74cl1EjRdAtraF5zDKYiqS7FU/uottsmGXbKp3UAfo5/wAE8/8Ago18Nv8Agp18D9Q+IXwvuNYm8P6ZrdxoFx/adl9knS5hjhlPybm+UxzxODno/IBBA99r8m/+DNn4fal4M/4JLavqV9F5dr4t+IWqatp7f89YEtLCzLf9/rSYf8Br9ZKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvzT/wCC43/BWnxd8DPFXhn9mj9nOBfEX7SnxXZLW2FvtlPhK0lBxdPn5VnZQzpv+WONHmf5Qgf6/wD+Cg/7a/hr/gnr+yB41+LPihlktPC9iWs7LeFfVL1/ktrVPeSVlUkZ2ruY8Ka+GP8Ag24/YQ1tfBniX9r34yQf2j8av2g7mbV7S4uYz5mkaPMweMRK2fL+0YVwASBAtsox8wIB7t/wR8/4Is+C/wDgl/8AD2TWdRlh8cfG/wAUK1x4r8bXgaa5nllbfLb2zyZdIN/LMcPMw3yfwonmH/B1J+1PdfAv/gl/qPgjQ2ll8W/G3WLXwdp1tbkm4kgdvOuiqj7waOMQEf8AT0vrX6R3t7DptlLPPLHBbwIZJZZGCpGoGSzE8AAckmvxT/ZfS6/4OEP+C2V98a71Z7n9mr9lq9Fj4LifItte1ZXEkdwAcZ3yIl0/cRxWUbr8xoA/U/8A4J7/ALK9p+xL+xF8MPhVaxxK3grw/bWV48eNs94V8y7lGP8AnpcPM/8AwOvZ6KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKp6lqdvounXF5dTR29raRtNNLIwVIkUEszE9AACSaAPxx/4LUarN/wVL/4LE/AX9i7SpJbnwZ4MuU8c/EgRMdioI/NWGT+6wsztVum7VI/Sv2O0zT4NH0+3tLWCG1tLaNYYYYkCRwoowqqo4CgAAAcACvxx/wCDcHVbT9of9oz9sD9tjxdeWmk6N4x8SzaHo+o6lMttFpulwsLqYSSOQqxpAdNTcSAPs7Z6cUv23v8AgrT8Sv8Agsn8RdR/Zk/Yfs9Vl0K8kFn44+KjpJaafYWLkrIkEmN0cTDcDJxLMFZYUIO8gGl/wVK/4KV+PP8AgqB8edR/Yp/Y+kj1KbUlksfiP4+jYnTdIsc+Xc26TKCBEASksq5Lk+TEGLE1+kv/AATy/YY8J/8ABOL9kjwp8JvB+65sfD8Be91GSIRz6xeyHdcXcgGcM75wuTsQIgJCCub/AOCYn/BMT4c/8Erv2c7TwJ4EtPtOoXWy48QeILiJVvvEN2FwZZCM7Y1yRHECVjUnqxd2+lKACiiigAooooAKKKxbXx7oeoeM7vw3BrelTeIrC2S8utLS8ja9toHJVJXhB3qjEEBiACQcGgDaooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA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HwU8E2Phrwd4e0Twr4d0xPLtNM0myjs7S2X0SOMBV/AVv0AYvw7+G3h74Q+C9P8ADfhTQtI8NeHtJiEFlpml2cdpaWiD+GOKMBVHsBW1RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV8Gf8FKP+DeD4Ef8FENdm8YQ2t78LPiuHFxD4w8LKtvNPcKcpLdQDCXDAgHeCk3AHmgACvvOigD8fbT/AIJa/wDBUL4A20enfDP9tvwn4o02JBCknjXT2luAgHXNxZag24ED+POM89i6b9jD/gshcxNG/wC1l8AlSQFWKaTbKwB9CPDwIPuCDX7AUUAfjnp3/Brh49/ao1CHVP2sv2tvih8UJCwlfRNHmeGxtmBztikumlQJnPCW0WMnHJzX23+xr/wQ9/Ze/YTmtr3wJ8J9Ak8QWxDrr2uK2samjj+OOW4L+Qf+uIjHt1r6xooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/9k="; +// HKDeviceUtil.saveUser(personName, certificateNo, faceBase64, phoneNo); +// System.out.println("saveUser 调用成功!请前往海康平台确认人员是否已新增。"); + + // 检查 JPG 文件 和 图片大小 +// byte[] decoded = java.util.Base64.getDecoder().decode(faceBase64); +// if (decoded.length < 3 || decoded[0] != (byte)0xFF || decoded[1] != (byte)0xD8 || decoded[2] != (byte)0xFF) { +// System.out.println("不是有效的 JPG 格式"); +// } +// int sizeKB = decoded.length / 1024; +// if (sizeKB < 10 || sizeKB > 200) { +// System.out.println("图片大小不符合要求: " + sizeKB + "KB"); +// } +// } catch (Exception e) { +// System.err.println("saveUser 调用失败:" + e.getMessage()); +// throw new RuntimeException(e); +// } } public void dockOneLevelPerson(String userCard, String userFaceImages, String userUid, String userName) throws Exception { @@ -142,15 +177,27 @@ public class TwoPersonUtil { } } zcloudUserImgQry.setUrlList(faceUrl); + // todo 提醒下悦哥 上线口门需要刷数据 List data = zcloudUserFacade.listBase64ByUrl(zcloudUserImgQry).getData(); Map collect = data.stream().collect(Collectors.toMap(ZcloudUserImgBase64Co::getUserAvatarUrl, ZcloudUserImgBase64Co::getUserAvatarBase64, (existing, replacement) -> replacement)); u.add(item); - u.forEach(itemUser -> { - item.setUserFaceImagesBase64(collect.get(itemUser.getUserFaceImages())); - // 把人同步过去,如存在不做任何操作。 - dockLongTermUserAuthLevelTwo(itemUser); - }); - dockLongAuthTwo(u, Arrays.asList(item.getHkIndexCode().split(",")), DateUtil.date2Str(new Date(), "yyyy-MM-dd")); + // 过滤掉没有人脸base64数据的用户 + List validUsers = new ArrayList<>(); + for (TwoLevelUser itemUser : u) { + String base64Data = collect.get(itemUser.getUserFaceImages()); + if (Tools.notEmpty(base64Data)) { + itemUser.setUserFaceImagesBase64(base64Data); + validUsers.add(itemUser); + } + } + + // 把人同步过去,如存在不做任何操作。 + validUsers.forEach(this::dockLongTermUserAuthLevelTwo); + + // 只有当有有效用户时才进行权限授权 + if (!validUsers.isEmpty()) { + dockLongAuthTwo(validUsers, Arrays.asList(item.getHkIndexCode().split(",")), DateUtil.date2Str(new Date(), "yyyy-MM-dd")); + } }); }