package com.doumee.service.business.impl.hksync; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.erp.model.openapi.request.erp.UserFailRequest; import com.doumee.core.haikang.model.HKConstants; import com.doumee.core.haikang.model.param.BaseResponse; import com.doumee.core.haikang.model.param.request.*; import com.doumee.core.haikang.model.param.respose.*; import com.doumee.core.haikang.service.HKService; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DESUtil; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.ImageBase64Util; import com.doumee.dao.business.CompanyMapper; import com.doumee.dao.business.DeviceRoleMapper; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.VisitsMapper; import com.doumee.dao.business.join.VisitsJoinMapper; import com.doumee.dao.business.model.Company; import com.doumee.dao.business.model.DeviceRole; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Visits; import com.doumee.service.business.ERPSyncService; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; /** * 海康访客业务Service实现 * @author 江蹄蹄 * @date 2023/11/30 15:33 */ @Service @Slf4j public class HkSyncVisitServiceImpl extends HkSyncBaseServiceImpl { @Autowired private VisitsJoinMapper visitsMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private DeviceRoleMapper deviceRoleMapper; /** * 同步海康组织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息 */ @Override public void syncVisitData(){ if(Constants.DEALING_HK_VISIT){ return ; } Constants.DEALING_HK_VISIT =true; String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode(); List roleList = deviceRoleMapper.selectList(new QueryWrapper().lambda() .eq(DeviceRole::getType, Constants.ONE)); //标记是否走免登记预约 String applyType =systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.MDJ_VISIT_REQUIRED).getCode(); String applyLwType =systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.MDJ_LW_REQUIRED).getCode(); try { //查询所有需要同步的数据 List list = getVisitList(); //按照父级申请分批处理每次申请数据 // List list = getParentList(alllist); if(list ==null || list.size()==0){ return; } Date date = new Date(); for(Visits c : list) { //发起海康预约接口(需要登记),根据预约返回接口封装申请记录更新字段 String type = Constants.equalsInteger(c.getType(),Constants.ONE)?applyType:applyLwType; getUpdateModelByResponse(c,date,type,roleList,path); visitsMapper.updateById(c); } }catch (Exception e){ e.printStackTrace(); }finally { Constants.DEALING_HK_VISIT =false; } } private List getParentList(List alllist) { if(alllist ==null || alllist.size()==0){ return null; } List list = new ArrayList<>(); for (Visits v : alllist){ if(v.getParentId() == null){ v.setVisitsList(getChildListByParentId(v.getId(),alllist)); list.add(v); } } return list; } private List getChildListByParentId(Integer id, List alllist) { List list = new ArrayList<>(); for (Visits v : alllist){ if(Constants.equalsInteger(v.getParentId(),id)){ list.add(v); } } return list; } /** * 根据预约返回接口封装申请记录更新字段 * @param c * @param date * @param date * @param type 0需要登记 1免登记 */ private void getUpdateModelByResponse( Visits c,Date date,String type,List roleList,String path ) { String code = null; String id = null; //发起海康预约接口 if(StringUtils.equals(type,"0")){ //(需要登记) VisitAppointmentRequest request = getHkRequestPara(c,roleList,path); if(request == null){ //海康下发成功 c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败 c.setRemark("下发海康参数不正确!"); c.setHkStatus(Constants.ONE); c.setHkDate(date); return; } BaseResponse response = HKService.visitAppiontment(request); code =response!=null ?response.getCode():null; id = (response!=null && response.getData()!=null && response.getData().getAppointmentInfoList() !=null && response.getData().getAppointmentInfoList().size()>0)?response.getData().getAppointmentInfoList().get(0).getOrderId():null; }else{ //免登记 VisitAppointmentMDJRequest request =getHkMDJRequestPara(c,roleList,path); if(request == null){ //海康下发成功 c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败 c.setRemark("下发海康免登记参数不正确!"); c.setHkStatus(Constants.ONE); c.setHkDate(date); return; } BaseResponse response = HKService.visitAppiontmentMDJ(request ); code =response!=null ?response.getCode():null; id = (response!=null && response.getData()!=null)?response.getData().getOrderId():null; } if (code!= null && id!=null) { //海康下发成功 c.setHkId( id);//预约标识 c.setRemark("下发海康成功!【"+type+"】"); c.setStatus(Constants.VisitStatus.xfSuccess);//下发海康成功 } else { //海康下发成功 c.setRemark("下发海康失败!【"+type+"】"); c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败 } c.setHkStatus(Constants.ONE); c.setHkDate(date); } /** * 免登记接口参数 * @param c * @return */ private VisitAppointmentMDJRequest getHkMDJRequestPara(Visits c,List roleList,String path) { VisitAppointmentMDJRequest request = new VisitAppointmentMDJRequest(); VisitAppointmentVistorRequest info =getRequestInfoByVisit(c,path); if(info == null ){ //人脸为空,不能进行推送 return null; } request.setVisitStartTime(DateUtil.getISO8601Timestamp(c.getStarttime())); request.setVisitEndTime(DateUtil.getISO8601Timestamp(c.getEndtime())); request.setReceptionistId(c.getReceptMemberHkId());//被访人海康编码 request.setVisitPurpose(c.getReason()); request.setVisitorInfo(info); request.setVisitorPermissionSet(getVisitPermissonRequest(roleList,c)); return request; } /** * 访客权限组 * @param roleList * @param c * @return */ private VisitAppointmentPermissonRequest getVisitPermissonRequest(List roleList, Visits c) { VisitAppointmentPermissonRequest p = new VisitAppointmentPermissonRequest(); //获取权限组集合 String[] roles = getHkRoles(c.getDoors(),roleList); if(roles==null || roles.length ==0){ //使用默认访客权限组 p.setDefaultPrivilegeGroupFlag(Constants.ONE+""); }else{ //指定有效海康访客权限组数据 p.setDefaultPrivilegeGroupFlag(Constants.ZERO+""); p.setPrivilegeGroupIds(roles); } return p; } private VisitAppointmentRequest getHkRequestPara(Visits c,List roleList,String path ) { VisitAppointmentRequest request = new VisitAppointmentRequest(); //申请人信息 VisitAppointmentVistorRequest info =getRequestInfoByVisit(c,path); if(info == null ){ //人脸为空,不能进行推送 return null; } request.setVisitStartTime(DateUtil.getISO8601Timestamp(c.getStarttime())); request.setVisitEndTime(DateUtil.getISO8601Timestamp(c.getEndtime())); request.setReceptionistId(c.getReceptMemberHkId());//被访人海康编码 request.setVisitPurpose(c.getReason()); //获取权限组集合 request.setVisitorPermissionSet(getVisitPermissonRequest(roleList,c)); List infolist = new ArrayList<>(); infolist.add(info); request.setVisitorInfoList(infolist); return request; } private VisitAppointmentVistorRequest getRequestInfoByVisit(Visits c,String path) { VisitAppointmentVistorRequest info = new VisitAppointmentVistorRequest(); //人脸数据 if(StringUtils.isBlank(c.getName()) ||StringUtils.isBlank(c.getPhone()) || StringUtils.isBlank(c.getFaceImg()) ){ return null; } if(StringUtils.isNotBlank(c.getFaceImg())){ info.setVisitorPhoto(ImageBase64Util.Image2Base64(path+c.getFaceImg())); } if(info.getVisitorPhoto() == null){ return null; } info.setVisitorName(c.getName()); info.setVisitorWorkUnit(c.getCompanyName()); info.setPhoneNo(c.getPhone()); info.setPlateNo(c.getCarNos()); if(Constants.equalsInteger(c.getIdcardType(),Constants.ZERO)){ info.setCertificateType(HKConstants.CertificateType.SHENFENZHENG.getKey()+""); info.setCertificateNo(DESUtil.decrypt(Constants.EDS_PWD, c.getIdcardNo())); } else if(Constants.equalsInteger(c.getIdcardType(),Constants.TWO)){ info.setCertificateType(HKConstants.CertificateType.HUZHAO.getKey()+""); info.setCertificateNo(DESUtil.decrypt(Constants.EDS_PWD, c.getIdcardNo())); } return info; } private String[] getHkRoles(String doors, List roleList) { if(StringUtils.isBlank(doors) || roleList.size()==0|| roleList.size()==0){ return null; } String[] ids = doors.split(","); List roles = new ArrayList<>(); for (String s : ids){ for(DeviceRole r : roleList){ if(StringUtils.isNotBlank(r.getHkId()) && StringUtils.equals(s,r.getId().toString())){ roles.add(r.getHkId()); } } } return roles.toArray(new String[]{}); } /** * 查询所有需要同步的数据 * @return */ private List getVisitList() { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Visits.class); queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName) .select("t1.hk_id as receptMemberHkId") .leftJoin(Member.class,Member::getId,Visits::getReceptMemberId); queryWrapper.eq(Visits::getStatus,Constants.VisitStatus.pass)//审批通过 .eq(Visits::getHkStatus,Constants.ZERO)//未同步到海康 .orderByAsc(Visits::getCreateDate); List list = visitsMapper.selectJoinList(Visits.class,queryWrapper); return list; } }