ParkingEntranceExitPushJob.java 6.07 KB
package com.zteits.park.job.datahub;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.zteits.clouds.api.apibase.constants.DataStatusEnum;
import com.zteits.park.domain.HubEnterpriseInfo;
import com.zteits.park.domain.HubEnterpriseInfoExample;
import com.zteits.park.domain.HubParkingEntranceExit;
import com.zteits.park.domain.HubParkingEntranceExitExample;
import com.zteits.park.mapper.HubEnterpriseInfoMapper;
import com.zteits.park.mapper.HubParkingEntranceExitMapper;
import com.jtjt.upload.client.vo.ParkEntracneExitInfoVo;
import com.jtjt.upload.client.vo.ParkEntranceExitInfoListVo;
import com.zteits.park.util.ParkInfoUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 停车场出入口数据推送JOB
 * @since 2025-08-17
 */
@Component
public class ParkingEntranceExitPushJob {
    private static final Logger logger = LoggerFactory.getLogger(ParkingEntranceExitPushJob.class);
    
    @Autowired
    private HubParkingEntranceExitMapper hubParkingEntranceExitMapper;
    
    @Autowired
    private HubEnterpriseInfoMapper hubEnterpriseInfoMapper;
    
    @Autowired
    private HubConfig hubConfig;
    
    @Autowired
    private TokenService tokenService;

    @XxlJob("ParkingEntranceExitPushJob")
    public ReturnT<String> execute() {
        log("开始推送停车场出入口信息JOB");
        try {
            this.pushData();
        } catch (Exception e) {
            logger.error("推送停车场出入口信息JOB异常:" + e.getMessage(), e);
            log("推送停车场出入口信息JOB异常:" + e.getMessage());
        }
        return ReturnT.SUCCESS;
    }

    private void pushData() {
        // 查询有效的停车场出入口数据
        HubParkingEntranceExitExample example = new HubParkingEntranceExitExample();
        example.createCriteria().andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value());
        List<HubParkingEntranceExit> entranceExitList = hubParkingEntranceExitMapper.selectByExample(example);
        
        if (CollectionUtils.isEmpty(entranceExitList)) {
            log("没有需要推送的停车场出入口信息");
            return;
        }
        
        // 查询运营单位信息
        HubEnterpriseInfoExample enterpriseInfoExample = new HubEnterpriseInfoExample();
        enterpriseInfoExample.createCriteria().andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value());
        List<HubEnterpriseInfo> hubEnterpriseInfos = hubEnterpriseInfoMapper.selectByExample(enterpriseInfoExample);
        
        if (CollectionUtils.isEmpty(hubEnterpriseInfos)) {
            log("没有需要推送的运营单位信息");
            return;
        }
        
        HubEnterpriseInfo hubEnterpriseInfo = hubEnterpriseInfos.get(0);
        
        // 按停车场分组
        Map<String, List<HubParkingEntranceExit>> groupedByPark = entranceExitList.stream()
                .collect(Collectors.groupingBy(HubParkingEntranceExit::getParkCode));
        
        // 遍历每个停车场的出入口信息
        for (Map.Entry<String, List<HubParkingEntranceExit>> entry : groupedByPark.entrySet()) {
            String parkCode = entry.getKey();
            List<HubParkingEntranceExit> list = entry.getValue();
            
            // 构建发送数据
            ParkEntracneExitInfoVo vo = new ParkEntracneExitInfoVo();
            vo.setBizId(hubEnterpriseInfo.getBizId());
            vo.setParkCode(parkCode);
            
            // 统计出入口数量
            int entranceNum = 0;
            int exitNum = 0;
            
            // 构建列表数据
            List<ParkEntranceExitInfoListVo> voList = new ArrayList<>();
            
            for (HubParkingEntranceExit entranceExit : list) {
                // 统计出入口数量
                if (entranceExit.getEntranceType() != null) {
                    if (entranceExit.getEntranceType() == 1 || entranceExit.getEntranceType() == 3) {
                        entranceNum++;
                    }
                    if (entranceExit.getEntranceType() == 2 || entranceExit.getEntranceType() == 3) {
                        exitNum++;
                    }
                }
                
                // 构建列表项
                ParkEntranceExitInfoListVo item = new ParkEntranceExitInfoListVo();
                item.setEntranceType(entranceExit.getEntranceType() != null ? entranceExit.getEntranceType() : 0);
                item.setCrName(entranceExit.getCrName() != null ? entranceExit.getCrName() : "");
                item.setCrNo(entranceExit.getCrNo() != null ? entranceExit.getCrNo() : "");
                item.setCrRoadName(entranceExit.getCrRoadName() != null ? entranceExit.getCrRoadName() : "");
                item.setCrLongitude(entranceExit.getCrLongitude() != null ? entranceExit.getCrLongitude() : "");
                item.setCrLatitude(entranceExit.getCrLatitude() != null ? entranceExit.getCrLatitude() : "");
                item.setCrPicture(entranceExit.getCrPicture() != null ? entranceExit.getCrPicture() : "");
                
                voList.add(item);
            }
            
            vo.setEntranceNum(entranceNum);
            vo.setExitNum(exitNum);
            vo.setList(voList);
            vo.setSentTime(LocalDateTime.now());
            
            // 发送数据
            int code = ParkInfoUtil.getSingleInstance().sendEntracneExitInfo(hubConfig.getUrlPrefix(), tokenService.getToken(false), vo);
            if (code == 401) {
                // 重新刷新token,再次尝试发送
                ParkInfoUtil.getSingleInstance().sendEntracneExitInfo(hubConfig.getUrlPrefix(), tokenService.getToken(true), vo);
            }
        }
    }

    private void log(String msg) {
        XxlJobHelper.log(msg);
        logger.info(msg);
    }
}