SignalHandle.java 3.21 KB
package com.bsth.data.gpsdata.arrival;

import com.bsth.data.gpsdata.GpsEntity;
import com.bsth.data.gpsdata.arrival.entity.StationRoute;
import com.bsth.data.gpsdata.arrival.utils.CircleQueue;
import com.bsth.data.gpsdata.arrival.utils.GeoUtils;
import com.bsth.entity.realcontrol.ScheduleRealInfo;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * Created by panzhao on 2016/12/27.
 */
public abstract class SignalHandle {

    public abstract boolean handle(GpsEntity gps, CircleQueue<GpsEntity> prevs);

    protected boolean isNotEmpty(CircleQueue<GpsEntity> prevs) {
        return prevs != null && prevs.size() > 0 && prevs.getTail() != null;
    }

/*    protected boolean isDriftSignal(GpsEntity gps) {
        return gps.getLat() == 0 || gps.getLon() == 0;
    }*/

    /**
     * gps掉线
     * @param gps
     * @return
     */
    protected boolean isGpsOffline(GpsEntity gps){
        return gps.getLat() == 0 || gps.getLon() == 0;
    }

    protected boolean isOffline(GpsEntity gps){
        return gps.getAbnormalStatus() != null && gps.getAbnormalStatus().equals("offline");
    }
    /**
     * 是不是异常信号
     *
     * @param gps
     * @return protected boolean isAbnormal(GpsEntity gps) {
    return gps.getLat() == 0 || gps.getLon() == 0;
    }*/

    /**
     * 连续异常信号个数统计
     *
     * @param
     * @return protected int abnormalCount(CircleQueue<GpsEntity> prevs) {
     * int count = 0;
     * <p>
     * if (!isNotEmpty(prevs))
     * return count;
     * <p>
     * GpsEntity[] array = (GpsEntity[]) prevs.getQueue();
     * GpsEntity gps;
     * for (int i = array.length - 1; i > 0; i--) {
     * gps = array[i];
     * <p>
     * if (isAbnormal(gps))
     * count++;
     * else
     * break;
     * }
     * <p>
     * return count;
     * }
     */

    Logger logger = LoggerFactory.getLogger(this.getClass());
    private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm");
    protected void transformUpdown(GpsEntity gps, ScheduleRealInfo sch) {
        int updown = Integer.parseInt(sch.getXlDir());
        //gps 切换走向
        gps.setUpDown(updown);

        List<StationRoute> srs = GeoCacheData.getStationRoute(sch.getXlBm(), updown);
        StationRoute station = GeoUtils.gpsInStation(gps, srs);
        if (station != null) {
            gps.setStopNo(station.getCode());
        }

        logger.info(gps.getTimestamp() + " -" + fmtHHmm.print(gps.getTimestamp()) + " 车辆 :" + gps.getNbbm() + " 切换到走向 : " + updown);
    }

    /**
     * 是否是从异常状态恢复的第一个信号
     *
     * @param gps
     * @param prevs
     * @return
     */
    protected boolean abnormalRecovery(GpsEntity gps, CircleQueue<GpsEntity> prevs) {
        if (prevs == null || prevs.size() == 0)
            return false;

        GpsEntity prev = prevs.getTail();
        //从异常状态恢复
        if (isGpsOffline(prev)
                && !isGpsOffline(gps)) {
            return true;
        }

        return false;
    }
}