package com.doumee.service.business.impl.hksync;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.doumee.biz.system.SystemDictDataBiz;
|
import com.doumee.core.constants.ResponseStatus;
|
import com.doumee.core.exception.BusinessException;
|
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.WxPlatNotice;
|
import com.doumee.dao.business.DeviceRoleMapper;
|
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.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 SystemDictDataBiz systemDictDataBiz;
|
@Autowired
|
private DeviceRoleMapper deviceRoleMapper;
|
@Autowired
|
private WxPlatNotice wxPlatNotice;
|
/**
|
* 同步海康访客信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
|
*/
|
@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){
|
Visits update = new Visits();
|
//已失效
|
update.setStatus(Constants.VisitStatus.invalid);
|
update.setEditDate(date);
|
update.setId(c.getId());
|
update.setRemark("预约已被清除");
|
visitsMapper.updateById(update);
|
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.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&& "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);
|
}
|
}
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}finally {
|
Constants.DEALING_HK_VISIT_EXPIRE =false;
|
}
|
}
|
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);
|
}
|
@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<DeviceRole> roleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().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<Visits> list = getVisitList();
|
//按照父级申请分批处理每次申请数据
|
// List<Visits> 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);
|
if(Objects.isNull(c.getParentId())){
|
wxPlatNotice.sendVisitAuditTemplateNotice(c,
|
systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_PREFIX).getCode(),
|
systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_AUDIT_VISIT).getCode());
|
}
|
}
|
}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
|
* @param type 0需要登记 1免登记
|
*/
|
private void getUpdateModelByResponse( Visits c,Date date,String type,List<DeviceRole> 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<VisitAppointmentResponse> 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<VisitAppointmentMDJResponse> 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<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());//被访人海康编码
|
request.setVisitPurpose(c.getReason());
|
request.setVisitorInfo(info);
|
request.setVisitorPermissionSet(getVisitPermissonRequest(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;
|
}
|
|
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());//被访人海康编码
|
request.setVisitPurpose(c.getReason());
|
//获取权限组集合
|
request.setVisitorPermissionSet(getVisitPermissonRequest(roleList,c));
|
List<VisitAppointmentVistorRequest> 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());
|
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;
|
}
|
|
private 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);
|
queryWrapper.in(Visits::getStatus, Arrays.asList(new Integer[]{Constants.VisitStatus.xfSuccess,Constants.VisitStatus.signin}) );
|
List<Visits> list = visitsMapper.selectJoinList(Visits.class,queryWrapper);
|
return list;
|
}
|
|
|
}
|