jiangping
2025-05-06 596b91470dd6a0c8a95f784ec4cda6d35161d37c
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
@@ -1,10 +1,12 @@
package com.doumee.service.business.impl.hksync;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.C;
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.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.request.event.acs.EventAcsInfoRequest;
@@ -16,22 +18,33 @@
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.MemberMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.web.reqeust.SavePlatformWarnEventDTO;
import com.doumee.service.business.CategoryService;
import com.doumee.service.business.VisitsService;
import com.doumee.service.business.impl.PlatformWarnEventServiceImpl;
import com.doumee.service.business.third.TmsService;
import com.doumee.service.business.third.model.request.TmsOrderInfoRequest;
import com.doumee.service.business.third.model.response.TmsOrderInfoResponse;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 访客权限组信息表Service实现
@@ -42,6 +55,8 @@
@Slf4j
public class HkSyncPushServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private InoutDayCountMapper inoutDayCountMapper;
    @Autowired
    private InterfaceLogMapper interfaceLogMapper;
    @Autowired
@@ -59,11 +74,15 @@
    @Autowired
    private CarEventMapper carEventMapper;
    @Autowired
    private CategoryMapper categoryMapper;
    @Autowired
    private VisitEventMapper visitEventMapper;
    @Autowired
    private VisitsJoinMapper visitsMapper;
    @Autowired
    private RetentionMapper retentionMapper;
    @Autowired
    private InoutRecordMapper inoutRecordMapper;
    @Autowired
    private PlatformMapper platformMapper;
    @Autowired
@@ -75,6 +94,10 @@
    @Autowired
    private PlatformJobMapper platformJobMapper;
    @Autowired
    private TmsService tmsService;
    @Autowired
    private VisitsService visitsService;
    @Autowired
    private PlatformWmsDetailMapper platformWmsDetailMapper;
    @Autowired
    private PlatformEventMapper platformEventMapper;
@@ -82,6 +105,13 @@
    private PlatformLogMapper platformLogMapper;
    @Autowired
    private PlatformWarnEventServiceImpl platformWarnEventService;
    /**
     * 海康门禁事件推送
     * @param param
@@ -101,13 +131,15 @@
            List<DeviceEvent> list = new ArrayList<>();
            List<Integer> delRetentionLis = new ArrayList<>();
            List<Retention> retentionList = new ArrayList<>();
            List<InoutRecord> inoutRecordList = new ArrayList<>();
            InoutDayCount inoutDayCount = new InoutDayCount();
            for(EventAcsInfoRequest request : events){
                EventDeviceDataRequest model = request.getData();
                if(model ==null){
                    continue;
                }
                //根据推送人员编码,处理在场、离场人员数据记录
                dealMemberDataByRequest(request,delRetentionLis,retentionList);
                dealMemberDataByRequest(request,delRetentionLis,retentionList,inoutDayCount,inoutRecordList);
                //封装门禁事件信息表对象
                list.add(getDeviceEventModelByRequest(request));
            }
@@ -125,8 +157,14 @@
                //再插入最新的在厂人员
                retentionMapper.insert(retentionList);
            }
            if(inoutRecordList.size()>0){
                //再插入最新的在厂人员
                inoutRecordMapper.insert(inoutRecordList);
            }
            dealInoutDayCountBiz(inoutDayCount);
            log.info("【海康门禁事件推送】========成功=======");
        }catch (Exception e) {
            e.printStackTrace();
            log.error("【海康门禁事件推送】========失败=======:\n" + e.getMessage());
        }finally {
            saveInterfaceLog(param,"/business/hksync/push/acs",result,false);//不计日志
@@ -135,29 +173,116 @@
    }
    private void dealInoutDayCountBiz(InoutDayCount param) {
        if(param == null){
            param = new InoutDayCount();
        }
        param.setTimeInfo(Utils.Date.getStart(new Date()));
        InoutDayCount model = inoutDayCountMapper.selectOne(new QueryWrapper<InoutDayCount>().lambda()
                .eq(InoutDayCount::getTimeInfo,param.getTimeInfo())
                .eq(InoutDayCount::getIsdeleted,Constants.ZERO)
                .last("limit 1"));
        log.error("============================inoutDayCountMapper:"+JSONObject.toJSONString(param));
        if(model == null){
            param.setIsdeleted(Constants.ZERO);
            param.setCreateDate(new Date());
            param.setEditDate(new Date());
            inoutDayCountMapper.insert(param);
        }else{
            inoutDayCountMapper.update(null,new UpdateWrapper<InoutDayCount>().lambda()
                    .eq(InoutDayCount::getId,model.getId() )
                    .set(InoutDayCount::getEditDate,new Date() )
                    .setSql(param.getInCarNum()!=null,"IN_CAR_NUM = ifnull(IN_CAR_NUM,0)+"+param.getInCarNum() )
                    .setSql(param.getOutCarNum()!=null,"OUT_CAR_NUM = ifnull(OUT_CAR_NUM,0)+"+param.getOutCarNum() )
                    .setSql(param.getInMemberNum()!=null,"IN_MEMBER_NUM = ifnull(IN_MEMBER_NUM,0)+"+param.getInMemberNum() )
                    .setSql(param.getOutMemberNum()!=null,"OUT_MEMBER_NUM = ifnull(OUT_MEMBER_NUM,0)+"+param.getOutMemberNum() )
                    .setSql(param.getInVisitorNum()!=null,"IN_VISITOR_NUM = ifnull(IN_VISITOR_NUM,0)+"+param.getInVisitorNum() )
                    .setSql(param.getOutVisitorNum()!=null,"OUT_VISITOR_NUM = ifnull(OUT_VISITOR_NUM,0)+"+param.getOutVisitorNum() )
                    .setSql(param.getSigninVisitorNum()!=null,"SIGNIN_VISITOR_NUM = ifnull(SIGNIN_VISITOR_NUM,0)+"+param.getSigninVisitorNum() )
                    .setSql(param.getLeaveVisitorNum()!=null,"LEAVE_VISITOR_NUM = ifnull(LEAVE_VISITOR_NUM,0)+"+param.getLeaveVisitorNum() )
                    .setSql(param.getInOtherMemberNum()!=null,"IN_OTHER_MEMBER_NUM = ifnull(IN_OTHER_MEMBER_NUM,0)+"+param.getInOtherMemberNum() )
                    .setSql(param.getOutOtherMemberNum()!=null,"OUT_OTHER_MEMBER_NUM = ifnull(OUT_OTHER_MEMBER_NUM,0)+"+param.getOutOtherMemberNum() )
                    .setSql(param.getInSelfMemberNum()!=null,"IN_SELF_MEMBER_NUM = ifnull(IN_SELF_MEMBER_NUM,0)+"+param.getInSelfMemberNum() )
                    .setSql(param.getOutSelfMemberNum()!=null,"OUT_SELF_MEMBER_NUM = ifnull(OUT_SELF_MEMBER_NUM,0)+"+param.getOutSelfMemberNum() )
            );
        }
    }
    /**
     * 根据推送人员编码,处理在场、离场人员数据记录
     * @param request
     * @param delRetentionLis
     * @param retentionList
     */
    private void dealMemberDataByRequest(EventAcsInfoRequest request, List<Integer> delRetentionLis, List<Retention> retentionList) {
    private void dealMemberDataByRequest(EventAcsInfoRequest request
            , List<Integer> delRetentionLis
            , List<Retention> retentionList
            ,InoutDayCount inoutDayCount
            ,List<InoutRecord> inoutRecordList) {
        //海康人员编码
        String userNo = request.getData().getExtEventPersonNo();
        if(StringUtils.isNotBlank(userNo)){
            Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getHkId,userNo).last("limit 1"));
            if(member !=null){
                //如果人员信息存在,则删除之前的所有进场数据(无论此次推送是进厂还是出场推送事件)
                Device d = deviceMapper.selectOne(new QueryWrapper<Device>().lambda()
                        .eq(Device::getDoorId,request.getSrcIndex())
                        .eq(Device::getIsdeleted,Constants.ZERO)
                        .last("limit 1" ));
                delRetentionLis.add(member.getId());
                if(d!=null && !(Constants.equalsInteger(d.getIsEntrance(),Constants.ONE) && Constants.formatIntegerNum(request.getData().getExtEventInOut()) != Constants.ONE)){
            Member member = memberMapper.selectJoinOne(Member.class,new MPJLambdaWrapper<Member>()
                    .selectAll(Member.class)
                    .selectAs(Company::getCompanyNamePath,Member::getCompanyNamePath)
                    .selectAs(Company::getType,Member::getCompanyType)
                    .leftJoin(Company.class,Company::getId,Member::getCompanyId)
                    .eq(Member::getHkId,userNo)
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .last("limit 1"));
            //如果人员信息存在,则删除之前的所有进场数据(无论此次推送是进厂还是出场推送事件)
            Device d = deviceMapper.selectOne(new QueryWrapper<Device>().lambda()
                    .eq(Device::getDoorId,request.getSrcIndex())
                    .eq(Device::getIsdeleted,Constants.ZERO)
                    .last("limit 1" ));
            InoutRecord record = new InoutRecord();
            record.setCreateDate(DateUtil.getISO8601DateByStr2(request.getHappenTime()));
            record.setTimeInfo(Utils.Date.getStart(record.getCreateDate()));
            record.setType(Constants.ONE);//人员
            record.setMemberType(Constants.ZERO);//默认为未知人员(访客)
            record.setIsdeleted(Constants.ZERO);
            record.setInOrOut(Constants.ZERO);
            record.setHkEventId(request.getEventId());
            record.setHkId(userNo);
            if(d!=null && Constants.equalsInteger(d.getIsEntrance(),Constants.ONE)){
                if(Constants.formatIntegerNum(request.getData().getExtEventInOut()) != Constants.ONE){
                    //如果是进门,录入人员的在场数据记录
                    retentionList.add(getRetentionModelByRequest(member,request));
                    inoutDayCount.setInMemberNum(Constants.formatIntegerNum(inoutDayCount.getInMemberNum())+1);//入场人次
                }else{
                    //如果是出门
                    record.setInOrOut(Constants.ONE);
                    inoutDayCount.setOutMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutMemberNum())+1);//离场人次
                }
            }
            if(member !=null){
                record.setMemberName(member.getName());
                record.setObjId(member.getId());
                record.setObjType(Constants.ONE);
                record.setMemberPhone(member.getPhone());
                record.setCompanyId(member.getCompanyId());
                record.setCompanyName(member.getCompanyNamePath());
                if(d!=null && Constants.equalsInteger(d.getIsEntrance(),Constants.ONE)){
                    delRetentionLis.add(member.getId());
                    if( Constants.formatIntegerNum(request.getData().getExtEventInOut()) == Constants.ONE){
                        //如果是进门,录入人员的在场数据记录
                        retentionList.add(getRetentionModelByRequest(member,request));
                        if(Constants.equalsInteger(member.getCompanyType(),Constants.ONE)){
                            record.setMemberType(Constants.ONE);
                            inoutDayCount.setInSelfMemberNum(Constants.formatIntegerNum(inoutDayCount.getInSelfMemberNum())+1);//内部人员入场人次
                        }else{
                            record.setMemberType(Constants.TWO);
                            inoutDayCount.setInOtherMemberNum(Constants.formatIntegerNum(inoutDayCount.getInOtherMemberNum())+1);//相关方入场人次
                        }
                    }else{
                        if(Constants.equalsInteger(member.getCompanyType(),Constants.ONE)){
                            inoutDayCount.setOutSelfMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutSelfMemberNum())+1);//内部人员出场人次
                        }else{
                            inoutDayCount.setOutOtherMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutOtherMemberNum())+1);//相关方出场人次
                        }
                    }
                }
            }
            inoutRecordList.add(record);
        }
    }
@@ -266,7 +391,6 @@
        retention.setMemberId(member.getId());
        retention.setDeviceName(request.getSrcName());
        retention.setDeviceIndex(request.getSrcIndex());
        return retention;
    }
@@ -344,6 +468,8 @@
            List<VisitEvent> list = new ArrayList<>();
            List<Integer> delRetentionLis = new ArrayList<>();
            List<Retention> retentionList = new ArrayList<>();
            List<InoutRecord> inoutRecordList = new ArrayList<>();
            InoutDayCount inoutDayCount = new InoutDayCount();
            for(EventVisitIccmInfoRequest request : events){
                if(request.getData() ==null || request.getData().getVisitorInvoices() ==null){
                    continue;
@@ -352,7 +478,7 @@
                    continue;
                }
                //海康访客记录编码
                dealVisitDataByRequstIccm(request,delRetentionLis,retentionList);
                dealVisitDataByRequstIccm(request,delRetentionLis,retentionList,inoutDayCount,inoutRecordList);
                list.add(getVisitEventModelByRequestIccm(request,request.getData().getVisitorInformationList().get(0)));
            }
            if(list.size()>0){
@@ -369,20 +495,27 @@
                //再插入最新的在厂人员
                retentionMapper.insert(retentionList);
            }
            if(inoutRecordList.size()>0){
                //批量插入人员出入记录
                inoutRecordMapper.insert(inoutRecordList);
            }
            dealInoutDayCountBiz(inoutDayCount);
            log.info("【海康访客事件推送】========成功=======");
        }catch (Exception e){
            log.error("【海康访客事件推送】========失败=======:\n"+e.getMessage());
        }
        saveInterfaceLog(param,"/business/hksync/push/visitIccm",result,true);
        return  null;
    }
    /**
     *  根据访客推送访客记录编码,处理访客记录、在场人员等信息
     */
    private void dealVisitDataByRequstIccm(EventVisitIccmInfoRequest request, List<Integer> delRetentionLis, List<Retention> retentionList ) {
    private void dealVisitDataByRequstIccm(EventVisitIccmInfoRequest request
            , List<Integer> delRetentionLis
            , List<Retention> retentionList
            ,  InoutDayCount inoutDayCount
            ,List<InoutRecord> inoutRecordList) {
        EventVisitIccmDataRequest model = request.getData();
        EventVisitIccmInvoiceParamRequest data =  request.getData().getVisitorInvoices();
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
@@ -393,8 +526,6 @@
        queryWrapper.last("limit 1");
        Visits visits = visitsMapper.selectJoinOne(Visits.class,queryWrapper);
        if(visits !=null){
            //如果人员信息存在,则删除之前的所有进场数据(无论此次推送是进厂还是出场推送事件)
            delRetentionLis.add(visits.getMemberId());
            if(dataSyncConfig.getOrgUserDataOrigin() == DataSyncConfig.origin.hk){
                //如果是伊利大屏项目,不做处理
                return;
@@ -403,36 +534,76 @@
            updateVistis.setId(visits.getId());
            if (Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_ICCM_IN.getKey()) {
                //如果是访客登记,录入人员的在场数据记录
                retentionList.add(getRetentionModelByVisitRequest(visits, request.getHappenTime(),request.getSrcType()));
                //retentionList.add(getRetentionModelByVisitRequest(visits, request.getHappenTime(),request.getSrcType()));
                //来访时间
                updateVistis.setStatus(Constants.VisitStatus.signin);
                updateVistis.setInDate(DateUtil.getISO8601DateByStr(data.getBeginTime()));
                updateVistis.setOutDate(DateUtil.getISO8601DateByStr(data.getFinishTime()));
                if(Constants.equalsInteger(visits.getStatus(),Constants.VisitStatus.xfSuccess)){
                    inoutDayCount.setSigninVisitorNum(Constants.formatIntegerNum(inoutDayCount.getSigninVisitorNum())+1);
                    updateVistis.setStatus(Constants.VisitStatus.signin);
                    updateVistis.setInDate(DateUtil.getISO8601DateByStr(data.getBeginTime()));
                    updateVistis.setOutDate(DateUtil.getISO8601DateByStr(data.getFinishTime()));
                }
                //更新最新来访时间
                Member member = new Member();
                member.setLastVisitDate(updateVistis.getInDate());
                member.setId(visits.getMemberId());
                memberMapper.updateById(member);
            }else  if (Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_ICCM_OUT.getKey())  {
            }else if (Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_ICCM_OUT.getKey())  {
                //如果是访客签离事件
                updateVistis.setStatus(Constants.VisitStatus.signout);
                updateVistis.setInDate(DateUtil.getISO8601DateByStr(data.getBeginTime()));
                updateVistis.setOutDate(DateUtil.getISO8601DateByStr(data.getFinishTime()));
                updateVistis.setOutType(Constants.ZERO);
                updateVistis.setOutInfo("访客正常签离");
                if(Constants.equalsInteger(visits.getStatus(),Constants.VisitStatus.signin)){
                    inoutDayCount.setLeaveVisitorNum(Constants.formatIntegerNum(inoutDayCount.getLeaveVisitorNum())+1);
                    updateVistis.setStatus(Constants.VisitStatus.signout);
                    updateVistis.setInDate(DateUtil.getISO8601DateByStr(data.getBeginTime()));
                    updateVistis.setOutDate(DateUtil.getISO8601DateByStr(data.getFinishTime()));
                    updateVistis.setOutType(Constants.ZERO);
                    updateVistis.setOutInfo("访客正常签离");
                }
                delRetentionLis.add(visits.getMemberId());
            }else{
                //如果人员信息存在,切是访客通行,则删除之前的所有进场数据(无论此次推送是进厂还是出场推送事件)
                delRetentionLis.add(visits.getMemberId());
                InoutRecord record = new InoutRecord();
                record.setCreateDate(DateUtil.getISO8601DateByStr2(request.getHappenTime()));
                record.setTimeInfo(Utils.Date.getStart(record.getCreateDate()));
                record.setType(Constants.ONE);//人员
                record.setMemberType(Constants.ZERO);
                record.setIsdeleted(Constants.ZERO);
                record.setMemberName(visits.getName());
                record.setObjId(visits.getId());
                record.setObjType(Constants.TWO);
                record.setMemberPhone(visits.getPhone());
                record.setCompanyName(visits.getCompanyName());
                record.setInOrOut(Constants.ZERO);
                record.setHkEventId(request.getEventId());
                record.setHkId(visits.getHkId());
                //如果是访客通行
                if(request.getData()!=null&&request.getData().getParamValues()!=null &&
                        StringUtils.equals(request.getData().getParamValues().getInOrOut(),"0")){
                    //如果是访客登记,录入人员的在场数据记录
                    Retention r = getRetentionModelByVisitRequest(visits, request.getHappenTime(),request.getSrcType());
                    r.setCarNo(request.getData().getParamValues().getPlateNos());
                    r.setAccessType(request.getData().getParamValues().getAccessType());
                    r.setDeviceName(request.getData().getParamValues().getSrcName());
                    r.setDeviceIndex(request.getData().getParamValues().getSrcIndex());
                    retentionList.add(r);
                    inoutDayCount.setInVisitorNum(Constants.formatIntegerNum(inoutDayCount.getInVisitorNum())+1);
                }
                if(request.getData()!=null&&request.getData().getParamValues()!=null &&
                         !StringUtils.equals(request.getData().getParamValues().getInOrOut(),"0")){
                    inoutDayCount.setOutVisitorNum(Constants.formatIntegerNum(inoutDayCount.getOutVisitorNum())+1);
                    record.setInOrOut(Constants.ONE);
                }
                inoutRecordList.add(record);
            }
            updateVistis.setEditDate(new Date());
            //更新访客来访或者签离时间信息
            visitsMapper.updateById(updateVistis) ;
        }
    }
    private Retention getRetentionModelByVisitRequest(Visits visits, String happentTime,String srcType) {
        Retention retention = new Retention();
        retention.setIsdeleted(Constants.ZERO);
        retention.setCreateDate(DateUtil.getISO8601DateByStr(happentTime));
        retention.setCreateDate(DateUtil.getISO8601DateByStr2(happentTime));
        retention.setCreateDate(retention.getCreateDate() == null?new Date():retention.getCreateDate());
        retention.setClasses(visits.getClasses());
        retention.setCode(visits.getCode());
        retention.setIdcardNo(visits.getIdcardNo());
@@ -448,9 +619,6 @@
        retention.setImgurl(visits.getImgurl());
        retention.setPhone(visits.getPhone());
        retention.setMemberId(visits.getMemberId());
//        retention.setDeviceName(request.getSrcName());
//        retention.setDeviceIndex(request.getSrcIndex());
        return retention;
    }
    private VisitEvent getVisitEventModelByRequestIccm(EventVisitIccmInfoRequest request,EventVisitIccmDetailParamRequest detail) {
@@ -466,6 +634,15 @@
        if(event.getCreateDate() == null){
            event.setCreateDate(new Date());
        }
        if (Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_ICCM_PASS.getKey())  {
            //如果是访客通行事件,进入进出事件
            if(request.getData()!=null&&request.getData().getParamValues()!=null &&
                    StringUtils.equals(request.getData().getParamValues().getInOrOut(),"0")){
                event.setInOrOut("0");//进
            }else{
                event.setInOrOut("1");//出
            }
        }
        event.setVisitorWorkUint(detail.getUnit());
        event.setVisitorId(detail.getVisitorId());
        event.setVisitorCode(detail.getAppointmentCode());
@@ -477,7 +654,8 @@
        event.setStartTime(request.getData().getVisitorInvoices().getBeginTime());
        event.setSrcType(request.getSrcType());
        event.setSrcParentIndex(request.getSrcParentIndex());
        event.setSrcName(request.getSrcName());
        event.setSrcName((request.getData()!=null &&request.getData().getParamValues()!=null)?
                request.getData().getParamValues().getSrcName():request.getSrcName());
        event.setSrcIndex(request.getSrcIndex());
        event.setSex(detail.getSex());
        event.setPurpose(request.getData().getVisitorInvoices().getVisitReason());
@@ -489,6 +667,7 @@
        event.setPhotoUrl(getHkImgUrl(detail.getFacePic()));
        event.setPersonName(detail.getVisitorName());
        event.setCarNo(detail.getPlateNo());
        event.setRemark(JSONObject.toJSONString(request));
        event.setInvoicesNo(request.getData().getVisitorInvoices().getInvoicesNo());//访客单号
        event.setIdType(detail.getCertType());
        String idnum = detail.getCertNo();
@@ -643,12 +822,15 @@
            List<CarEvent> list = new ArrayList<>();
            List<Retention> retentionList = new ArrayList<>();
            List<String> delRetentionList = new ArrayList<>();
            List<Integer> delMemberRetentionList = new ArrayList<>();
            InoutDayCount inoutDayCount = new InoutDayCount();
            List<InoutRecord> inoutRecordList = new ArrayList<>();
            for(EventParkInfoRequest request : events){
                if(request.getData() ==null ||StringUtils.isBlank(request.getData().getPlateNo())){
                    continue;
                }
                //封装事件信息表对象
                list.add(getParkEventModelByRequest(request,delRetentionList,retentionList));
                list.add(getParkEventModelByRequest(request,delRetentionList,retentionList,delMemberRetentionList,inoutDayCount,inoutRecordList));
            }
            if(list.size()>0){
                //插入门禁记录
@@ -660,13 +842,24 @@
                        .eq(Retention::getType,Constants.THREE)
                        .in(Retention::getCarNo,delRetentionList));
            }
            if(delMemberRetentionList.size()>0){
                //先删除原有的在场人员(内部人员和访客)
                retentionMapper.delete(new UpdateWrapper<Retention>().lambda()
                        .in(Retention::getType,Constants.memberType.internal,Constants.memberType.visitor)
                        .in(Retention::getMemberId,delMemberRetentionList));
            }
            if(retentionList.size()>0){
                //再插入最新的在厂人员
                retentionMapper.insert(retentionList);
            }
            if(inoutRecordList.size()>0){
                //再插入最新的人车出入明细
                inoutRecordMapper.insert(inoutRecordList);
            }
            dealInoutDayCountBiz(inoutDayCount);
            log.info("【海康停车场事件推送】========成功=======");
        }catch (Exception e){
            e.printStackTrace();
            log.error("【海康停车场事件推送】========失败=======:\n"+e.getMessage());
        }
        saveInterfaceLog(param,"/business/hksync/push/parks",result,false);
@@ -678,7 +871,325 @@
     * @param request
     * @return
     */
    private CarEvent getParkEventModelByRequest(EventParkInfoRequest request, List<String> delRetentionList , List<Retention> retentionList ) {
    private CarEvent getParkEventModelByRequest(EventParkInfoRequest request
            , List<String> delRetentionList
            , List<Retention> retentionList
            , List<Integer> delMemberRetentionList
            , InoutDayCount inoutDayCount
            , List<InoutRecord> inoutRecordList) {
        CarEvent event =initCarEventModelByRequest(request);
        if(StringUtils.isNotBlank(event.getPlateNos())){
            //标记车辆进出记录
            List<Category> categoryList = categoryMapper.selectJoinList(Category.class, new MPJLambdaWrapper<Category>()
                        .selectAll(Category.class)
                        .select("t4.name",Category::getParentName)
                        .leftJoin("category t4 on t.parent_id=t4.id")
                        .eq(Category::getIsdeleted,Constants.ZERO)
                        .isNotNull(Category::getBizType));//查询所有带有业务类型的车辆分类编码
            List<Visits> visitsList = null;
            InoutRecord carrecord = new InoutRecord();
            carrecord.setCreateDate(DateUtil.getISO8601DateByStr2(request.getHappenTime()));
            carrecord.setTimeInfo(Utils.Date.getStart(carrecord.getCreateDate()));
            carrecord.setType(Constants.ZERO);//车辆
            carrecord.setIsdeleted(Constants.ZERO);
            carrecord.setObjType(Constants.ZERO);
            carrecord.setHkEventId(request.getEventId());
            carrecord.setCarCode(event.getPlateNos());
            Cars carModel = carsMapper.selectJoinOne(Cars.class,new MPJLambdaWrapper<Cars>()
                            .selectAll(Cars.class )
                            .selectAs(Company::getType,Cars::getCompanyType)
                            .selectAs(Member::getName,Cars::getMemberName)
                            .selectAs(Member::getIdcardDecode,Cars::getIdcardDecode)
                            .selectAs(Member::getCode,Cars::getMemberCode)
                            .selectAs(Member::getFaceImg,Cars::getFaceImg)
                            .selectAs(Member::getIdcardNo,Cars::getIdcardNo)
                            .selectAs(Member::getName,Cars::getMemberName)
                            .selectAs(Member::getPhone,Cars::getMemberPhone)
                            .selectAs(Company::getCompanyNamePath,Cars::getCompanyName)
                            .selectAs(Category::getBizType,Cars::getBizType)
                            .selectAs(Category::getName,Cars::getCateName)
                            .select("t4.id",Cars::getCatePId)
                            .select("t4.name",Cars::getCatePName)
                            .leftJoin(Company.class,Company::getId,Cars::getGroupId)
                            .leftJoin(Member.class,Member::getId,Cars::getMemberId)
                            .leftJoin(Category.class,Category::getId,Cars::getCateId)
                            .leftJoin("category t4 on t3.parent_id=t4.id")
                            .eq(Cars::getCode,event.getPlateNos())
                            .eq(Cars::getIsdeleted,Constants.ZERO)
                            .last(" limit 1"));
            if(carModel!=null){
                //0安泰公务车 1安泰自有物流车 2其它
                event.setMemberId(carModel.getMemberId());
                event.setCompanyId(carModel.getGroupId());
                //-----------------20250429改造----start---------------
                event.setCarType(carModel.getBizType());//车辆业务类型
                carrecord.setObjType(Constants.FOUR);
                carrecord.setMemberName(carModel.getMemberName());//司机
                carrecord.setMemberPhone(carModel.getMemberPhone());//司机
                carrecord.setObjId(carModel.getId());
                carrecord.setObjType(Constants.ZERO);
                carrecord.setFaceImg(carModel.getFaceImg());
                carrecord.setIdcardDecode(carModel.getIdcardDecode());
                carrecord.setIdcardNo(carModel.getIdcardNo());
                carrecord.setMemberCode(carModel.getMemberCode());
                carrecord.setCompanyId(carModel.getGroupId());
                carrecord.setCompanyName(carModel.getCompanyName());
                carrecord.setCategoryId(carModel.getCateId());
                carrecord.setCategoryName(carModel.getCateName());
                carrecord.setCategoryParentId(carModel.getCatePId());
                carrecord.setCategoryParentName(carModel.getCatePName());
                carrecord.setMemberType( Constants.RetentionMemberType.car);//只是车辆的记录
                if(carModel.getMemberId()!=null){
                    if(Constants.equalsInteger(carModel.getCompanyType(),Constants.ONE)){
                        //内部组织
                        carrecord.setMemberType(Constants.RetentionMemberType.internalMember);
                    }else{
                        //相关方组织
                        carrecord.setMemberType( Constants.RetentionMemberType.relMember);
                    }
                }
//              carrecord.setMemberPhone(carTypeJob.getDrivierPhone());
                //-----------------20250429改造----end---------------
            }
            if(event.getCarType() ==null || event.getCarType().equals(Constants.RetentionCarType.other)){//如果为识别到车型
                PlatformJob carTypeJob = platformJobMapper.selectJoinOne(PlatformJob.class,
                        new MPJLambdaWrapper<PlatformJob>(). selectAll(PlatformJob.class)
                                .selectAs(PlatformGroup::getType,PlatformJob::getGroupType)
                                .leftJoin(PlatformGroup.class,PlatformGroup::getId,PlatformJob::getPlatformGroupId)
                                .eq(PlatformJob::getCarCodeFront,event.getPlateNos())
                                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                                .orderByAsc(PlatformJob::getCreateDate)
                                .last(" limit 1"));
                if(carTypeJob!=null ) {
                    /**
                     * 如果非固定车辆,检查是否货运车辆
                     * 货运车辆优先级:
                     * 1、安泰自有车:货运车辆-安泰物流货运车辆(固定车辆上面已处理,此处不考虑)
                     * 2、wms推送的物流车辆(非自有车):货运车辆-外协运输车辆  对应grouptype为:安泰物流卸货 2
                     * 3、安泰的预约入园车辆:货运车辆-加工烟卸货车辆  对应grouptype为0安泰物流卸货 2市公司卸货
                     * 4、市公司的预约入园车辆:货运车辆-市公司卸货车辆
                     */
                    carrecord.setMemberName(carTypeJob.getDriverName());//司机
                    carrecord.setMemberPhone(carTypeJob.getDrivierPhone());//司机
                    carrecord.setObjId(carTypeJob.getId());
                    carrecord.setMemberId(carTypeJob.getDriverId());//司机编码
                    carrecord.setObjType(Constants.FOUR);
                    carrecord.setCompanyId(carTypeJob.getCompanyId());
                    carrecord.setCompanyName(carTypeJob.getCompanyNamePath());
                    carrecord.setMemberType(Constants.RetentionMemberType.car);
                    if(carModel.getMemberPhone()!=null || StringUtils.isNotBlank(carModel.getMemberName())){
                        //货运司机(如果司机手机号或者姓名不为空)
                        carrecord.setMemberType(Constants.RetentionMemberType.driver);
                    }
                    Category category  = null;
                    String tempName = "";
                    String tempPName = "";
                    //如果非固定车辆,则查询是否货运车辆 作业类型 0自有车卸货 1自有车装货 2外协车卸货 3外协车装货 4市公司外协车卸货
                    if(Constants.equalsInteger(carTypeJob.getOrigin(),Constants.ONE)){
                        //如果是推送的wms非自有车
                        event.setCarType(Constants.RetentionCarType.wxysCar);//外协车
                        tempName = "外协运输车辆";
                        tempPName = "货运车辆";
                    }else  if(Constants.equalsInteger(carTypeJob.getType(),Constants.FOUR)){
                        if(Constants.equalsInteger(carTypeJob.getGroupType(),Constants.TWO)){
                            ///安泰的预约入园车辆:货运车辆-加工烟卸货车辆
                            tempName = "加工烟卸货车辆";
                            tempPName = "货运车辆";
                            event.setCarType(Constants.RetentionCarType.jgyxhCar);//加工烟卸货车辆
                        }else  if(Constants.equalsInteger(carTypeJob.getGroupType(),Constants.TWO)){
                            //市公司的预约入园车辆:货运车辆-市公司卸货车辆
                            tempName = "市公司卸货车辆";
                            tempPName = "货运车辆";
                            event.setCarType(Constants.RetentionCarType.sgsxhCar);//市公司卸货车辆
                        }
                    }
                    category =findCategoryByBizType(event.getCarType(),tempName,tempPName,categoryList);
                    carrecord.setCategoryId(category.getId());
                    carrecord.setCategoryName(category.getName());
                    carrecord.setCategoryParentName(category.getParentName());
                    carrecord.setCategoryParentId(category.getParentId());
                }
            }
            //处理自有车自动签到业务
            dealSelTruckAutoSignBiz(request,event);
            if(Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.PARK_PASS_IN.getKey()){
                //如果是入厂放行
                delRetentionList.add(event.getPlateNos());
                delMemberRetentionList.add(event.getMemberId());
                retentionList.add(getRetentionModelByParkRequest(request,event));//在厂车辆信息
                inoutDayCount.setInCarNum(Constants.formatIntegerNum(inoutDayCount.getInCarNum())+1);
                carrecord.setInOrOut(Constants.ZERO);
            }else if(Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.PARK_PASS_OUT.getKey()){
                //如果是出场放行
                delRetentionList.add(event.getPlateNos());
                delMemberRetentionList.add(event.getMemberId());
                inoutDayCount.setOutCarNum(Constants.formatIntegerNum(inoutDayCount.getOutCarNum())+1);
                carrecord.setInOrOut(Constants.ZERO);
            }
            //车辆进入记录对应业务类型
            if(event.getCarType() ==null || event.getCarType().equals(Constants.RetentionCarType.other)){
                //如果未识别到车型,不是固定车 也不是货运车辆,则检查是否是访客车
                visitsList =  visitsMapper.selectList(new QueryWrapper<Visits>().lambda()
                                .eq(Visits::getCarNos,event.getPlateNos())
                                .eq(Visits::getIsdeleted,Constants.ZERO )
                                .in(Visits::getStatus,Constants.VisitStatus.signin)//最近一个已到达或者已签离
                                .isNull(Visits::getParentId)
                                .orderByDesc(Visits::getId)
//                        .last("limit 1" )
                );
                if(visitsList!=null && visitsList.size()>0){
                    //最近使用该车的申请人(已到达)
                    event.setMemberId(visitsList.get(0).getMemberId());
                    event.setCarType(Constants.RetentionCarType.fkCar);
                    int index =0;
                    carrecord.setCarBizType(Constants.RetentionCarType.fkCar);
                    Category category =findCategoryByBizType(Constants.RetentionCarType.fkCar,"访客车辆","访客车辆",categoryList);
                    carrecord.setCategoryId(category.getId());
                    carrecord.setCategoryName(category.getName());
                    carrecord.setCategoryParentName(category.getParentName());
                    carrecord.setCategoryParentId(category.getParentId());
                    for(Visits v :visitsList){
                        delMemberRetentionList.add(event.getMemberId());
                        InoutRecord copyObj = new InoutRecord();
                        BeanUtils.copyProperties(carrecord,copyObj);
                        copyObj.setMemberId(v.getMemberId());
                        copyObj.setMemberName(v.getName());
                        copyObj.setMemberPhone(v.getPhone());
                        copyObj.setCompanyName(v.getCompanyName());
                        copyObj.setMemberType(Constants.ZERO);
                        copyObj.setRemark(carrecord.getCarCode());
                        copyObj.setCarCode(index>=0?null:carrecord.getCarCode());
                        copyObj.setMemberType(Constants.RetentionMemberType.fk);
                        inoutRecordList.add(copyObj);
                        index++;
                        if(Constants.equalsInteger(carrecord.getInOrOut(),Constants.ONE)){
                            //如果是车辆出园区 统计访客进入数
                            inoutDayCount.setOutVisitorNum(Constants.formatIntegerNum(inoutDayCount.getOutVisitorNum())+1);
                            try {
                                //访客申请自动签离
                                visitsService.visitLevelForCarOut(v);
                                //统计签离数
                                inoutDayCount.setLeaveVisitorNum(Constants.formatIntegerNum(inoutDayCount.getLeaveVisitorNum())+1);
                            }catch (Exception e){
                                log.error("访客跟随车辆出园自动签离失败:==========="+e.getMessage());
                            }
                        }else{
                            //如果是进入园区,访客录入在园人员记录
                            retentionList.add(getRetentionModelByRequest(copyObj,request));
                            //统计访客出行数
                            inoutDayCount.setInVisitorNum(Constants.formatIntegerNum(inoutDayCount.getInVisitorNum())+1);
                        }
                    }
                }
            }
            if(event.getCarType() !=null && !event.getCarType().equals(Constants.RetentionCarType.fkCar)){
                //录入非访客类型车辆进出记录
                dealNotFkCarMemberBiz(event,request,carrecord,retentionList,inoutDayCount,inoutRecordList);
            }
        }
        return event;
    }
    private void dealNotFkCarMemberBiz( CarEvent event ,EventParkInfoRequest request, InoutRecord carrecord,List<Retention> retentionList,InoutDayCount inoutDayCount,List<InoutRecord> inoutRecordList) {
        //录入非访客类型车辆进出记录
        carrecord.setCarBizType(event.getCarType()==null?Constants.RetentionCarType.other:event.getCarType());
        if(carrecord.getMemberId()!=null
                && (Constants.equalsInteger(carrecord.getMemberType(),Constants.RetentionMemberType.internalMember)
                ||Constants.equalsInteger(carrecord.getMemberType(),Constants.RetentionMemberType.relMember)
                ||Constants.equalsInteger(carrecord.getMemberType(),Constants.RetentionMemberType.driver))){
            if( Constants.equalsInteger(carrecord.getInOrOut(),Constants.ZERO)) {
                //如果是进入
                retentionList.add(getRetentionModelByRequest(carrecord,request));
                if(Constants.equalsInteger(carrecord.getMemberType(),Constants.RetentionMemberType.relMember)){
                    //如果是相关方人员,统计今日累计数
                    inoutDayCount.setInOtherMemberNum(Constants.formatIntegerNum(inoutDayCount.getInOtherMemberNum())+1);
                }else if(Constants.equalsInteger(carrecord.getMemberType(),Constants.RetentionMemberType.internalMember)){
                    //如果是内部人员,统计今日累计数
                    inoutDayCount.setInSelfMemberNum(Constants.formatIntegerNum(inoutDayCount.getInSelfMemberNum())+1);
                }
                //统计今日入园总人次
                inoutDayCount.setInMemberNum(Constants.formatIntegerNum(inoutDayCount.getInMemberNum())+1);
            }else   if(carrecord.getMemberId()!=null &&  Constants.equalsInteger(carrecord.getInOrOut(),Constants.ONE)) {
                //如果是出园区
                if(Constants.equalsInteger(carrecord.getMemberType(),Constants.RetentionMemberType.relMember)){
                    //如果是相关方,统计今日累计数
                    inoutDayCount.setOutOtherMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutOtherMemberNum())+1);
                }else if(Constants.equalsInteger(carrecord.getMemberType(),Constants.RetentionMemberType.internalMember)){
                    //如果是内部人员,统计今日累计数
                    inoutDayCount.setOutSelfMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutSelfMemberNum())+1);
                }
                //统计今日出园总人次
                inoutDayCount.setOutMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutMemberNum())+1);
            }
        }
        inoutRecordList.add(carrecord);//录入车辆以及携带人员的入园明细记录(非访客)
    }
    private Category findCategoryByBizType(Integer carType,String tempname, String pName,List<Category> categoryList) {
        if(categoryList!=null){
            for(Category category :categoryList){
                if(Constants.equalsInteger(carType,category.getBizType())){
                    return category;
                }
            }
        }
        Category category  = new Category();
        category.setName(tempname);
        category.setParentName(pName);
        return null;
    }
    private void dealSelTruckAutoSignBiz(EventParkInfoRequest request, CarEvent event) {
        ParkBook cars = parkBookMapper.selectOne(new QueryWrapper<ParkBook>().lambda()
                .eq(ParkBook::getCarCode,event.getPlateNos())
                .eq(ParkBook::getHkStatus,Constants.ONE )
                .eq(ParkBook::getIsdeleted,Constants.ZERO )
                .last("limit 1" ));
        if(cars!=null){
            event.setMemberId(cars.getMemberId());
            //自有车  查询当前是否有待签到的任务
            if(carsMapper.selectCount(new QueryWrapper<Cars>()
                    .lambda().eq(Cars::getCode,event.getPlateNos())
                    .eq(Cars::getType,Constants.ONE)
                    .eq(Cars::getIsdeleted,Constants.ZERO)
            )>Constants.ZERO){
                //查询车辆当前是否存在进行中的任务
                if( platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
                        .eq(PlatformJob::getCarCodeFront,event.getPlateNos())
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .in(PlatformJob::getStatus,
                                Constants.PlatformJobStatus.IN_WAIT.getKey(),
                                Constants.PlatformJobStatus.CALLED.getKey(),
                                Constants.PlatformJobStatus.WORKING.getKey(),
                                Constants.PlatformJobStatus.TRANSFERING.getKey(),
                                Constants.PlatformJobStatus.EXCEPTION.getKey()
                        )
                )==Constants.ZERO){//如果没进行中任务
                    PlatformJob platformJob = platformJobMapper.selectOne(new QueryWrapper<PlatformJob>().lambda()
                            .eq(PlatformJob::getCarCodeFront,event.getPlateNos())
                            .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                            .in(PlatformJob::getStatus,
                                    Constants.PlatformJobStatus.WAIT_CONFIRM.getKey(),
                                    Constants.PlatformJobStatus.WART_SIGN_IN.getKey()
                            )
                            .orderByAsc(PlatformJob::getCreateDate)
                            .last(" limit 1")
                    );
                    if(Objects.nonNull(platformJob)){
                        if(Constants.equalsInteger(platformJob.getType(),Constants.ONE)){
                            //如果是自有车装货自动签到
                            jobAutoSignBiz(platformJob);
                        }else  if(Constants.equalsInteger(platformJob.getType(),Constants.ZERO)){
                            //如果是自有车卸货 查询TMS合同状态,决定是否自动签到
                            checkTmsContractStatusBiz(platformJob);
                        }
                    }
                }
            }
        }
    }
    private CarEvent initCarEventModelByRequest(EventParkInfoRequest request) {
        CarEvent event = new CarEvent();
        event.setIsdeleted(Constants.ZERO);
        event.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
@@ -716,7 +1227,7 @@
        event.setEventCmd(request.getData().getEventCmd());
        event.setCardNo(request.getData().getCardNo());
        event.setCarAttributeName(request.getData().getCarAttributeName());
        event.setCarType(Constants.RetentionCarType.other);//默认未登记车辆
        if(request.getData().getInResult()!=null && request.getData().getInResult().getRlsResult() !=null ){
            //放行方式
            event.setReleaseWay(request.getData().getInResult().getRlsResult().getReleaseWay());
@@ -730,46 +1241,83 @@
            event.setVehiclePicUrl(getHkImgUrl(request.getData().getPicUrl().getVehiclePicUrl()));
            event.setPlatePicUrl(getHkImgUrl(request.getData().getPicUrl().getPlatePicUrl()));
        }
        if(StringUtils.isNotBlank(event.getPlateNos())){
            ParkBook cars = parkBookMapper.selectOne(new QueryWrapper<ParkBook>().lambda()
                    .eq(ParkBook::getCarCode,event.getPlateNos())
                            .eq(ParkBook::getIsdeleted,Constants.ZERO )
                    .last("limit 1" ));
            if(cars!=null){
                event.setMemberId(cars.getMemberId());
            }else{
                Visits visits =  visitsMapper.selectOne(new QueryWrapper<Visits>().lambda()
                        .eq(Visits::getCarNos,event.getPlateNos())
                        .eq(Visits::getIsdeleted,Constants.ZERO )
                        .in(Visits::getStatus,Constants.VisitStatus.signin,Constants.VisitStatus.signout)//最近一个已到达或者已签离
                        .isNull(Visits::getParentId)
                        .orderByDesc(Visits::getId)
                        .last("limit 1" ));
                if(visits!=null){
                    //最近使用该车的申请人(已到达)
                    event.setMemberId(visits.getMemberId());
                }
            }
            if(Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.PARK_PASS_IN.getKey()){
                //如果是入厂放行
                delRetentionList.add(event.getPlateNos());
                retentionList.add(getRetentionModelByParkRequest(request));
            }else if(Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.PARK_PASS_OUT.getKey()){
                //如果是出场放行
                delRetentionList.add(event.getPlateNos());
            }
        }
        return event;
    }
    private Retention getRetentionModelByParkRequest(EventParkInfoRequest request) {
    /**
     * ;如果是卸货任务,需要通过TMS提供的“2.2合同列表接口”接口查询车辆对应的合同状态是否为在途状态(对应orderStatus值为3/4/5/6),
     * 如果是自动签到,否则不自动签到;如果一个车辆对应多个合同号,则取运单下任一合同查询对应在途信息
     * @param platformJob
     */
    private void checkTmsContractStatusBiz(PlatformJob platformJob) {
        PlatformWmsDetail detail = platformWmsDetailMapper.selectOne(new QueryWrapper<PlatformWmsDetail>().lambda()
                .eq(PlatformWmsDetail::getIsdeleted, Constants.ZERO)
                .eq(PlatformWmsDetail::getJobId, platformJob.getId())
                .isNotNull(PlatformWmsDetail::getContractNum)
                .last("limit 1")
        );
        if(detail!=null && StringUtils.isNotBlank(detail.getContractNum())){
            TmsOrderInfoRequest param = new TmsOrderInfoRequest();
            param.setContractNumber(detail.getContractNum());
            TmsOrderInfoResponse response = tmsService.orderInfo(param);
            if(response!=null &&( StringUtils.equals(response.getOrderStatus(),"3")  )
                ||StringUtils.equals(response.getOrderStatus(),"4")
                ||StringUtils.equals(response.getOrderStatus(),"5")
                ||StringUtils.equals(response.getOrderStatus(),"6")){
                //如果合同在途,则自动签到
                jobAutoSignBiz(platformJob);
            }
        }
    }
    private void jobAutoSignBiz(PlatformJob platformJob) {
        platformJob.setStatus(Constants.PlatformJobStatus.WAIT_CALL.getKey());
        platformJob.setArriveDate(new Date());
        platformJob.setSingType(Constants.TWO);
        platformJob.setSignDate(new Date());
        List<PlatformJob> signList = platformJobMapper.selectList(new QueryWrapper<PlatformJob>().lambda().apply(" DATE(SIGN_DATE) = DATE(NOW()) and sign_date is not null  "));
        if(CollectionUtils.isEmpty(signList)){
            platformJob.setSignNum(Constants.ONE);
        } else{
            int maxNumber = Collections.max(signList.stream().map(i->i.getSignNum()).collect(Collectors.toList()));
            platformJob.setSignNum(maxNumber + Constants.ONE);
        }
        platformJobMapper.updateById(platformJob);
    }
    private Retention getRetentionModelByRequest(InoutRecord inoutRecord, EventParkInfoRequest request) {
        Retention retention = new Retention();
        retention.setIsdeleted(Constants.ZERO);
        retention.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
        retention.setCode(inoutRecord.getMemberCode());
        retention.setIdcardNo(inoutRecord.getIdcardNo());
        retention.setIdcardDecode(inoutRecord.getIdcardDecode());
        retention.setName(inoutRecord.getMemberName());
        retention.setType(inoutRecord.getMemberType());
        retention.setCompanyId(inoutRecord.getCompanyId());
        retention.setCompanyName(inoutRecord.getCompanyName());
        retention.setEventCode(request.getEventType()+"");
        retention.setEventDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
        retention.setFaceImg(inoutRecord.getFaceImg());
        retention.setPhone(inoutRecord.getMemberPhone());
        retention.setMemberId(inoutRecord.getMemberId());
        retention.setDeviceName(request.getSrcName());
        retention.setDeviceIndex(request.getSrcIndex());
        retention.setRemark("跟随车辆入园区");
        return retention;
    }
    private Retention getRetentionModelByParkRequest(EventParkInfoRequest request,CarEvent event  ) {
        Retention retention = new Retention();
        retention.setIsdeleted(Constants.ZERO);
        retention.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
        retention.setCarNo(request.getData().getPlateNo());
        retention.setType(Constants.THREE);
        retention.setMemberId(event.getMemberId());
        retention.setCarType(event.getCarType());
        retention.setCompanyId(event.getCompanyId());
//        retention.setDeviceName(request.getSrcName());
//        retention.setDeviceIndex(request.getSrcIndex());
        return retention;
    }
@@ -864,34 +1412,56 @@
                if( data.getHPVehicleStatus() ==null  ){
                    continue;//如何推送状态集合为空,不处理跳过
                }
                //各车道车辆状态
                EventPlatformCarsStatusInfoRequest status = data.getHPVehicleStatus();
                PlatformEvent event = initPlatformEventModel(request,data,status);
                if(StringUtils.isBlank(status.getPlateNo())){
                    eventList.add(event);//封装事件(已月台通道为维度)
                    continue;//如果车辆信息为空,不处理直接跳过
                }
                PlatformDevice model = platformDeviceMapper.selectOne(new QueryWrapper<PlatformDevice>().lambda()
                        .eq(PlatformDevice::getDeviceId,request.getSrcIndex())
                        .eq(PlatformDevice::getIsdeleted,Constants.ZERO)
                        .last("limit 1"));
                if(model ==null){
                    eventList.add(event);//封装事件(已月台通道为维度)
                    continue;//监控点未同步,跳过处理
                }
                    //各车道车辆状态
                EventPlatformCarsStatusInfoRequest status = data.getHPVehicleStatus();
                eventList.add(initPlatformEventModel(request,data,status));//封装事件(已月台通道为维度)
                if(StringUtils.isBlank(status.getPlateNo())){
                    continue;//如果车辆信息为空,不处理直接跳过
                }
                event.setPlatformId(model.getPlatformId());//月台编码
                eventList.add(event);//封装事件(已月台通道为维度)
                //截掉第一个颜色汉字,去掉“挂”字
                status.setPlateNo(status.getPlateNo().substring(1,status.getPlateNo().length()).replace("挂",""));
                PlatformJob job = platformJobMapper.selectJoinOne(PlatformJob.class, new MPJLambdaWrapper<PlatformJob>()
                        .selectAll(PlatformJob.class)
                        .selectAs(Platform::getName,PlatformJob::getPlatformName)
                        .selectAs(Platform::getLedContent,PlatformJob::getLedContent)
                        .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                        .eq(StringUtils.equals(status.getStockStatus(),"front"),PlatformJob::getCarCodeFront,status.getPlateNo() )//前车牌号
                        .eq(!StringUtils.equals(status.getStockStatus(),"front"),PlatformJob::getCarCodeBack,status.getPlateNo() )//后车牌号
//                        .eq(!StringUtils.equals(status.getStockStatus(),"front"),PlatformJob::getCarCodeBack,status.getPlateNo() )//后车牌号
//                        .eq(StringUtils.equals(status.getStockStatus(),"front"),PlatformJob::getCarCodeFront,status.getPlateNo() )//前车牌号
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO )
                        .eq(PlatformJob::getPlatformId,model.getPlatformId() )
                        .orderByDesc(PlatformJob::getCallDate)
                        .last("limit 1 "));
                if(job == null){
                    if(StringUtils.equals(status.getMotionStatus(),"enter")){
                        //如果月台当前没作业,直接提示车辆停错
                        Platform platform = platformMapper.selectJoinOne(Platform.class, new MPJLambdaWrapper<Platform>()
                                .selectAll(Platform.class)
                                .eq(Platform::getIsdeleted,Constants.ZERO )
                                .eq(PlatformJob::getId,model.getPlatformId() )
                                .last("limit 1 "));
                        if(platform!=null){
                            dealCarsAndPlatformErrorBiz(platform,status);
                        }
                    }
                    continue;//如果作业为空,跳过处理
                }
                PlatformJob update = new PlatformJob();
                update.setId(job.getId());
                update.setEditDate(new Date());
                if(StringUtils.equals(status.getMotionStatus(),"leave")){
                    //如果是车辆离开,不做相关自动完成作业业务处理
                 /*   if(job ==null && !Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
                   /* if(job ==null && !Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
                        continue;//如果没查到对应的作业或者作业并非作业中,不做业务处理
                    }
                    if(Constants.equalsInteger(job.getType(), Constants.THREE) || Constants.equalsInteger(job.getType(), Constants.TWO)){
@@ -906,16 +1476,43 @@
                    //如果是正在作业的状态,标记作业已完成
                    update.setStatus(Constants.PlatformJobStatus.DONE.getKey());//作业已完成
                    update.setDoneDate(update.getEditDate());*/
                    if(Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.DONE.getKey()) ||
                            Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.TRANSFERING.getKey()) ||
                            Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.EXCEPTION.getKey()) ||
                            Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey())){
                        if(((StringUtils.equals(status.getStockStatus(),"front") && StringUtils.equals(job.getCarCodeFront(),status.getPlateNo()))
                                ||(!StringUtils.equals(status.getStockStatus(),"front") && StringUtils.equals(job.getCarCodeBack(),status.getPlateNo()))
                        )){
                            //说明车辆进错月台 或者还未叫号状态,发起警告
//                          dealCarsInErrorPlatformBiz(job,status);
                            if(Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.DONE.getKey())  ||
                                    Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.AUTHED_LEAVE.getKey())){
                                update.setInOut(Constants.ZERO);//车辆已经离开
                                platformJobMapper.updateById(update);
                            }
                            dealPlatformContentForLeave(job);
                         }
                    }
                }else  if(StringUtils.equals(status.getMotionStatus(),"enter")){
                    //如果是车辆进入
                    if(job ==null || !Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.CALLED.getKey())){
                        //说明车辆进错月台 或者还未叫号状态,发起警告
                        dealCarsInErrorPlatformBiz(job,status);
                    if(Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.CALLED.getKey())){
                        if(!((StringUtils.equals(status.getStockStatus(),"front") && StringUtils.equals(job.getCarCodeFront(),status.getPlateNo()))
                                ||(!StringUtils.equals(status.getStockStatus(),"front") && StringUtils.equals(job.getCarCodeBack(),status.getPlateNo()))
                        )){
                            //说明车辆进错月台 或者还未叫号状态,发起警告
                            dealCarsInErrorPlatformBiz(job,status);
                        }else{
                            //车辆已经进入
                            update.setInOut(Constants.ONE);//车辆已经进入
                            platformJobMapper.updateById(update);
                        }
                    }
                    /*
                    if(job.getStartDate() == null){
                        update.setStartDate(update.getEditDate());
                    }
                    update.setStatus(Constants.PlatformJobStatus.WORKING.getKey());//开始作业
                    */
                }else{
                    continue;//其他状态不处理,跳过
                }
@@ -935,6 +1532,37 @@
            saveInterfaceLog(param,"/business/hksync/push/platform/workstatus",result,false);//不计日志
        }
        return  null;
    }
    /**
     * 月台车辆离开 设置月台文案为“空闲中 文案”
     * @param model
     */
    private void dealPlatformContentForLeave(PlatformJob model) {
        List<PlatformDevice> deviceList = platformDeviceMapper.selectList(new QueryWrapper<PlatformDevice>().lambda()
                .eq(PlatformDevice::getType, Constants.ZERO)
                .eq(PlatformDevice::getPlatformId,model.getPlatformId())
                .eq(PlatformDevice::getIsdeleted,Constants.ZERO));
        if(deviceList ==null || deviceList.size() == 0){
            return;
        }
        int speed = 13;
        try {
            speed = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.LED_CONTENT_SPEED).getCode());
        }catch (Exception e){
        }
        String content = StringUtils.defaultString(model.getLedContent(), Constants.PlatformLedContent.IDEL_CONTNET.getInfo());
        List<PlatformBroadcastLog> logList = new ArrayList<>();
        for(PlatformDevice device : deviceList){
            if(StringUtils.isBlank(device.getHkId())){
                continue;
            }
            PlatformBroadcastLog log = dealLedContentBiz(model.getId(),device.getHkNo(),device.getName(),content,speed,1);
            logList.add(log);
        }
        if(logList.size()>0){
            platformBroadcastLogMapper.insert(logList);
        }
    }
    private PlatformEvent initPlatformEventModel(EventPlatformCarsInfoRequest request, EventPlatformCarsDataRequest data, EventPlatformCarsStatusInfoRequest status) {
@@ -1044,75 +1672,79 @@
            return;
        }
        String content =Constants.PlatformLedContent.WRONG_IN.getInfo();
        content = content.replace("${param}",model.getPlatformName());
        content = content.replace("${param2}",model.getCarCodeFront());
        content = content.replace("${param2}",model.getPlatformName());
        content = content.replace("${param}",status.getPlateNo());
        List<String> broadcastList = new ArrayList<>();
        List<String> ledList = new ArrayList<>();
        String bNames = "";
        List<PlatformBroadcastLog> logList = new ArrayList<>();
        for(PlatformDevice device : deviceList){
            if(StringUtils.isNotBlank(device.getHkId())){
            if(StringUtils.isBlank(device.getHkId())){
                continue;
            }
            if(Constants.equalsInteger(device.getType(),Constants.ZERO)){
            /*if(Constants.equalsInteger(device.getType(),Constants.ZERO)){
                //如果是LED
                PlatformBroadcastLog log = new PlatformBroadcastLog();
                log.setCreateDate(new Date());
                log.setBizType(Constants.ONE);
                log.setHkDate(new Date());
                log.setObjType(Constants.ONE);
                log.setIds(device.getHkNo());
                log.setRemark(device.getName());
                log.setInfo(content);
                log.setNum(Constants.ONE);
                BaseResponse response = dealLedContentBiz(device.getHkNo(),content,speed,1);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                    log.setHkInfo("请求失败:"+JSONObject.toJSONString(response));
                    log.setHkStatus(Constants.THREE);
                }else{
                    log.setHkInfo("请求成功");
                    log.setHkStatus(Constants.TWO);
                }
                log.setDeviceType(Constants.ONE);
                log.setName("设置LED屏显内容");
                PlatformBroadcastLog log = dealLedContentBiz(model.getId(),device.getHkNo(),device.getName(),content,speed,1);
                logList.add(log);
                ledList.add(device.getHkId());
            }else  if(Constants.equalsInteger(device.getType(),Constants.ZERO)){
            }else  */if(Constants.equalsInteger(device.getType(),Constants.TWO)){
                //如果是广播点
                bNames += device.getName()+";";
                broadcastList.add(device.getHkId());
            }
        }
        if(broadcastList.size()>0){
            String content1 =Constants.PlatformBroadcastContent.WRONG_IN.getInfo();
            content1 = content1.replace("${param}",model.getCarCodeFront());
            PlatformBroadcastLog log = new PlatformBroadcastLog();
            log.setCreateDate(new Date());
            log.setBizType(Constants.ONE);
            log.setHkDate(new Date());
            log.setObjType(Constants.ONE);
            log.setInfo(content1);
            log.setRemark(bNames);
            log.setNum(Constants.ONE);
            log.setIds(String.join(",",broadcastList));
            CustomBroadcastRequest request = new CustomBroadcastRequest();
            request.setAudioPointIndexCode(broadcastList);
            request.setPlayDuration(15);//单位秒
            request.setBroadCastMode("tts");
            request.setPriority(1);
            request.setState(1);//播放/停止标识 1-播放,0-停止
            request.setPlayTtsContent(content1);
            BaseResponse response =  HKService.customBroadcast(request);
            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                log.setHkInfo("请求失败:"+JSONObject.toJSONString(response));
                log.setHkStatus(Constants.THREE);
            }else{
                log.setHkInfo("请求成功");
                log.setHkStatus(Constants.TWO);
            PlatformBroadcastLog log = dealBroadcastBiz(model,broadcastList,bNames,Constants.PlatformBroadcastContent.WRONG_IN.getInfo().replace("${param}",status.getPlateNo()));
            logList.add(log);
        }
        if(logList.size()>0){
            platformBroadcastLogMapper.insert(logList);
        }
    }
    private void dealCarsAndPlatformErrorBiz( Platform model, EventPlatformCarsStatusInfoRequest status) {
        //处理车辆进入错误月台业务逻辑
        SavePlatformWarnEventDTO savePlatformWarnEventDTO = new SavePlatformWarnEventDTO();
        savePlatformWarnEventDTO.setPlatformJobId(model.getId());
        savePlatformWarnEventDTO.setPlatformId(model.getId());
        savePlatformWarnEventDTO.setCarCode(status.getPlateNo());
        savePlatformWarnEventDTO.setEventType(Constants.PlatformWarnEvent.STOP_ERROR.getKey());
        platformWarnEventService.savePlatformWarnEvent(savePlatformWarnEventDTO);
        int speed = 13;
        try {
            speed = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.LED_CONTENT_SPEED).getCode());
        }catch (Exception e){
        }
        List<PlatformDevice> deviceList = platformDeviceMapper.selectList(new QueryWrapper<PlatformDevice>().lambda()
                .eq(PlatformDevice::getPlatformId,model.getId())
                .eq(PlatformDevice::getIsdeleted,Constants.ZERO));
        if(deviceList ==null || deviceList.size() == 0){
            return;
        }
        String content =Constants.PlatformLedContent.WRONG_IN.getInfo();
        content = content.replace("${param2}",model.getName());
        content = content.replace("${param}",status.getPlateNo());
        List<String> broadcastList = new ArrayList<>();
        List<String> ledList = new ArrayList<>();
        String bNames = "";
        List<PlatformBroadcastLog> logList = new ArrayList<>();
        for(PlatformDevice device : deviceList){
            if(StringUtils.isBlank(device.getHkId())){
                continue;
            }
            log.setDeviceType(Constants.ONE);
            log.setName("发送广播播报内容");
            if(Constants.equalsInteger(device.getType(),Constants.TWO)){
                //如果是广播点
                bNames += device.getName()+";";
                broadcastList.add(device.getHkId());
            }
        }
        if(broadcastList.size()>0){
            PlatformJob job = new PlatformJob();
            job.setId(-1);
            job.setCarCodeFront(status.getPlateNo());
            job.setPlatformId(model.getId());
            PlatformBroadcastLog log = dealBroadcastBiz(job,broadcastList,bNames,Constants.PlatformBroadcastContent.WRONG_IN.getInfo().replace("${param}",status.getPlateNo()));
            logList.add(log);
        }
        if(logList.size()>0){
@@ -1120,7 +1752,58 @@
        }
    }
    public static BaseResponse dealLedContentBiz(String hkNo, String content,int speed,int color) {
    /**
     * 广播通知
     * @param model
     * @param broadcastList
     * @param bNames
     * @param content1
     * @return
     */
    public static PlatformBroadcastLog dealBroadcastBiz(PlatformJob model, List<String> broadcastList,String bNames , String content1) {
        PlatformBroadcastLog log = new PlatformBroadcastLog();
        content1 = content1.replace("${param}",model.getCarCodeFront());
        log.setObjId(model.getId().toString());
        log.setCreateDate(new Date());
        log.setBizType(Constants.ONE);
        log.setHkDate(new Date());
        log.setObjType(Constants.ONE);
        log.setInfo(content1);
        log.setRemark(bNames);
        log.setNum(Constants.ONE);
        log.setIds(String.join(",",broadcastList));
        CustomBroadcastRequest request = new CustomBroadcastRequest();
        request.setAudioPointIndexCode(broadcastList);
        request.setPlayDuration(15);//单位秒
        request.setBroadCastMode("tts");
        request.setPriority(1);
        request.setState(1);//播放/停止标识 1-播放,0-停止
        request.setPlayTtsContent(content1);
        BaseResponse response =  HKService.customBroadcast(request);
        if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
            log.setHkInfo("请求失败:"+JSONObject.toJSONString(response));
            log.setHkStatus(Constants.THREE);
        }else{
            log.setHkInfo("请求成功");
            log.setHkStatus(Constants.TWO);
        }
        log.setDeviceType(Constants.ZERO);
        log.setName("发送广播播报内容");
        return  log;
    }
    public static PlatformBroadcastLog dealLedContentBiz(Integer platformId,String hkNo,String hkName, String content,int speed,int color) {
        PlatformBroadcastLog log = new PlatformBroadcastLog();
        log.setCreateDate(new Date());
        log.setBizType(Constants.ONE);
        log.setHkDate(new Date());
        log.setObjType(Constants.ONE);
        log.setIds(hkNo);
        log.setRemark(hkName);
        log.setInfo(content);
        log.setNum(Constants.ONE);
        log.setObjId(platformId.toString());
        TransparentChannelBodyRequest body = new TransparentChannelBodyRequest();
        TransparentChannelHeadRequest head = new TransparentChannelHeadRequest();
        TransparentChannelBodyParamRequest request = new TransparentChannelBodyParamRequest();
@@ -1147,6 +1830,16 @@
        request.getRegions().add(regions);
        regions.setSpeed(speed>0?speed:13);
        body.setParams(request);
       return HKService.transparentchannel(head,body);
        BaseResponse response =  HKService.transparentchannel(head,body);
        if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
            log.setHkInfo("请求失败:"+JSONObject.toJSONString(response));
            log.setHkStatus(Constants.THREE);
        }else{
            log.setHkInfo("请求成功");
            log.setHkStatus(Constants.TWO);
        }
        log.setDeviceType(Constants.ONE);
        log.setName("设置LED屏显内容");
        return log;
    }
}