GpsArrivalStationThread.java 4.5 KB
package com.bsth.vehicle.gpsdata;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.bsth.entity.realcontrol.ScheduleRealInfo;
import com.bsth.service.realcontrol.buffer.ScheduleBuffer;
import com.bsth.util.DateUtils;
import com.bsth.util.db.DBUtils_MS;
import com.bsth.vehicle.gpsdata.buffer.GpsArrivalDataBuffer;
import com.bsth.vehicle.gpsdata.entity.ArrivalInfo;

/**
 * 
 * @ClassName: GpsArrivalStationThread 
 * @Description: TODO(GPS到离站) 
 * @author PanZhao
 * @date 2016年6月27日 上午10:58:13 
 *
 */	
@Component
public class GpsArrivalStationThread extends Thread{

	Logger logger = LoggerFactory.getLogger(this.getClass());
	SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
	
	private static int diff = 1000 * 60 * 60;
	
	@Override
	public void run() {
		List<ArrivalInfo> list = null;
		try {
			list = loadData();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		System.out.println("size: " + list.size());
		GpsArrivalDataBuffer.putAll(list);
		//实际到离站和计划排班相匹配
		
		Set<String> keySet = GpsArrivalDataBuffer.allMap.keySet();
		System.out.println("开始...");
		List<ScheduleRealInfo> schList;
		for(String key : keySet){
			schList = ScheduleBuffer.vehLinkedMap.get(key);
			if(null != schList)
				match(GpsArrivalDataBuffer.allMap.get(key), schList);
		}
		System.out.println("结束...");
	}
	
	
	/**
	 * 
	 * @Title: match 
	 * @Description: TODO(实际和计划进行匹配) 
	 * @param @param arrList 实际GPS到离站链表
	 * @param @param schList 计划排班链表
	 * @throws
	 */
	public void match(List<ArrivalInfo> arrList, List<ScheduleRealInfo> schList){
		Iterator<ScheduleRealInfo> schIterator = schList.iterator();
		
		while(schIterator.hasNext())
			match(schIterator.next(), arrList);
	}
	
	
	public void match(ScheduleRealInfo scInfo, List<ArrivalInfo> arrList){
		for(ArrivalInfo arr : arrList){
			match(scInfo, arr);
		}
	}
	
	//单个匹配
	public void match(ScheduleRealInfo scInfo, ArrivalInfo arr){
		Long ts = arr.getTs();
		//起点
		if(scInfo.getFcsjActualTime() == null
				&& scInfo.getQdzCode().equals(arr.getStopNo())
				&& Math.abs(scInfo.getFcsjT() - ts) < diff){
			
			scInfo.setFcsjActualTime(ts);
			scInfo.setFcsjActual(sdf.format(ts));
			System.out.println("成功匹配一个起点...");
		}
		//终点
		if(scInfo.getZdsjActualTime() == null
				&& scInfo.getZdzCode().equals(arr.getStopNo())
				&& Math.abs(scInfo.getZdsjT() - ts) < diff){
			
			scInfo.setZdsjActualTime(ts);
			scInfo.setZdsjActual(sdf.format(ts));
			System.out.println("成功匹配一个终点...");
		}
	}
	
	/**
	 * @throws ParseException 
	 * 
	 * @Title: loadData 
	 * @Description: TODO(从数据库加载到离站信息) 
	 * @return List<ArrivalInfo>    返回类型 
	 * @throws
	 */
	private List<ArrivalInfo> loadData() throws ParseException{
		Calendar cal = Calendar.getInstance();
		//周数,表分区字段
		int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
		//按时间标记增量加载
		if(null == GpsArrivalDataBuffer.markTime){
			//第一次从当天0点开始
			GpsArrivalDataBuffer.markTime = DateUtils.getTimesmorning() * 1000L;
		}
		
		String sql = "select * from bsth_c_arrival_info where weeks_year=? and create_date > ?";
		
		List<ArrivalInfo> list = new ArrayList<>();
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = DBUtils_MS.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, weeks_year);
			ps.setLong(2, GpsArrivalDataBuffer.markTime);
			
			Long t = System.currentTimeMillis();
			rs = ps.executeQuery();
			
			while(rs.next()){
				list.add(new ArrivalInfo(rs.getString("device_id"), rs.getLong("ts"), rs.getString("line_id")
						, rs.getInt("up_down"), rs.getString("stop_no"), rs.getInt("in_out"), rs.getDate("create_date"), rs.getInt("weeks_year")));
			}
			
			//重新打时间标记
			GpsArrivalDataBuffer.markTime = t;
			
		} catch (Exception e) {
			logger.error("", e);
		}finally {
			DBUtils_MS.close(rs, ps, conn);
		}
		return list;
	}
}