jiangping
2024-07-31 bed3eee53f72f47f49b493772a4525e6c6b3e7be
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
@@ -1,8 +1,10 @@
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.config.DataSyncConfig;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
@@ -12,25 +14,22 @@
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitInfoRequest;
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.utils.*;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.DeviceRoleMapper;
import com.doumee.dao.business.RetentionMapper;
import com.doumee.dao.business.VisitEventMapper;
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.doumee.dao.business.model.*;
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 org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.Date;
/**
 * 海康访客业务Service实现
@@ -40,8 +39,13 @@
@Service
@Slf4j
public class HkSyncVisitServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @Autowired
    private VisitsJoinMapper visitsMapper;
    @Autowired
    private VisitEventMapper visitEventMapper;
    @Autowired
    private RetentionMapper retentionMapper;
    @Autowired
@@ -71,14 +75,15 @@
                //发起海康预约接口(需要登记),根据预约返回接口封装申请记录更新字段
                AppointmentInfoResponse model =  getVisitRecord(c.getHkId());
                if(model == null){
                    Visits update = new Visits();
                    continue;
                   /* Visits update = new Visits();
                    //已失效
                    update.setStatus(Constants.VisitStatus.invalid);
                    update.setEditDate(date);
                    update.setId(c.getId());
                    update.setRemark("预约已被清除");
                    visitsMapper.updateById(update);
                    continue;
                    continue;*/
                }
                /**
                 *      * 0:待审核(预约待审批)、
@@ -111,7 +116,7 @@
                    if(!Constants.equalsInteger(c.getStatus(),Constants.VisitStatus.signout)){
                        Visits update = new Visits();
                        //已失效
                        update.setStatus(Constants.VisitStatus.invalid);
                        update.setStatus(Constants.VisitStatus.signout);
                        update.setEditDate(date);
                        update.setId(c.getId());
                        update.setInDate(DateUtil.getISO8601DateByStr2(model.getVisitStartTime()));
@@ -204,8 +209,8 @@
        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();
//        String applyType =systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MDJ_VISIT_REQUIRED).getCode();
//        String applyLwType =systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MDJ_LW_REQUIRED).getCode();
        try {
            //查询所有需要同步的数据
            List<Visits> list = getVisitList();
@@ -217,8 +222,7 @@
            Date date = new Date();
            for(Visits c : list) {
                //发起海康预约接口(需要登记),根据预约返回接口封装申请记录更新字段
                String type = Constants.equalsInteger(c.getType(),Constants.ONE)?applyType:applyLwType;
                getUpdateModelByResponse(c,date,type,roleList,path);
                getUpdateModelByResponse(c,date,roleList,path);
                visitsMapper.updateById(c);
                if(Objects.isNull(c.getParentId())){
                    wxPlatNotice.sendVisitAuditTemplateNotice(c,
@@ -267,13 +271,15 @@
     * @param date
     * @param type 0需要登记 1免登记
     */
    private void getUpdateModelByResponse(  Visits c,Date date,String type,List<DeviceRole> roleList,String path ) {
    private void getUpdateModelByResponse(  Visits c,Date date, List<DeviceRole> roleList,String path ) {
        String code = null;
        String id = null;
        String qrcode = null;
        String reson = "";
        //发起海康预约接口
        if(StringUtils.equals(type,"0")){
        if(Constants.equalsInteger(c.getVisitType(),Constants.ZERO)){
            //(需要登记)
            c.setVisitType(Constants.ZERO);
            VisitAppointmentRequest request =  getHkRequestPara(c,roleList,path);
            if(request == null){
                //海康下发成功
@@ -291,8 +297,10 @@
                id =response.getData().getAppointmentInfoList().get(0).getOrderId();
                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){
                //海康下发成功
@@ -308,17 +316,18 @@
                id = response.getData().getOrderId();
                qrcode =response.getData().getQRCode();
            }
            reson = response!=null?JSONObject.toJSONString(response):"";
        }
        if (code!= null && id!=null) {
            //海康下发成功
            c.setHkId( id);//预约标识
            c.setQrcode(qrcode);
            c.setRemark("下发海康成功!【"+type+"】");
            c.setRemark("下发海康成功!");
            c.setStatus(Constants.VisitStatus.xfSuccess);//下发海康成功
        } else {
            //海康下发失败
            c.setRemark("下发海康失败!【"+type+"】");
            c.setRemark("下发海康失败,原因:"+ reson);
            c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败
        }
        c.setHkStatus(Constants.ONE);
@@ -340,7 +349,15 @@
        request.setVisitStartTime(DateUtil.getISO8601Timestamp2(c.getStarttime()));
        request.setVisitEndTime(DateUtil.getISO8601Timestamp2(c.getEndtime()));
        request.setReceptionistId(c.getReceptMemberHkId());//被访人海康编码
        request.setVisitPurpose(c.getReason());
        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;
@@ -378,7 +395,16 @@
        request.setVisitStartTime(DateUtil.getISO8601Timestamp(c.getStarttime()));
        request.setVisitEndTime(DateUtil.getISO8601Timestamp(c.getEndtime()));
        request.setReceptionistId(c.getReceptMemberHkId());//被访人海康编码
        request.setVisitPurpose(c.getReason());
        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<>();
@@ -401,8 +427,25 @@
        if(info.getVisitorPhoto() == null){
            return  null;
        }
        info.setVisitorName(c.getName());
        info.setVisitorWorkUnit(c.getCompanyName());
        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(c.getSex()+"");
@@ -458,6 +501,107 @@
        List<Visits> list = visitsMapper.selectJoinList(Visits.class,queryWrapper);
        return list;
    }
    @Override
    @Transactional
    public   void syncParkRecords(Date date){
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持海康数据同步操作~");
            }
            AppointmentEventListRequest param =  new AppointmentEventListRequest();
            //(全量同步)
            boolean hasNext = true;
            int curTotal = 0;
            int curPage = 1;
            //查询今天的
            Date start = Utils.Date.getStart(date);
            Date end = new Date();
            if(DateUtil.daysBetweenDates(end,start) >1){
                end =  Utils.Date.getEnd(date);
            }
            param.setEventTimeBegin(DateUtil.getISO8601Timestamp2( start));
            param.setEventTimeBegin(DateUtil.getISO8601Timestamp2( end));
            List<VisitEvent>  allHkList = new ArrayList<>();
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<AppointmentEventInfoResponse>> response = HKService.appointmentEventQuery(param);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)  ){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
                }
                if(response.getData() == null || response.getData().getTotal() ==0){
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
                }
                BaseListPageResponse<AppointmentEventInfoResponse> r = response.getData();
                curTotal += 100;
                if(curTotal >= r.getTotal()){
                    hasNext = false;
                }
                if(r.getList() == null || r.getList().size()==0){
                    hasNext =false;
                }else{
                    allHkList.addAll(getNewCarEventModelBYList(r.getList()));
                }
                curPage++;
            }
            if(allHkList .size() == 0){
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
            }
            //清空原有当天的数据
            visitEventMapper.delete(new UpdateWrapper<VisitEvent>().lambda()
                    .ge(VisitEvent::getCreateDate,start)
                    .le(VisitEvent::getCreateDate,end));
            if(allHkList.size()>0){
                int sublistSize = 500;
                int startIndex = 0;
                int endIndex = sublistSize;
                while (startIndex < allHkList.size()) {
                    if (endIndex > allHkList.size()) {
                        endIndex = allHkList.size();
                    }
                    List<VisitEvent> sublist = allHkList.subList(startIndex, endIndex);
                    if(sublist.size()>0){
                        visitEventMapper.insertBatchSomeColumn(sublist);//插入新数据
                    }
                    startIndex = endIndex;
                    endIndex += sublistSize;
                }
            }
        }catch (BusinessException e){
            throw  e;
        }
    }
    private List<VisitEvent> getNewCarEventModelBYList(List<AppointmentEventInfoResponse> list ) {
        List<VisitEvent> newList = new ArrayList<>();
        if(list == null || list.size()==0){
            return  newList;
        }
        for(AppointmentEventInfoResponse model :list){
            VisitEvent c = new VisitEvent();
            c.setHappenTime(model.getEventTime());
            c.setCreateDate(DateUtil.getISO8601DateByStr2(model.getEventTime()));
            c.setPersonName(model.getVisitorName());
            c.setSex(Integer.parseInt(model.getVisitorSex()));
            c.setCarNo(model.getCarNumber());
            c.setIdNo(model.getIdentityNum());
            c.setIdType(Integer.parseInt(model.getIdentityId()));
            c.setPhone(model.getPhoneNum());
            c.setRemark(model.getCardNum());
            c.setPhotoUrl(model.getIdentityPhotoUri());
            c.setVisitorId(model.getVisitorId());
            c.setIsdeleted(Constants.ZERO);
            c.setEventTypeName(model.getEventName());
            newList.add(c);
        }
        return newList;
    }
}