BasicData.java 12 KB
package com.bsth.data;

import com.bsth.Application;
import com.bsth.entity.*;
import com.bsth.entity.schedule.CarConfigInfo;
import com.bsth.repository.*;
import com.bsth.repository.schedule.CarConfigInfoRepository;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @author PanZhao
 * @ClassName: BasicData
 * @Description: TODO(基础的映射数据)
 * @date 2016年8月10日 下午3:27:45
 */
@Component
public class BasicData implements CommandLineRunner {

    //设备号和车辆自编号 (K: 设备编码 ,V:车辆自编号)
    public static BiMap<String, String> deviceId2NbbmMap;

    //车辆自编号和公司代码对照 (K: 车辆自编号 ,V:公司代码)
    public static Map<String, String> nbbm2CompanyCodeMap;

    //站点编码和名称对照,包括停车场 (K: 站点编码 ,V:站点名称)
    public static Map<String, String> stationCode2NameMap;

    //线路起终点对照(线路编码_上下行_起终点)  1024_0_B (1024上行起点)
    public static Map<String, String> lineSEPointMap;

    //车辆和线路对照
    public static Map<String, Line> nbbm2LineMap;

    //线路和用户对照 用于webSocket定向推送消息(用户进入线调时写入数据)
    //public static TreeMultimap<String, String> lineCode2SocketUserMap = TreeMultimap.create();

    //线路ID和code 对照
    public static BiMap<Integer, String> lineId2CodeMap;

    //线路编码和名称对照
    public static Map<String, String> lineCode2NameMap;

    //线路编码_站点编码 == 0|1  上下行
    public static Map<String, Integer> lineStationUpDownMap;

    //停车场
    public static List<String> parkCodeList;

    //线路ID和shangHaiLinecode 对照
    public static Map<Integer, String> lineId2ShangHaiCodeMap;

    //线路Code和shangHaiLinecode 对照
    public static Map<String, String> lineCode2ShangHaiCodeMap;

    //驾驶员工号 和 personnel 对象映射
    public static Map<String, Personnel> jsyMap;
    //售票员工号 和 personnel 对象映射
    public static Map<String, Personnel> spyMap;
    //全量员工 工号和姓名对照
    public static Map<String, String> allPerson;

    //站点名和运管处编号 对照
    public static Map<String, Map<String, Map>> stationName2YgcNumber;


    static Logger logger = LoggerFactory.getLogger(BasicData.class);

    @Autowired
    BasicDataLoader dataLoader;

    @Override
    public void run(String... arg0) throws Exception {
        Application.mainServices.scheduleWithFixedDelay(dataLoader, 0, 1, TimeUnit.HOURS);
    }


    @Component
    public static class BasicDataLoader extends Thread {

        @Autowired
        CarsRepository carsRepository;

        @Autowired
        StationRepository stationRepository;

        @Autowired
        CarParkRepository carParkRepository;

        @Autowired
        CarConfigInfoRepository carConfigInfoRepository;

        @Autowired
        LineRepository lineRepository;

        @Autowired
        StationRouteRepository stationRouteRepository;

        @Autowired
        PersonnelRepository personnelRepository;


        @Override
        public void run() {
            loadAllData();
        }

        /**
         * @Title: loadAllData
         * @Description: TODO(加载所有数据)
         */
        public int loadAllData() {
            try {
                //设备信息
                loadDeviceInfo();
                //站点信息
                loadStationInfo();
                //线路信息
                loadLineInfo();
                //车辆和线路映射信息
                loadNbbm2LineInfo();
                //站点路由信息
                loadStationRouteInfo();
                //人员信息
                loadPersonnelInfo();
                logger.info("加载基础数据成功!,");
            } catch (Exception e) {
                logger.error("加载基础数据时出现异常,", e);
            }
            return 0;
        }


        private void loadStationRouteInfo() {
            Iterator<StationRoute> iterator = stationRouteRepository.findAllEffective().iterator();

            Map<String, String> sePointMap = new HashMap<>();
            //lineSEPointMap
            Map<String, Integer> map = new HashMap<>();

            StationRoute route;
            while (iterator.hasNext()) {
                route = iterator.next();
                map.put(route.getLineCode() + "_" + route.getStationCode(), route.getDirections());

                if (route.getStationMark() != null &&
                        (route.getStationMark().equals("B") || route.getStationMark().equals("E"))) {
                    sePointMap.put(route.getLineCode() + "_"
                            + route.getDirections()
                            + "_" + route.getStationMark(), route.getStationCode());
                }
            }
            lineStationUpDownMap = map;
            lineSEPointMap = sePointMap;
        }

        /**
         * @Title: loadDeviceInfo
         * @Description: TODO(加载设备相关信息)
         */
        public void loadDeviceInfo() {
            BiMap<String, String> deviceId2Nbbm = HashBiMap.create();
            //车辆和公司代码对照
            Map<String, String> nbbm2CompanyCode = new HashMap<>();
            Iterator<Cars> carIterator = carsRepository.findAll().iterator();
            Cars car;
            while (carIterator.hasNext()) {
                car = carIterator.next();
                deviceId2Nbbm.put(car.getEquipmentCode(), car.getInsideCode());
                nbbm2CompanyCode.put(car.getInsideCode(), car.getBusinessCode());
            }

            deviceId2NbbmMap = deviceId2Nbbm;
            nbbm2CompanyCodeMap = nbbm2CompanyCode;
        }

        /**
         * @Title: loadStationInfo
         * @Description: TODO(加载站点信息)
         */
        public void loadStationInfo() {
            Map<String, String> stationCode2Name = new HashMap<>();
            Iterator<Station> iterator = stationRepository.findAll().iterator();
            //站点
            Station station;
            while (iterator.hasNext()) {
                station = iterator.next();
                stationCode2Name.put(station.getStationCod(), station.getStationName());
            }
            //停车场
            Iterator<CarPark> iterator2 = carParkRepository.findAll().iterator();

            List<String> parkCodes = new ArrayList<>();

            CarPark carPark;
            while (iterator2.hasNext()) {
                carPark = iterator2.next();
                stationCode2Name.put(carPark.getParkCode(), carPark.getParkName());

                parkCodes.add(carPark.getParkCode());
            }
            parkCodeList = parkCodes;
            stationCode2NameMap = stationCode2Name;
        }

        /**
         * @Title: loadNbbm2LineInfo
         * @Description: TODO(车辆和线路对照)
         */
        public void loadNbbm2LineInfo() {
            Iterator<CarConfigInfo> allIterator = carConfigInfoRepository.findAll().iterator();
            Map<String, Line> ccMap = new HashMap<>();

            CarConfigInfo cci;
            while (allIterator.hasNext()) {
                cci = allIterator.next();
                ccMap.put(cci.getCl().getInsideCode(), cci.getXl());
            }
            nbbm2LineMap = ccMap;
        }

        /**
         * @Title: loadLineInfo
         * @Description: TODO(加载线路相关信息)
         */
        public void loadLineInfo(){
            List<StationRoute> stationsList = null;// 站点路由集
            StationRoute stationRoute = null;
            int size = 0;
            Map<String, Integer> station2Number ;
            Map<String, Map> dirs2Statioin ;
            int[] dirs = {0,1};// 运行方向  上下行
            int num = 1;
            Iterator<Line> iterator = lineRepository.findAll().iterator();

            Line line;
            BiMap<Integer, String> biMap = HashBiMap.create();
            Map<String, String> code2name = new HashMap<>();
            Map<Integer, String> id2SHcode = new HashMap<Integer, String>();
            Map<String, String> code2SHcode = new HashMap<String, String>();
            Map<String, Map<String, Map>> tempStationName2YgcNumber = new HashMap<String, Map<String, Map>>();

            while(iterator.hasNext()){
                line = iterator.next();
                biMap.put(line.getId(), line.getLineCode());
                code2name.put(line.getLineCode(), line.getName());
                id2SHcode.put(line.getId(),line.getShanghaiLinecode());
                code2SHcode.put(line.getLineCode(), line.getShanghaiLinecode());

                /**
                 * 加载运管处的站点及序号
                 * 上行从1开始,下行顺序续编

                num = 1;
                dirs2Statioin = new HashMap<String, Map>();
                for (int i = 0; i < dirs.length; i++) {
                    // 分别取得上下行的站点
                    stationsList = stationRouteRepository.findByLine(line.getLineCode(), dirs[i]);
                    size = stationsList == null ? 0 :stationsList.size();
                    if(size > 0 ){
                        station2Number = new HashMap<String, Integer>();
                        for (int j = 0; j < size; j++) {
                            stationRoute = stationsList.get(j);
                            // map保存为(站点名称 -->序号)
                            station2Number.put(stationRoute.getStationName(), num++);
                        }
                        // 保存两个数据,(0 --> station2Number)(1 --> station2Number) 0上行 1 下行
                        dirs2Statioin.put(dirs[i]+"", station2Number);
                    }
                }
                // 保存(站点编码 --> dirs2Statioin)
                tempStationName2YgcNumber.put(line.getLineCode(), dirs2Statioin);
                 */
            }

            lineId2CodeMap = biMap;
            lineCode2NameMap = code2name;
            lineId2ShangHaiCodeMap = id2SHcode;
            lineCode2ShangHaiCodeMap = code2SHcode;
            stationName2YgcNumber = tempStationName2YgcNumber;
        }

        /**
         * @Title: loadPersonnelInfo
         * @Description: TODO(加载人员信息)
         */
        public void loadPersonnelInfo() {
            Iterator<Personnel> iterator = personnelRepository.findAll().iterator();

            Map<String, Personnel> jsyTempMap = new HashMap<>(), spyTempMap = new HashMap<>();
            Map<String, String> allPersonMap = new HashMap<>();

            Personnel p;
            String jobCode;
            while (iterator.hasNext()) {
                p = iterator.next();

                jobCode = p.getJobCode();
                if (StringUtils.isEmpty(jobCode))
                    continue;

                if (jobCode.indexOf("-") != -1) {
                    jobCode = jobCode.split("-")[1];
                }
                if (p.getPosts() != null) {
                    if (p.getPosts().equals("1"))
                        jsyTempMap.put(jobCode, p);
                    else if (p.getPosts().equals("2"))
                        spyTempMap.put(jobCode, p);
                }

                allPersonMap.put(jobCode, p.getPersonnelName());
            }

            jsyMap = jsyTempMap;
            spyMap = spyTempMap;
            allPerson = allPersonMap;
        }
    }
}