| 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.biz.system.SystemDictDataBiz; | 
| import com.doumee.core.haikang.model.HKConstants; | 
| import com.doumee.core.haikang.model.param.BaseListPageResponse; | 
| 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.core.wx.wxPlat.WxPlatConstants; | 
| import com.doumee.core.wx.wxPlat.WxPlatNotice; | 
| import com.doumee.dao.business.DeviceRoleMapper; | 
| import com.doumee.dao.business.RetentionMapper; | 
| import com.doumee.dao.business.WxNoticeConfigMapper; | 
| import com.doumee.dao.business.join.VisitsJoinMapper; | 
| import com.doumee.dao.business.model.DeviceRole; | 
| import com.doumee.dao.business.model.Member; | 
| import com.doumee.dao.business.model.Retention; | 
| import com.doumee.dao.business.model.Visits; | 
| 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.*; | 
|   | 
| /** | 
|  * 海康访客业务Service实现 | 
|  * @author 江蹄蹄 | 
|  * @date 2023/11/30 15:33 | 
|  */ | 
| @Service | 
| @Slf4j | 
| public class HkSyncVisitServiceImpl extends HkSyncBaseServiceImpl { | 
|     @Autowired | 
|     private VisitsJoinMapper visitsMapper; | 
|   | 
|   | 
|   | 
|     @Autowired | 
|     private WxPlatNotice wxPlatNotice; | 
|     @Autowired | 
|     private WxNoticeConfigMapper wxNoticeConfigMapper; | 
|     @Autowired | 
|     private RetentionMapper retentionMapper; | 
|     @Autowired | 
|     private SystemDictDataBiz systemDictDataBiz; | 
|     @Autowired | 
|     private DeviceRoleMapper deviceRoleMapper; | 
|     /** | 
|      * 同步海康访客信息是否已签离状态 | 
|      */ | 
|     @Override | 
|     public void getOutTimeVisitRecord(){ | 
|         if(Constants.DEALING_HK_VISIT_EXPIRE){ | 
|             return   ; | 
|         } | 
|         Constants.DEALING_HK_VISIT_EXPIRE =true; | 
|         try { | 
|             //查询所有需要同步的数据 | 
|             List<Visits> list = getExpireVisitList(); | 
|             //按照父级申请分批处理每次申请数据 | 
|             if(list ==null || list.size()==0){ | 
|                 return; | 
|             } | 
|             Date date = new Date(); | 
|             for(Visits c : list) { | 
|                 //发起海康预约接口(需要登记),根据预约返回接口封装申请记录更新字段 | 
|                 AppointmentInfoResponse model =  getVisitRecord(c.getHkId()); | 
|                 if(model == null){ | 
|                     continue; | 
|                 } | 
|                 /** | 
|                  *      * 0:待审核(预约待审批)、 | 
|                  *      * 1:正常(预约成功或预约审批成功后<未登记>:当前时间未超过预计来访时间)、 | 
|                  *      * 2:迟到(预约成功或预约审批成功后<未登记>:当前时间超过预计来访时间,但未超过预计离开时间)、 | 
|                  *      * 3:失效(预约成功或预约审批成功后<未登记>:当前时间已超过预计离开时间)、 | 
|                  *      * 4:审核退回(预约待审批,审批人员审批退回)、 | 
|                  *      * 5:超期自动签离(超期未签离记录访客,由后台任务定时处理签离)、 | 
|                  *      * 6:已签离(访客签离)、 | 
|                  *      * 7:超期未签离(访客登记,当前时间已超过预计离开时间,还未进行签离)、 | 
|                  *      * 8:已到达;(访客登记,当前时间未超过预计离开时间)、 | 
|                  *      * 9:审核失效(预约待审批,一直到当前时间超过预计离开时间,还未审批通过)、 | 
|                  *      * 10:邀约中(员工发起邀约,访客还未应邀)、 | 
|                  *      * 11:邀约失效(员工发起邀约,一直到当前时间超过预计离开时间,访客还未应邀) | 
|                  */ | 
|                 if (model.getVisitorStatus()!=null && ",3,4,11,".contains( ","  +model.getVisitorStatus()+"," )){ | 
|                     //对相应状态下的数据进行【已失效】处理 | 
|                     Visits update = new Visits(); | 
|                     //已失效 | 
|                     update.setStatus(Constants.VisitStatus.invalid); | 
|                     update.setEditDate(date); | 
|                     update.setId(c.getId()); | 
|                     update.setInDate(DateUtil.getISO8601DateByStr2(model.getVisitStartTime())); | 
|                     update.setOutDate(DateUtil.getISO8601DateByStr2(model.getVisitEndTime())); | 
|                     update.setRemark("超时未登记"); | 
|                     visitsMapper.updateById(update); | 
|                 } | 
|                 if (model.getVisitorStatus()!=null && ",5,6,".contains( ","  +model.getVisitorStatus()+"," )){ | 
|                     // 对相应状态下的数据进行【已签离】处理 | 
|                     if(!Constants.equalsInteger(c.getStatus(),Constants.VisitStatus.signout)){ | 
|                         Visits update = new Visits(); | 
|                         //已失效 | 
|                         update.setStatus(Constants.VisitStatus.signout); | 
|                         update.setEditDate(date); | 
|                         update.setId(c.getId()); | 
|                         update.setInDate(DateUtil.getISO8601DateByStr2(model.getVisitStartTime())); | 
|                         update.setOutDate(DateUtil.getISO8601DateByStr2(model.getVisitEndTime())); | 
|                         update.setRemark("已签离"); | 
|                         visitsMapper.updateById(update); | 
|   | 
|                         //先删除原有的在场人员(普通访客) | 
|                         retentionMapper.delete(new UpdateWrapper<Retention>().lambda() | 
|                                 .eq(Retention::getType,Constants.RetentionMemberType.fk) | 
|                                 .eq(Retention::getMemberId,c.getMemberId())); | 
|                     } | 
|                 } | 
|                 if (model.getVisitorStatus()!=null&& ",7,8,".contains( ","  +model.getVisitorStatus()+"," )){ | 
|                     //如果已登记 | 
|                     if(!Constants.equalsInteger(c.getStatus(),Constants.VisitStatus.signin)){ | 
|                         Visits update = new Visits(); | 
|                         //已失效 | 
|                         update.setStatus(Constants.VisitStatus.signin); | 
|                         update.setEditDate(date); | 
|                         update.setId(c.getId()); | 
|                         update.setInDate(DateUtil.getISO8601DateByStr2(model.getVisitStartTime())); | 
|                         update.setOutDate(DateUtil.getISO8601DateByStr2(model.getVisitEndTime())); | 
|                         update.setRemark("超时未签到"); | 
|                         visitsMapper.updateById(update); | 
|                         //先删除原有的在场人员(普通访客) | 
|                         retentionMapper.delete(new UpdateWrapper<Retention>().lambda() | 
|                                 .eq(Retention::getType,Constants.RetentionMemberType.fk) | 
|                                 .eq(Retention::getMemberId,c.getMemberId())); | 
|                         //再插入最新的在厂人员 | 
|                         retentionMapper.insert(getRetentionModelByVisitRequest(c,update.getInDate())); | 
|                     } | 
|                 } | 
|             } | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|         }finally { | 
|             Constants.DEALING_HK_VISIT_EXPIRE =false; | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 查询ICCM访客数据状态 | 
|      */ | 
|     @Override | 
|     public void getOutTimeVisitRecordIccm(){ | 
|         if(Constants.DEALING_HK_VISIT_EXPIRE){ | 
|             return   ; | 
|         } | 
|         Constants.DEALING_HK_VISIT_EXPIRE =true; | 
|         try { | 
|             //查询所有需要同步的数据 | 
|             List<Visits> list = getExpireVisitList(); | 
|             //按照父级申请分批处理每次申请数据 | 
|             if(list ==null || list.size()==0){ | 
|                 return; | 
|             } | 
|             Date date = new Date(); | 
|             for(Visits c : list) { | 
|                 //发起海康预约接口(需要登记),根据预约返回接口封装申请记录更新字段 | 
|                 IccmAppointmentListResponse data =  getVisitRecordIccm(c.getHkId()); | 
|                 if(data == null || data.getVisitorList() ==null || data.getVisitorList().size()==0){ | 
|                     continue; | 
|                 } | 
|                 /** | 
|                  * 访客状态(0:未签到,1:已签到,2:已签退,3:滞留,4:未访问,5:自动签离,6:未签退) | 
|                  */ | 
|                 IccmAppointmentVisitorResponse model = data.getVisitorList().get(0); | 
|                 if (model.getVisitorStatus()!=null && ",4,".contains( ","  +model.getVisitorStatus()+"," )){ | 
|                     //对相应状态下的数据进行【已失效】处理 | 
|                     Visits update = new Visits(); | 
|                     //已失效 | 
|                     update.setStatus(Constants.VisitStatus.invalid); | 
|                     update.setEditDate(date); | 
|                     update.setId(c.getId()); | 
|                     update.setInDate(DateUtil.getISO8601DateByStr2(data.getVisitStartTime())); | 
|                     update.setOutDate(DateUtil.getISO8601DateByStr2(data.getVisitEndTime())); | 
|                     update.setRemark("超时未登记"); | 
|                     visitsMapper.updateById(update); | 
|                 } | 
|                 if (model.getVisitorStatus()!=null && ",2,5,".contains( ","  +model.getVisitorStatus()+"," )){ | 
|                     // 对相应状态下的数据进行【已签离】处理 | 
|                     if(!Constants.equalsInteger(c.getStatus(),Constants.VisitStatus.signout)){ | 
|                         Visits update = new Visits(); | 
|                         //已签离 | 
|                         update.setStatus(Constants.VisitStatus.signout); | 
|                         update.setEditDate(date); | 
|                         update.setId(c.getId()); | 
|                         update.setInDate(DateUtil.getISO8601DateByStr2(data.getVisitStartTime())); | 
|                         update.setOutDate(DateUtil.getISO8601DateByStr2(data.getVisitEndTime())); | 
|                         update.setOutInfo(model.getVisitorStatus().equals(5)?"过期自动签离":"查询已签离"); | 
|                         update.setRemark("已签离"); | 
|                         visitsMapper.updateById(update); | 
|   | 
|                         //先删除原有的在场人员(普通访客) | 
|                         retentionMapper.delete(new UpdateWrapper<Retention>().lambda() | 
|                                 .eq(Retention::getType,Constants.RetentionMemberType.fk) | 
|                                 .eq(Retention::getMemberId,c.getMemberId())); | 
|                     } | 
|                 } | 
|                 if (model.getVisitorStatus()!=null&& ",1,3,6,".contains( ","  +model.getVisitorStatus()+"," )){ | 
|                     //如果已登记 | 
|                     if(!Constants.equalsInteger(c.getStatus(),Constants.VisitStatus.signin)){ | 
|                         Visits update = new Visits(); | 
|                         //已失效 | 
|                         update.setStatus(Constants.VisitStatus.signin); | 
|                         update.setEditDate(date); | 
|                         update.setId(c.getId()); | 
|                         update.setInDate(DateUtil.getISO8601DateByStr2(data.getVisitStartTime())); | 
|                         update.setOutDate(DateUtil.getISO8601DateByStr2(data.getVisitEndTime())); | 
|                         update.setRemark("已签到"); | 
|                         visitsMapper.updateById(update); | 
|                         //先删除原有的在场人员(普通访客) | 
|                         retentionMapper.delete(new UpdateWrapper<Retention>().lambda() | 
|                                 .eq(Retention::getType,Constants.RetentionMemberType.fk) | 
|                                 .eq(Retention::getMemberId,c.getMemberId())); | 
|                         //再插入最新的在厂人员 | 
|                         retentionMapper.insert(getRetentionModelByVisitRequest(c,update.getInDate())); | 
|                     } | 
|                 } | 
|             } | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|         }finally { | 
|             Constants.DEALING_HK_VISIT_EXPIRE =false; | 
|         } | 
|     } | 
|   | 
|     private Retention getRetentionModelByVisitRequest(Visits visits,Date date) { | 
|         Retention retention = new Retention(); | 
|         retention.setIsdeleted(Constants.ZERO); | 
|         retention.setCreateDate(date); | 
|         retention.setClasses(visits.getClasses()); | 
|         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.setEventDate(retention.getCreateDate()); | 
|         retention.setFaceImg(visits.getFaceImg()); | 
|         retention.setImgurl(visits.getImgurl()); | 
|         retention.setPhone(visits.getPhone()); | 
|         retention.setMemberId(visits.getMemberId()); | 
|   | 
|         return retention; | 
|     } | 
|   | 
|     public AppointmentInfoResponse getVisitRecord(String orderId){ | 
|         //分页遍历循环查询所有门禁设备数据 | 
|         if(StringUtils.isBlank(orderId)){ | 
|             return  null; | 
|         } | 
|         AppointmentListRequest param =  new AppointmentListRequest(); | 
|         param.setPageNo(1); | 
|         param.setPageSize(1); | 
|         param.setOrderId(orderId); | 
|         BaseResponse<BaseListPageResponse<AppointmentInfoResponse>> response = HKService.appointmentRecords(param); | 
|         if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)  ){ | 
|            return null; | 
|         } | 
|         if(response.getData() == null || response.getData().getList() == null|| response.getData().getList().size() ==0){ | 
|            return  null; | 
|         } | 
|         return response.getData().getList().get(0); | 
|     } | 
|     public IccmAppointmentListResponse getVisitRecordIccm(String orderId){ | 
|         //分页遍历循环查询所有门禁设备数据 | 
|         if(StringUtils.isBlank(orderId)){ | 
|             return  null; | 
|         } | 
|         IccmAppointmentListRequest param =  new IccmAppointmentListRequest(); | 
|         param.setPageNo(1); | 
|         param.setPageSize(1); | 
|         param.setOrderId(orderId); | 
|         BaseResponse<BaseListPageResponse<IccmAppointmentListResponse>> response = HKService.iccmAppointmentRecords(param); | 
|         if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)  ){ | 
|            return null; | 
|         } | 
|         if(response.getData() == null || response.getData().getList() == null|| response.getData().getList().size() ==0){ | 
|            return  null; | 
|         } | 
|         return response.getData().getList().get(0); | 
|     } | 
|     @Override | 
|     public  void syncVisitData(){ | 
|         if(Constants.DEALING_HK_VISIT){ | 
|             return   ; | 
|         } | 
|         Constants.DEALING_HK_VISIT =true; | 
|         String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode() | 
|                 +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode(); | 
|         List<DeviceRole> roleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda() | 
|                 .eq(DeviceRole::getType, Constants.ONE)); | 
|         //标记是否走免登记预约 | 
|         try { | 
|             //查询所有需要同步的数据 | 
|             List<Visits> list = getVisitList(); | 
|             if(list ==null || list.size()==0){ | 
|                 return; | 
|             } | 
|             Date date = new Date(); | 
|             for(Visits c : list) { | 
|                 //发起海康预约接口(需要登记),根据预约返回接口封装申请记录更新字段 | 
| //                getUpdateModelByResponse(c,date,roleList,path); | 
|                 getUpdateModelByResponseIccm(c,date,roleList,path); | 
|                 visitsMapper.updateById(c); | 
|                 //给申请人发送微信公众号 下发权限失败 | 
|                 if(StringUtils.isNotBlank(c.getOpenid()) && Constants.equalsInteger(c.getStatus(),Constants.VisitStatus.xfFail)){ | 
|                     wxPlatNotice.sendVisitTemplateNotice(systemDictDataBiz, | 
|                             wxNoticeConfigMapper,c, WxPlatConstants.visitContent.visitApplyHkFail, | 
|                             Arrays.asList(c.getOpenid().split(",")) | 
|                     ); | 
|                 } | 
|             } | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|         }finally { | 
|             Constants.DEALING_HK_VISIT =false; | 
|         } | 
|     } | 
|   | 
|     private List<Visits> getParentList(List<Visits> alllist) { | 
|         if(alllist ==null || alllist.size()==0){ | 
|             return null; | 
|         } | 
|         List<Visits> list = new ArrayList<>(); | 
|   | 
|         for (Visits v : alllist){ | 
|             if(v.getParentId() == null){ | 
|                 v.setVisitsList(getChildListByParentId(v.getId(),alllist)); | 
|                 list.add(v); | 
|             } | 
|         } | 
|         return  list; | 
|     } | 
|   | 
|     private List<Visits> getChildListByParentId(Integer id, List<Visits> alllist) { | 
|   | 
|         List<Visits> list = new ArrayList<>(); | 
|   | 
|         for (Visits v : alllist){ | 
|             if(Constants.equalsInteger(v.getParentId(),id)){ | 
|                 list.add(v); | 
|             } | 
|         } | 
|         return  list; | 
|     } | 
|   | 
|     /** | 
|      * 根据预约返回接口封装申请记录更新字段 | 
|      * @param c | 
|      * @param date | 
|      * @param date | 
|      */ | 
|     private void getUpdateModelByResponse(  Visits c,Date date, List<DeviceRole> roleList,String path ) { | 
|         String code = null; | 
|         String id = null; | 
|         String recordid = null; | 
|         String qrcode = null; | 
|         String reson = ""; | 
|         //发起海康预约接口 | 
|         if(Constants.equalsInteger(c.getVisitType(),Constants.ZERO)){ | 
|             //(需要登记) | 
|             c.setVisitType(Constants.ZERO); | 
|             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<VisitAppointmentResponse> response =  HKService.visitAppiontment(request); | 
|             code =response!=null ?response.getCode():null; | 
|             if((response!=null && response.getData()!=null | 
|                     && response.getData().getAppointmentInfoList() !=null | 
|                     && response.getData().getAppointmentInfoList().size()>0)){ | 
|                 id =response.getData().getAppointmentInfoList().get(0).getOrderId(); | 
|                 qrcode =response.getData().getAppointmentInfoList().get(0).getVerificationCode(); | 
| //                qrcode =response.getData().getAppointmentInfoList().get(0).getQRCode(); | 
|             } | 
|             reson = response!=null?JSONObject.toJSONString(response):""; | 
|         }else{ | 
|             //免登记 | 
|             c.setVisitType(Constants.ONE); | 
|             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<VisitAppointmentMDJResponse> response = HKService.visitAppiontmentMDJ(request ); | 
|             code =response!=null ?response.getCode():null; | 
|             if(response!=null && response.getData()!=null){ | 
|                 id = response.getData().getOrderId(); | 
|                 recordid = response.getData().getAppointRecordId(); | 
|                 qrcode =response.getData().getQRCode(); | 
|             } | 
|             reson = response!=null?JSONObject.toJSONString(response):""; | 
|         } | 
|         if (code!= null && id!=null) { | 
|             //海康下发成功 | 
|             c.setHkId( id);//预约标识 | 
|             c.setHkRecordId(recordid);//访客预约记录标识(用户取消预约) | 
|             c.setQrcode(qrcode); | 
|             c.setRemark("下发海康成功!"); | 
|             c.setStatus(Constants.VisitStatus.xfSuccess);//下发海康成功 | 
|         } else { | 
|             //海康下发失败 | 
|             c.setRemark("下发海康失败,原因:"+ reson); | 
|             c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败 | 
|         } | 
|         c.setHkStatus(Constants.ONE); | 
|         c.setHkDate(date); | 
|     } | 
|     public static void getUpdateModelByResponseIccm(  Visits c,Date date, List<DeviceRole> roleList,String path ) { | 
|         String code = null; | 
|         String id = null; | 
|         String recordId = null; | 
|         String qrcode = null; | 
|         String reson = ""; | 
|         //发起海康预约接口 | 
|         if(Constants.equalsInteger(c.getVisitType(),Constants.ZERO)){ | 
|             //(需要登记) | 
|             c.setVisitType(Constants.ZERO); | 
|             IccmAppointmentRequest request =  getHkRequestParaIccm(c,roleList,path); | 
|             if(request == null){ | 
|                 //海康下发成功 | 
|                 c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败 | 
|                 c.setRemark("下发海康参数不正确!"); | 
|                 c.setHkStatus(Constants.ONE); | 
|                 c.setHkDate(date); | 
|                 return; | 
|             } | 
|             BaseResponse<IccmAppointmentResponse> response =  HKService.iccmAppointment(request); | 
|             code =response!=null ?response.getCode():null; | 
|             if((response!=null && response.getData()!=null | 
|                     && response.getData().getAppointmentInfoList() !=null | 
|                     && response.getData().getAppointmentInfoList().size()>0)){ | 
|                 id =response.getData().getOrderId(); | 
|                 recordId = response.getData().getAppointRecordId(); | 
| //                qrcode =response.getData().getAppointmentInfoList().get(0).getQRCode(); | 
|                 qrcode =response.getData().getAppointmentInfoList().get(0).getVerificationCode(); | 
|             } | 
|             reson = response!=null?JSONObject.toJSONString(response):""; | 
|         }else{ | 
|             //免登记 | 
|             c.setVisitType(Constants.ONE); | 
|             IccmAppointmentMDJRequest request =getHkMDJRequestParamIccm(c,roleList,path); | 
|             if(request == null){ | 
|                 //海康下发成功 | 
|                 c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败 | 
|                 c.setRemark("下发海康免登记参数不正确!"); | 
|                 c.setHkStatus(Constants.ONE); | 
|                 c.setHkDate(date); | 
|                 return; | 
|             } | 
|             BaseResponse<IccmAppointmentMDJResponse> response = HKService.iccmAppiontmentMDJ(request ); | 
|             code =response!=null ?response.getCode():null; | 
|             if(response!=null && response.getData()!=null){ | 
|                 id = response.getData().getOrderId(); | 
|                 recordId = response.getData().getAppointRecordId(); | 
|                 qrcode =response.getData().getQRCode(); | 
|             } | 
|             reson = response!=null?JSONObject.toJSONString(response):""; | 
|         } | 
|         if (code!= null && id!=null) { | 
|             //海康下发成功 | 
|             c.setHkId( id);//预约标识 | 
|             c.setHkRecordId(recordId); | 
|             c.setQrcode(qrcode); | 
|             c.setRemark("下发海康成功!"); | 
|             c.setStatus(Constants.VisitStatus.xfSuccess);//下发海康成功 | 
|         }else { | 
|             //海康下发失败 | 
|             c.setRemark("下发海康失败,原因:"+ reson); | 
|             c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败 | 
|         } | 
|         c.setHkStatus(Constants.ONE); | 
|         c.setHkDate(date); | 
|     } | 
|   | 
|     /** | 
|      * 免登记接口参数 | 
|      * @param c | 
|      * @return | 
|      */ | 
|     private VisitAppointmentMDJRequest getHkMDJRequestPara(Visits c,List<DeviceRole> roleList,String path) { | 
|         VisitAppointmentMDJRequest request = new VisitAppointmentMDJRequest(); | 
|         VisitAppointmentVistorRequest info =getRequestInfoByVisit(c,path); | 
|         if(info == null ){ | 
|             //人脸为空,不能进行推送 | 
|             return  null; | 
|         } | 
|         request.setVisitStartTime(DateUtil.getISO8601Timestamp2(c.getStarttime())); | 
|         request.setVisitEndTime(DateUtil.getISO8601Timestamp2(c.getEndtime())); | 
|         request.setReceptionistId(c.getReceptMemberHkId());//被访人海康编码 | 
|         if(StringUtils.isNotBlank(c.getReason())){ | 
|             char[] charArray = c.getReason().toCharArray(); | 
|             int length = charArray.length; | 
|             if(length>32){ | 
|                 request.setVisitPurpose(c.getReason().substring(0,32)); | 
|             }else{ | 
|                 request.setVisitPurpose(c.getReason()); | 
|             } | 
|         } | 
|         request.setVisitorInfo(info); | 
|         request.setVisitorPermissionSet(getVisitPermissonRequest(roleList,c)); | 
|         return  request; | 
|     } | 
|     public static IccmAppointmentMDJRequest getHkMDJRequestParamIccm(Visits c,List<DeviceRole> roleList,String path) { | 
|         IccmAppointmentMDJRequest request = new IccmAppointmentMDJRequest(); | 
|         IccmAppointmentVistorRequest info =getRequestInfoByVisitIccm(c,path); | 
|         if(info == null ){ | 
|             //人脸为空,不能进行推送 | 
|             return  null; | 
|         } | 
|         request.setVisitStartTime(DateUtil.getISO8601Timestamp2(c.getStarttime())); | 
|         request.setVisitEndTime(DateUtil.getISO8601Timestamp2(c.getEndtime())); | 
|         request.setReceptionistId(c.getReceptMemberHkId());//被访人海康编码 | 
|        /* if(StringUtils.isNotBlank(c.getReason())){ | 
|             char[] charArray = c.getReason().toCharArray(); | 
|             int length = charArray.length; | 
|             if(length>32){ | 
|                 request.setVisitPurpose(c.getReason().substring(0,32)); | 
|             }else{ | 
|                 request.setVisitPurpose(c.getReason()); | 
|             } | 
|         }*/ | 
|         request.setVisitorInfo(info); | 
|         request.setVisitorPermissionSet(getVisitPermissonRequestIccm(roleList,c)); | 
|         return  request; | 
|     } | 
|   | 
|     /** | 
|      * 访客权限组 | 
|      * @param roleList | 
|      * @param c | 
|      * @return | 
|      */ | 
|     private VisitAppointmentPermissonRequest getVisitPermissonRequest(List<DeviceRole> 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; | 
|     } | 
|     public static IccmPermissionSetRequest getVisitPermissonRequestIccm(List<DeviceRole> roleList, Visits c) { | 
|         IccmPermissionSetRequest p = new IccmPermissionSetRequest(); | 
|         //获取权限组集合 | 
|         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<DeviceRole> 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());//被访人海康编码 | 
|   | 
|         if(StringUtils.isNotBlank(c.getReason())){ | 
|             char[] charArray = c.getReason().toCharArray(); | 
|             int length = charArray.length; | 
|             if(length>32){ | 
|                 request.setVisitPurpose(c.getReason().substring(0,32)); | 
|             }else{ | 
|                 request.setVisitPurpose(c.getReason()); | 
|             } | 
|         } | 
|         //获取权限组集合 | 
|         request.setVisitorPermissionSet(getVisitPermissonRequest(roleList,c)); | 
|         List<VisitAppointmentVistorRequest> infolist = new ArrayList<>(); | 
|         infolist.add(info); | 
|         request.setVisitorInfoList(infolist); | 
|         return  request; | 
|     } | 
|     public static  IccmAppointmentRequest getHkRequestParaIccm(Visits c,List<DeviceRole> roleList,String path ) { | 
|         IccmAppointmentRequest request = new IccmAppointmentRequest(); | 
|         //申请人信息 | 
|         IccmAppointmentVistorRequest info =getRequestInfoByVisitIccm(c,path); | 
|         if(info == null ){ | 
|             //人脸为空,不能进行推送 | 
|             return  null; | 
|         } | 
|         request.setVisitStartTime(DateUtil.getISO8601Timestamp2(c.getStarttime())); | 
|         request.setVisitEndTime(DateUtil.getISO8601Timestamp2(c.getEndtime())); | 
|         request.setReceptionistId(c.getReceptMemberHkId());//被访人海康编码 | 
|   | 
|       /*  if(StringUtils.isNotBlank(c.getReason())){ | 
|             char[] charArray = c.getReason().toCharArray(); | 
|             int length = charArray.length; | 
|             if(length>32){ | 
|                 request.setVisitPurpose(c.getReason().substring(0,32)); | 
|             }else{ | 
|                 request.setVisitPurpose(c.getReason()); | 
|             } | 
|         }*/ | 
|         //获取权限组集合 | 
|         request.setVisitorPermissionSet(getVisitPermissonRequestIccm(roleList,c)); | 
|         List<IccmAppointmentVistorRequest> 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; | 
|         } | 
|         if(StringUtils.isNotBlank(c.getName())){ | 
|             char[] charArray = c.getName().toCharArray(); | 
|             int length = charArray.length; | 
|             if(length>32){ | 
|                 info.setVisitorName(c.getName().substring(0,32)); | 
|             }else{ | 
|                 info.setVisitorName(c.getName()); | 
|             } | 
|         } | 
|   | 
|         if(StringUtils.isNotBlank(c.getCompanyName())){ | 
|             char[] charArray = c.getCompanyName().toCharArray(); | 
|             int length = charArray.length; | 
|             if(length>32){ | 
|                 info.setVisitorWorkUnit(c.getCompanyName().substring(0,32)); | 
|             }else{ | 
|                 info.setVisitorWorkUnit(c.getCompanyName()); | 
|             } | 
|         } | 
|         info.setPhoneNo(c.getPhone()); | 
|         info.setPlateNo(c.getCarNos()); | 
|         info.setGender( "1" ); | 
|         if(Constants.equalsInteger(c.getSex(),Constants.ONE) ||Constants.equalsInteger(c.getSex(),Constants.TWO)  ){ | 
|             info.setGender( c.getSex()+""); | 
|         } | 
|         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; | 
|     } | 
|     public static IccmAppointmentVistorRequest getRequestInfoByVisitIccm(Visits c,String path) { | 
|         IccmAppointmentVistorRequest info = new IccmAppointmentVistorRequest(); | 
|         //人脸数据 | 
|         if(StringUtils.isBlank(c.getName()) | 
|                 ||StringUtils.isBlank(c.getPhone()) | 
|                 || StringUtils.isBlank(c.getFaceImg()) ){ | 
|             return  null; | 
|         } | 
|         if(StringUtils.isNotBlank(c.getFaceImg())){ | 
|             log.info("===================================="+path+c.getFaceImg()+"======start===="); | 
|             info.setVisitorPhoto(ImageBase64Util.Image2Base64(path+c.getFaceImg())); | 
|             log.info("===================================="+path+c.getFaceImg()+"========end==="); | 
|         } | 
|         if(info.getVisitorPhoto() == null){ | 
|             log.info("===================================="+path+c.getFaceImg()+"======imgerror====="); | 
|             return  null; | 
|         } | 
|         if(StringUtils.isNotBlank(c.getName())){ | 
|             char[] charArray = c.getName().toCharArray(); | 
|             int length = charArray.length; | 
|             if(length>32){ | 
|                 info.setVisitorName(c.getName().substring(0,32)); | 
|             }else{ | 
|                 info.setVisitorName(c.getName()); | 
|             } | 
|         } | 
|         if(StringUtils.isNotBlank(c.getCompanyName())){ | 
|             char[] charArray = c.getCompanyName().toCharArray(); | 
|             int length = charArray.length; | 
|             if(length>32){ | 
|                 info.setVisitorWorkUnit(c.getCompanyName().substring(0,32)); | 
|             }else{ | 
|                 info.setVisitorWorkUnit(c.getCompanyName()); | 
|             } | 
|         } | 
|         info.setPhoneNo(c.getPhone()); | 
|         info.setPlateNo(c.getCarNos()); | 
|         info.setGender( "1"); | 
|         if(Constants.equalsInteger(c.getSex(),Constants.ONE) ||Constants.equalsInteger(c.getSex(),Constants.TWO)  ){ | 
|             info.setGender( c.getSex()+""); | 
|         } | 
|         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; | 
|     } | 
|   | 
|     public static String[] getHkRoles(String doors, List<DeviceRole> roleList) { | 
|         if(StringUtils.isBlank(doors) || roleList.size()==0|| roleList.size()==0){ | 
|             return null; | 
|         } | 
|         String[] ids = doors.split(","); | 
|         List<String> 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<Visits> getVisitList() { | 
|         MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>(); | 
|         queryWrapper.selectAll(Visits.class); | 
|         queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName) | 
|                 .selectAs(Member::getHkId,Visits::getReceptMemberHkId) | 
|                 .leftJoin(Member.class,Member::getId,Visits::getReceptMemberId); | 
|         queryWrapper.eq(Visits::getStatus,Constants.VisitStatus.pass)//审批通过 | 
|                 .eq(Visits::getHkStatus,Constants.ZERO)//未同步到海康 | 
|                 .orderByAsc(Visits::getCreateDate); | 
|         List<Visits> list = visitsMapper.selectJoinList(Visits.class,queryWrapper); | 
|         return list; | 
|     } | 
|     private List<Visits> getExpireVisitList() { | 
|         MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>(); | 
|         queryWrapper.selectAll(Visits.class) | 
|                 .selectAs(Member::getType,Visits::getMemberType) | 
|                 .leftJoin(Member.class,Member::getId,Visits::getMemberId); | 
|         queryWrapper.in(Visits::getStatus, Arrays.asList(new Integer[]{Constants.VisitStatus.xfSuccess,Constants.VisitStatus.signin}) ); | 
|         List<Visits> list = visitsMapper.selectJoinList(Visits.class,queryWrapper); | 
|         return list; | 
|     } | 
|   | 
|   | 
| } |