ParkingLotAreaQueryServiceImpl.java 4.13 KB
package com.zteits.park.biz.closecarpark;

import com.clouds.common.cache.park.CloudClosedParkChannelCacheUtil;
import com.zteits.clouds.api.apibase.bean.BizResult;
import com.zteits.clouds.api.dto.park.dto.closecarpark.ParkingLotAreasDTO;
import com.zteits.clouds.api.dto.park.dto.closecarpark.ParkingLotChannelAreaDTO;
import com.zteits.clouds.api.dto.park.param.closecarpark.QueryChannelInfoByNoRequest;
import com.zteits.clouds.api.service.park.closecarpark.ParkingLotAreaQueryService;
import com.zteits.park.domain.ParkingLotAreas;
import com.zteits.park.service.closecarpark.query.ParkingLotAreasService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class ParkingLotAreaQueryServiceImpl implements ParkingLotAreaQueryService {
    private static final Logger logger = LoggerFactory.getLogger(ParkingLotAreaQueryServiceImpl.class);

    @Autowired
    private ParkingLotAreasService parkingLotAreasService;

    /**
     * 根据停车场编号以及通道号,获取对应的停车场区域信息
     */
    @Override
    public BizResult<ParkingLotAreasDTO> getParkingLotAreaByPlNoAndChannel(QueryChannelInfoByNoRequest request) {
        ParkingLotAreas parkingLotAreas = parkingLotAreasService.getParkingLotAreasByPlNoAndChannel(request);
        if (parkingLotAreas == null) {
            return null;
        }
        ParkingLotAreasDTO parkingLotAreasDTO = new ParkingLotAreasDTO();
        BeanUtils.copyProperties(parkingLotAreas, parkingLotAreasDTO);
        return new BizResult<>(parkingLotAreasDTO);
    }

    /**
     * 通过停车场编号以及通道号,判断所属的区域是否是免费的子区域
     * 注: 暂时只用于西城联通车场的逻辑
     * by zengqc
     *
     * @return 是 返回true; 否 返回false
     */
    @Override
    public BizResult<Boolean> checkIsFreeSubArea(QueryChannelInfoByNoRequest request) {
        List<ParkingLotChannelAreaDTO> cacheList = getParkingLotChannelAreaDTOFromCache(request);
        ParkingLotChannelAreaDTO parkingLotChannelAreaDTO = null;
        // 获取对应停车场通道的数据
        for (ParkingLotChannelAreaDTO dto : cacheList) {
            if (request.getPlNo().equals(dto.getPlNo())
                    && request.getChannelNumber().equals(dto.getChannelNumber())) {
                parkingLotChannelAreaDTO = dto;
                break;
            }
        }

        // 0 不收费 1 收费
        String whetherCharge = Optional.ofNullable(parkingLotChannelAreaDTO)
                .map(ParkingLotChannelAreaDTO::getWhetherCharge).orElse("1");

        return new BizResult<>("0".equals(whetherCharge));
    }

    /**
     * 先从缓存获取,再去数据库获取
     */
    private List<ParkingLotChannelAreaDTO> getParkingLotChannelAreaDTOFromCache(QueryChannelInfoByNoRequest request) {

        // 从缓存获取, 缓存不存key, 再去读取数据库
        List<ParkingLotChannelAreaDTO> cacheList = CloudClosedParkChannelCacheUtil.getFreeChanelList();
        if (cacheList == null) {
            // 去数据库获取
            cacheList = parkingLotAreasService.getAllFreeChargeAreas();
            // 放入缓存
            CloudClosedParkChannelCacheUtil.setFreeChanelList(cacheList);
        }
        return cacheList;

    }

    /**
     * 获取所有开启了内部区域免费的停车场。
     * 这些停车场的数据计费的时候,要看下子订单表是否有数据
     * 例如 西城-内部联通车场的逻辑
     */
    @Override
    public BizResult<Boolean> checkParkWithFreeArea(QueryChannelInfoByNoRequest request) {
        String plNo = request.getPlNo();
        boolean resFlg = false;
        List<ParkingLotChannelAreaDTO> cacheList = getParkingLotChannelAreaDTOFromCache(request);
        for (ParkingLotChannelAreaDTO dto : cacheList) {

            if (plNo.equals(dto.getPlNo())) {
                resFlg = true;
                break;
            }
        }
        return new BizResult<>(resFlg);
    }
}