package com.zhgd.xmgl.task; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.gexin.fastjson.JSON; import com.zhgd.redis.lock.RedisRepository; import com.zhgd.xmgl.async.AsyncHikvision; import com.zhgd.xmgl.call.HikvisionCall; import com.zhgd.xmgl.constant.Cts; import com.zhgd.xmgl.modules.car.entity.CarInfo; import com.zhgd.xmgl.modules.car.service.impl.CarInfoServiceImpl; import com.zhgd.xmgl.modules.car.service.impl.ProjectCarCameraConfigServiceImpl; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.modules.project.service.impl.ProjectUfaceConfigServiceImpl; import com.zhgd.xmgl.modules.worker.entity.DepartmentInfo; import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; import com.zhgd.xmgl.modules.worker.entity.TeamInfo; import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; import com.zhgd.xmgl.modules.worker.mapper.DepartmentInfoMapper; import com.zhgd.xmgl.modules.worker.service.ITeamInfoService; import com.zhgd.xmgl.modules.worker.service.impl.DepartmentInfoServiceImpl; import com.zhgd.xmgl.modules.worker.service.impl.EnterpriseInfoServiceImpl; import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl; import com.zhgd.xmgl.modules.xz.entity.XzHikvisionSync; import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionCompareDataMapper; import com.zhgd.xmgl.modules.xz.service.IXzHikvisionCompareDataService; import com.zhgd.xmgl.modules.xz.service.impl.XzHikvisionSyncServiceImpl; import com.zhgd.xmgl.util.HikvisionUtil; import com.zhgd.xmgl.util.JoBuilder; import com.zhgd.xmgl.util.MapBuilder; import lombok.extern.slf4j.Slf4j; import net.javacrumbs.shedlock.core.SchedulerLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping(value = {"xmgl/task", "xmgl/hikvision"}) public class HikvisionTask { @Autowired XzHikvisionSyncServiceImpl xzHikvisionSyncService; @Lazy @Autowired private HikvisionCall hikvisionCall; @Lazy @Autowired private ProjectMapper projectMapper; @Lazy @Autowired private EnterpriseInfoServiceImpl enterpriseInfoService; @Lazy @Autowired private CarInfoServiceImpl carInfoService; @Lazy @Autowired private DepartmentInfoServiceImpl departmentInfoService; @Lazy @Autowired private ITeamInfoService teamInfoService; @Lazy @Autowired private WorkerInfoServiceImpl workerInfoService; @Lazy @Autowired private XzHikvisionCompareDataMapper xzHikvisionCompareDataMapper; @Lazy @Autowired private RedisRepository redisRepository; @Lazy @Autowired private IXzHikvisionCompareDataService xzHikvisionCompareDataService; @Lazy @Autowired private DepartmentInfoMapper departmentInfoMapper; @Lazy @Autowired private ProjectCarCameraConfigServiceImpl projectCarCameraConfigService; @Lazy @Autowired private ProjectUfaceConfigServiceImpl projectUfaceConfigService; @Lazy @Autowired private AsyncHikvision asyncHikvision; /** * 删除长时间(超过30分钟)的卡主的任务,设备不支持并发多个任务下权限,如果你同时往同一个设备下了多个任务,会导致设备堵住,任务一直处于下载中,这些任务就释放不了 * * @throws Exception */ @SchedulerLock(name = "deleteLongTask", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5) @Scheduled(cron = "0 0/30 * * * ?") @RequestMapping("deleteLongTask") public void deleteLongTask() throws Exception { doDeleteLongTask(false); } @RequestMapping("deleteAllTask") public void deleteAllTask() throws Exception { doDeleteLongTask(true); } private void doDeleteLongTask(boolean deleteAll) { List projects = projectMapper.selectList(new LambdaQueryWrapper() .eq(Project::getSyncHikvision, 1)); for (Project project : projects) { try { JSONObject joRt = HikvisionUtil.getTasks(project, new JoBuilder().put("pageNo", 1).put("pageSize", 1000).put("authTaskStatusList", Arrays.asList(0, 1)).build()); JSONObject dataJo = HikvisionUtil.getJsonObjectData(joRt); JSONArray listJa = dataJo.getJSONArray("list"); for (int i = 0; i < listJa.size(); i++) { JSONObject jo = listJa.getJSONObject(i); if (deleteAll || DateUtil.compare(DateUtil.parse(jo.getString("createTime")), DateUtil.offsetMinute(new Date(), -30)) < 0) { if (jo.getInteger("taskStatus").equals(1)) { HikvisionUtil.stopTask(project, new JoBuilder().put("taskId", jo.getString("authTaskId")).build()); } else { HikvisionUtil.deleteTask(project, new JoBuilder().put("taskId", jo.getString("authTaskId")).build()); } } } } catch (Exception e) { log.error("" + e); } } } /** * 定时一分钟获取海康数据 */ @SchedulerLock(name = "getRecordForHikvision", lockAtMostFor = 1000 * 30, lockAtLeastFor = 1000 * 30) @Scheduled(cron = "0 */2 * * * ?") @RequestMapping("getRecordForHikvision") public void getRecordForHikvision() { String startTime = DateUtil.formatDateTime(DateUtil.offsetMinute(new Date(), -5)); String endTime = DateUtil.formatDateTime(new Date()); List projects = projectMapper.selectList(new LambdaQueryWrapper() .eq(Project::getSyncHikvision, 1)); for (Project project : projects) { log.info("定时获取海康记录,{}", project.getProjectName()); HashMap map = new HashMap<>(16); map.put("projectSn", project.getProjectSn()); map.put("startTime", startTime); map.put("endTime", endTime); String projectSn = project.getProjectSn(); boolean carConfig = projectCarCameraConfigService.isHikvisionConfig(projectSn); boolean ufaceConfig = projectUfaceConfigService.isHikvisionConfig(projectSn); if (carConfig) { asyncHikvision.getCrossRecordsAsync(map); } if (ufaceConfig) { asyncHikvision.getDoorEventsAsync(map); } } } /** * 定时重试失败的记录,十分钟一次 */ // @SchedulerLock(name = "retrySyncHikvisionTenMin", lockAtMostFor = 1000 * 30, lockAtLeastFor = 1000 * 30) // @Scheduled(cron = "0 */10 * * * ?") // @RequestMapping("retrySyncHikvisionTenMin") // public void retrySyncHikvisionTenMin() { // try { // HashMap newListMap = new HashMap<>(16); // newListMap.put("isSuccess", 0); // newListMap.put("createDateBegin", DateUtil.formatDateTime(DateUtil.offsetHour(new Date(), -1))); // newListMap.put("geBeforeTenMin", 1); // List newestList = xzHikvisionSyncService.getNewestList(newListMap); // newestList = newestList.stream().filter(xzHikvisionSync -> Objects.equals(xzHikvisionSync.getIsSuccess(), 0)).collect(Collectors.toList()); // for (XzHikvisionSync xzHikvisionSync : newestList) { // log.info("海康同步的定时重试失败的记录,id:{}", xzHikvisionSync.getId()); // HashMap retryMap = new HashMap<>(16); // retryMap.put("id", xzHikvisionSync.getId()); // try { // xzHikvisionSyncService.retry(retryMap); // } catch (Exception e) { // log.error("海康同步的定时重试失败的记录:error:", e); // } // } // } catch (Exception e) { // log.error("定时重试失败的记录,十分钟一次,出现错误" + e); // } // } /** * 定时重试失败的记录,一小时一次 */ // @SchedulerLock(name = "retrySyncHikvisionHourly", lockAtMostFor = 1000 * 30, lockAtLeastFor = 1000 * 30) // @Scheduled(cron = "0 0 0/1 * * ?") // @RequestMapping("retrySyncHikvisionHourly") // public void retrySyncHikvisionHourly() { // try { // HashMap newListMap = new HashMap<>(16); // newListMap.put("isSuccess", 0); // newListMap.put("createDateBegin", DateUtil.formatDateTime(DateUtil.offsetDay(new Date(), -1))); // newListMap.put("geBeforeHour", 1); // List newestList = xzHikvisionSyncService.getNewestList(newListMap); // newestList = newestList.stream().filter(xzHikvisionSync -> Objects.equals(xzHikvisionSync.getIsSuccess(), 0)).collect(Collectors.toList()); // for (XzHikvisionSync xzHikvisionSync : newestList) { // log.info("海康同步的定时重试失败的记录,id:{}", xzHikvisionSync.getId()); // HashMap retryMap = new HashMap<>(16); // retryMap.put("id", xzHikvisionSync.getId()); // try { // xzHikvisionSyncService.retry(retryMap); // } catch (Exception e) { // log.error("海康同步的定时重试失败的记录:error:", e); // } // } // } catch (Exception e) { // log.error("定时重试失败的记录,一小时一次" + e); // } // } /** * 数据校验同步 */ @SchedulerLock(name = "compareData", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5) @Scheduled(cron = "0 0 3 * * ?") @RequestMapping("compareData") public void compareData() throws Exception { log.info("数据校验同步任务开始"); List projects = projectMapper.selectList(new LambdaQueryWrapper().eq(Project::getSyncHikvision, 1)); for (Project project : projects) { try { xzHikvisionCompareDataService.deleteAllCompareData(project); boolean ufaceConfig = projectUfaceConfigService.isHikvisionConfig(project.getProjectSn()); if (ufaceConfig) { compareHikvisionForEnterpriseEtc(project); } boolean carConfig = projectCarCameraConfigService.isHikvisionConfig(project.getProjectSn()); if (carConfig) { compareHikvisionForCar(project); } } catch (Exception e) { log.error("数据校验同步失败,projectSn:{} ", project.getProjectSn(), e); xzHikvisionCompareDataService.addExceptionShowIfNull(project.getProjectSn()); } } } /** * 对比车 * * @param project * @throws Exception */ public void compareHikvisionForCar(Project project) throws Exception { compareHikvisionForFixCar(project); compareHikvisionForReservationCar(project); compareHikvisionForBlackCar(project); xzHikvisionCompareDataService.addSuccessShow(project.getProjectSn(), "4"); } /** * 对比企业 * * @param project * @throws Exception */ public void compareHikvisionForEnterpriseEtc(Project project) throws Exception { //对比企业 JSONObject param = new JSONObject(); HikvisionUtil.addPageParamIfAbsent(param); param.put("parentOrgIndexCode", project.getProjectSn()); JSONObject rtJo = HikvisionUtil.getSubOrgListByParentOrg(project, param); List enterpriseInfos = BeanUtil.copyToList(enterpriseInfoService.getEnterpriseInfoList(new MapBuilder().put(Cts.PROJECT_SN, project.getProjectSn()).build()), EnterpriseInfo.class); log.info("数据校验我们平台的企业列表:{}", JSON.toJSONString(enterpriseInfos)); JSONObject dataJo = HikvisionUtil.getJsonObjectData(rtJo); JSONArray listJa = dataJo.getJSONArray("list"); if (CollUtil.isEmpty(listJa)) { for (EnterpriseInfo enterpriseInfo : enterpriseInfos) { xzHikvisionCompareDataService.addCompareDataForEnterprise(project, enterpriseInfo.getEnterpriseName(), 0, 1, String.valueOf(enterpriseInfo.getId())); compareHikvisionForDepartmentAndTeamEtc(project, String.valueOf(enterpriseInfo.getId()), String.valueOf(enterpriseInfo.getId())); } } else { //isc存在,平台也存在 HashSet nameSet = new HashSet<>(); enterpriseInfos.forEach(enterpriseInfo -> nameSet.add(enterpriseInfo.getEnterpriseName())); listJa.forEach(o -> nameSet.add(((JSONObject) o).getString("orgName"))); Map iscMap = listJa.stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("orgName"), o -> (JSONObject) o, (o, o2) -> o2)); Map myMap = enterpriseInfos.stream().collect(Collectors.toMap(EnterpriseInfo::getEnterpriseName, Function.identity(), (o, o2) -> o2)); for (String name : nameSet) { String orgIndex = null; String enterpriseId = null; if (myMap.containsKey(name) && !iscMap.containsKey(name)) { orgIndex = String.valueOf(myMap.get(name).getId()); enterpriseId = orgIndex; xzHikvisionCompareDataService.addCompareDataForEnterprise(project, name, 0, 1, orgIndex); } else if (!myMap.containsKey(name) && iscMap.containsKey(name)) { orgIndex = iscMap.get(name).getString("orgIndexCode"); enterpriseId = orgIndex; xzHikvisionCompareDataService.addCompareDataForEnterprise(project, name, 1, 0, orgIndex); } else { enterpriseId = String.valueOf(myMap.get(name).getId()); orgIndex = iscMap.get(name).getString("orgIndexCode"); } compareHikvisionForDepartmentAndTeamEtc(project, orgIndex, enterpriseId); } } xzHikvisionCompareDataService.addSuccessShow(project.getProjectSn(), "1"); } /** * 对比班组和部门 * * @param project * @param orgIndex * @param enterpriseId * @throws Exception */ private void compareHikvisionForDepartmentAndTeamEtc(Project project, String orgIndex, String enterpriseId) throws Exception { JSONObject param = new JSONObject(); HikvisionUtil.addPageParamIfAbsent(param); param.put("parentOrgIndexCode", orgIndex); JSONObject rtJo = HikvisionUtil.getSubOrgListByParentOrg(project, param); List teamList = teamInfoService.getProjectTeamList(new MapBuilder() .put(Cts.PROJECT_SN, project.getProjectSn()).put(Cts.ENTERPRISE_ID, enterpriseId).build()); teamList.forEach(o -> o.setTeamName(o.getTeamName() + Cts.ISC_SYNC_TEAM_SUFFIX)); log.info("数据校验我们平台的班组列表:{}", JSON.toJSONString(teamList)); List departmentInfoList = departmentInfoMapper.getDepartmentInfoList(new MapBuilder() .put(Cts.PROJECT_SN, project.getProjectSn()).put(Cts.ENTERPRISE_ID, enterpriseId).build()); departmentInfoList.forEach(o -> o.setDepartmentName(o.getDepartmentName() + Cts.ISC_SYNC_DEPARTMENT_SUFFIX)); log.info("数据校验我们平台的部门列表:{}", JSON.toJSONString(departmentInfoList)); JSONObject dataJo = HikvisionUtil.getJsonObjectData(rtJo); JSONArray listJa = dataJo.getJSONArray("list"); if (CollUtil.isEmpty(listJa)) { for (TeamInfo teamInfo : teamList) { xzHikvisionCompareDataService.addCompareDataForTeam(project, teamInfo.getTeamName(), 0, 1, String.valueOf(teamInfo.getId())); compareHikvisionForWorker(project, String.valueOf(teamInfo.getId()), 1); } for (DepartmentInfo departmentInfo : departmentInfoList) { xzHikvisionCompareDataService.addCompareDataForDepartment(project, departmentInfo.getDepartmentName(), 0, 1, String.valueOf(departmentInfo.getId())); compareHikvisionForWorker(project, String.valueOf(departmentInfo.getId()), 2); } } else { //isc存在,平台也存在 HashSet nameSet = new HashSet<>(); teamList.forEach(teamInfo -> nameSet.add(teamInfo.getTeamName())); departmentInfoList.forEach(departmentInfo -> nameSet.add(departmentInfo.getDepartmentName())); listJa.forEach(o -> nameSet.add(((JSONObject) o).getString("orgName"))); Map iscMap = listJa.stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("orgName"), o -> (JSONObject) o, (o, o2) -> o2)); Map myTeamMap = teamList.stream().collect(Collectors.toMap(TeamInfo::getTeamName, Function.identity(), (o, o2) -> o2)); Map myDepartmentMap = departmentInfoList.stream().collect(Collectors.toMap(DepartmentInfo::getDepartmentName, Function.identity(), (o, o2) -> o2)); for (String name : nameSet) { String index; Integer type = null; if (myTeamMap.containsKey(name) && !iscMap.containsKey(name)) { index = String.valueOf(myTeamMap.get(name).getId()); xzHikvisionCompareDataService.addCompareDataForTeam(project, name, 0, 1, index); type = 1; } else if (myDepartmentMap.containsKey(name) && !iscMap.containsKey(name)) { index = String.valueOf(myDepartmentMap.get(name).getId()); xzHikvisionCompareDataService.addCompareDataForDepartment(project, name, 0, 1, index); type = 2; } else if ((!myTeamMap.containsKey(name) && !myDepartmentMap.containsKey(name)) && iscMap.containsKey(name)) { index = iscMap.get(name).getString("orgIndexCode"); xzHikvisionCompareDataService.addCompareDataForTeam(project, name, 1, 0, index); type = 1; } else if (myTeamMap.containsKey(name) && iscMap.containsKey(name)) { //班组存在和isc存在 index = String.valueOf(myTeamMap.get(name).getId()); type = 1; } else { //部门存在和isc存在 index = String.valueOf(myDepartmentMap.get(name).getId()); type = 2; } compareHikvisionForWorker(project, index, type); } } xzHikvisionCompareDataService.addSuccessShow(project.getProjectSn(), "1"); } /** * 对比人员 * * @param project * @param orgIndex * @param type 1班组 2部门 * @throws Exception */ private void compareHikvisionForWorker(Project project, String orgIndex, Integer type) throws Exception { JSONObject param = new JSONObject(); HikvisionUtil.addPageParamIfAbsent(param); param.put("orgIndexCode", orgIndex); JSONObject rtJo = HikvisionUtil.getWorkerListByOrg(project, param); IPage workerPage = workerInfoService.selectWorkerInfoList(new MapBuilder() .put(Cts.PROJECT_SN, project.getProjectSn()) .put(type == 1, Cts.TEAM_ID, orgIndex) .put(type == 2, Cts.DEPARTMENT_ID, orgIndex) .build()); List workerInfoList = workerPage.getRecords(); log.info("数据校验我们平台的人员列表:{}", JSON.toJSONString(workerInfoList)); JSONObject dataJo = HikvisionUtil.getJsonObjectData(rtJo); JSONArray listJa = dataJo.getJSONArray("list"); if (CollUtil.isEmpty(listJa)) { for (WorkerInfo workerInfo : workerInfoList) { xzHikvisionCompareDataService.addCompareDataForWorker(project, workerInfo.getWorkerName(), 0, 1, String.valueOf(workerInfo.getId()), workerInfo.getIdCard()); xzHikvisionCompareDataService.addCompareDataForFace(project, workerInfo.getWorkerName(), 0, 1, String.valueOf(workerInfo.getId()), workerInfo.getIdCard()); } } else { //isc存在,平台也存在 HashSet idCardSet = new HashSet<>(); workerInfoList.forEach(workerInfo -> idCardSet.add(workerInfo.getIdCard())); listJa.forEach(o -> idCardSet.add(((JSONObject) o).getString("certificateNo"))); Map iscMap = listJa.stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("certificateNo"), o -> (JSONObject) o, (o, o2) -> o2)); Map myMap = workerInfoList.stream().collect(Collectors.toMap(WorkerInfo::getIdCard, Function.identity(), (o, o2) -> o2)); for (String idCard : idCardSet) { if (myMap.containsKey(idCard) && !iscMap.containsKey(idCard)) { xzHikvisionCompareDataService.addCompareDataForWorker(project, myMap.get(idCard).getWorkerName(), 0, 1, String.valueOf(myMap.get(idCard).getId()), idCard); WorkerInfo wi = myMap.get(idCard); if (StrUtil.isNotBlank(wi.getFieldAcquisitionUrl())) { xzHikvisionCompareDataService.addCompareDataForFace(project, myMap.get(idCard).getWorkerName(), 0, 1, String.valueOf(myMap.get(idCard).getId()), idCard); } } else if (!myMap.containsKey(idCard) && iscMap.containsKey(idCard)) { xzHikvisionCompareDataService.addCompareDataForWorker(project, iscMap.get(idCard).getString("personName"), 1, 0, iscMap.get(idCard).getString("personId"), idCard); JSONArray ppJa = iscMap.get(idCard).getJSONArray("personPhoto"); if (CollUtil.isNotEmpty(ppJa)) { xzHikvisionCompareDataService.addCompareDataForFace(project, iscMap.get(idCard).getString("personName"), 1, 0, iscMap.get(idCard).getString("personId"), idCard); } } else { //isc存在,平台也存在该人员 boolean myHave = StrUtil.isNotBlank(myMap.get(idCard).getFieldAcquisitionUrl()); boolean iscHave = CollUtil.isNotEmpty(iscMap.get(idCard).getJSONArray("personPhoto")); if (myHave && !iscHave) { xzHikvisionCompareDataService.addCompareDataForFace(project, iscMap.get(idCard).getString("personName"), 0, 1, String.valueOf(myMap.get(idCard).getId()), idCard); } else if (!myHave && iscHave) { xzHikvisionCompareDataService.addCompareDataForFace(project, iscMap.get(idCard).getString("personName"), 1, 0, String.valueOf(myMap.get(idCard).getId()), idCard); } } } } xzHikvisionCompareDataService.addSuccessShow(project.getProjectSn(), "2"); xzHikvisionCompareDataService.addSuccessShow(project.getProjectSn(), "3"); } /** * 对比固定车 * * @param project * @throws Exception */ public void compareHikvisionForFixCar(Project project) throws Exception { JSONObject param = new JSONObject(); HikvisionUtil.addPageParamIfAbsent(param); JSONObject rtJo = HikvisionUtil.getFixCarList(project, param); List carInfoList = carInfoService.selectCarList(new MapBuilder() .put(Cts.PROJECT_SN, project.getProjectSn()) .put("carModuleType", 1) .put("isBlack", 0) .build()); JSONObject dataJo = HikvisionUtil.getJsonObjectData(rtJo); JSONArray listJa = dataJo.getJSONArray("list"); compareAndAddData(project, listJa, carInfoList, 1); } /** * 对比临时车 * * @param project * @throws Exception */ public void compareHikvisionForReservationCar(Project project) throws Exception { JSONObject param = new JSONObject(); HikvisionUtil.addPageParamIfAbsent(param); JSONArray listJa = HikvisionUtil.getIscActiveReservationCarList(null, project); List carInfoList = carInfoService.selectCarList(new MapBuilder() .put(Cts.PROJECT_SN, project.getProjectSn()) .put(Cts.RESERVATION_TYPE, 1) .put("isBlack", 0) .build()); log.info("数据校验我们平台的临时车列表:{}", JSON.toJSONString(carInfoList)); compareAndAddData(project, listJa, carInfoList, 2); } /** * 对边黑名单车 * * @param project * @throws Exception */ public void compareHikvisionForBlackCar(Project project) throws Exception { JSONObject param = new JSONObject(); HikvisionUtil.addPageParamIfAbsent(param); JSONObject jo = new JSONObject(); jo.put("pageNo", 1); jo.put("pageSize", 1000); JSONObject joRs = HikvisionUtil.getBlackCarList(project, jo); JSONObject dataJo = HikvisionUtil.getJsonObjectData(joRs); JSONArray listJa = dataJo.getJSONArray("list"); List carInfoList = carInfoService.selectCarList(new MapBuilder() .put(Cts.PROJECT_SN, project.getProjectSn()) .put("isBlack", 1) .build()); compareAndAddData(project, listJa, carInfoList, 3); } /** * 对比和添加车辆数据 * * @param project * @param listJa * @param carInfoList * @param carIscExistType */ private void compareAndAddData(Project project, JSONArray listJa, List carInfoList, int carIscExistType) { if (CollUtil.isEmpty(listJa)) { for (CarInfo carInfo : carInfoList) { xzHikvisionCompareDataService.addCompareDataForCar(project, carInfo.getCarNumber(), 0, 1, String.valueOf(carInfo.getId()), null); } } else { //isc存在,平台也存在 HashSet carNumberSet = new HashSet<>(); carInfoList.forEach(enterpriseInfo -> carNumberSet.add(enterpriseInfo.getCarNumber())); listJa.forEach(o -> carNumberSet.add(((JSONObject) o).getString("plateNo"))); Map iscMap = listJa.stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("plateNo"), o -> (JSONObject) o, (o, o2) -> o2)); Map myMap = carInfoList.stream().collect(Collectors.toMap(CarInfo::getCarNumber, Function.identity(), (o, o2) -> o2)); for (String carNumber : carNumberSet) { String uniqueId = null; if (myMap.containsKey(carNumber) && !iscMap.containsKey(carNumber)) { uniqueId = String.valueOf(myMap.get(carNumber).getId()); xzHikvisionCompareDataService.addCompareDataForCar(project, carNumber, 0, 1, uniqueId, null); } else if (!myMap.containsKey(carNumber) && iscMap.containsKey(carNumber)) { uniqueId = iscMap.get(carNumber).getString("vehicleId"); xzHikvisionCompareDataService.addCompareDataForCar(project, carNumber, 1, 0, uniqueId, carIscExistType); } } } } }