package com.zhgd.xmgl.call; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.xuyanwu.spring.file.storage.FileStorageService; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.execption.OpenPromptException; import com.zhgd.redis.lock.RedisRepository; import com.zhgd.xmgl.async.AsyncAiAnalyse; import com.zhgd.xmgl.async.AsyncHikvision; import com.zhgd.xmgl.base.*; import com.zhgd.xmgl.call.entity.ChargeDeletionParam; import com.zhgd.xmgl.constant.Cts; import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; import com.zhgd.xmgl.modules.basicdata.service.UploadFileService; import com.zhgd.xmgl.modules.basicdata.service.impl.NoticeServiceImpl; import com.zhgd.xmgl.modules.car.entity.CarCamera; import com.zhgd.xmgl.modules.car.entity.CarInfo; import com.zhgd.xmgl.modules.car.entity.CarPassRecord; import com.zhgd.xmgl.modules.car.enums.CarInfoCarModuleTypeEnum; import com.zhgd.xmgl.modules.car.mapper.CarCameraMapper; import com.zhgd.xmgl.modules.car.mapper.CarInfoMapper; import com.zhgd.xmgl.modules.car.mapper.CarPassRecordMapper; import com.zhgd.xmgl.modules.car.mapper.CarTypeMapper; import com.zhgd.xmgl.modules.car.service.impl.CarInfoServiceImpl; import com.zhgd.xmgl.modules.car.service.impl.CarPassRecordServiceImpl; import com.zhgd.xmgl.modules.frontierprotectionnonet.entity.FrontierProtectionNoNetData; import com.zhgd.xmgl.modules.frontierprotectionnonet.mapper.FrontierProtectionNoNetDevMapper; import com.zhgd.xmgl.modules.frontierprotectionnonet.service.IFrontierProtectionNoNetDevService; import com.zhgd.xmgl.modules.frontierprotectionnonet.service.impl.FrontierProtectionNoNetDataServiceImpl; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.entity.vo.ProjectInfoExtVo; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.modules.project.service.IProjectUfaceConfigService; import com.zhgd.xmgl.modules.project.service.impl.ProjectServiceImpl; import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareAlarmRecord; import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareRecord; import com.zhgd.xmgl.modules.video.mapper.AiAnalyseHardWareAlarmRecordMapper; import com.zhgd.xmgl.modules.video.mapper.AiAnalyseHardWareRecordMapper; import com.zhgd.xmgl.modules.video.service.IAiAnalyseHardWareAlarmRecordService; import com.zhgd.xmgl.modules.video.service.IAiAnalyseHardWareRecordService; import com.zhgd.xmgl.modules.worker.entity.*; import com.zhgd.xmgl.modules.worker.enums.WorkerInfoPersonTypeEnum; import com.zhgd.xmgl.modules.worker.mapper.EnterpriseInfoMapper; import com.zhgd.xmgl.modules.worker.mapper.UfaceDevMapper; import com.zhgd.xmgl.modules.worker.mapper.WorkerAttendanceMapper; import com.zhgd.xmgl.modules.worker.mapper.WorkerInfoMapper; import com.zhgd.xmgl.modules.worker.service.IUfaceDevService; import com.zhgd.xmgl.modules.worker.service.IWorkerAttendancePresenceService; import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService; import com.zhgd.xmgl.modules.worker.service.impl.EnterpriseInfoServiceImpl; import com.zhgd.xmgl.modules.worker.service.impl.WorkerAttendanceServiceImpl; import com.zhgd.xmgl.modules.xz.entity.XzHikvisionSync; import com.zhgd.xmgl.modules.xz.enums.XzHikvisionSyncBigTypeEnum; import com.zhgd.xmgl.modules.xz.enums.XzHikvisionSyncOperateEnum; import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionCompareDataMapper; import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionSyncMapper; import com.zhgd.xmgl.modules.xz.service.IXzHikvisionCompareDataService; import com.zhgd.xmgl.modules.xz.service.impl.XzHikvisionSyncServiceImpl; import com.zhgd.xmgl.security.entity.UserInfo; import com.zhgd.xmgl.util.*; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Async; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping("/xmgl/hikvision") public class HikvisionCall { public static final String SUC_CODE = "0"; public static final String EVENT_IAS = "event_ias"; public static final String X_00052102 = "0x00052102"; public static final String CODE = "code"; public static final String X_00072202 = "0x00072202"; public static final String X_02_E_33900 = "0x02e33900"; public static final String X_02_E_33400 = "0x02e33400"; public static final String X_00072003 = "0x00072003"; public static final String X_00052301 = "0x00052301"; public static final String MSG = "msg"; public static final String DATA = "data"; public static final String X_00072002 = "0x00072002"; public static final String FAIL = "失败"; public static final String SUC = "成功"; public static final String X_15403007 = "0x15403007"; public static final String X_02401033 = "0x02401033"; public static final String LIST = "list"; public static final String EVENT_PMS = "event_pms"; public static final String EVENT_VSS = "event_vss"; private static final String FIXED_CAR_GROUP_NAME = "业主车辆"; public AsyncHikvision asyncHikvision; @Autowired XzHikvisionSyncServiceImpl xzHikvisionSyncService; @Lazy @Autowired UploadFileService uploadFileService; @Lazy @Autowired ProjectServiceImpl projectService; @Lazy @Autowired FileStorageService fileStorageService; @Lazy @Autowired CarPassRecordServiceImpl carPassRecordService; @Lazy @Autowired HikvisionCall hikvisionCall; @Lazy @Autowired CarInfoServiceImpl carInfoService; @Autowired @Lazy EnterpriseInfoServiceImpl enterpriseInfoService; @Lazy @Autowired private XzHikvisionCompareDataMapper xzHikvisionCompareDataMapper; @Lazy @Autowired private AiAnalyseHardWareAlarmRecordMapper aiAnalyseHardWareAlarmRecordMapper; @Lazy @Autowired private AsyncAiAnalyse asyncAiAnalyse; @Value("${upload.image.url.prefix:}") private String imageUrlPrefix; @Value("${basePath:}") private String basePath; @Autowired @Lazy private ProjectMapper projectMapper; @Autowired @Lazy private RedisRepository redisRepository; @Autowired @Lazy private EnterpriseInfoMapper enterpriseInfoMapper; @Autowired @Lazy private NoticeServiceImpl noticeService; @Autowired @Lazy private IWorkerAttendanceService workerAttendanceService; @Autowired @Lazy private WorkerAttendanceMapper workerAttendanceMapper; @Autowired @Lazy private IWorkerAttendancePresenceService workerAttendancePresenceService; @Autowired @Lazy private WorkerInfoMapper workerInfoMapper; @Autowired @Lazy private CarCameraMapper carCameraMapper; @Autowired @Lazy private CarPassRecordMapper carPassRecordMapper; @Autowired @Lazy private CarTypeMapper carTypeMapper; @Autowired @Lazy private CarInfoMapper carInfoMapper; @Autowired @Lazy private WorkerAttendanceServiceImpl workerAttendanceServiceImpl; @Autowired private UfaceDevMapper ufaceDevMapper; @Autowired private XzHikvisionSyncMapper xzHikvisionSyncMapper; @Autowired private IAiAnalyseHardWareRecordService aiAnalyseHardWareRecordService; @Autowired private IFrontierProtectionNoNetDevService frontierProtectionNoNetDevService; @Lazy @Autowired private IAiAnalyseHardWareAlarmRecordService aiAnalyseHardWareAlarmRecordService; @Lazy @Autowired private AiAnalyseHardWareRecordMapper aiAnalyseHardWareRecordMapper; @Lazy @Autowired private FrontierProtectionNoNetDevMapper frontierProtectionNoNetDevMapper; @Lazy @Autowired private FrontierProtectionNoNetDataServiceImpl frontierProtectionNoNetDataService; @Lazy @Autowired private IXzHikvisionCompareDataService xzHikvisionCompareDataService; @Lazy @Resource private IUfaceDevService ufaceDevService; @Lazy @Resource private IProjectUfaceConfigService projectUfaceConfigService; @Lazy @Autowired private ISystemUserService systemUserService; /** * 获取图片 * * @param rq * @param artemisConfigHost * @param artemisConfigAppKey * @param artemisConfigAppSecret * @return */ public static String getHikvisionEventsPicture(HikvisionEventsPictureRq rq, String artemisConfigHost, String artemisConfigAppKey, String artemisConfigAppSecret) throws Exception { if (StrUtil.isBlank(rq.getPicUri()) || StrUtil.isBlank(rq.getSvrIndexCode())) { return null; } final String artemisPath = "/artemis"; final String path = artemisPath + "/api/video/v1/events/picture"; String host = "https://" + artemisConfigHost; String body = JSONObject.toJSONString(rq); String rs = HikvisionUtil.doPost(host, path, body, null, artemisConfigAppKey, artemisConfigAppSecret); JSONObject rsJo = JSONObject.parseObject(rs); String code = rsJo.getString(CODE); if (Objects.equals(code, SUC_CODE)) { return rsJo.getJSONObject(DATA).getString("picUrl"); } return null; } public static String getWorkerJson(WorkerInfo workerInfo) { JSONObject jsonBody = new JSONObject(); jsonBody.put("personId", workerInfo.getId()); jsonBody.put("personName", workerInfo.getWorkerName()); jsonBody.put("gender", workerInfo.getSex()); jsonBody.put("orgIndexCode", getOrgIndexCode(workerInfo)); jsonBody.put("birthday", workerInfo.getBirthday()); jsonBody.put("phoneNo", workerInfo.getPhoneNumber()); jsonBody.put("email", workerInfo.getPersonMail()); jsonBody.put("certificateType", "111"); jsonBody.put("certificateNo", workerInfo.getIdCard()); jsonBody.put("jobNo", workerInfo.getPersonSn()); return jsonBody.toJSONString(); } private static String getOrgIndexCode(WorkerInfo workerInfo) { if (workerInfo == null) { return null; } if (Objects.equals(workerInfo.getPersonType(), WorkerInfoPersonTypeEnum.LW.getValue())) { return String.valueOf(workerInfo.getTeamId()); } else if (Objects.equals(workerInfo.getPersonType(), WorkerInfoPersonTypeEnum.GL.getValue())) { return String.valueOf(workerInfo.getDepartmentId()); } else if (Objects.equals(workerInfo.getPersonType(), WorkerInfoPersonTypeEnum.LS.getValue())) { return String.valueOf(workerInfo.getProjectSn()); } return null; } @ApiOperation(value = "海康事件回调", notes = "海康事件回调", httpMethod = "POST") @PostMapping(value = "/eventCallback") public Result eventCallback(@ApiIgnore @RequestBody JSONObject jsonObject) { log.info("海康事件回调:{}", JSON.toJSONString(jsonObject)); String method = jsonObject.getString("method"); String ability1 = jsonObject.getString("ability"); String onEventNotify = "OnEventNotify"; if (Objects.equals(method, onEventNotify)) { JSONObject paramsJo = jsonObject.getJSONObject("params"); String ability = paramsJo.getString("ability"); String eventAcs = "event_acs"; if (Objects.equals(ability, eventAcs)) { log.info("人员通行记录事件"); //人员通行记录 JSONArray eventsJa = paramsJo.getJSONArray("events"); if (eventsJa != null) { for (int i = 0; i < eventsJa.size(); i++) { JSONObject jo1 = eventsJa.getJSONObject(i); JSONObject dataJo = jo1.getJSONObject(DATA); String extEventPersonNo = dataJo.getString("ExtEventPersonNo"); WorkerInfo workerInfo = workerInfoMapper.selectById(extEventPersonNo); if (workerInfo == null) { log.info("未找到该人员信息,extEventPersonNo:{}", extEventPersonNo); return Result.error("未找到该人员信息,extEventPersonNo:" + extEventPersonNo); } String happenTime = jo1.getString("happenTime"); String extEventCardNo = dataJo.getString("ExtEventCardNo"); String srcIndex = jo1.getString("srcIndex"); Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, workerInfo.getProjectSn())); String idCard = workerInfo.getIdCard(); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { log.info("未配置,idCard:{},extEventCardNo:{}", idCard, extEventCardNo); return Result.error("未配置,idCard:" + idCard + ",extEventCardNo:" + extEventCardNo); } QueryWrapper devQueryWrapper = new QueryWrapper<>(); devQueryWrapper.lambda().eq(UfaceDev::getDevSn, srcIndex).eq(UfaceDev::getProjectSn, workerInfo.getProjectSn()); UfaceDev ufaceDev = ufaceDevMapper.selectOne(devQueryWrapper); if (ufaceDev == null) { log.error("请先上传对应设备信息,idCard:{},devSN:{}", idCard, srcIndex); return Result.error("请先上传对应设备信息,idCard:" + idCard + ",extEventCardNo:" + extEventCardNo); } String time = DateUtil.formatDateTime(DateUtil.parse(happenTime)); Integer count = workerAttendanceMapper.selectCount(new LambdaQueryWrapper() .eq(WorkerAttendance::getPersonSn, workerInfo.getPersonSn()) .eq(WorkerAttendance::getCreateTime, time) ); if (count != 0) { continue; } int passType = workerAttendanceServiceImpl.getPassType(ufaceDev, time); hikvisionCall.saveEventCallbackAttendanceAsync(dataJo, workerInfo, srcIndex, project, idCard, time, passType); } } } else if (Objects.equals(ability, EVENT_PMS)) { log.info("车辆出入场事件"); //车辆入场压线(放行)、出场压线(放行) JSONArray eventsJa = paramsJo.getJSONArray("events"); if (eventsJa != null) { for (int i = 0; i < eventsJa.size(); i++) { JSONObject jo1 = eventsJa.getJSONObject(i); JSONObject dataJo = jo1.getJSONObject(DATA); Integer status = jo1.getInteger("status"); String srcIndex = jo1.getString("srcIndex"); Long eventType = jo1.getLong("eventType"); String plateNo = dataJo.getString("plateNo"); if (!Objects.equals(status, 5)) { log.info("status!=5没有图片的不记录,cameraId:{},plateNo:{}", srcIndex, plateNo); continue; } CarCamera carCamera = carCameraMapper.selectOne(new LambdaQueryWrapper() .eq(CarCamera::getCameraId, srcIndex)); if (carCamera == null) { log.info("海康回调车辆相机设备不存在:CameraId:{}", srcIndex); return Result.error("海康回调车辆相机设备不存在:CameraId:" + srcIndex); } Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, carCamera.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { String cameraId = carCamera.getCameraId(); log.info("海康事件车辆入场压线的project不存在,cameraId:{}", cameraId); return Result.error("海康事件车辆入场压线的project不存在,cameraId:" + cameraId); } String time = DateUtil.formatDateTime(DateUtil.parse(dataJo.getString("time"))); if (eventType == 771760134 || eventType == 771760131) { //出入场放行,不通过这个判断车辆是否通行 //CarPassRecord carPassRecord = carPassRecordMapper.getNewestlineBreakingEvent(plateNo, time); //if (carPassRecord == null) { // log.info("海康回调出入场放行的压线不存在:plateNo:{}", plateNo); // return Result.error(""); //} //carPassRecord.setIsOpen(1); //carPassRecordMapper.updateById(carPassRecord); } else if (eventType == 771760130 || eventType == 771760133) { //压线事件 hikvisionCall.saveEventCallbackCarPassRecordAsync(dataJo, srcIndex, plateNo, carCamera, project, time); } } } } else if (Objects.equals(ability, EVENT_IAS)) { addFrontierProtectionNoNetData(paramsJo); } else if (Objects.equals(ability, "")) { log.info("告警=======" + paramsJo); JSONArray eventsArray = paramsJo.getJSONArray("events"); if (eventsArray.size() > 0) { JSONObject dataEvent = eventsArray.getJSONObject(0); JSONArray eventDetails = dataEvent.getJSONArray("eventDetails"); JSONObject eventDetail = eventDetails.getJSONObject(0); ability = eventDetail.getString("ability"); if (Objects.equals(ability, EVENT_VSS)) { log.info("AI识别告警=======" + paramsJo); //摄像机名称 String srcName = eventDetail.getString("srcName"); //422000003 String eventType = eventDetail.getString("eventType"); JSONObject data = eventDetail.getJSONObject(DATA); //海康AI图片地址 String imageUrl = data.getString("url"); //海康AI图片地址 String srcIndex = eventDetail.getString("srcIndex"); AiAnalyseHardWareRecord dev = aiAnalyseHardWareRecordMapper.selectOne(new LambdaQueryWrapper() .eq(AiAnalyseHardWareRecord::getHardwareId, srcIndex)); if (dev == null) { log.error("未查到AI识别告警设备,设备id:{}", srcIndex); return null; } hikvisionCall.saveEventCallbackAiAsync(dataEvent, srcName, eventType, imageUrl, srcIndex, dev); } else if (Objects.equals(ability, EVENT_IAS)) { log.info("临边防护告警=======" + paramsJo); String srcName = eventDetail.getString("srcName"); String srcParentIndex = dataEvent.getString("srcParentIndex"); String happenTime = dataEvent.getString("happenTime"); String ds = srcName + "报警"; FrontierProtectionNoNetData data1 = new FrontierProtectionNoNetData(); data1.setDevSn(srcParentIndex); data1.setAlarmTime(DateUtil.parse(happenTime)); data1.setDeviceStatus(1); data1.setDetailStatus(ds); data1.setDescription(ds); frontierProtectionNoNetDataService.add(data1); } } } } else if (Objects.equals(ability1, EVENT_IAS)) { addFrontierProtectionNoNetData(jsonObject); } return Result.ok(); } /** * 添加红外对射预警数据 * * @param paramsJo */ private void addFrontierProtectionNoNetData(JSONObject paramsJo) { log.info("临边防护告警事件========" + paramsJo); JSONArray eventsJa = paramsJo.getJSONArray("events"); JSONObject dataEvent = eventsJa.getJSONObject(0); hikvisionCall.saveEventCallbackIasAsync(dataEvent); } /** * 异步添加红外对射预警数据 * * @param dataEvent */ @Async("saveEventCallbackAiAsync") public void saveEventCallbackIasAsync(JSONObject dataEvent) { String devCode = dataEvent.getString("srcIndex"); String happenTime = dataEvent.getString("happenTime"); Date createTime = DateUtil.parse(happenTime); Integer count = frontierProtectionNoNetDataService.count(new LambdaQueryWrapper() .eq(FrontierProtectionNoNetData::getCreateTime, createTime) .eq(FrontierProtectionNoNetData::getDevSn, devCode)); if (count > 0) { log.info("重复的红外对射预警数据不保存,deviceID:{},createTime:{}", devCode, createTime); return; } FrontierProtectionNoNetData data1 = new FrontierProtectionNoNetData(); data1.setDevSn(devCode); data1.setAlarmTime(DateUtil.parse(happenTime)); data1.setDeviceStatus(1); data1.setDetailStatus(dataEvent.getString("srcName") + "-" + dataEvent.getString(DATA)); data1.setDescription(data1.getDescription()); frontierProtectionNoNetDataService.add(data1); } /** * 异步添加ai数据 * * @param dataEvent * @param srcName * @param eventType * @param imageUrl * @param deviceId * @param dev */ @Async("saveEventCallbackAiAsync") public void saveEventCallbackAiAsync(JSONObject dataEvent, String srcName, String eventType, String imageUrl, String deviceId, AiAnalyseHardWareRecord dev) { String happenTime = dataEvent.getString("happenTime"); String createTime = DateUtil.formatDateTime(DateUtil.parse(happenTime)); Integer count = aiAnalyseHardWareAlarmRecordMapper.selectCount(new LambdaQueryWrapper() .eq(AiAnalyseHardWareAlarmRecord::getCreateTime, createTime) .eq(AiAnalyseHardWareAlarmRecord::getHardwareId, deviceId) ); if (count > 0) { log.info("重复的ai预警数据不保存,deviceID:{},createTime:{}", deviceId, createTime); return; } ProjectInfoExtVo projectInfoBySn = projectService.getProjectInfoBySn(dev.getProjectSn()); AiAnalyseHardWareAlarmRecord record = new AiAnalyseHardWareAlarmRecord(); record.setCreateTime(createTime); record.setAlarmType(Integer.valueOf(eventType)); record.setHardwareId(deviceId); record.setHardwareName(dev.getHardwareName()); record.setLocation(srcName); record.setAlarmDesc(record.getLocation()); record.setProjectSn(dev.getProjectSn()); record.setStatus(1); String relativePath = projectInfoBySn.getProjectName() + "/" + DateUtil.today(); try { record.setImageUrl(uploadFileService.uploadUrlReturnFileName(imageUrl, relativePath)); } catch (Exception e) { log.error("ai预警图片保存失败:", e); } aiAnalyseHardWareAlarmRecordMapper.insert(record); //将数据通过MQTT转发到前台 asyncAiAnalyse.sendAiAnalyse(record, Cts.PROJECT_LEVEL_AND_CHILDREN); } /*** * 异步添加车辆通行数据 * @param dataJo * @param srcIndex * @param plateNo * @param carCamera * @param project * @param time */ @Async("saveEventCallbackCarPassRecord") public void saveEventCallbackCarPassRecordAsync(JSONObject dataJo, String srcIndex, String plateNo, CarCamera carCamera, Project project, String time) { CarPassRecord carPassRecord = new CarPassRecord(); carPassRecord.setCarNumber(plateNo); carPassRecord.setType(getPassType(carCamera.getPassType())); carPassRecord.setPassTime(time); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(CarPassRecord::getCarNumber, plateNo) .eq(CarPassRecord::getPassTime, time); Integer count = carPassRecordMapper.selectCount(queryWrapper); if (count != 0) { log.info("重复的车辆通行的数据不保存,plateNo:{},time:{}", plateNo, time); return; } try { //车牌 JSONObject picUrlJo = dataJo.getJSONObject("picUrl"); String svrIndex = dataJo.getString("svrIndex"); String vehiclePicUrl = picUrlJo.getString("vehiclePicUrl"); String platePicUrl = picUrlJo.getString("platePicUrl"); if (StringUtils.isNotBlank(platePicUrl)) { carPassRecord.setImageUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(svrIndex, platePicUrl), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); } if (StringUtils.isNotBlank(vehiclePicUrl)) { carPassRecord.setPanoramaUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(svrIndex, vehiclePicUrl), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); } } catch (Exception e) { log.error("error:", e); } carPassRecord.setCarColor(getCarColor(dataJo.getInteger("plateColor"))); carPassRecord.setLocation(carCamera.getCameraName()); carPassRecord.setProjectSn(carCamera.getProjectSn()); carPassRecord.setColor(getColor(dataJo.getInteger("vehicleColor"))); carPassRecord.setCameraId(srcIndex); List carInfos = carInfoMapper.selectList(new LambdaQueryWrapper() .eq(CarInfo::getProjectSn, carCamera.getProjectSn()) .eq(CarInfo::getCarNumber, plateNo) .eq(CarInfo::getIsBlack, 0) ); if (CollUtil.isNotEmpty(carInfos)) { carPassRecord.setIsOpen(1); } else { carPassRecord.setIsOpen(0); } carPassRecordMapper.insert(carPassRecord); //车进场后,意味着绑定的司机走过了人脸机,统计为在场人员。车辆出场后,在场人员随之减少 if (carInfos.size() != 0 && carInfos.get(0) != null && (StringUtils.isNotEmpty(carInfos.get(0).getDriverWorkerId()) || StringUtils.isNotEmpty(carInfos.get(0).getOutsideDriverIdCard()))) { log.info("保存车辆绑定的司机的通行数据,车牌号:{}", carInfos.get(0).getCarNumber()); carPassRecordService.saveDriverPassData(carPassRecord, carInfos.get(0)); } } /** * 异步保存人员通行数据 * * @param dataJo * @param workerInfo * @param srcIndex * @param project * @param idCard * @param time * @param passType */ @Async("saveEventCallbackAttendance") public void saveEventCallbackAttendanceAsync(JSONObject dataJo, WorkerInfo workerInfo, String srcIndex, Project project, String idCard, String time, int passType) { HashMap map = new HashMap<>(16); map.put("passTime", time); map.put("idCard", idCard); map.put("attendanceNumber", workerInfo.getAttendanceNumber()); map.put("direction", passType); map.put("passType", 2); map.put("projectCode", workerInfo.getProjectSn()); map.put("devCode", srcIndex); Integer count = workerAttendanceMapper.selectCount(new LambdaQueryWrapper() .eq(WorkerAttendance::getCreateTime, time) .eq(WorkerAttendance::getPersonSn, workerInfo.getPersonSn()) ); if (count != 0) { log.info("重复的人员通行的数据不保存,idCard:{},time:{}", idCard, time); return; } try { String extEventPictureUrl = dataJo.getString("ExtEventPictureURL"); String svrIndexCode = dataJo.getString("svrIndexCode"); HikvisionEventsPictureRq rq = new HikvisionEventsPictureRq(); rq.setPicUri(extEventPictureUrl); rq.setSvrIndexCode(svrIndexCode); map.put("faceUrl", saveToLocal(getHikvisionEventsPicture(rq, project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); } catch (Exception e) { log.error("error:", e); } workerAttendanceService.saveExternalPassRecord(map); } @ApiOperation(value = "按事件类型订阅事件", notes = "按事件类型订阅事件", httpMethod = "POST") @PostMapping(value = "/subscribeEvent") public Result subscribeEvent(@ApiIgnore @RequestBody SubscribeEventQo qo) throws Exception { final String artemisPath = "/artemis"; final String path = artemisPath + "/api/eventService/v1/eventSubscriptionByEventTypes"; String host = "https://" + qo.getArtemisConfigHost(); String rs = HikvisionUtil.doPost(host, path, JSON.toJSONString(qo), null, qo.getArtemisConfigAppKey(), qo.getArtemisConfigAppSecret()); return Result.ok(); } @ApiOperation(value = "服务挂了主动获取门禁点事件的人员通行记录", notes = "服务挂了主动获取门禁点事件的人员通行记录", httpMethod = "POST") @ApiImplicitParams({ @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "body", required = true, dataType = "String"), }) @PostMapping(value = "/getDoorEvents") public Result getDoorEvents(@ApiIgnore @RequestBody HashMap paramMap) { String startTime = MapUtils.getString(paramMap, "startTime"); String endTime = MapUtils.getString(paramMap, "endTime"); DateUtils.checkLegalDate19(startTime); DateUtils.checkLegalDate19(endTime); JSONObject param = new JSONObject(); param.put("startTime", DateUtils.getISO8601Str(DateUtil.parse(startTime))); param.put("endTime", DateUtils.getISO8601Str(DateUtil.parse(endTime))); String projectSn = MapUtils.getString(paramMap, "projectSn"); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(Project::getSyncHikvision, 1); if (StringUtils.isNotBlank(projectSn)) { queryWrapper.eq(Project::getProjectSn, projectSn); } List projects = projectMapper.selectList(queryWrapper); if (CollUtil.isEmpty(projects)) { return Result.error("项目未配置海康同步功能"); } getDoorEventsAsync(startTime, endTime, param, projectSn, projects); return Result.ok("已在后台同步人员数据,请耐心等待!"); } /** * 获取门禁事件的数据 * * @param startTime * @param endTime * @param param * @param projectSn * @param projects */ @Async("getDoorEvents") public void getDoorEventsAsync(String startTime, String endTime, JSONObject param, String projectSn, List projects) { for (Project project : projects) { List ufaceDevs = ufaceDevMapper.selectList(new LambdaQueryWrapper() .eq(UfaceDev::getProjectSn, project.getProjectSn())); for (UfaceDev ufaceDev : ufaceDevs) { param.put("doorIndexCodes", Collections.singletonList(ufaceDev.getDevSn())); param.put(Cts.PAGE_NO, 0); param.put("pageSize", 1000); Integer total = 0; JSONArray listJa = new JSONArray(); do { String rs = null; param.put("pageNo", param.getIntValue("pageNo") + 1); try { rs = HikvisionUtil.getDoorEvents(project, param); } catch (Exception e) { log.error("err:", e); return; } JSONObject joData = HikvisionUtil.getJsonObjectData(rs); if (joData != null) { total = joData.getInteger("total"); if (!Objects.equals(total, 0)) { listJa = joData.getJSONArray(LIST); for (int i = 0; i < listJa.size(); i++) { JSONObject listJo = listJa.getJSONObject(i); String eventTime = listJo.getString("eventTime"); String personId = listJo.getString("personId"); String personName = listJo.getString("personName"); String doorIndexCode = listJo.getString("doorIndexCode"); String picUri = listJo.getString("picUri"); String svrIndexCode = listJo.getString("svrIndexCode"); WorkerInfo workerInfo = workerInfoMapper.selectById(personId); if (workerInfo == null) { log.error("未找到该人员信息,personName:{}", personName); continue; } HashMap map = new HashMap<>(16); String time = DateUtil.formatDateTime(DateUtil.parse(eventTime)); map.put("passTime", time); map.put("idCard", workerInfo.getIdCard()); map.put("attendanceNumber", workerInfo.getAttendanceNumber()); int passType = workerAttendanceServiceImpl.getPassType(ufaceDev, time); map.put("direction", passType); map.put("passType", 2); map.put("projectCode", workerInfo.getProjectSn()); map.put("devCode", doorIndexCode); Integer count = workerAttendanceMapper.selectCount(new LambdaQueryWrapper() .eq(WorkerAttendance::getCreateTime, time) .eq(WorkerAttendance::getPersonSn, workerInfo.getPersonSn()) ); if (count != 0) { log.info("重复的人员通行的数据不保存,idCard:{},time:{}", workerInfo.getIdCard(), time); continue; } try { HikvisionEventsPictureRq rq = new HikvisionEventsPictureRq(); rq.setPicUri(picUri); rq.setSvrIndexCode(svrIndexCode); map.put("faceUrl", saveToLocal(getHikvisionEventsPicture(rq, project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); } catch (Exception e) { log.error("主动获取人脸图片失败>", e); } workerAttendanceService.saveExternalPassRecord(map); } } } } while (total > param.getInteger(Cts.PAGE_NO) * 1000); } } log.info("服务挂了主动获取门禁点事件的人员通行记录执行完成,startTime:{},endTime:{}", startTime, endTime); } @ApiOperation(value = "服务挂了主动获取查询过车记录", notes = "服务挂了主动获取查询过车记录", httpMethod = "POST") @ApiImplicitParams({ @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = false, dataType = "String"), @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "body", required = true, dataType = "String"), }) @PostMapping(value = "/getCrossRecords") public Result getCrossRecords(@ApiIgnore @RequestBody HashMap paramMap) { String startTime = MapUtils.getString(paramMap, "startTime"); String endTime = MapUtils.getString(paramMap, "endTime"); DateUtils.checkLegalDate19(startTime); DateUtils.checkLegalDate19(endTime); JSONObject param = new JSONObject(); param.put("startTime", DateUtils.getISO8601Str(DateUtil.parse(startTime))); param.put("endTime", DateUtils.getISO8601Str(DateUtil.parse(endTime))); String projectSn = MapUtils.getString(paramMap, "projectSn"); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(Project::getSyncHikvision, 1); if (StringUtils.isNotBlank(projectSn)) { queryWrapper.eq(Project::getProjectSn, projectSn); } List projects = projectMapper.selectList(queryWrapper); if (CollUtil.isEmpty(projects)) { return Result.error("项目未配置海康同步功能"); } hikvisionCall.getCrossRecordsAsync(startTime, endTime, param, projects); return Result.ok("已在后台同步车辆通行数据,请耐心等待!"); } /** * 异步同步车辆通行数据 * * @param startTime * @param endTime * @param param * @param projects */ @Async("getCrossRecords") public void getCrossRecordsAsync(String startTime, String endTime, JSONObject param, List projects) { for (Project project : projects) { String projectParkCode = null; try { projectParkCode = HikvisionUtil.getProjectParkCode(project); } catch (Exception e) { log.error("err:", e); return; } param.put("parkSyscode", projectParkCode); Integer total = 0; JSONArray listJa = new JSONArray(); param.put(Cts.PAGE_NO, 0); do { String rs = null; param.put(Cts.PAGE_NO, param.getIntValue(Cts.PAGE_NO) + 1); try { rs = HikvisionUtil.getCrossRecords(project, param); } catch (Exception e) { log.error("err:", e); return; } JSONObject joData = HikvisionUtil.getJsonObjectData(rs); if (joData != null) { total = joData.getInteger("total"); if (!Objects.equals(total, 0)) { listJa = joData.getJSONArray(LIST); for (int i = 0; i < listJa.size(); i++) { JSONObject listJo = listJa.getJSONObject(i); String plateNo = listJo.getString("plateNo"); String roadwaySyscode = listJo.getString("roadwaySyscode"); String aswSyscode = listJo.getString("aswSyscode"); String crossTime = listJo.getString("crossTime"); String time = DateUtil.formatDateTime(DateUtil.parse(crossTime)); String plateNoPicUri = listJo.getString("plateNoPicUri"); String vehiclePicUri = listJo.getString("vehiclePicUri"); CarCamera carCamera = carCameraMapper.selectOne(new LambdaQueryWrapper() .eq(CarCamera::getCameraId, roadwaySyscode)); if (carCamera == null) { log.info("海康车辆相机设备不存在:CameraId:{}", roadwaySyscode); continue; } CarPassRecord carPassRecord = new CarPassRecord(); carPassRecord.setCarNumber(plateNo); carPassRecord.setType(getPassType(carCamera.getPassType())); carPassRecord.setPassTime(time); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(CarPassRecord::getCarNumber, plateNo) .eq(CarPassRecord::getPassTime, time); Integer count = carPassRecordMapper.selectCount(queryWrapper); if (count != 0) { log.info("重复的车辆通行的数据不保存,plateNo:{},time:{}", plateNo, time); continue; } try { //车牌 carPassRecord.setImageUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(aswSyscode, plateNoPicUri), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); carPassRecord.setPanoramaUrl(saveToLocal(getHikvisionEventsPicture(new HikvisionEventsPictureRq(aswSyscode, vehiclePicUri), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); } catch (Exception e) { log.error("error:", e); } carPassRecord.setCarColor(getCarColor(listJo.getInteger("plateColor"))); carPassRecord.setLocation(carCamera.getCameraName()); carPassRecord.setProjectSn(carCamera.getProjectSn()); carPassRecord.setColor(getColor(listJo.getInteger("vehicleColor"))); carPassRecord.setCameraId(roadwaySyscode); List carInfos = carInfoMapper.selectList(new LambdaQueryWrapper() .eq(CarInfo::getProjectSn, carCamera.getProjectSn()) .eq(CarInfo::getCarNumber, plateNo) .eq(CarInfo::getIsBlack, 0) ); if (CollUtil.isNotEmpty(carInfos)) { carPassRecord.setIsOpen(1); } else { carPassRecord.setIsOpen(0); } carPassRecordMapper.insert(carPassRecord); //车进场后,意味着绑定的司机走过了人脸机,统计为在场人员。车辆出场后,在场人员随之减少 if (carInfos.size() != 0 && carInfos.get(0) != null && (StringUtils.isNotEmpty(carInfos.get(0).getDriverWorkerId()) || StringUtils.isNotEmpty(carInfos.get(0).getOutsideDriverIdCard()))) { log.info("保存车辆绑定的司机的通行数据,车牌号:{}", carInfos.get(0).getCarNumber()); carPassRecordService.saveDriverPassData(carPassRecord, carInfos.get(0)); } } } } } while (total > param.getInteger(Cts.PAGE_NO) * 1000); } log.info("服务挂了主动获取车辆事件的车辆通行记录执行完成,startTime:{},endTime:{}", startTime, endTime); } /** * 获取车辆颜色 * * @param plateColor * @return */ private String getColor(Integer plateColor) { if (plateColor == null) { return null; } switch (plateColor) { case 0: return "其他颜色"; case 1: return "白色"; case 2: return "银色"; case 3: return "灰色"; case 4: return "黑色"; case 5: return "红色"; case 6: return "深蓝色"; case 7: return "蓝色"; case 8: return "黄色"; case 9: return "绿色"; case 10: return "棕色"; case 11: return "粉色"; case 12: return "紫色"; case 13: return "深灰"; case 14: return "杏色"; case 255: return "未识别的车辆颜色"; default: } return null; } /** * 车牌颜色 * * @param plateColor * @return */ private String getCarColor(Integer plateColor) { if (plateColor == null) { return null; } switch (plateColor) { case 0: return "蓝色"; case 1: return "黄色"; case 2: return "白色"; case 3: return "黑色"; case 4: return "绿色"; case 5: return "民航黑色"; case 255: return "其他颜色"; default: } return null; } /** * 获取进出类型 * * @param passType * @return */ private Integer getPassType(Integer passType) { if (passType == null) { return null; } //1进,2出 switch (passType) { case 1: return 0; case 2: return 1; default: } return null; } /** * 添加人员 * * @param workerInfo * @param isSaveWorker * @param isSaveWorkerFace */ public void addWorkerForHikvision(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, workerInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } if (isSaveWorker) { addWorkerFromHttp(workerInfo, project); } if (isSaveWorkerFace) { saveWorkerFace(workerInfo, project); } } /** * 添加人员 * * @param workerInfo * @param project * @throws Exception */ public void addWorkerFromHttp(WorkerInfo workerInfo, Project project) throws Exception { String rs = HikvisionUtil.addWorker(workerInfo, project); sendNoticeAndSetStatusForWorker("添加人员到海康isc", rs, workerInfo, 1, 1, true); } /** * 保存人员 * * @param workerInfo * @param isSaveWorker * @param isSaveWorkerFace */ public void saveWorker(WorkerInfo workerInfo, boolean isSaveWorker, boolean isSaveWorkerFace) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, workerInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } //idcard, // 存在: // person一样,更新 // person不一样,删除,再新增 // 不存在: // 新增 JSONObject wiJo = HikvisionUtil.getWorkerInfoByCertificateNo(workerInfo, project); if (wiJo != null) { String iscPersonId = wiJo.getString("personId"); if (Objects.equals(iscPersonId, workerInfo.getId() + "")) { if (isSaveWorker) { editWorkerFromHttp(workerInfo, project); } if (isSaveWorkerFace) { saveWorkerFace(workerInfo, project); } } else { //海康门禁isc List ufaceDevs = ufaceDevService.getAllDevsByProjectSn(workerInfo.getProjectSn()); projectUfaceConfigService.buildAndSendOneWorkerForHk(ufaceDevs, workerInfo, 3, workerInfo.getProjectSn(), false); deleteWorkerForHikvision(iscPersonId + "", workerInfo, false); addWorkerForHikvision(workerInfo, isSaveWorker, isSaveWorkerFace); } } else { addWorkerForHikvision(workerInfo, isSaveWorker, isSaveWorkerFace); } } /** * 更新人员 * * @param workerInfo * @param project * @throws Exception */ public void editWorkerFromHttp(WorkerInfo workerInfo, Project project) throws Exception { String rs = HikvisionUtil.editWorker(workerInfo, project); sendNoticeAndSetStatusForWorker("更新人员到海康isc", rs, workerInfo, 1, 2, true); } /** * 添加人脸 * * @param workerInfo * @param project */ public void addWorkerFace(WorkerInfo workerInfo, Project project) throws Exception { String fieldAcquisitionUrl = workerInfo.getFieldAcquisitionUrl(); if (StringUtils.isNotBlank(fieldAcquisitionUrl)) { String rs = HikvisionUtil.addWorkerFace(workerInfo, project); sendNoticeAndSetStatusForWorker("添加人员照片到海康isc", rs, workerInfo, 2, 1, true); } } /** * 为车辆发送通知和设置下发状态 * * @param title * @param rs * @param carInfo * @param type * @param operate * @param setSuc * @param isNotice */ public void sendNoticeAndSetStatusForCarInfo(String title, String rs, CarInfo carInfo, Integer type, Integer operate, Boolean setSuc, boolean isNotice) { String msg; if (setSuc == null) { setSuc = false; boolean callSuc = HikvisionUtil.isSuccess(rs); JSONObject jo = JSONObject.parseObject(rs); String code = jo.getString(CODE); if (callSuc) { Object data = jo.get(DATA); if (data instanceof JSONObject) { JSONObject dataJo = jo.getJSONObject(DATA); Optional fOp = Optional.ofNullable(dataJo).map(o -> o.getJSONArray("failures")); if (fOp.isPresent() && fOp.get().size() != 0) { if (X_00052102.equals(fOp.get().getJSONObject(0).getString(CODE))) { msg = "同步失败,车牌号码:" + carInfo.getCarNumber() + "。失败原因:车辆绑定的人员在isc不存在"; title += FAIL; } else { msg = "同步失败,车牌号码:" + carInfo.getCarNumber() + "。失败原因:下发异常"; title += FAIL; } } else { msg = "同步成功,车牌号码:" + carInfo.getCarNumber(); title += SUC; setSuc = true; } } else { msg = "同步成功,车牌号码:" + carInfo.getCarNumber(); title += SUC; setSuc = true; } } else { if (Objects.equals(code, X_00072202)) { msg = "同步成功,车牌号码:" + carInfo.getCarNumber(); title += SUC; setSuc = true; isNotice = false; } else if (Objects.equals(code, X_02_E_33900)) { String msg1 = jo.getString(MSG); String errMsg1 = "reservation record not existed or overdued!"; if (Objects.equals(msg1, errMsg1)) { msg = "同步成功,车牌号码:" + carInfo.getCarNumber(); title += SUC; setSuc = true; isNotice = false; } else { String errMsg = "Car reservation failed! The plateNo has reserved in the parking!"; if (Objects.equals(msg1, errMsg)) { msg = "同步失败,车牌号码:" + carInfo.getCarNumber() + "。失败原因:车辆预约记录已存在"; title += FAIL; } else { msg = "同步失败,车牌号码:" + carInfo.getCarNumber() + "。失败原因:下发异常"; title += FAIL; } } } else if (Objects.equals(code, X_02_E_33400)) { msg = "同步失败,车牌号码:" + carInfo.getCarNumber() + "。失败原因:车辆属于黑名单内不能下发预约车"; title += FAIL; } else if (Objects.equals(code, X_00072003)) { msg = "同步失败,车牌号码:" + carInfo.getCarNumber() + "。失败原因:车牌格式不正确!"; title += FAIL; } else if (Objects.equals(code, X_00052301)) { String msg1 = jo.getString(MSG); String errMsg = "PersonId Not Exists"; if (Objects.equals(msg1, errMsg)) { msg = "同步失败,车牌号码:" + carInfo.getCarNumber() + "。失败原因:车辆绑定的人员ID不存在"; title += FAIL; } else { msg = "同步失败,车牌号码:" + carInfo.getCarNumber() + "。失败原因:下发异常"; title += FAIL; } } else { msg = "同步失败,车牌号码:" + carInfo.getCarNumber() + "。失败原因:下发异常"; title += FAIL; } } } else { if (setSuc) { msg = "同步成功,车牌号码:" + carInfo.getCarNumber(); title += SUC; } else { msg = "同步失败,车牌号码:" + carInfo.getCarNumber() + "。失败原因:下发异常"; title += FAIL; } } if (setSuc) { updateSuccessStatus(carInfo.getProjectSn(), carInfo.getId(), type, operate, null); } else { updateFailStatus(carInfo.getProjectSn(), carInfo.getId(), type, operate, null); } xzHikvisionCompareDataService.compareRetryForCar(carInfo, type, operate, setSuc); if (isNotice) { if (ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class) != null) { noticeService.addUserNotice(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId(), title, msg, "24"); } else if (carInfo.getUserIds() != null && carInfo.getUserIds().size() > 0) { for (String userId : carInfo.getUserIds()) { noticeService.addUserNotice(Long.valueOf(userId), title, msg, "24"); } } else if (carInfo.getCreateBy() != null) { noticeService.addUserNotice(carInfo.getCreateBy(), title, msg, "24"); } } } /** * 为组织发送通知和设置下发状态 * * @param title * @param rs * @param orgName */ private void sendNoticeForOrg(String title, String rs, String orgName) { if (StringUtils.isBlank(rs)) { return; } boolean success = HikvisionUtil.isSuccess(rs); String msg = ""; String type = "25"; if (success) { JSONObject jo = JSONObject.parseObject(rs); if (jo.get(DATA) instanceof JSONObject) { JSONObject dataJo = jo.getJSONObject(DATA); Optional fOp = Optional.ofNullable(dataJo).map(o -> o.getJSONArray("failures")); if (fOp.isPresent() && fOp.get().size() != 0) { if (X_00052102.equals(fOp.get().getJSONObject(0).getString(CODE))) { msg = "同步失败,组织名称:" + orgName + "。失败原因:上级组织不存在"; title += FAIL; success = false; } else { msg = "同步失败,组织名称:" + orgName + "。失败原因:下发异常"; title += FAIL; success = false; } } else { msg = "同步成功,组织名称:" + orgName; title += SUC; } } else if (jo.get(DATA) instanceof JSONArray) { JSONArray dataJa = jo.getJSONArray(DATA); if (CollUtil.isNotEmpty(dataJa)) { String errMsg = "Exists Child Org"; if (X_00052102.equals(dataJa.getJSONObject(0).getString(CODE)) && errMsg.equals(dataJa.getJSONObject(0).getString(MSG))) { msg = "同步失败,组织名称:" + orgName + "。失败原因:ISC存在下级组织"; title += FAIL; success = false; } else { msg = "同步失败,组织名称:" + orgName + "。失败原因:下发异常"; title += FAIL; success = false; } } else { msg = "同步成功,组织名称:" + orgName; title += SUC; } } else { msg = "同步成功,组织名称:" + orgName; title += SUC; } } else { msg = "同步失败,组织名称:" + orgName + "。失败原因:" + rs; title += FAIL; success = false; } if (success) { xzHikvisionCompareDataService.compareRetrySuc(); } else { xzHikvisionCompareDataService.compareRetryFail(); } if (ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class) != null) { noticeService.addUserNotice(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId(), title, msg, type); } } /** * 为人员发送通知和设置下发状态 * * @param title * @param rs * @param workerInfo * @param type * @param operate * @param sendNotice */ private void sendNoticeAndSetStatusForWorker(String title, String rs, WorkerInfo workerInfo, int type, int operate, boolean sendNotice) { boolean callSuc = HikvisionUtil.isSuccess(rs); String msg = ""; String noticeType = "23"; boolean success = false; if (callSuc) { success = true; msg = "同步成功,人员名称:" + workerInfo.getWorkerName() + ",身份证号:" + workerInfo.getIdCard(); title += SUC; } else { JSONObject jo = JSONObject.parseObject(rs); String code = jo.getString(CODE); if (Objects.equals(code, X_00072002)) { String msg1 = jo.getString(MSG); String errMsg = "Please Change Picture,Picture Max Size Is Limit 200KB"; if (Objects.equals(msg1, errMsg)) { msg = "同步失败,人员名称:" + workerInfo.getWorkerName() + ",身份证号:" + workerInfo.getIdCard() + "。失败原因:人脸图片不能大于200KB"; title += FAIL; } else { msg = "同步失败,人员名称:" + workerInfo.getWorkerName() + ",身份证号:" + workerInfo.getIdCard() + "。失败原因:下发异常"; title += FAIL; } } else if (Objects.equals(code, X_00052301)) { String msg1 = jo.getString(MSG); String orgIndexCodeNotExists = "OrgIndexCode Not Exists"; String personIdAlreadyInDb = "PersonId Already In Db"; String personNotExists = "Person Not Exists"; if (Objects.equals(msg1, orgIndexCodeNotExists)) { String pN = ""; if (Objects.equals(workerInfo.getPersonType(), WorkerInfoPersonTypeEnum.LW.getValue())) { pN = "班组"; } else if (Objects.equals(workerInfo.getPersonType(), WorkerInfoPersonTypeEnum.GL.getValue())) { pN = "部门"; } msg = "同步失败,人员名称:" + workerInfo.getWorkerName() + ",身份证号:" + workerInfo.getIdCard() + "。失败原因:" + pN + "未同步成功"; title += FAIL; } else if (Objects.equals(msg1, personIdAlreadyInDb)) { //成功 success = true; msg = "同步成功,人员名称:" + workerInfo.getWorkerName() + ",身份证号:" + workerInfo.getIdCard(); title += SUC; } else if (Objects.equals(msg1, personNotExists)) { msg = "同步失败,人员名称:" + workerInfo.getWorkerName() + ",身份证号:" + workerInfo.getIdCard() + "。失败原因:人员不存在"; title += FAIL; } else { msg = "同步失败,人员名称:" + workerInfo.getWorkerName() + ",身份证号:" + workerInfo.getIdCard() + "。失败原因:下发异常"; title += FAIL; } } else if (Objects.equals(code, X_00072003)) { String msg1 = jo.getString(MSG); String errMsg = "The format of parameter phoneNo is not correct."; if (Objects.equals(msg1, errMsg)) { msg = "同步失败,人员名称:" + workerInfo.getWorkerName() + ",身份证号:" + workerInfo.getIdCard() + "。失败原因:手机号码格式不正确"; title += FAIL; } else { msg = "同步失败,人员名称:" + workerInfo.getWorkerName() + ",身份证号:" + workerInfo.getIdCard() + "。失败原因:下发异常"; title += FAIL; } } else { msg = "同步失败,人员名称:" + workerInfo.getWorkerName() + ",身份证号:" + workerInfo.getIdCard() + "。失败原因:下发异常"; title += FAIL; } } if (success) { updateSuccessStatus(workerInfo.getProjectSn(), workerInfo.getId(), type, operate, null); xzHikvisionCompareDataService.compareRetrySuc(); } else { updateFailStatus(workerInfo.getProjectSn(), workerInfo.getId(), type, operate, null); xzHikvisionCompareDataService.compareRetryFail(); } Set userIdSet = getNoticeUserIds(workerInfo.getNoticeUserId(), workerInfo.getProjectSn()); if (sendNotice) { for (Long userId : userIdSet) { noticeService.addUserNotice(userId, title, msg, noticeType); } } } /** * 通知发起人,项目账号,操作的人 * * @param flowStartUser * @param projectSn * @return */ public Set getNoticeUserIds(Long flowStartUser, String projectSn) { //项目级别账号 List systemUsers = systemUserService.getSystemUsersBySn(new MapBuilder().put(Cts.SN, projectSn).put(Cts.QUERY_TYPE, Cts.PROJECT_LEVEL).build()); Set userIdSet = systemUsers.stream().map(SystemUser::getUserId).collect(Collectors.toSet()); //审批的发起人 if (flowStartUser != null) { userIdSet.add(flowStartUser); } if (ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class) != null) { userIdSet.add(ThreadLocalUtil.getByKey(Cts.TL_AUTH_USER, UserInfo.class).getUserId()); } return userIdSet; } /** * 更新所有未同步失败状态 * * @param projectSn * @param workerList * @param bigType * @param operate */ public void updateAllFailStatusIfNullForAuth(String projectSn, List workerList, Integer bigType, Integer operate) { for (WorkerInfo workerInfo : workerList) { hikvisionCall.updateAllFailStatusIfNullForAuth(projectSn, workerInfo.getId(), bigType, operate); } } /** * 更新某个为失败状态 * * @param projectSn * @param whoId * @param bigType * @param operate */ @Transactional(rollbackFor = Exception.class) public void updateAllFailStatusIfNullForAuth(String projectSn, Long whoId, Integer bigType, Integer operate) { xzHikvisionSyncMapper.update(null, new LambdaUpdateWrapper() .set(XzHikvisionSync::getIsSuccess, 0) .isNull(XzHikvisionSync::getIsSuccess) .eq(XzHikvisionSync::getType, 3) .eq(XzHikvisionSync::getOperate, operate) .eq(XzHikvisionSync::getWhoId, whoId) .eq(XzHikvisionSync::getBigType, bigType) ); this.updateTotalStatus(projectSn, whoId, bigType); } /** * 更新某个为失败状态 * * @param projectSn * @param whoId * @param bigType */ @Transactional(rollbackFor = Exception.class) public void updateAllFailStatusIfNull(String projectSn, Long whoId, Integer bigType) { xzHikvisionSyncMapper.update(null, new LambdaUpdateWrapper() .set(XzHikvisionSync::getIsSuccess, 0) .isNull(XzHikvisionSync::getIsSuccess) .eq(XzHikvisionSync::getWhoId, whoId) .eq(XzHikvisionSync::getBigType, bigType) ); updateTotalStatus(projectSn, whoId, bigType); } /** * 更新某个为失败状态 * * @param projectSn * @param whoId * @param type * @param operate * @param deviceSn */ public void updateFailStatus(String projectSn, Long whoId, Integer type, Integer operate, String deviceSn) { updateStatus(projectSn, whoId, type, operate, deviceSn, false); } /** * 更新成功状态 * * @param projectSn * @param whoId * @param type * @param operate * @param deviceSn */ public void updateSuccessStatus(String projectSn, Long whoId, Integer type, Integer operate, String deviceSn) { updateStatus(projectSn, whoId, type, operate, deviceSn, true); } /** * 更新某个状态 * * @param projectSn * @param whoId * @param type * @param operate * @param deviceSn * @param isSuccess */ @Transactional(rollbackFor = Exception.class) public void updateStatus(String projectSn, Long whoId, Integer type, Integer operate, String deviceSn, Boolean isSuccess) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(XzHikvisionSync::getProjectSn, projectSn) .eq(XzHikvisionSync::getWhoId, whoId) .eq(XzHikvisionSync::getType, type) .eq(StringUtils.isNotBlank(deviceSn), XzHikvisionSync::getDeviceSn, deviceSn); if (operate != null) { if (operate.equals(XzHikvisionSyncOperateEnum.DELETE.getValue())) { queryWrapper.eq(XzHikvisionSync::getOperate, operate); } else { queryWrapper.ne(XzHikvisionSync::getOperate, XzHikvisionSyncOperateEnum.DELETE.getValue()); } } List xzHikvisionSyncs = xzHikvisionSyncMapper.selectList(queryWrapper); if (CollUtil.isNotEmpty(xzHikvisionSyncs)) { for (XzHikvisionSync xzHikvisionSync : xzHikvisionSyncs) { xzHikvisionSync.setIsSuccess(isSuccess ? 1 : 0); xzHikvisionSyncMapper.updateById(xzHikvisionSync); } updateTotalStatus(projectSn, whoId, xzHikvisionSyncs.get(0).getBigType()); } } /** * 更下总状态 * * @param projectSn * @param whoId * @param bigType */ public void updateTotalStatus(String projectSn, Long whoId, Integer bigType) { List xzHikvisionSyncs = xzHikvisionSyncMapper.selectList(new LambdaQueryWrapper() .eq(XzHikvisionSync::getProjectSn, projectSn) .eq(XzHikvisionSync::getWhoId, whoId) .eq(XzHikvisionSync::getBigType, bigType) ); Integer sendSuccessStatus = 4; if (CollUtil.isEmpty(xzHikvisionSyncs) || xzHikvisionSyncs.stream().allMatch(xzHikvisionSync1 -> xzHikvisionSync1.getIsSuccess() == null)) { sendSuccessStatus = 4; } else if (xzHikvisionSyncs.stream().allMatch(xzHikvisionSync1 -> Objects.equals(xzHikvisionSync1.getIsSuccess(), 1))) { sendSuccessStatus = 1; } else if (xzHikvisionSyncs.stream().allMatch(xzHikvisionSync1 -> xzHikvisionSync1.getIsSuccess() == null || Objects.equals(xzHikvisionSync1.getIsSuccess(), 0))) { sendSuccessStatus = 2; } else { sendSuccessStatus = 3; } if (Objects.equals(bigType, XzHikvisionSyncBigTypeEnum.CAR.getValue())) { carInfoMapper.update(null, new LambdaUpdateWrapper() .eq(CarInfo::getId, whoId) .set(CarInfo::getSendSuccessStatus, sendSuccessStatus) ); } else { workerInfoMapper.update(null, new LambdaUpdateWrapper() .eq(WorkerInfo::getId, whoId) .set(WorkerInfo::getSendSuccessStatus, sendSuccessStatus) ); } } /** * 保存人脸 * * @param workerInfo * @param project */ public void saveWorkerFace(WorkerInfo workerInfo, Project project) throws Exception { if (StrUtil.isNotBlank(workerInfo.getFieldAcquisitionUrl())) { ArrayList workerFaceIds = getWorkerFaceIds(String.valueOf(workerInfo.getId()), project); if (CollUtil.isNotEmpty(workerFaceIds)) { String workerFaceId = workerFaceIds.get(0); final String artemisPath = "/artemis"; final String path = artemisPath + "/api/resource/v1/face/single/update"; String host = "https://" + project.getArtemisConfigHost(); JSONObject jo = new JSONObject(); jo.put("faceId", workerFaceId); jo.put("faceData", Base64Util.convertFileToBase64(PathUtil.reviseSlash(basePath + "/" + workerInfo.getFieldAcquisitionUrl()))); String rs = HikvisionUtil.doPost(host, path, jo.toJSONString(), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); sendNoticeAndSetStatusForWorker("更新人员照片到海康isc", rs, workerInfo, 2, 2, true); } else { addWorkerFace(workerInfo, project); } } } /** * 删除人员 * * @param uniqueId * @param workerInfo * @param sendNotice */ public void deleteWorkerForHikvision(String uniqueId, WorkerInfo workerInfo, boolean sendNotice) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, workerInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } deleteWorkerFace(uniqueId, workerInfo, project, sendNotice); deleteWorkerFromHttp(uniqueId, workerInfo, project, sendNotice); } /** * 删除人员到海康isc * * @param uniqueId * @param workerInfo * @param project * @param sendNotice * @throws Exception */ public void deleteWorkerFromHttp(String uniqueId, WorkerInfo workerInfo, Project project, boolean sendNotice) throws Exception { String rs = HikvisionUtil.deleteWorkerById(uniqueId, project).toJSONString(); sendNoticeAndSetStatusForWorker("删除人员到海康isc", rs, workerInfo, 1, 3, sendNotice); } /** * 删除人员图片到海康isc * * @param uniqueId * @param workerInfo * @param project * @param sendNotice * @throws Exception */ public void deleteWorkerFace(String uniqueId, WorkerInfo workerInfo, Project project, boolean sendNotice) throws Exception { List workerFaceIds = getWorkerFaceIds(uniqueId, project); if (CollUtil.isNotEmpty(workerFaceIds)) { for (String workerFaceId : workerFaceIds) { JSONObject rsJo = HikvisionUtil.deleteWorkerFace(project, workerFaceId); sendNoticeAndSetStatusForWorker("删除人员图片到海康isc", rsJo.toJSONString(), workerInfo, 2, 3, sendNotice); } } } /** * 获取人员人脸id列表 * * @param uniqueId * @param project * @return */ private ArrayList getWorkerFaceIds(String uniqueId, Project project) throws Exception { JSONObject joData = HikvisionUtil.getWorkerInfoByPersonId(uniqueId, project); ArrayList ids = new ArrayList<>(); if (joData != null) { JSONArray ppJa = joData.getJSONArray("personPhoto"); if (ppJa != null) { for (int j = 0; j < ppJa.size(); j++) { JSONObject jo1 = ppJa.getJSONObject(j); ids.add(jo1.getString("personPhotoIndexCode")); } } } return ids; } /** * 保存车辆 * * @param carInfo */ public void saveCarInfoFromHikvision(CarInfo carInfo) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, carInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } if (carInfo.getIsBlack() == 0) { handleAlarmCar(project, carInfo); } cancelCharge(project, carInfo); if (Objects.equals(carInfo.getCarModuleType(), CarInfoCarModuleTypeEnum.GD.getValue())) { //删除预约车辆 deleteReservationCarFromHttp(carInfo, project, true); saveFixedCar(carInfo, project); saveBindCategory(carInfo, project); } else if (Objects.equals(carInfo.getCarModuleType(), CarInfoCarModuleTypeEnum.CQ.getValue()) || Objects.equals(carInfo.getCarModuleType(), CarInfoCarModuleTypeEnum.LS.getValue())) { unbindCar(project, carInfo); deleteFixedCarForHikvision(carInfo, project); saveReservationCar(project, carInfo); } } /** * 车辆取消布防/布防 * * @param project * @param carInfo * @throws Exception */ public void handleAlarmCar(Project project, CarInfo carInfo) { try { JSONObject jo = new JSONObject(); jo.put("searchKey", carInfo.getCarNumber()); jo.put("pageNo", 1); jo.put("pageSize", 1); JSONObject joRs = HikvisionUtil.getBlackCarList(project, jo); if (HikvisionUtil.isSuccess(joRs)) { JSONObject dataJo = HikvisionUtil.getJsonObjectData(joRs); JSONArray listJa = dataJo.getJSONArray(LIST); if (CollUtil.isEmpty(listJa)) { if (carInfo.getIsBlack() == 1) { JSONObject addJo = new JSONObject(); CarInfo c = carInfoService.queryById(String.valueOf(carInfo.getId())); addJo.put("driver", c.getDriverWorkerName()); addJo.put("driverPhone", c.getDriverTelephone()); addJo.put("plateNo", carInfo.getCarNumber()); JSONObject rs = HikvisionUtil.addAlarmCar(project, addJo); sendNoticeAndSetStatusForCarInfo("车辆添加黑名单到海康isc", rs.toJSONString(), carInfo, 7, null, null, true); } else { sendNoticeAndSetStatusForCarInfo("车辆取消黑名单到海康isc", null, carInfo, 7, null, true, false); } } else { if (carInfo.getIsBlack() == 1) { sendNoticeAndSetStatusForCarInfo("车辆添加黑名单到海康isc", null, carInfo, 7, null, true, true); } else { JSONObject joOne = listJa.getJSONObject(0); String alarmSyscode = joOne.getString("alarmSyscode"); JSONObject deleteJo = new JSONObject(); deleteJo.put("alarmSyscodes", alarmSyscode); JSONObject rs = HikvisionUtil.deletionAlarmCar(project, deleteJo); sendNoticeAndSetStatusForCarInfo("车辆取消黑名单到海康isc", rs.toJSONString(), carInfo, 7, null, null, true); } } } else { failAlarmNotice(carInfo); } } catch (Exception e) { failAlarmNotice(carInfo); } } /** * 添加车辆黑名单失败报警通知 * * @param carInfo */ private void failAlarmNotice(CarInfo carInfo) { if (carInfo.getIsBlack() == 1) { sendNoticeAndSetStatusForCarInfo("车辆添加黑名单到海康isc", new JSONObject().toJSONString(), carInfo, 7, null, false, true); } else { sendNoticeAndSetStatusForCarInfo("车辆取消黑名单到海康isc", new JSONObject().toJSONString(), carInfo, 7, null, false, true); } } /** * 保存固定车 * * @param carInfo * @param project * @throws Exception */ private void saveFixedCar(CarInfo carInfo, Project project) throws Exception { //根据车牌号删除车辆 JSONObject oldCarInfo = searchCarInfoByCarNumberFromHttp(carInfo.getCarNumber(), project); if (oldCarInfo != null) { log.info("查询到海康车辆,车牌号:{}", carInfo.getCarNumber()); carInfo.setHikvisionVehicleId(oldCarInfo.getString("vehicleId")); editCarInfoFromHttp(carInfo, project); } else { log.info("未查询到海康车辆,车牌号:{}", carInfo.getCarNumber()); //固定车 addCarInfoFromHttp(carInfo, project); } } /** * 通过车牌号获取isc的车辆id * * @param carNumber * @param project * @return * @throws Exception */ private String getRemoteCarIdByCarNumber(String carNumber, Project project) throws Exception { JSONObject oldCarInfo = searchCarInfoByCarNumberFromHttp(carNumber, project); return oldCarInfo == null ? null : oldCarInfo.getString("vehicleId"); } /** * 保存绑定群组关系 * * @param carInfo * @param project * @throws Exception */ private void saveBindCategory(CarInfo carInfo, Project project) throws Exception { bindCar(project, carInfo); } /** * 获取绑定的固定车辆群组 * * @param project * @return * @throws Exception */ @NotNull private String getCategoryCode(Project project) throws Exception { //绑定固定的群组 JSONArray ja = HikvisionUtil.getCategoryList(project); return getFixedCarGroupName(ja); } /** * 添加车辆 * * @param carInfo * @param project * @throws Exception */ public void addCarInfoFromHttp(CarInfo carInfo, Project project) throws Exception { final String artemisPath = "/artemis"; final String path = artemisPath + "/api/resource/v1/vehicle/batch/add"; String host = "https://" + project.getArtemisConfigHost(); HikvisionCarInfo hikvisionCarInfo = getHikvisionCarInfo(carInfo); ArrayList list = new ArrayList<>(); list.add(hikvisionCarInfo); String rs = HikvisionUtil.doPost(host, path, JSON.toJSONString(list), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); sendNoticeAndSetStatusForCarInfo("添加车辆白名单到海康isc", rs, carInfo, 4, 1, null, true); } /** * 获取车辆 * * @param carInfo * @return */ private HikvisionCarInfo getHikvisionCarInfo(CarInfo carInfo) { HikvisionCarInfo hikvisionCarInfo = new HikvisionCarInfo(); hikvisionCarInfo.setVehicleId(carInfo.getHikvisionVehicleId()); hikvisionCarInfo.setPlateNo(carInfo.getCarNumber()); String[] driverList = StringUtils.split(carInfo.getDriverWorkerId(), Cts.COMMA); if (driverList != null && driverList.length > 0) { hikvisionCarInfo.setPersonId(driverList[0]); } hikvisionCarInfo.setPlateType(null); hikvisionCarInfo.setPlateColor(getPlateColor(carInfo)); hikvisionCarInfo.setVehicleType(getVehicleType(carInfo)); hikvisionCarInfo.setVehicleColor(getVehicleColor(carInfo.getCarColor())); hikvisionCarInfo.setDescription(null); return hikvisionCarInfo; } /** * 获取isc的车牌颜色 * * @param carInfo * @return */ private String getPlateColor(CarInfo carInfo) { String carColor = carInfo.getCarColor(); if (StringUtils.isBlank(carColor)) { return null; } switch (carColor) { case "蓝色": return SUC_CODE; case "黄色": return "1"; case "白色": return "2"; case "黑色": return "3"; case "绿色": return "4"; case "民航黑色": return "5"; case "其他颜色": return "255"; default: } return null; } /** * 获取isc的车辆类型 * * @param carInfo * @return */ private String getVehicleType(CarInfo carInfo) { String carTypeName = carInfoMapper.getCarTypeName(carInfo); switch (carTypeName) { case "其他车": return SUC_CODE; case "小型车": return "1"; case "大型车": return "2"; case "摩托车": return "3"; default: } return null; } /** * 获取isc的车辆颜色 * * @param carColor * @return */ private String getVehicleColor(String carColor) { if (StringUtils.isBlank(carColor)) { return null; } switch (carColor) { case "其他颜色": return SUC_CODE; case "白色": return "1"; case "银色": return "2"; case "灰色": return "3"; case "黑色": return "4"; case "红色": return "5"; case "深蓝色": return "6"; case "蓝色": return "7"; case "黄色": return "8"; case "绿色": return "9"; case "棕色": return "10"; case "粉色": return "11"; case "紫色": return "12"; case "深灰": return "13"; case "杏色": return "14"; case "未识别的车辆颜色": return "255"; default: return null; } } /** * 编辑车辆 * * @param carInfo * @param old */ public void editCarInfoForHikvision(CarInfo carInfo, CarInfo old) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, carInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } if (!Objects.equals(carInfo.getCarNumber(), old.getCarNumber())) { //删除旧的车辆数据 deleteCarInfoForHikvision(old, false); } saveCarInfoFromHikvision(carInfo); } /** * 修改车辆 * * @param carInfo * @param project * @throws Exception */ private void editCarInfoFromHttp(CarInfo carInfo, Project project) throws Exception { final String artemisPath = "/artemis"; final String path = artemisPath + "/api/resource/v1/vehicle/single/update"; String host = "https://" + project.getArtemisConfigHost(); HikvisionCarInfo hikvisionCarInfo = getHikvisionCarInfo(carInfo); String rs = HikvisionUtil.doPost(host, path, JSON.toJSONString(hikvisionCarInfo), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); sendNoticeAndSetStatusForCarInfo("更新车辆白名单到海康isc", rs, carInfo, 4, 2, null, true); } /** * 解绑车辆群组 * * @param project * @param carInfo * @throws Exception */ private void unbindCar(Project project, CarInfo carInfo) throws Exception { String categoryCode = getCategoryCode(project); bindOrNotCarCategory(project, 2, categoryCode, carInfo); } /** * 解绑车辆群组 * * @param project * @param carInfo * @throws Exception */ private void bindCar(Project project, CarInfo carInfo) throws Exception { String categoryCode = getCategoryCode(project); bindOrNotCarCategory(project, 1, categoryCode, carInfo); } /** * 获取固定车的categoryCode * * @param ja */ private String getFixedCarGroupName(JSONArray ja) { if (ja != null) { for (int i = 0; i < ja.size(); i++) { JSONObject jo = ja.getJSONObject(i); String categoryName = jo.getString("categoryName"); if (Objects.equals(categoryName, FIXED_CAR_GROUP_NAME)) { return jo.getString("categoryCode"); } } } log.error("获取固定车的群组失败"); throw new OpenPromptException("获取固定车的群组失败"); } /** * 删除车辆 * * @param carInfo * @param isSetBlack */ public void deleteCarInfoForHikvision(CarInfo carInfo, boolean isSetBlack) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, carInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } cancelCharge(project, carInfo); unbindCar(project, carInfo); deleteFixedCarForHikvision(carInfo, project); deleteReservationCarFromHttp(carInfo, project, true); CarInfo c = new CarInfo(); BeanUtil.copyProperties(carInfo, c); c.setIsBlack(isSetBlack ? 1 : 0); handleAlarmCar(project, c); } /** * 删除固定车 * * @param carInfo * @param project * @throws Exception */ private void deleteFixedCarForHikvision(CarInfo carInfo, Project project) throws Exception { //根据车牌号删除车辆 JSONObject oldCarInfo = searchCarInfoByCarNumberFromHttp(carInfo.getCarNumber(), project); if (oldCarInfo != null) { log.info("海康存在车辆,车牌号:{}", oldCarInfo.getString("plateNo")); String rs = HikvisionUtil.deleteCarInfoById(oldCarInfo.getString("vehicleId"), project); sendNoticeAndSetStatusForCarInfo("删除车辆白名单到海康isc", rs, carInfo, 4, 3, null, true); } else { sendNoticeAndSetStatusForCarInfo("删除车辆白名单到海康isc", null, carInfo, 4, 3, true, false); } } /** * 根据车牌号查询车辆 * * @param carNumber * @param project * @return * @throws Exception */ private JSONObject searchCarInfoByCarNumberFromHttp(String carNumber, Project project) throws Exception { long total = 0; JSONObject o1 = null; int pageNo = 0; do { JSONObject jo = HikvisionUtil.getFixCarListByCarNumber(carNumber, project, ++pageNo); if (HikvisionUtil.isSuccess(jo)) { JSONObject dataJo = HikvisionUtil.getJsonObjectData(jo); total = dataJo.getInteger("total"); JSONArray listJa = dataJo.getJSONArray(LIST); Optional plateNoOpt = listJa.stream().filter(o -> { JSONObject j = (JSONObject) o; return carNumber.equals(j.getString("plateNo")); }).findFirst(); if (plateNoOpt.isPresent()) { o1 = (JSONObject) plateNoOpt.get(); } } else { return null; } } while (o1 == null && total > pageNo * 1000L); return o1; } /** * 取消车位预约 * * @param carInfo * @param project * @param isNotice */ private void deleteReservationCarFromHttp(CarInfo carInfo, Project project, boolean isNotice) throws Exception { final String artemisPath = "/artemis"; final String path = artemisPath + "/api/pms/v1/parkingSpace/reservations/deletion"; String host = "https://" + project.getArtemisConfigHost(); JSONArray reservationCarInfoList = HikvisionUtil.getIscActiveReservationCarList(carInfo.getCarNumber(), project); if (CollUtil.isNotEmpty(reservationCarInfoList)) { for (int i = 0; i < reservationCarInfoList.size(); i++) { JSONObject jsonObject = reservationCarInfoList.getJSONObject(i); String reserveOrderNo = jsonObject.getString("reserveOrderNo"); JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("reserveOrderNo", reserveOrderNo); String rs = HikvisionUtil.doPost(host, path, jsonObject1.toJSONString(), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); sendNoticeAndSetStatusForCarInfo("取消车位预约到海康isc", rs, carInfo, 6, 3, null, isNotice); } } else { sendNoticeAndSetStatusForCarInfo("取消车位预约到海康isc", null, carInfo, 6, 3, true, false); } } /** * 添加组织 * * @param enterpriseInfo */ public void addEnterpriseInfoForHikvision(EnterpriseInfo enterpriseInfo) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, enterpriseInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } enterpriseInfo = BeanUtil.toBean(enterpriseInfoService.getEnterpriseInfoById(new MapBuilder() .put(Cts.PROJECT_SN, enterpriseInfo.getProjectSn()).put(Cts.ENTERPRISE_ID, enterpriseInfo.getId()).build()), EnterpriseInfo.class); HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(enterpriseInfo, String.valueOf(enterpriseInfo.getProjectEnterprise().getId())); addOrgNoticeFromHttp(project, hikvisionOrganization); } /** * 映射isc的组织 * * @param enterpriseInfo * @param orgIndexCode * @return */ private HikvisionOrganization getHikvisionOrganization(EnterpriseInfo enterpriseInfo, String orgIndexCode) { HikvisionOrganization hikvisionOrganization = new HikvisionOrganization(); hikvisionOrganization.setClientId(null); hikvisionOrganization.setOrgIndexCode(orgIndexCode); hikvisionOrganization.setOrgName(enterpriseInfo.getEnterpriseName()); hikvisionOrganization.setParentIndexCode(enterpriseInfo.getProjectSn()); return hikvisionOrganization; } /** * 更新组织 * * @param enterpriseInfo */ public void editEnterpriseInfoForHikvision(EnterpriseInfo enterpriseInfo) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, enterpriseInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } Pair existAndIndexCode = existAndGetEnterpriseOrgIndexCodeByEnterpriseId(project, String.valueOf(enterpriseInfo.getId()), null); HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(enterpriseInfo, existAndIndexCode.getRight()); if (existAndIndexCode.getLeft()) { editOrgFromHttp(project, hikvisionOrganization); } else { addOrgNoticeFromHttp(project, hikvisionOrganization); } } /** * @param project * @param enterpriseId * @param projectEnterpriseId * @return * @throws Exception */ private Pair existAndGetEnterpriseOrgIndexCodeByEnterpriseId(Project project, String enterpriseId, Long projectEnterpriseId) throws Exception { if (projectEnterpriseId == null) { EnterpriseInfo enterpriseInfo = BeanUtil.toBean(enterpriseInfoService.getEnterpriseInfoById(new MapBuilder() .put(Cts.PROJECT_SN, project.getProjectSn()).put(Cts.ENTERPRISE_ID, enterpriseId).build()), EnterpriseInfo.class); if (enterpriseInfo.getProjectEnterprise() != null) { projectEnterpriseId = enterpriseInfo.getProjectEnterprise().getId(); } } JSONArray orgList = getOrgList(project, StrUtil.join(Cts.COMMA, enterpriseId, projectEnterpriseId != null ? projectEnterpriseId : ""), project.getProjectSn()); String index = null; if (CollUtil.isEmpty(orgList)) { index = projectEnterpriseId != null ? String.valueOf(projectEnterpriseId) : enterpriseId; } else { index = orgList.getJSONObject(0).getString("orgIndexCode"); } return new ImmutablePair<>(CollUtil.isNotEmpty(orgList), index); } /** * 删除组织 * * @param projectSn * @param enterpriseName */ public void deleteEnterpriseInfoForHikvision(String projectSn, String enterpriseName) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, projectSn)); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } String orgIndex = getOrgIndexByParentIndexAndName(project, enterpriseName); String rs = HikvisionUtil.deleteOrgByIndexCodes(project, Collections.singletonList(orgIndex)); sendNoticeForOrg("删除组织到海康isc", rs, enterpriseName); } /** * 根据父级索引和名称获取组织索引 * * @param project * @param orgName * @return * @throws Exception */ private String getOrgIndexByParentIndexAndName(Project project, String orgName) throws Exception { JSONObject param = new JSONObject(); param.put("pageNo", 1); param.put("pageSize", 1000); param.put("orgName", orgName); param.put("parentOrgIndexCodes", project.getProjectSn()); String rs = HikvisionUtil.getOrgV2(project, param); JSONObject dataJo = HikvisionUtil.getJsonObjectData(rs); JSONArray listJa = dataJo.getJSONArray(LIST); for (int i = 0; i < listJa.size(); i++) { JSONObject jo = listJa.getJSONObject(i); if (jo.getString("orgName").equals(orgName)) { return jo.getString("orgIndexCode"); } } return null; } /** * 添加组织 * * @param teamInfo */ public void addTeamInfoForHikvision(TeamInfo teamInfo) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, teamInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(teamInfo, project); addOrgNoticeFromHttp(project, hikvisionOrganization); } /** * 映射isc的组织 * * @param teamInfo * @param project * @return * @throws Exception */ private HikvisionOrganization getHikvisionOrganization(TeamInfo teamInfo, Project project) throws Exception { HikvisionOrganization hikvisionOrganization = new HikvisionOrganization(); hikvisionOrganization.setClientId(null); hikvisionOrganization.setOrgIndexCode(String.valueOf(teamInfo.getId())); hikvisionOrganization.setOrgName(teamInfo.getTeamName()); hikvisionOrganization.setParentIndexCode(existAndGetEnterpriseOrgIndexCodeByEnterpriseId(project, String.valueOf(teamInfo.getEnterpriseId()), null).getRight()); return hikvisionOrganization; } /** * 编辑组织 * * @param teamInfo */ public void editTeamInfoForHikvision(TeamInfo teamInfo) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, teamInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(teamInfo, project); if (existOrg(project, String.valueOf(teamInfo.getId()), hikvisionOrganization.getParentIndexCode())) { editOrgFromHttp(project, hikvisionOrganization); } else { addOrgNoticeFromHttp(project, hikvisionOrganization); } } /** * 更新组织到海康isc * * @param project * @param hikvisionOrganization * @throws Exception */ private void editOrgFromHttp(Project project, HikvisionOrganization hikvisionOrganization) throws Exception { String rs = HikvisionUtil.editOrg(project, hikvisionOrganization); sendNoticeForOrg("更新组织到海康isc", rs, hikvisionOrganization.getOrgName()); } /** * 删除组织到海康isc * * @param project * @param idList * @param orgName * @throws Exception */ private void deleteOrgFromHttp(Project project, List idList, String orgName) throws Exception { String rs = HikvisionUtil.deleteOrgByIndexCodes(project, idList); sendNoticeForOrg("删除组织到海康isc", rs, orgName); } /** * 添加组织到海康isc * * @param project * @param hikvisionOrganization * @throws Exception */ private void addOrgNoticeFromHttp(Project project, HikvisionOrganization hikvisionOrganization) throws Exception { String rs = HikvisionUtil.addOrg(project, hikvisionOrganization); sendNoticeForOrg("添加组织到海康isc", rs, hikvisionOrganization.getOrgName()); } /** * 删除组织 * * @param id * @param teamInfo */ public void deleteTeamInfoForHikvision(String id, TeamInfo teamInfo) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, teamInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } deleteOrgFromHttp(project, Arrays.asList(id), teamInfo.getTeamName()); } /** * 添加组织 * * @param departmentInfo */ public void addDepartmentInfoForHikvision(DepartmentInfo departmentInfo) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, departmentInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(departmentInfo, project); addOrgNoticeFromHttp(project, hikvisionOrganization); } /** * 映射isc的组织 * * @param departmentInfo * @param project * @return * @throws Exception */ private HikvisionOrganization getHikvisionOrganization(DepartmentInfo departmentInfo, Project project) throws Exception { HikvisionOrganization hikvisionOrganization = new HikvisionOrganization(); hikvisionOrganization.setClientId(null); hikvisionOrganization.setOrgIndexCode(String.valueOf(departmentInfo.getId())); hikvisionOrganization.setOrgName(departmentInfo.getDepartmentName()); hikvisionOrganization.setParentIndexCode(existAndGetEnterpriseOrgIndexCodeByEnterpriseId(project, String.valueOf(departmentInfo.getEnterpriseId()), null).getRight()); return hikvisionOrganization; } /** * 编辑组织 * * @param departmentInfo */ public void editDepartmentInfoForHikvision(DepartmentInfo departmentInfo) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, departmentInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(departmentInfo, project); if (existOrg(project, String.valueOf(departmentInfo.getId()), hikvisionOrganization.getParentIndexCode())) { editOrgFromHttp(project, hikvisionOrganization); } else { addOrgNoticeFromHttp(project, hikvisionOrganization); } } /** * 删除组织 * * @param uniqueId * @param departmentInfo */ public void deleteDepartmentInfoForHikvision(String uniqueId, DepartmentInfo departmentInfo) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, departmentInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } deleteOrgFromHttp(project, Arrays.asList(uniqueId), departmentInfo.getDepartmentName()); } /** * 添加组织 * * @param project */ public void editProjectForHikvision(Project project) throws Exception { if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } HikvisionOrganization hikvisionOrganization = getHikvisionOrganization(project); HikvisionUtil.addOrg(project, hikvisionOrganization); } /** * 组织是否存在 * * @param project * @param orgIndexs 逗号分割 * @param parentOrgIndexCode * @return */ public boolean existOrg(Project project, String orgIndexs, String parentOrgIndexCode) throws Exception { JSONArray list = getOrgList(project, orgIndexs, parentOrgIndexCode); return list.size() > 0; } /** * 查询组织 * * @param project * @param orgIndexs 逗号分割 * @param parentOrgIndexCode * @return */ private JSONArray getOrgList(Project project, String orgIndexs, String parentOrgIndexCode) throws Exception { JSONObject param = new JSONObject(); param.put("pageNo", 1); param.put("pageSize", 1000); param.put("orgIndexCodes", orgIndexs); param.put("parentOrgIndexCodes", parentOrgIndexCode); String rs = HikvisionUtil.getOrgV2(project, param); JSONObject jo = HikvisionUtil.getJsonObjectData(rs); return jo.getJSONArray(LIST); } /** * 映射isc的组织 * * @param project * @return */ private HikvisionOrganization getHikvisionOrganization(Project project) { HikvisionOrganization hikvisionOrganization = new HikvisionOrganization(); hikvisionOrganization.setClientId(null); hikvisionOrganization.setOrgIndexCode(project.getProjectSn()); hikvisionOrganization.setOrgName(project.getProjectName()); hikvisionOrganization.setParentIndexCode("root000000"); return hikvisionOrganization; } /** * 保存预约车辆 * * @param project * @param carInfo */ public void saveReservationCar(Project project, CarInfo carInfo) throws Exception { //删除预约车辆 deleteReservationCarFromHttp(carInfo, project, false); //临时车辆预约 reservationCarFromHttp(project, carInfo); } /** * 取消车辆包期 * * @param project * @param carInfo * @throws Exception */ private void cancelCharge(Project project, CarInfo carInfo) throws Exception { //取消车辆包期 String parkIndexCode = HikvisionUtil.getProjectParkCode(project); HikvisionUtil.chargeDeletion(project, new ChargeDeletionParam(parkIndexCode, carInfo.getCarNumber())); } /** * 添加预约车辆到海康isc * * @param project * @param carInfo * @throws Exception */ private void reservationCarFromHttp(Project project, CarInfo carInfo) throws Exception { final String artemisPath = "/artemis"; final String path = artemisPath + "/api/pms/v2/parkingSpace/reservations/addition"; String host = "https://" + project.getArtemisConfigHost(); ParkReservation parkReservation = getParkReservation(project, carInfo); String rs = HikvisionUtil.doPost(host, path, JSON.toJSONString(parkReservation), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); sendNoticeAndSetStatusForCarInfo("添加预约车辆到海康isc", rs, carInfo, 6, 1, null, true); } /** * 映射车辆预约信息 * * @param project * @param carInfo * @return * @throws Exception */ private ParkReservation getParkReservation(Project project, CarInfo carInfo) throws Exception { String parkIndexCode = HikvisionUtil.getProjectParkCode(project); WorkerInfo workerInfo = workerInfoMapper.selectById(carInfo.getDriverWorkerId()); ParkReservation parkReservation = new ParkReservation(); parkReservation.setParkSyscode(parkIndexCode); parkReservation.setPlateNo(carInfo.getCarNumber()); if (Objects.equals(carInfo.getCarModuleType(), CarInfoCarModuleTypeEnum.LS.getValue())) { parkReservation.setOwner(carInfo.getDriverWorkerName()); } else if (workerInfo != null) { parkReservation.setOwner(workerInfo.getWorkerName()); } parkReservation.setPhoneNo(carInfo.getDriverTelephone()); parkReservation.setAllowTimes(Convert.toLong(carInfo.getEntryAndExitPermit())); parkReservation.setIsCharge(SUC_CODE); parkReservation.setStartTime(DateUtil.format(carInfo.getReserveStartTime(), "yyyy-MM-dd'T'HH:mm:ss") + "+08:00"); parkReservation.setEndTime(DateUtil.format(carInfo.getReserveEndTime(), "yyyy-MM-dd'T'HH:mm:ss") + "+08:00"); return parkReservation; } /** * 保存图片本体 * * @param url * @return */ public String saveToLocal(String url) { return UrlUtil.saveToLocal(url, basePath, IdUtil.simpleUUID() + ".png"); } /** * 保存车辆群组绑定关系 * * @param project * @param categoryCode * @param carInfo * @throws Exception */ public void saveCarCategoryBind(Project project, String categoryCode, CarInfo carInfo) throws Exception { bindOrNotCarCategory(project, 2, categoryCode, carInfo); bindOrNotCarCategory(project, 1, categoryCode, carInfo); } /** * 车辆群组管理,解绑使用 * * @param project * @param operation 绑定操作类型,1绑定、2解绑 * @param categoryCode 车辆分类标识 * @param carInfo */ public void bindOrNotCarCategory(Project project, Integer operation, String categoryCode, CarInfo carInfo) throws Exception { int bind = 1; int unbind = 2; if (Objects.equals(operation, bind)) { //绑定 Set ids = getHkCarIds(project, carInfo); JSONObject bindParam = new JSONObject(); bindParam.put("vehicleIds", StrUtil.join(Cts.COMMA, ids)); bindParam.put("operation", bind); bindParam.put("categoryCode", categoryCode); JSONObject jo = HikvisionUtil.bindCarCategory(project, bindParam); String rs = jo.toJSONString(); sendNoticeAndSetStatusForCarInfo("绑定" + FIXED_CAR_GROUP_NAME + "到海康isc", rs, carInfo, 5, bind, null, true); } else if (Objects.equals(operation, unbind)) { //解绑 String carId = this.getRemoteCarIdByCarNumber(carInfo.getCarNumber(), project); JSONObject param = new JSONObject(); Object vehicleIds = carId == null ? carInfo.getId() : carId; if (vehicleIds == null) { return; } param.put("vehicleIds", vehicleIds); param.put("operation", unbind); param.put("categoryCode", categoryCode); JSONObject jo = HikvisionUtil.bindCarCategory(project, param); String rs = jo.toJSONString(); sendNoticeAndSetStatusForCarInfo("解绑" + FIXED_CAR_GROUP_NAME + "到海康isc", rs, carInfo, 5, 3, null, true); } } /** * 获取isc的海康的车辆ids * * @param project * @param carInfo * @return * @throws Exception */ @NotNull private Set getHkCarIds(Project project, CarInfo carInfo) throws Exception { JSONObject param = new JSONObject(); param.putIfAbsent("pageNo", 0); param.putIfAbsent("pageSize", 1000); JSONArray listJa = new JSONArray(); int total = 0; do { param.put("pageNo", param.getInteger("pageNo") + 1); JSONObject hkFixCars = HikvisionUtil.getFixCarList(project, param); JSONObject jo = HikvisionUtil.getJsonObjectData(hkFixCars); total = jo.getInteger("total"); JSONArray oneList = jo.getJSONArray(LIST); listJa.addAll(oneList); } while (total > param.getInteger(Cts.PAGE_NO) * 1000); List myFixCars = carInfoMapper.selectList(new LambdaQueryWrapper() .eq(CarInfo::getProjectSn, project.getProjectSn()) .eq(CarInfo::getCarModuleType, CarInfoCarModuleTypeEnum.GD.getValue()) ); Set ids = new HashSet<>(); Set carNumSet = myFixCars.stream().map(CarInfo::getCarNumber).collect(Collectors.toSet()); for (int i = 0; i < listJa.size(); i++) { JSONObject jo = listJa.getJSONObject(i); if (carNumSet.contains(jo.getString("plateNo"))) { ids.add(jo.getString("vehicleId")); } } ids.add(carInfo.getId() + ""); return ids; } /** * 人脸评分 */ public boolean faceScore(Project project, JSONObject param) throws Exception { final String artemisPath = "/artemis"; final String path = artemisPath + "/api/frs/v1/face/picture/check"; String host = "https://" + project.getArtemisConfigHost(); String rs = HikvisionUtil.doPost(host, path, param.toJSONString(), null, project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()); if (HikvisionUtil.isSuccess(rs)) { JSONObject rsJo = HikvisionUtil.getJsonObjectData(rs); return rsJo.getBoolean("checkResult"); } else { return false; } } /** * 更新人员权限 * * @param i 0新增,2删除 */ public void updatePersonAuth(WorkerInfo workerInfo, String devSn, StringBuilder sucSb, StringBuilder failSb, int i) throws Exception { Project project = projectMapper.selectOne(new LambdaQueryWrapper().eq(Project::getProjectSn, workerInfo.getProjectSn())); if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { return; } UfaceDev dev = ufaceDevMapper.selectOne(new LambdaQueryWrapper() .eq(UfaceDev::getDevSn, devSn)); String json = "{\n" + " \"pageNo\": 1,\n" + " \"pageSize\": 1,\n" + "\t \"expressions\": [\n" + " {\n" + " \"key\": \"resourceIndexCode\",\n" + " \"operator\": 0,\n" + " \"values\": [\n" + " \"" + devSn + "\"\n" + " ]\n" + " }\n" + " ],\n" + "}"; JSONObject rs = HikvisionUtil.getDoorsV2(project, JSONObject.parseObject(json)); JSONObject jo = HikvisionUtil.getJsonObjectData(rs); JSONArray listJa = jo.getJSONArray(LIST); if (CollUtil.isEmpty(listJa)) { throw new OpenAlertException("失败信息:isc不存在该设备"); } String channelNo = listJa.getJSONObject(0).getString("channelNo"); String sdStr = "{\n" + "\t\"taskType\": 5,\n" + "\t\"resourceInfo\": {\n" + "\t\t\"channelNos\": [" + channelNo + "],\n" + "\t\t\"resourceIndexCode\": \"" + devSn + "\",\n" + "\t\t\"resourceType\": \"door\"\n" + "\t},\n" + "\t\"personInfo\": {\n" + "\t\t\"personId\": \"" + workerInfo.getId() + "\",\n" + "\t\t\"operatorType\": " + i + "\n" + "\t}\n" + "}"; JSONObject sdRs = HikvisionUtil.downloadSimple(project, sdStr); if (HikvisionUtil.isFail(sdRs)) { log.error("下发人员权限失败:" + workerInfo.getWorkerName() + "," + dev.getDevName() + " fail:" + sdRs.toJSONString() + ","); String code = sdRs.getString(CODE); if (Objects.equals(code, X_15403007)) { //已存在权限,下发成功 updateSucForUpdatePersonAuth(workerInfo, devSn, i); sucSb.append(workerInfo.getWorkerName() + "," + dev.getDevName() + ";"); return; } if (Objects.equals(code, X_02401033)) { failSb.append(workerInfo.getWorkerName() + "," + dev.getDevName() + ",失败原因:网络异常;"); } else { failSb.append(workerInfo.getWorkerName() + "," + dev.getDevName() + ",失败原因:下发异常;"); } return; } JSONObject sdRsJo = HikvisionUtil.getJsonObjectData(sdRs); Integer downloadResult = sdRsJo.getJSONObject("resourceDownloadResult").getInteger("downloadResult"); if (downloadResult == 0) { updateSucForUpdatePersonAuth(workerInfo, devSn, i); sucSb.append(workerInfo.getWorkerName() + "," + dev.getDevName() + ";"); } else { log.error(workerInfo.getWorkerName() + "," + dev.getDevName() + ",fail:" + sdRsJo.toJSONString()); failSb.append(workerInfo.getWorkerName() + "," + dev.getDevName() + ",失败原因:下发异常;"); } } /** * 为人员权限设置成功下发状态 * * @param workerInfo * @param devSn * @param i */ private void updateSucForUpdatePersonAuth(WorkerInfo workerInfo, String devSn, int i) { updateSuccessStatus(workerInfo.getProjectSn(), workerInfo.getId(), 3, i == 0 ? 1 : 3, devSn); } /** * 需要简单删除权限方法 * * @param workerId * @param dev * @param project * @param flowStartUser * @param workerIdMap * @param jsonObject * @throws Exception */ public void simpleDeletePersonAuth(String workerId, UfaceDev dev, ProjectInfoExtVo project, Long flowStartUser, Map workerIdMap, JSONObject jsonObject) throws Exception { WorkerInfo workerInfo = workerIdMap.get(workerId); String sdStr = "{\n" + "\t\"taskType\": 5,\n" + "\t\"resourceInfo\": {\n" + "\t\t\"channelNos\": [" + jsonObject.getString("channelNo") + "],\n" + "\t\t\"resourceIndexCode\": \"" + jsonObject.getString("parentIndexCode") + "\",\n" + "\t\t\"resourceType\": \"acsDevice\"\n" + "\t},\n" + "\t\"personInfo\": {\n" + "\t\t\"personId\": \"" + workerId + "\",\n" + "\t\t\"operatorType\": 2\n" + "\t}\n" + "}"; JSONObject sdRs = HikvisionUtil.downloadSimple(project, sdStr); boolean isSuc; String exceptionReason = ""; if (HikvisionUtil.isFail(sdRs)) { log.error("下发人员权限失败:" + workerInfo.getWorkerName() + "," + dev.getDevName() + " fail:" + sdRs.toJSONString() + ","); String code = sdRs.getString(CODE); if (Objects.equals(code, X_15403007)) { //已存在权限,下发成功 isSuc = true; } else if (Objects.equals(code, X_02401033)) { isSuc = false; exceptionReason = "网络异常"; } else { isSuc = false; exceptionReason = "下发异常"; } } else { JSONObject sdRsJo = HikvisionUtil.getJsonObjectData(sdRs); Integer downloadResult = sdRsJo.getJSONObject("resourceDownloadResult").getInteger("downloadResult"); isSuc = downloadResult == 0; exceptionReason = "下发异常"; } String projectSn = project.getProjectSn(); if (isSuc) { hikvisionCall.updateSuccessStatus(projectSn, Long.valueOf(workerId), 3, 3, dev.getDevSn()); } else { hikvisionCall.updateFailStatus(projectSn, Long.valueOf(workerId), 3, 3, dev.getDevSn()); } Set noticeUserIds = this.getNoticeUserIds(flowStartUser, projectSn); for (Long noticeUserId : noticeUserIds) { noticeService.addUserNotice(noticeUserId, "人员下发设备提醒", StrUtil.format("[{}]取消下发到[{}]{}", workerInfo.getWorkerName(), dev.getDevName(), isSuc ? "成功" : "失败," + exceptionReason), "1"); } } }