package com.zhgd.xmgl.task; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; 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.zhgd.redis.lock.RedisRepository; 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.project.entity.Project; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; 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.XzHikvisionCompareData; import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionCompareDataMapper; import com.zhgd.xmgl.modules.xz.service.IXzHikvisionCompareDataService; import com.zhgd.xmgl.util.HikvisionUtil; 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.HashSet; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping("xmgl/task") public class HikvisionTask { @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; /** * 数据校验同步 */ @SchedulerLock(name = "compareData", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5) @Scheduled(cron = "0 0 3 * * ?") @RequestMapping("compareData") public void compareData() throws Exception { List projects = projectMapper.selectList(new LambdaQueryWrapper().eq(Project::getSyncHikvision, 1)); for (Project project : projects) { try { xzHikvisionCompareDataMapper.delete(new LambdaQueryWrapper() .eq(XzHikvisionCompareData::getProjectSn, project.getProjectSn())); compareHikvisionForEnterpriseEtc(project); compareHikvisionForCar(project); } catch (Exception e) { log.error("数据校验同步失败,projectSn:{} ", project.getProjectSn(), e); xzHikvisionCompareDataService.addExceptionShowIfNull(project.getProjectSn()); } } } public void compareHikvisionForCar(Project project) throws Exception { compareHikvisionForFixCar(project); compareHikvisionForReservationCar(project); xzHikvisionCompareDataService.addSuccessShow(project.getProjectSn(), "4"); } public void compareHikvisionForEnterpriseEtc(Project project) throws Exception { //对比企业 JSONObject param = new JSONObject(); HikvisionUtil.addPageParamIfAbsent(param); param.put("parentOrgIndexCode", project.getProjectSn()); JSONObject rtJo = hikvisionCall.getSubOrgListByParentOrg(project, param); List enterpriseInfos = BeanUtil.copyToList(enterpriseInfoService.getEnterpriseInfoList(new MapBuilder().put(Cts.PROJECT_SN, project.getProjectSn()).build()), EnterpriseInfo.class); 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())); } } 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; if (myMap.containsKey(name) && !iscMap.containsKey(name)) { orgIndex = String.valueOf(myMap.get(name).getId()); xzHikvisionCompareDataService.addCompareDataForEnterprise(project, name, 0, 1, orgIndex); } else if (!myMap.containsKey(name) && iscMap.containsKey(name)) { orgIndex = iscMap.get(name).getString("orgIndexCode"); xzHikvisionCompareDataService.addCompareDataForEnterprise(project, name, 1, 0, orgIndex); } else { orgIndex = String.valueOf(myMap.get(name).getId()); } compareHikvisionForDepartmentAndTeamEtc(project, orgIndex); } } xzHikvisionCompareDataService.addSuccessShow(project.getProjectSn(), "1"); } private void compareHikvisionForDepartmentAndTeamEtc(Project project, String orgIndex) throws Exception { JSONObject param = new JSONObject(); HikvisionUtil.addPageParamIfAbsent(param); param.put("parentOrgIndexCode", orgIndex); JSONObject rtJo = hikvisionCall.getSubOrgListByParentOrg(project, param); List teamList = teamInfoService.getProjectTeamList(new MapBuilder() .put(Cts.PROJECT_SN, project.getProjectSn()).put(Cts.ENTERPRISE_ID, orgIndex).build()); List departmentInfoList = departmentInfoMapper.getDepartmentInfoList(new MapBuilder() .put(Cts.PROJECT_SN, project.getProjectSn()).put(Cts.ENTERPRISE_ID, orgIndex).build()); 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 = hikvisionCall.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(); 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); 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); 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"); } 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) .build()); JSONObject dataJo = HikvisionUtil.getJSONObjectData(rtJo); JSONArray listJa = dataJo.getJSONArray("list"); compareAndAddData(project, listJa, carInfoList); } public void compareHikvisionForReservationCar(Project project) throws Exception { JSONObject param = new JSONObject(); HikvisionUtil.addPageParamIfAbsent(param); JSONArray listJa = hikvisionCall.getReservationCarInfoList(null, project); List carInfoList = carInfoService.selectCarList(new MapBuilder() .put(Cts.PROJECT_SN, project.getProjectSn()) .put(Cts.RESERVATION_TYPE, 1) .build()); compareAndAddData(project, listJa, carInfoList); } private void compareAndAddData(Project project, JSONArray listJa, List carInfoList) { if (CollUtil.isEmpty(listJa)) { for (CarInfo carInfo : carInfoList) { xzHikvisionCompareDataService.addCompareDataForCar(project, carInfo.getCarNumber(), 0, 1, String.valueOf(carInfo.getId())); } } 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); } else if (!myMap.containsKey(carNumber) && iscMap.containsKey(carNumber)) { uniqueId = iscMap.get(carNumber).getString("vehicleId"); xzHikvisionCompareDataService.addCompareDataForCar(project, carNumber, 1, 0, uniqueId); } } } } }