package com.doumee.service.business.impl.hksync; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.doumee.config.SpringContextUtil; import com.doumee.core.haikang.model.HKConstants; import com.doumee.core.haikang.model.param.request.event.acs.EventAcsInfoRequest; import com.doumee.core.haikang.model.param.request.event.acs.EventAcsRequest; import com.doumee.core.haikang.model.param.request.event.acs.EventDeviceDataRequest; import com.doumee.core.haikang.model.param.request.event.parks.EventParkInfoRequest; import com.doumee.core.haikang.model.param.request.event.parks.EventParkRequest; import com.doumee.core.haikang.model.param.request.event.visit.EventVisitDataRequest; import com.doumee.core.haikang.model.param.request.event.visit.EventVisitInfoRequest; import com.doumee.core.haikang.model.param.request.event.visit.EventVisitRequest; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DESUtil; import com.doumee.core.utils.DateUtil; import com.doumee.dao.business.*; import com.doumee.dao.business.join.VisitsJoinMapper; import com.doumee.dao.business.model.*; import com.doumee.dao.system.model.SystemUser; import com.doumee.service.business.DeviceEventService; import com.doumee.service.business.InterfaceLogService; import com.doumee.service.business.MemberService; import com.github.yulichang.interfaces.MPJBaseJoin; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.hikvision.artemis.sdk.config.ArtemisConfig; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.checkerframework.checker.units.qual.C; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 访客权限组信息表Service实现 * @author 江蹄蹄 * @date 2023/11/30 15:33 */ @Service @Slf4j public class HkSyncPushServiceImpl extends HkSyncBaseServiceImpl { @Autowired private InterfaceLogMapper interfaceLogMapper; @Autowired private DeviceEventMapper deviceEventMapper; @Autowired private MemberMapper memberMapper; @Autowired private CarEventMapper carEventMapper; @Autowired private VisitEventMapper visitEventMapper; @Autowired private VisitsJoinMapper visitsMapper; @Autowired private RetentionMapper retentionMapper; /** * 海康门禁事件推送 * @param param * @param response * @return */ @Override public String dealAcsEvent(EventAcsRequest param, HttpServletResponse response){ log.info("【海康门禁事件推送】========开始=========:\n"+JSONObject.toJSONString(param)); String result = null; try { if(param == null || param.getParams() == null || param.getParams().getEvents()==null){ return null; } //门禁事件集合 List events = param.getParams().getEvents(); List list = new ArrayList<>(); List delRetentionLis = new ArrayList<>(); List retentionList = new ArrayList<>(); for(EventAcsInfoRequest request : events){ EventDeviceDataRequest model = request.getData(); if(model ==null){ continue; } //根据推送人员编码,处理在场、离场人员数据记录 dealMemberDataByRequest(request,delRetentionLis,retentionList); //封装门禁事件信息表对象 list.add(getDeviceEventModelByRequest(request)); } if(list.size()>0){ //插入门禁记录 deviceEventMapper.insertBatchSomeColumn(list); } if(delRetentionLis.size()>0){ //先删除原有的在场人员(内部人员) retentionMapper.delete(new UpdateWrapper().lambda() .eq(Retention::getType,Constants.memberType.internal) .in(Retention::getMemberId,delRetentionLis)); } if(retentionList.size()>0){ //再插入最新的在厂人员 retentionMapper.insertBatchSomeColumn(retentionList); } log.error("【海康门禁事件推送】========成功======="); }catch (Exception e) { log.error("【海康门禁事件推送】========失败=======:\n" + e.getMessage()); }finally { saveInterfaceLog(param,"/business/hksync/push/acs",result); } return null; } /** * 根据推送人员编码,处理在场、离场人员数据记录 * @param request * @param delRetentionLis * @param retentionList */ private void dealMemberDataByRequest(EventAcsInfoRequest request, List delRetentionLis, List retentionList) { //海康人员编码 String userNo = request.getData().getExtEventPersonNo(); if(StringUtils.isNotBlank(userNo)){ Member member = memberMapper.selectOne(new QueryWrapper().lambda().eq(Member::getHkId,userNo).last("limit 1")); if(member !=null){ //如果人员信息存在,则删除之前的所有进场数据(无论此次推送是进厂还是出场推送事件) delRetentionLis.add(member.getId()); if(Constants.formatIntegerNum(request.getData().getExtEventInOut()) == Constants.ONE){ //如果是进门,录入人员的在场数据记录 retentionList.add(getRetentionModelByRequest(member,request)); } } } } public static String getHkImgUrl(String url){ if(StringUtils.isBlank(url)){ return null; } return HKConstants.IMG_INDEX+url; } /** *封装门禁事件信息表对象 */ private DeviceEvent getDeviceEventModelByRequest(EventAcsInfoRequest request) { DeviceEvent event = new DeviceEvent(); event.setIsdeleted(Constants.ZERO); event.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime())); event.setEventId(request.getEventId()); event.setEventType( request.getData().getExtEventType()!=null?request.getData().getExtEventType()+"":null); event.setAccessChannel(request.getData().getExtAccessChannel()); event.setUserType(request.getData().getUserType()); event.setSvrIndexCode(request.getData().getSvrIndexCode()); event.setStatus(request.getStatus()); event.setSrcType(request.getSrcType()); event.setSrcName(request.getSrcName()); event.setSrcIndex(request.getSrcIndex()); event.setSeq(request.getData().getSeq()); event.setTimeout(request.getTimeout()); event.setExtEventType(request.getData().getExtEventType()); event.setHappenTime(request.getHappenTime()); event.setExtReceiveTime(request.getData().getExtReceiveTime()); event.setExtEventWhiteListNo(request.getData().getExtEventWhiteListNo()); event.setExtEventWhiteListNo(request.getData().getExtEventWhiteListNo()); event.setExtEventVerifyID(request.getData().getExtEventVerifyID()); event.setExtEventRoleID(request.getData().getExtEventRoleID()); event.setExtEventReportChannel(request.getData().getExtEventReportChannel()); event.setExtEventReaderKind(request.getData().getExtEventReaderKind()); event.setExtEventReaderID(request.getData().getExtEventReaderID()); event.setExtEventPictureURL(getHkImgUrl(request.getData().getExtEventPictureURL())); event.setExtEventPersonNo(request.getData().getExtEventPersonNo()); event.setExtEventMainDevID(request.getData().getExtEventMainDevID()); event.setExtEventLocalControllerID(request.getData().getExtEventLocalControllerID()); event.setExtEventInOut(request.getData().getExtEventInOut()); event.setExtEventIDCardPictureURL(getHkImgUrl(request.getData().getExtEventIDCardPictureURL())); event.setExtEventEwipNum(request.getData().getExtEventSwipNum()); event.setExtEventEubDevID(request.getData().getExtEventMainDevID()); event.setExtEventDoorID(request.getData().getExtEventDoorID()); event.setExtEventCode(request.getData().getExtEventCode()); event.setExtEventCaseID(request.getData().getExtEventCaseID()); event.setExtEventCardNo(request.getData().getExtEventCardNo()); event.setExtEventAlarmOutID(request.getData().getExtEventAlarmOutID()); event.setExtEventAlarmInID(request.getData().getExtEventAlarmInID()); event.setExtAccessChannel(request.getData().getExtAccessChannel()); //通道事件信息 if(request.getData().getExtEventCustomerNumInfo() !=null){ event.setTotalTimes(request.getData().getExtEventCustomerNumInfo().getTotalTimes()); event.setEntryTimes(request.getData().getExtEventCustomerNumInfo().getEntryTimes()); event.setExitTimes(request.getData().getExtEventCustomerNumInfo().getExitTimes()); event.setAccessChannel(request.getData().getExtEventCustomerNumInfo().getAccessChannel()); } if(request.getData().getExtEventIdentityCardInfo() !=null){ //人员身份证件信息 event.setBirth(request.getData().getExtEventIdentityCardInfo().getBirth()); String idnum = request.getData().getExtEventIdentityCardInfo().getIdNum(); if(StringUtils.isNotBlank(idnum)){ //身份证号存储密文 event.setIdNum(DESUtil.encrypt(Constants.EDS_PWD,idnum));//身份证号加密 //脱敏手机号显示n event.setIdcardDecode(Constants.getTuominStr(idnum)); } event.setAddress(request.getData().getExtEventIdentityCardInfo().getAddress()); event.setSex(request.getData().getExtEventIdentityCardInfo().getSex()); event.setName(request.getData().getExtEventIdentityCardInfo().getName()); event.setEndDate(request.getData().getExtEventIdentityCardInfo().getEndDate()); event.setStartDate(request.getData().getExtEventIdentityCardInfo().getStartDate()); event.setTermOfValidity(request.getData().getExtEventIdentityCardInfo().getTermOfValidity()); } return event; } /** * 进厂对象封装成在场人员 * @param member * @param request * @return */ private Retention getRetentionModelByRequest(Member member, EventAcsInfoRequest request) { Retention retention = new Retention(); retention.setIsdeleted(Constants.ZERO); retention.setCreateDate(DateUtil.getISO8601DateByStr(request.getData().getExtReceiveTime())); retention.setClasses(member.getClasses()); retention.setCode(member.getCode()); retention.setIdcardNo(member.getIdcardNo()); retention.setIdcardDecode(member.getIdcardDecode()); retention.setName(member.getName()); retention.setBirthday(member.getBirthday()); retention.setType(member.getType()); retention.setCompanyId(member.getCompanyId()); retention.setCompanyName(member.getCompanyName()); retention.setEventCode(request.getData().getExtEventCode()+""); retention.setEventDate(DateUtil.getISO8601DateByStr(request.getData().getExtReceiveTime())); retention.setFaceImg(member.getFaceImg()); retention.setImgurl(member.getImgurl()); retention.setPhone(member.getPhone()); retention.setMemberId(member.getId()); retention.setDeviceName(request.getSrcName()); retention.setDeviceIndex(request.getSrcIndex()); return retention; } /** * 海康访客事件推送 * @param param * @param response * @return */ @Override public String dealVisitEvent(EventVisitRequest param, HttpServletResponse response){ log.info("【海康访客事件推送】==========开始=======:\n"+JSONObject.toJSONString(param)); String result = null; try { if(param == null || param.getParams() == null || param.getParams().getEvents()==null){ return null; } //门禁事件集合 List events = param.getParams().getEvents(); List list = new ArrayList<>(); List delRetentionLis = new ArrayList<>(); List retentionList = new ArrayList<>(); for(EventVisitInfoRequest request : events){ if(request.getData() ==null ||StringUtils.isBlank(request.getData().getVisitorId())){ continue; } //海康访客记录编码 if(StringUtils.isNotBlank(request.getData().getVisitorId())){ //根据访客推送访客记录编码,处理访客记录、在场人员等信息 dealVisitDataByRequst(request,delRetentionLis,retentionList); } //封装门禁事件信息表对象 list.add(getVisitEventModelByRequest(request)); } if(list.size()>0){ //插入门禁记录 visitEventMapper.insertBatchSomeColumn(list); } if(delRetentionLis.size()>0){ //先删除原有的在场人员(普通访客) retentionMapper.delete(new UpdateWrapper().lambda() .eq(Retention::getType,Constants.memberType.visitor) .in(Retention::getMemberId,delRetentionLis)); } if(retentionList.size()>0){ //再插入最新的在厂人员 retentionMapper.insertBatchSomeColumn(retentionList); } log.error("【海康访客事件推送】========成功======="); }catch (Exception e){ log.error("【海康访客事件推送】========失败=======:\n"+e.getMessage()); } saveInterfaceLog(param,"/business/hksync/push/visit",result); return null; } /** * 根据访客推送访客记录编码,处理访客记录、在场人员等信息 */ private void dealVisitDataByRequst(EventVisitInfoRequest request, List delRetentionLis, List retentionList) { EventVisitDataRequest model = request.getData(); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Visits.class); queryWrapper.eq(Visits::getHkId,model.getVisitorId() ); queryWrapper.last("limit 1"); Visits visits = visitsMapper.selectJoinOne(Visits.class,queryWrapper); if(visits !=null){ //如果人员信息存在,则删除之前的所有进场数据(无论此次推送是进厂还是出场推送事件) delRetentionLis.add(visits.getMemberId()); Visits updateVistis = new Visits(); updateVistis.setId(visits.getId()); if(Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_IN.getKey()){ //如果是访客登记,录入人员的在场数据记录 retentionList.add(getRetentionModelByVisitRequest(visits,request)); //来访时间 updateVistis.setOutDate(DateUtil.getISO8601DateByStr(model.getStartTime())); }else { //如果是访客签离事件 updateVistis.setOutDate(DateUtil.getISO8601DateByStr(model.getEndTime())); updateVistis.setOutType(Constants.ZERO); updateVistis.setOutInfo("访客正常签离"); } updateVistis.setEditDate(new Date()); //更新访客来访或者签离时间信息 visitsMapper.updateById(updateVistis) ; } } private VisitEvent getVisitEventModelByRequest(EventVisitInfoRequest request) { VisitEvent event = new VisitEvent(); event.setIsdeleted(Constants.ZERO); event.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime())); event.setVisitorWorkUint(request.getData().getVisitorWorkUint()); event.setVisitorId(request.getData().getVisitorId()); event.setVisitorCode(request.getData().getVisitorCode()); event.setTimeout(request.getTimeout()); event.setSvrIndexCode(request.getData().getSvrIndexCode()); event.setStatus(request.getStatus()); event.setStartTime(request.getData().getStartTime()); event.setSrcType(request.getSrcType()); event.setSrcParentIndex(request.getSrcParentIndex()); event.setSrcName(request.getSrcName()); event.setSrcIndex(request.getSrcIndex()); event.setSignOrg(request.getData().getSignOrg()); event.setSex(request.getData().getSex()); event.setPurpose(request.getData().getPurpose()); event.setPhotoUrl(getHkImgUrl(request.getData().getPhotoUrl())); event.setPersonName(request.getData().getPersonName()); event.setIdType(request.getData().getIdType()); String idnum =request.getData().getIdNo(); if(StringUtils.isNotBlank(idnum)){ //身份证号存储密文 event.setIdNo(DESUtil.encrypt(Constants.EDS_PWD,idnum));//身份证号加密 //脱敏手机号显示n event.setIdcardDecode(Constants.getTuominStr(idnum)); } event.setEventType(request.getEventType()); event.setEventId(request.getEventId()); event.setHappenTime(event.getHappenTime()); return event; } private Retention getRetentionModelByVisitRequest(Visits visits, EventVisitInfoRequest request) { Retention retention = new Retention(); retention.setIsdeleted(Constants.ZERO); retention.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime())); retention.setClasses(visits.getMemberClasses()); retention.setCode(visits.getCode()); retention.setIdcardNo(visits.getIdcardNo()); retention.setIdcardDecode(visits.getIdcardDecode()); retention.setName(visits.getName()); retention.setBirthday(visits.getBirthday()); retention.setType(visits.getMemberType()); retention.setCompanyId(visits.getCompanyId()); retention.setCompanyName(visits.getCompanyName()); retention.setEventCode(request.getEventType()+""); retention.setEventDate(retention.getCreateDate()); retention.setFaceImg(visits.getFaceImg()); retention.setImgurl(visits.getImgurl()); retention.setPhone(visits.getPhone()); retention.setMemberId(visits.getMemberId()); retention.setDeviceName(request.getSrcName()); retention.setDeviceIndex(request.getSrcIndex()); return retention; } /** * 海康停车场事件推送 * @param param * @param response * @return */ @Override public String dealParkEvent(EventParkRequest param, HttpServletResponse response){ String result = null; log.info("【海康停车场事件推送】========开始=========:\n"+JSONObject.toJSONString(param)); try { if(param == null || param.getParams() == null || param.getParams().getEvents()==null){ return null; } //门禁事件集合 List events = param.getParams().getEvents(); List list = new ArrayList<>(); for(EventParkInfoRequest request : events){ if(request.getData() ==null ||StringUtils.isBlank(request.getData().getPlateNo())){ continue; } //封装事件信息表对象 list.add(getParkEventModelByRequest(request)); } if(list.size()>0){ //插入门禁记录 carEventMapper.insertBatchSomeColumn(list); } log.error("【海康停车场事件推送】========成功======="); }catch (Exception e){ log.error("【海康停车场事件推送】========失败=======:\n"+e.getMessage()); } saveInterfaceLog(param,"/business/hksync/push/parks",result); return null; } private CarEvent getParkEventModelByRequest(EventParkInfoRequest request) { CarEvent event = new CarEvent(); return event; } private void saveInterfaceLog(Object param, String path,String result) { InterfaceLog hkMonitoryLogDO=new InterfaceLog(); hkMonitoryLogDO.setType(1); hkMonitoryLogDO.setCreateDate(new Date()); hkMonitoryLogDO.setIsdeleted(0); if(param!=null){ hkMonitoryLogDO.setRequest(JSONObject.toJSONString(param)); } hkMonitoryLogDO.setRepose(result); hkMonitoryLogDO.setName(path); hkMonitoryLogDO.setUrl(path); interfaceLogMapper.insert(hkMonitoryLogDO); } }