diff --git a/web-infrastructure/src/main/java/com/zcloud/primeport/plan/TwoLevelPersonXxlJob.java b/web-infrastructure/src/main/java/com/zcloud/primeport/plan/TwoLevelPersonXxlJob.java new file mode 100644 index 0000000..67b7932 --- /dev/null +++ b/web-infrastructure/src/main/java/com/zcloud/primeport/plan/TwoLevelPersonXxlJob.java @@ -0,0 +1,31 @@ +package com.zcloud.primeport.plan; + +import com.jjb.saas.framework.job.Job; +import com.jjb.saas.framework.job.annotation.JobRegister; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.annotation.XxlJob; +import com.zcloud.primeport.plan.mjDevice.TwoPersonUtil; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class TwoLevelPersonXxlJob implements Job { + + @Resource + private TwoPersonUtil twoPersonUtil; + + @Override + @JobRegister(cron = "0 20 0 * * ?", jobDesc = "闭区定时任务,每日00:20进行当日二级门禁可进门人员推送", triggerStatus = 1) + @XxlJob("com.zcloud.plan.TwoLevelPersonDockXxlJob") + public ReturnT execute(String param) { + try { + // 二级门禁人员定时对接(含同步一级门禁) + twoPersonUtil.scheduledPeopleCompany(); + } catch (Exception e) { + e.printStackTrace(); + return ReturnT.FAIL; + } + return ReturnT.SUCCESS; + } +} 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 bf1153e..d7d7ed8 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 @@ -81,14 +81,27 @@ public class TwoPersonUtil { /* * 定时任务对接人 + * 单个异常跳过不影响其他人员同步 * */ - public void scheduledPeopleCompany() throws Exception { + public void scheduledPeopleCompany() { if (!dockFlag.equals(1)) return; List userList = closedAreaPersonApplyRepository.getDockAuthTmpInfoById(null); userList.addAll(closedAreaPersonApplyRepository.getDockAuthInfoById(null)); - dockUserReal(userList); + // 二级门禁同步 — 逐个处理,单个失败继续下一个 + for (TwoLevelUser user : userList) { + try { + dockUserReal(Collections.singletonList(user)); + } catch (Exception e) { + System.err.println("二级门禁人员同步失败, userCard=" + user.getUserCard() + ", 原因: " + e.getMessage()); + } + } + // 一级门禁(大华)同步 — 逐个处理,单个失败继续下一个 for (TwoLevelUser item : userList) { - dockOneLevelPerson(item.getUserCard(), item.getUserFaceImages(), item.getUserUid(), item.getUserName()); + try { + dockOneLevelPerson(item.getUserCard(), item.getUserFaceImages(), item.getUserUid(), item.getUserName()); + } catch (Exception e) { + System.err.println("一级门禁人员同步失败, userCard=" + item.getUserCard() + ", 原因: " + e.getMessage()); + } } } @@ -234,14 +247,24 @@ public class TwoPersonUtil { /** - * 对接二级口门人 + * 对接二级口门人:用户不存在则新增,已存在跳过 + * 先按手机号查询,手机号查不到则用身份证号(处理手机号变更场景) */ public void dockLongTermUserAuthLevelTwo(TwoLevelUser towUser) { - // 跟据身份证号查询 这个人有没有一级门禁 没有新增一级门禁 if (!dockFlag.equals(1)) return; - JSONObject userListByUserCard = HKDeviceUtil.getUserListByPhone(Arrays.asList(towUser.getUserPhone())); - if (userListByUserCard.getJSONArray("data").isEmpty()) return; - // 门禁系统里没有这个人,哪么需要把这个人的信息同步过去 + // 按手机号查询 + JSONObject phoneResult = HKDeviceUtil.getUserListByPhone(Collections.singletonList(towUser.getUserPhone())); + if (!phoneResult.getJSONObject("data").getJSONArray("list").isEmpty()) { + // 手机号查到,用户已存在,无需新增 + return; + } + // 手机号查不到,尝试用身份证号(手机号可能变更了,但身份证号不变) + JSONObject idCardResult = HKDeviceUtil.getUserListByUserCard(towUser.getUserCard()); + if (!idCardResult.getJSONObject("data").getJSONArray("list").isEmpty()) { + // 身份证查到 -> 用户存在,只是手机号变了,无需新增 + return; + } + // 手机号和身份证都查不到 -> 海康无此用户,新增 HKDeviceUtil.saveUser(towUser.getUserName(), towUser.getUserCard(), towUser.getUserFaceImagesBase64(), towUser.getUserPhone()); } @@ -255,16 +278,34 @@ public class TwoPersonUtil { /* * 给人授权门禁范围 + * 先按手机号批量查询 personId,手机号查不到的用户用身份证号(处理手机号变更场景) * */ public void dockLongAuthTwo(List userIdList, List resourceInfos, String time) { if (!dockFlag.equals(1)) return; - JSONArray jsonArray = new JSONArray(); + JSONArray userJsonArray = new JSONArray(); List phoneList = userIdList.stream().map(TwoLevelUser::getUserPhone).collect(Collectors.toList()); - List> partition = partition(phoneList, 20); - partition.forEach(item -> { + List> partitions = partition(phoneList, 20); + Set foundPhones = new HashSet<>(); + partitions.forEach(item -> { // 接口有限制 最多一次查询20个人 - jsonArray.addAll(HKDeviceUtil.getUserListByPhone(item).getJSONObject("data").getJSONArray("list")); + JSONObject result = HKDeviceUtil.getUserListByPhone(item); + JSONArray list = result.getJSONObject("data").getJSONArray("list"); + for (int i = 0; i < list.size(); i++) { + JSONObject user = list.getJSONObject(i); + userJsonArray.add(user); + foundPhones.add(user.getStr("phoneNo")); + } }); + // 手机号查不到的用户,用身份证号查(手机号变更后海康仍存旧号,但身份证号不变) + for (TwoLevelUser user : userIdList) { + if (!foundPhones.contains(user.getUserPhone())) { + JSONObject result = HKDeviceUtil.getUserListByUserCard(user.getUserCard()); + JSONArray list = result.getJSONObject("data").getJSONArray("list"); + for (int i = 0; i < list.size(); i++) { + userJsonArray.add(list.getJSONObject(i)); + } + } + } ArrayList objects = new ArrayList<>(); resourceInfos.forEach(item -> { JSONObject entries = new JSONObject(); @@ -274,8 +315,8 @@ public class TwoPersonUtil { }); // 接口有限制 最多一次存1000个人 ArrayList userIds = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JSONObject jsonObject = jsonArray.getJSONObject(i); + for (int i = 0; i < userJsonArray.size(); i++) { + JSONObject jsonObject = userJsonArray.getJSONObject(i); userIds.add(jsonObject.getStr("personId")); } List> partitionUserIds = partition(userIds, 1000);