SampleTimeDataLoader.java 3.79 KB
package com.bsth.data.forecast;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.bsth.data.forecast.entity.SimpleRoute;
import com.bsth.data.forecast.entity.SimpleRoute.TimeRange;
import com.bsth.entity.StationRoute;
import com.bsth.entity.forecast.Sample;
import com.bsth.repository.StationRouteRepository;
import com.bsth.repository.forecast.SampleRepository;
import com.google.common.collect.ArrayListMultimap;

/**
 * 
 * @Title: loadData
 * @Description: TODO(从数据库加载数据)
 */
@Component
public class SampleTimeDataLoader extends Thread {

	@Autowired
	SampleRepository sampleRepository;

	@Autowired
	StationRouteRepository stationRouteRepository;

	// 当天日期
	String rq;

	private static DateTimeFormatter fmtyyyyMMddHHmm = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm")
				,fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd");

	Logger logger = LoggerFactory.getLogger(this.getClass());

	@Override
	public void run() {
		rq = fmtyyyyMMdd.print(new Date().getTime());

		Iterator<Sample> iterator = sampleRepository.findAll().iterator();
		ArrayListMultimap<String, Sample> sampleMap = ArrayListMultimap.create();

		Sample sample;
		String key;
		while (iterator.hasNext()) {
			sample = iterator.next();
			key = sample.getLineCode() + "_" + sample.getUpdown() + "_" + sample.getsStation() + "_"
					+ sample.geteStation();
			sampleMap.put(key, sample);
		}

		// 加载全部路由信息
		List<StationRoute> allRoutes = stationRouteRepository.findAllEffective();
		// 线路和走向分组
		ArrayListMultimap<String, StationRoute> groupMap = ArrayListMultimap.create();
		for (StationRoute sr : allRoutes)
			groupMap.put(sr.getLineCode() + "_" + sr.getDirections(), sr);

		ArrayListMultimap<String, SimpleRoute> lineSampleMapCopy = ArrayListMultimap.create();
		// 排序路由链并附加各个时区耗时信息
		StationRouteComp comp = new StationRouteComp();
		Set<String> kys = groupMap.keySet();
		List<StationRoute> routeList;
		StationRoute sRoute;
		
		List<Sample> sapList;
		for (String k : kys) {
			routeList = groupMap.get(k);
			// 排序
			Collections.sort(routeList, comp);

			for (int i = 1; i < routeList.size(); i++) {
				sRoute = routeList.get(i);

				sapList = sampleMap.get(k + "_" +routeList.get(i - 1).getStationCode() + "_" + sRoute.getStationCode());
				
				lineSampleMapCopy.put(k, createSimpleRoute(sRoute, sapList));
			}
		}

		ForecastRealServer.lineSampleMap = lineSampleMapCopy;
		logger.info("SampleTimeDataLoader.... over...");
	}

	private SimpleRoute createSimpleRoute(StationRoute sRoute, List<Sample> list) {
		SimpleRoute simple = new SimpleRoute();

		simple.stationCode = sRoute.getStationCode();
		simple.ranges = new ArrayList<>();

		try{
			TimeRange tg;
			for (Sample s : list) {
				tg = new TimeRange();

				tg.startTime = fmtyyyyMMddHHmm.parseMillis(rq + s.getsDate());
				tg.endTime = fmtyyyyMMddHHmm.parseMillis(rq + s.geteDate());
				tg.runTime = s.getRunTime();
				simple.ranges.add(tg);
			}
			
			//排序
			Collections.sort(simple.ranges);
		}catch(Exception e){
			logger.error("", e);
		}
		return simple;
	}
	
	public static class StationRouteComp implements Comparator<StationRoute> {

		@Override
		public int compare(StationRoute o1, StationRoute o2) {
			return o1.getStationRouteCode() - o2.getStationRouteCode();
		}
	}
}