///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 根据区段获得属于区段内的所有车站信息 并排序 public void getAllStationInfoByDistrict(String districtName) { StationDistrictRelation tableName = new StationDistrictRelation(); // 设置要进行操作的数据库表名 String sqlStr = "select * from stationdistrictrelation where District_name = '" + districtName + "'"; // 获取区段内所有车站信息 List<StationDistrictRelation> list = databaseAccessHandler.sqlQuery(tableName, "StationDistrictRelation", sqlStr); List<StationDistrictRelation> sortedStationDistrictRelationList = new ArrayList<StationDistrictRelation>(); // 对区段内所有车站信息进行排序 : 首站->终点站 sortedStationDistrictRelationList = this.sortStations(list); baseParam.setSortedStationDistrictRelationList(sortedStationDistrictRelationList); if (sortedStationDistrictRelationList == null || sortedStationDistrictRelationList.size() == 0) return; int len = sortedStationDistrictRelationList.size(); List<String> stationNameList = new ArrayList<String>(); // 计算区段内站的总距离 和提取车站名 int sumStationDistance = 0; for (int i = 0; i < len; i++) { StationDistrictRelation sdr = sortedStationDistrictRelationList.get(i); sumStationDistance = sumStationDistance + sdr.getPredistance(); stationNameList.add(sdr.getStation_name()); // 提取车站名 } BaseParam.setSortedStationNameList(stationNameList); baseParam.setSumStationDistance(sumStationDistance); }
public boolean TDCSCommandForRun(String vrTime, String timeStep) { // 此方法对应于教师TDCS界面中选取命令的处理 TDCSCommandMessage sMsg = new TDCSCommandMessage(); // AbstractMessage类中定义的字段 通信类别 此数据报所表示的是客户端和服务器代码进行进一步处理的依据 sMsg.setCommandType(Constants.TYPE_CLIENT_EXPERIMENT_RUN); // 运行 // sMsg.setCommandType(Constants.TYPE_CLIENT_EXPERIMENT_CLOSE);关闭实验 // Constants.TYPE_TEACHER_TDCS_START);//启动 // 设置当前区段名称 sMsg.setDistrictName(baseParam.getCurrentDistrictName()); // 下面设置默认的工作模式 sMsg.setRunMode(Constants.RUN_MODE_AUTO); // 自律模式 sMsg.setSubjectName(Constants.EXPERIMENT_MODE_TDSI); // 综合实验 // 设置虚拟时间 if ((vrTime == null) || (vrTime.length() == 0)) timeStep = "00:00"; // 默认值 sMsg.setVrTime(vrTime); // 设置时间步长 if ((timeStep == null) || (timeStep.length() == 0)) timeStep = "2"; // 默认值 sMsg.setTimeStep(timeStep); // 向服务器发送开始实验消息 TDCSCommandMessage rMsg = databaseAccessHandler.TDCSRunCommandToServer(sMsg); if (rMsg == null) return false; else // 成功 { utilForCurrentTimeAxis.displayTimeOnToolBar( rMsg.getVrTime(), rMsg.getCurrentTime(), rMsg.getTimeStep()); return true; } }
//////////////////// 以上的代码是写数据到数据库中////////////////////////////// // ********************************************************************************************************// //////////////////// 以下的代码是从数据库中读取内容////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// // 获取所有区段信息 public void getAllDistrictInfo() { District tableName = new District(); String sqlStr = "select * from District"; List<District> list = databaseAccessHandler.sqlQuery(tableName, "District", sqlStr); baseParam.setAllDistrictName(list); // 测试代码 // getAllPlanTrainInfoByDistrict("北京-呼和浩特"); }
public void TDCSCommandForStop() { // 关闭实验 TDCSCommandMessage sMsg = new TDCSCommandMessage(); // AbstractMessage类中定义的字段 通信类别 此数据报所表示的是客户端和服务器代码进行进一步处理的依据 sMsg.setCommandType(Constants.TYPE_CLIENT_EXPERIMENT_CLOSE); // 关闭实验 // 设置当前区段名称 sMsg.setDistrictName(baseParam.getCurrentDistrictName()); databaseAccessHandler.TDCSCloseCommandToServer(sMsg); }
// 发送改动后的车次信息到服务器 public void TDCSCommandForTrain() { TeamTdcsRsbMessage sMsg = new TeamTdcsRsbMessage(); switch (BaseParam.getOperationType()) { case Constants.TDCS_TRAIN_TYPE_DELETE: // 删除车次 sMsg.setCommandType(Constants.TYPE_CLIENT_ZNTDCS_DELETE); break; case Constants.TDCS_TRAIN_TYPE_NEW: // 添加新车次 sMsg.setCommandType(Constants.TYPE_CLIENT_ZNTDCS_ADD); break; case Constants.TDCS_MENU_TOOL_RECTANGLE_ADJUST: // 调整车次的发车或到站时间 sMsg.setCommandType(Constants.TYPE_CLIENT_ZNTDCS_ADJUST); break; } sMsg.setTeamID(BaseParam.getTeamID()); // 组编号 // 车次信息 List<TDCSPlan> trainPlan = BaseParam.getTdcsTrainList(); sMsg.setTrainPlan(JsonUtil.list2json(trainPlan)); databaseAccessHandler.TDCSCommandForTrainToServer(sMsg); }
// 根据区段获得属于区段内的所有计划车次信息 public void getAllPlanTrainInfoByDistrict(String districtName) { // ORDER BY 记录将按照默认的升序进行排列(即:从1到9,从a到z)使用DESC 数据按照降序排列 Plan tableName = new Plan(); // 设置要进行操作的数据库表名 String sqlStr = "select * from plan where District_name = '" + districtName + "' ORDER BY Plan_arrivestationtime,Plan_leavestationtime"; // 从plan表中获取区段内所有车次信息 已经按照到站和离站时间排好序 List<Plan> planTrainList = databaseAccessHandler.sqlQuery(tableName, "Plan", sqlStr); ////////////////////////////////////////////////////////////////// // 从TrainDistrictRelation表中获取区段内所有车次信息,仅有车次信息 原来的 // List<TrainDistrictRelation> trainNameList = // getAllTrainDistrictRelationByDistrict(districtName); // 从Train表中获取区段内所有车次信息 List<Train> trainNameList = getAllTrainsByDistrict(districtName); if (trainNameList == null || trainNameList.size() == 0) return; // 对trainNameList进行加工,方便getTrainDirectionByTrainName方法的执行,提高效率 Iterator<Train> it = trainNameList.iterator(); while (it.hasNext()) { Train data = (Train) it.next(); trainNameDirectionMap.put(data.getTrain_name(), data.getTrain_direction()); } baseParam.setTrainNameDirectionMap(trainNameDirectionMap); // 对每一个车站,获取经过的所有车次信息,并自动排序 sortPlanTrainForStation(planTrainList); // 转换格式 int len = trainNameList.size(); // 每次执行,仅对一个车次的信息的进行操作 for (int i = 0; i < len; i++) { String trainName = trainNameList.get(i).getTrain_name(); // 依据车次trainName按照车站的先后顺序对本车次进行排序 首站->终点站 List<Plan> sortPlanTrainList = sortPlanTrainList(planTrainList, trainName); // 依据车次trainName,对排好序的车次详细信息进行加工,使之用于屏幕绘图 setTrainPlanFromatList(sortPlanTrainList, trainName); } // 将车次信息添加到tdcsDataset的TrainList中 for (int i = 0; i < len; i++) { String trainName = trainNameList.get(i).getTrain_name(); trainNameExist(trainName); // 判断trainName是否已经存在 } }
// 判断trainName是否存在 private void trainNameExist(String trainName) { boolean existFlag = false; List<String> trainNameList = baseParam.getTrainNameList(); if (trainNameList == null || trainNameList.size() == 0) existFlag = false; else { for (int i = 0; i < trainNameList.size(); i++) { if (trainNameList.get(i).equalsIgnoreCase(trainName)) { // 如果存在 existFlag = true; break; } } } // 如果不存在 if (!existFlag) { // 车次名称 baseParam.appendTrainNameList(trainName); // 车次本身信息 LineFigure trainList = new LineFigure(); trainList.setTrainName(trainName); // 设置车次信息List的trainName trainList.setTrainDirection(getTrainDirectionByTrainName(trainName)); // 设置车次的方向 baseParam.appendTrainList(trainList); } }
// 将排序后的sortPlanTrainList中的plan数据转化为可以直接画图的TrainDrawFromat格式数据 // 执行一次,只能实现对某一车次的运营计划的数据进行格式化 private void setTrainPlanFromatList(List<Plan> list, String trainName) { if ((list == null) || (list.size() == 0) || (trainName.length() == 0)) { return; } Plan plan = new Plan(); Plan planStation = new Plan(); Plan planNextStation = new Plan(); FromatedTrain trainDrawFromat = new FromatedTrain(); int len = list.size(); for (int i = 0; i < len; i++) { // for2 plan = list.get(i); if (plan.getTrain_name().equalsIgnoreCase(trainName)) { // if语句1 planStation = plan; // System.out.println("转换格式函数:i = " + i); for (int j = i + 1; j < len; j++) { // for 1 plan = list.get(j); if (plan.getTrain_name().equalsIgnoreCase(trainName)) { planNextStation = plan; trainDrawFromat = new FromatedTrain(); trainDrawFromat.setTrainName(trainName); // 设置车次 trainDrawFromat.setStationName(planStation.getStation_name()); // 设置本站名称 trainDrawFromat.setNextStationName(planNextStation.getStation_name()); // 设置下一站名称 // 设置本站出发时间 时:分:秒 转换为分 String leaveTimeStr = planStation.getPlan_leavestationtime(); trainDrawFromat.setStationTimeX(UtilForTime2X.timeToX(leaveTimeStr)); // 设置下站到站时间 String arriveTimeStr = planNextStation.getPlan_arrivestationtime(); trainDrawFromat.setNextStationTimeX(UtilForTime2X.timeToX(arriveTimeStr)); // System.out.println("车次:" + trainDrawFromat.getTrainName() + " 发站:" + leaveTimeStr + // " 到站:" + arriveTimeStr ); baseParam.appendTrainPlanFromatList(trainDrawFromat); planStation = planNextStation; } } // for1 break; // 退出循环 } // if 语句1 } // for2 }
// 对每一个车站,获取经过的所有车次信息,并按到站/离站时间升序排列 // 从数据库读的车次信息 已经按照到站和离站时间排好序 private void sortPlanTrainForStation(List<Plan> planList) { // 临时保存车站名和经过该车站的所有车次信息(添加过程中,系统按找车次的到达时间自动排序) Map<String, TreeSet<SortedTrain>> stationTrainDownMap = new HashMap<String, TreeSet<SortedTrain>>(); // 保存下行 Map<String, TreeSet<SortedTrain>> stationTrainUpMap = new HashMap<String, TreeSet<SortedTrain>>(); // 保存上行 // 获取已经排好序的车站列表 List<String> sortedStationNameList = new ArrayList<String>(); sortedStationNameList = BaseParam.getSortedStationNameList(); if ((planList == null) || (sortedStationNameList == null) || (planList.size() == 0) || (sortedStationNameList.size() == 0)) return; Plan plan = new Plan(); int planLength = planList.size(); int stationLength = sortedStationNameList.size(); String firstStation = sortedStationNameList.get(0); String lastStation = sortedStationNameList.get(stationLength - 1); for (int i = 0; i < stationLength; i++) { // 对所有车站 TreeSet<SortedTrain> treeSetDown = new TreeSet<SortedTrain>(); TreeSet<SortedTrain> treeSetUp = new TreeSet<SortedTrain>(); String sortedStationName = sortedStationNameList.get(i); // int timeType = Constants.TDCS_TIME_TYPE_ARRIVEAL; String trainName = ""; for (int j = 0; j < planLength; j++) { // 某一车站的所有车次 plan = planList.get(j); if (sortedStationName.equalsIgnoreCase(plan.getStation_name())) { trainName = plan.getTrain_name(); /*数据库中时间格式(字符串):00:00:00 //plan.getPlan_arrivestationtime() 转换后时间格式(整数):000,单位 分钟 //TimeX_x.timeToX */ int arriveTime = UtilForTime2X.timeToX(plan.getPlan_arrivestationtime()); int leaveTime = UtilForTime2X.timeToX(plan.getPlan_leavestationtime()); int trainDirection = getTrainDirectionByTrainName(trainName); int typeFlag = Constants.TDCS_TRAIN_TYPE_NO; SortedTrain sortedPlan = null; if (trainDirection == 1) // 车次方向 下行1 { if (!firstStation.equalsIgnoreCase(plan.getStation_name())) { // 首站 不处理 sortedPlan = new SortedTrain( typeFlag, trainName, trainDirection, Constants.TDCS_TIME_TYPE_ARRIVEAL, arriveTime); // time是到站时间 treeSetDown.add(sortedPlan); } if (!lastStation.equalsIgnoreCase(plan.getStation_name())) { // 终点站 不处理 sortedPlan = new SortedTrain( typeFlag, trainName, trainDirection, Constants.TDCS_TIME_TYPE_LEAVE, leaveTime); // time是离站时间 treeSetDown.add(sortedPlan); } } else if (trainDirection == 0) // 车次方向(上行0) { if (!lastStation.equalsIgnoreCase(plan.getStation_name())) { // 首站 不处理 sortedPlan = new SortedTrain( typeFlag, trainName, trainDirection, Constants.TDCS_TIME_TYPE_ARRIVEAL, arriveTime); // time是到站时间 treeSetUp.add(sortedPlan); } if (!firstStation.equalsIgnoreCase(plan.getStation_name())) { // 终点站 不处理 sortedPlan = new SortedTrain( typeFlag, trainName, trainDirection, Constants.TDCS_TIME_TYPE_LEAVE, leaveTime); // time是离站时间 treeSetUp.add(sortedPlan); } } } if (!treeSetDown.isEmpty()) { stationTrainDownMap.put(sortedStationName, treeSetDown); } if (!treeSetUp.isEmpty()) { stationTrainUpMap.put(sortedStationName, treeSetUp); } } // 某一车站的所有车次 for } // 对所有车站 UtilForMouseAction.setStationTrainDownMap(stationTrainDownMap); UtilForMouseAction.setStationTrainUpMap(stationTrainUpMap); }
public class DatabaseServer { private static DatabaseServer thisData = null; public static DatabaseServer getInstance() { if (thisData == null) { thisData = new DatabaseServer(); } return thisData; } public DatabaseServer() {} /////////////////////////////////////////////////////////////////////////////////////// private static BaseParam baseParam = BaseParam.getInstance(); private UtilForCurrentTimeAxis utilForCurrentTimeAxis = new UtilForCurrentTimeAxis().getInstance(); private DatabaseAccessHandler databaseAccessHandler = new DatabaseAccessHandler().getInstance(); // ********************************************************************************************************// ////////////////// 以下代码是供发有关命令到服务器使用////////////////////////////// // 从服务器获取组的名称或组内成员名称 public String[] getTeamORMemberNameFromServer(int flag, String teamID) { TDCSCommandMessage sMsg = new TDCSCommandMessage(); sMsg.setDistrictName(teamID); sMsg.setCommandType(flag); return databaseAccessHandler.getTeamORMemberNameFromServer(sMsg); } // 向服务器发送故障或调度命令 public boolean sendScheduleORErrorCommandToServer( int CommandType, int teamID, String name, String content) { // hu 2010-11-2 修改 // ScheduleErrorMessage sMsg = new ScheduleErrorMessage(); CommonMessage cMsg = new CommonMessage(); cMsg.setTeamID(teamID); if (name.equalsIgnoreCase("TDCS")) { cMsg.setCommandType(Constants.TYPE_DDZR_TO_ZNTDCS_ASYN); } else if (name.equalsIgnoreCase("CTC")) { cMsg.setCommandType(Constants.TYPE_DDZR_TO_ZNCTC_ASYN); } else if (name.equalsIgnoreCase("电务维修机")) { // 电务 cMsg.setCommandType(Constants.TYPE_DDZR_TO_DW_ASYN); } else { cMsg.setCommandType(Constants.TYPE_DDZR_TO_SICS_ASYN); cMsg.setStationName(name); } ScheduleErrorMessage sMsg = new ScheduleErrorMessage(); sMsg.setContent(content); sMsg.setTeamID(teamID); cMsg.setMeseageName("ScheduleErrorMessage"); cMsg.setMessage(JsonUtil.bean2json(sMsg)); databaseAccessHandler.sendCommonMessageToServer(cMsg); return true; } public boolean TDCSCommandForRun(String vrTime, String timeStep) { // 此方法对应于教师TDCS界面中选取命令的处理 TDCSCommandMessage sMsg = new TDCSCommandMessage(); // AbstractMessage类中定义的字段 通信类别 此数据报所表示的是客户端和服务器代码进行进一步处理的依据 sMsg.setCommandType(Constants.TYPE_CLIENT_EXPERIMENT_RUN); // 运行 // sMsg.setCommandType(Constants.TYPE_CLIENT_EXPERIMENT_CLOSE);关闭实验 // Constants.TYPE_TEACHER_TDCS_START);//启动 // 设置当前区段名称 sMsg.setDistrictName(baseParam.getCurrentDistrictName()); // 下面设置默认的工作模式 sMsg.setRunMode(Constants.RUN_MODE_AUTO); // 自律模式 sMsg.setSubjectName(Constants.EXPERIMENT_MODE_TDSI); // 综合实验 // 设置虚拟时间 if ((vrTime == null) || (vrTime.length() == 0)) timeStep = "00:00"; // 默认值 sMsg.setVrTime(vrTime); // 设置时间步长 if ((timeStep == null) || (timeStep.length() == 0)) timeStep = "2"; // 默认值 sMsg.setTimeStep(timeStep); // 向服务器发送开始实验消息 TDCSCommandMessage rMsg = databaseAccessHandler.TDCSRunCommandToServer(sMsg); if (rMsg == null) return false; else // 成功 { utilForCurrentTimeAxis.displayTimeOnToolBar( rMsg.getVrTime(), rMsg.getCurrentTime(), rMsg.getTimeStep()); return true; } } // 发送改动后的车次信息到服务器 public void TDCSCommandForTrain() { TeamTdcsRsbMessage sMsg = new TeamTdcsRsbMessage(); switch (BaseParam.getOperationType()) { case Constants.TDCS_TRAIN_TYPE_DELETE: // 删除车次 sMsg.setCommandType(Constants.TYPE_CLIENT_ZNTDCS_DELETE); break; case Constants.TDCS_TRAIN_TYPE_NEW: // 添加新车次 sMsg.setCommandType(Constants.TYPE_CLIENT_ZNTDCS_ADD); break; case Constants.TDCS_MENU_TOOL_RECTANGLE_ADJUST: // 调整车次的发车或到站时间 sMsg.setCommandType(Constants.TYPE_CLIENT_ZNTDCS_ADJUST); break; } sMsg.setTeamID(BaseParam.getTeamID()); // 组编号 // 车次信息 List<TDCSPlan> trainPlan = BaseParam.getTdcsTrainList(); sMsg.setTrainPlan(JsonUtil.list2json(trainPlan)); databaseAccessHandler.TDCSCommandForTrainToServer(sMsg); } public void TDCSCommandForStop() { // 关闭实验 TDCSCommandMessage sMsg = new TDCSCommandMessage(); // AbstractMessage类中定义的字段 通信类别 此数据报所表示的是客户端和服务器代码进行进一步处理的依据 sMsg.setCommandType(Constants.TYPE_CLIENT_EXPERIMENT_CLOSE); // 关闭实验 // 设置当前区段名称 sMsg.setDistrictName(baseParam.getCurrentDistrictName()); databaseAccessHandler.TDCSCloseCommandToServer(sMsg); } ////////////////// 以上代码是供发有关命令到服务器使用////////////////////////////// // ********************************************************************************************************// ////////////////// 以下代码是写数据到数据库中////////////////////////////// /* 本方法是针对教师的,如果对学生,只需将plan表更改为dispatch表,当然需要增加一些字段 */ public boolean batchUpdateFromTDCSForTeacher( Map<String, PlanForStatics> insertTrainDistrictMap, Map<String, PlanForStatics> deleteTrainDistrictMap, Map<TrainStation, PlanForStatics> insertPlanMap, // plan表插入 Map<TrainStationTime, TrainPlan> updatePlanMap, // plan表更新 String firstStation, String lastStation) { int insertLen = insertTrainDistrictMap.size(); int deleteLen = deleteTrainDistrictMap.size(); int insertPlanLen = insertPlanMap.size(); int updatePlanLen = updatePlanMap.size(); String[] sqlArray = new String[(deleteLen * 3) + (insertLen * 2) + insertPlanLen + updatePlanLen]; int rowNumber = 0; String zeroTimeStr = "00:00:00"; // 组装插入记录 if (insertLen != 0) { // 存在元素 for (String key : insertTrainDistrictMap.keySet()) { PlanForStatics info = insertTrainDistrictMap.get(key); /*表TrainDistrictRelation 关键字: Train_name 车次名称, District_name 区段名称 */ String inertStr = "insert into TrainDistrictRelation(District_name,Train_name) Values('" + info.getDistrictName() + "','" + key + "');"; sqlArray[rowNumber++] = inertStr; /*Train表 关键字:Train_name Train_name 车次名称,Train_direction 车次方向(上行0和下行1)Train_maxspeed 车最大速度' Train_startstationname始发站名称',Train_endstationname 到达站名称'*/ inertStr = "insert into Train(Train_name,Train_direction,Train_startstationname,Train_endstationname) Values('" + key + "'," + info.getTrainDirection() + ",'" + firstStation + "','" + lastStation + "');"; sqlArray[rowNumber++] = inertStr; // System.out.println(inertStr); } } // 对于plan需要单独处理,因为plan表所保存的内容是以车站和车次为关键字,即同一个车次在不同车站的状态都要保存 if (insertPlanLen != 0) { // 存在元素 for (TrainStation key : insertPlanMap.keySet()) { /*Plan表 关键字:Train_name Station_name Train_name 车次名称, District_name 区段名称' Prestation_name'前站站名',Station_name 本站站名', Plan_arrivestationtime 到站时间', Plan_leavestationtime 离站时间',*/ String trainName = key.getTrainName(); PlanForStatics info = insertPlanMap.get(key); String arriveTime = info.getArriveTime(); String leaveTime = info.getLeaveTime(); if (leaveTime == null) leaveTime = zeroTimeStr; if (arriveTime == null) arriveTime = zeroTimeStr; String inertStr = "insert into Plan(District_name,Train_name,Prestation_name,Station_name,Plan_arrivestationtime,Plan_leavestationtime) Values('" + info.getDistrictName() + "','" + trainName + "','" + info.getPrestationName() + "','" + info.getStationName() + "','" + arriveTime + "','" + leaveTime + "')"; sqlArray[rowNumber++] = inertStr; // System.out.println(inertStr); } } // 对于plan需要单独处理,因为plan表所保存的内容是以车站和车次为关键字,即同一个车次在不同车站的状态都要保存 if (updatePlanLen != 0) { // 存在元素 for (TrainStationTime key : updatePlanMap.keySet()) { int timeType = key.getTypeTime(); TrainPlan value = updatePlanMap.get(key); String fixStr = "' where Train_name='" + key.getTrainName() + "' and Station_name='" + key.getStationName() + "';"; String updateStr = ""; if (timeType == Constants.TDCS_TIME_TYPE_ARRIVEAL) // 到站时间 { updateStr = "update Plan set Plan_arrivestationtime='" + value.getTime() + fixStr; } else if (timeType == Constants.TDCS_TIME_TYPE_LEAVE) // 离站时间 { updateStr = "update Plan set Plan_leavestationtime='" + value.getTime() + fixStr; } sqlArray[rowNumber++] = updateStr; // System.out.println(updateStr); } } // 组装删除记录 if (deleteLen != 0) { // 存在元素 for (String key : deleteTrainDistrictMap.keySet()) { PlanForStatics info = deleteTrainDistrictMap.get(key); // TrainDistrictRelation表 String deleteStr = "delete from TrainDistrictRelation where District_name='" + info.getDistrictName() + "' and Train_name='" + key + "';"; sqlArray[rowNumber++] = deleteStr; // Train表 deleteStr = "delete from Train where Train_name='" + key + "';"; sqlArray[rowNumber++] = deleteStr; // Plan表 deleteStr = "delete from Plan where Train_name='" + key + "';"; sqlArray[rowNumber++] = deleteStr; // System.out.println(deleteStr); } } // NODEFINE 表示无须指定表名,实际上此字段可以去掉。 boolean result = databaseAccessHandler.updateQuery("NODEFINE", sqlArray); // System.out.println("result::"+result); return result; } //////////////////// 以上的代码是写数据到数据库中////////////////////////////// // ********************************************************************************************************// //////////////////// 以下的代码是从数据库中读取内容////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// // 获取所有区段信息 public void getAllDistrictInfo() { District tableName = new District(); String sqlStr = "select * from District"; List<District> list = databaseAccessHandler.sqlQuery(tableName, "District", sqlStr); baseParam.setAllDistrictName(list); // 测试代码 // getAllPlanTrainInfoByDistrict("北京-呼和浩特"); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 根据区段获得属于区段内的所有车站信息 并排序 public void getAllStationInfoByDistrict(String districtName) { StationDistrictRelation tableName = new StationDistrictRelation(); // 设置要进行操作的数据库表名 String sqlStr = "select * from stationdistrictrelation where District_name = '" + districtName + "'"; // 获取区段内所有车站信息 List<StationDistrictRelation> list = databaseAccessHandler.sqlQuery(tableName, "StationDistrictRelation", sqlStr); List<StationDistrictRelation> sortedStationDistrictRelationList = new ArrayList<StationDistrictRelation>(); // 对区段内所有车站信息进行排序 : 首站->终点站 sortedStationDistrictRelationList = this.sortStations(list); baseParam.setSortedStationDistrictRelationList(sortedStationDistrictRelationList); if (sortedStationDistrictRelationList == null || sortedStationDistrictRelationList.size() == 0) return; int len = sortedStationDistrictRelationList.size(); List<String> stationNameList = new ArrayList<String>(); // 计算区段内站的总距离 和提取车站名 int sumStationDistance = 0; for (int i = 0; i < len; i++) { StationDistrictRelation sdr = sortedStationDistrictRelationList.get(i); sumStationDistance = sumStationDistance + sdr.getPredistance(); stationNameList.add(sdr.getStation_name()); // 提取车站名 } BaseParam.setSortedStationNameList(stationNameList); baseParam.setSumStationDistance(sumStationDistance); } // 对list序列进行排序 首站->终点站 private List<StationDistrictRelation> sortStations(List<StationDistrictRelation> list) { List<StationDistrictRelation> sortedList = new ArrayList<StationDistrictRelation>(); if ((list == null) || (list.size() == 0)) { return null; } StationDistrictRelation sdr = new StationDistrictRelation(); int listLength = list.size(); String preStationName = ""; // 查找区段内首站,即第一个车站 for (int i = 0; i < listLength; i++) { sdr = list.get(i); String stationName = sdr.getStation_name(); if (stationName.equalsIgnoreCase(sdr.getPrestation_name())) { preStationName = stationName; sortedList.add(sdr); break; } } // 没有找到首站 if (preStationName.length() == 0) { return null; } // 依据首站 依次查找区段内其他站 for (int i = 0; i < listLength; i++) { sdr = list.get(i); if (sdr.getStation_name().equalsIgnoreCase(sdr.getPrestation_name())) { // 首站 continue; } for (int j = 0; j < listLength; j++) { sdr = list.get(j); String stationName = sdr.getStation_name(); if (stationName.equalsIgnoreCase(sdr.getPrestation_name())) { // 首站 continue; } else // 非首站 if (preStationName.equalsIgnoreCase(sdr.getPrestation_name())) { preStationName = stationName; sortedList.add(sdr); } } } return sortedList; } /////////////////////////////////////////////////////////////////////////////////////////////////////////// // 根据区段 从TrainDistrictRelation表获得属于区段内的所有计划车次信息 仅含车次信息 目前不用 private List<TrainDistrictRelation> getAllTrainDistrictRelationByDistrict(String districtName) { TrainDistrictRelation tableName = new TrainDistrictRelation(); // 设置要进行操作的数据库表名 String sqlStr = "select * from Traindistrictrelation where District_name = '" + districtName + "'"; List<TrainDistrictRelation> trainNameList = databaseAccessHandler.sqlQuery(tableName, "TrainDistrictRelation", sqlStr); return trainNameList; } private List<Train> getAllTrainsByDistrict(String districtName) { Train tableName = new Train(); // 设置要进行操作的数据库表名 String sqlStr = "select * from Train where Train.Train_name in " + "(select Train_name from Traindistrictrelation where District_name='" + districtName + "')"; List<Train> trainList = databaseAccessHandler.sqlQuery(tableName, "Train", sqlStr); return trainList; } // 返回车次的方向(上行0,下行1) private int getTrainDirectionByTrainName(String trainName) { if ((trainNameDirectionMap == null) || (trainNameDirectionMap.size() == 0) || (!trainNameDirectionMap.containsKey(trainName))) return -1; else { return trainNameDirectionMap.get(trainName); } } private Map<String, Integer> trainNameDirectionMap = new HashMap<String, Integer>(); // 根据区段获得属于区段内的所有计划车次信息 public void getAllPlanTrainInfoByDistrict(String districtName) { // ORDER BY 记录将按照默认的升序进行排列(即:从1到9,从a到z)使用DESC 数据按照降序排列 Plan tableName = new Plan(); // 设置要进行操作的数据库表名 String sqlStr = "select * from plan where District_name = '" + districtName + "' ORDER BY Plan_arrivestationtime,Plan_leavestationtime"; // 从plan表中获取区段内所有车次信息 已经按照到站和离站时间排好序 List<Plan> planTrainList = databaseAccessHandler.sqlQuery(tableName, "Plan", sqlStr); ////////////////////////////////////////////////////////////////// // 从TrainDistrictRelation表中获取区段内所有车次信息,仅有车次信息 原来的 // List<TrainDistrictRelation> trainNameList = // getAllTrainDistrictRelationByDistrict(districtName); // 从Train表中获取区段内所有车次信息 List<Train> trainNameList = getAllTrainsByDistrict(districtName); if (trainNameList == null || trainNameList.size() == 0) return; // 对trainNameList进行加工,方便getTrainDirectionByTrainName方法的执行,提高效率 Iterator<Train> it = trainNameList.iterator(); while (it.hasNext()) { Train data = (Train) it.next(); trainNameDirectionMap.put(data.getTrain_name(), data.getTrain_direction()); } baseParam.setTrainNameDirectionMap(trainNameDirectionMap); // 对每一个车站,获取经过的所有车次信息,并自动排序 sortPlanTrainForStation(planTrainList); // 转换格式 int len = trainNameList.size(); // 每次执行,仅对一个车次的信息的进行操作 for (int i = 0; i < len; i++) { String trainName = trainNameList.get(i).getTrain_name(); // 依据车次trainName按照车站的先后顺序对本车次进行排序 首站->终点站 List<Plan> sortPlanTrainList = sortPlanTrainList(planTrainList, trainName); // 依据车次trainName,对排好序的车次详细信息进行加工,使之用于屏幕绘图 setTrainPlanFromatList(sortPlanTrainList, trainName); } // 将车次信息添加到tdcsDataset的TrainList中 for (int i = 0; i < len; i++) { String trainName = trainNameList.get(i).getTrain_name(); trainNameExist(trainName); // 判断trainName是否已经存在 } } // 对每一个车站,获取经过的所有车次信息,并按到站/离站时间升序排列 // 从数据库读的车次信息 已经按照到站和离站时间排好序 private void sortPlanTrainForStation(List<Plan> planList) { // 临时保存车站名和经过该车站的所有车次信息(添加过程中,系统按找车次的到达时间自动排序) Map<String, TreeSet<SortedTrain>> stationTrainDownMap = new HashMap<String, TreeSet<SortedTrain>>(); // 保存下行 Map<String, TreeSet<SortedTrain>> stationTrainUpMap = new HashMap<String, TreeSet<SortedTrain>>(); // 保存上行 // 获取已经排好序的车站列表 List<String> sortedStationNameList = new ArrayList<String>(); sortedStationNameList = BaseParam.getSortedStationNameList(); if ((planList == null) || (sortedStationNameList == null) || (planList.size() == 0) || (sortedStationNameList.size() == 0)) return; Plan plan = new Plan(); int planLength = planList.size(); int stationLength = sortedStationNameList.size(); String firstStation = sortedStationNameList.get(0); String lastStation = sortedStationNameList.get(stationLength - 1); for (int i = 0; i < stationLength; i++) { // 对所有车站 TreeSet<SortedTrain> treeSetDown = new TreeSet<SortedTrain>(); TreeSet<SortedTrain> treeSetUp = new TreeSet<SortedTrain>(); String sortedStationName = sortedStationNameList.get(i); // int timeType = Constants.TDCS_TIME_TYPE_ARRIVEAL; String trainName = ""; for (int j = 0; j < planLength; j++) { // 某一车站的所有车次 plan = planList.get(j); if (sortedStationName.equalsIgnoreCase(plan.getStation_name())) { trainName = plan.getTrain_name(); /*数据库中时间格式(字符串):00:00:00 //plan.getPlan_arrivestationtime() 转换后时间格式(整数):000,单位 分钟 //TimeX_x.timeToX */ int arriveTime = UtilForTime2X.timeToX(plan.getPlan_arrivestationtime()); int leaveTime = UtilForTime2X.timeToX(plan.getPlan_leavestationtime()); int trainDirection = getTrainDirectionByTrainName(trainName); int typeFlag = Constants.TDCS_TRAIN_TYPE_NO; SortedTrain sortedPlan = null; if (trainDirection == 1) // 车次方向 下行1 { if (!firstStation.equalsIgnoreCase(plan.getStation_name())) { // 首站 不处理 sortedPlan = new SortedTrain( typeFlag, trainName, trainDirection, Constants.TDCS_TIME_TYPE_ARRIVEAL, arriveTime); // time是到站时间 treeSetDown.add(sortedPlan); } if (!lastStation.equalsIgnoreCase(plan.getStation_name())) { // 终点站 不处理 sortedPlan = new SortedTrain( typeFlag, trainName, trainDirection, Constants.TDCS_TIME_TYPE_LEAVE, leaveTime); // time是离站时间 treeSetDown.add(sortedPlan); } } else if (trainDirection == 0) // 车次方向(上行0) { if (!lastStation.equalsIgnoreCase(plan.getStation_name())) { // 首站 不处理 sortedPlan = new SortedTrain( typeFlag, trainName, trainDirection, Constants.TDCS_TIME_TYPE_ARRIVEAL, arriveTime); // time是到站时间 treeSetUp.add(sortedPlan); } if (!firstStation.equalsIgnoreCase(plan.getStation_name())) { // 终点站 不处理 sortedPlan = new SortedTrain( typeFlag, trainName, trainDirection, Constants.TDCS_TIME_TYPE_LEAVE, leaveTime); // time是离站时间 treeSetUp.add(sortedPlan); } } } if (!treeSetDown.isEmpty()) { stationTrainDownMap.put(sortedStationName, treeSetDown); } if (!treeSetUp.isEmpty()) { stationTrainUpMap.put(sortedStationName, treeSetUp); } } // 某一车站的所有车次 for } // 对所有车站 UtilForMouseAction.setStationTrainDownMap(stationTrainDownMap); UtilForMouseAction.setStationTrainUpMap(stationTrainUpMap); } // 判断trainName是否存在 private void trainNameExist(String trainName) { boolean existFlag = false; List<String> trainNameList = baseParam.getTrainNameList(); if (trainNameList == null || trainNameList.size() == 0) existFlag = false; else { for (int i = 0; i < trainNameList.size(); i++) { if (trainNameList.get(i).equalsIgnoreCase(trainName)) { // 如果存在 existFlag = true; break; } } } // 如果不存在 if (!existFlag) { // 车次名称 baseParam.appendTrainNameList(trainName); // 车次本身信息 LineFigure trainList = new LineFigure(); trainList.setTrainName(trainName); // 设置车次信息List的trainName trainList.setTrainDirection(getTrainDirectionByTrainName(trainName)); // 设置车次的方向 baseParam.appendTrainList(trainList); } } // 将排序后的sortPlanTrainList中的plan数据转化为可以直接画图的TrainDrawFromat格式数据 // 执行一次,只能实现对某一车次的运营计划的数据进行格式化 private void setTrainPlanFromatList(List<Plan> list, String trainName) { if ((list == null) || (list.size() == 0) || (trainName.length() == 0)) { return; } Plan plan = new Plan(); Plan planStation = new Plan(); Plan planNextStation = new Plan(); FromatedTrain trainDrawFromat = new FromatedTrain(); int len = list.size(); for (int i = 0; i < len; i++) { // for2 plan = list.get(i); if (plan.getTrain_name().equalsIgnoreCase(trainName)) { // if语句1 planStation = plan; // System.out.println("转换格式函数:i = " + i); for (int j = i + 1; j < len; j++) { // for 1 plan = list.get(j); if (plan.getTrain_name().equalsIgnoreCase(trainName)) { planNextStation = plan; trainDrawFromat = new FromatedTrain(); trainDrawFromat.setTrainName(trainName); // 设置车次 trainDrawFromat.setStationName(planStation.getStation_name()); // 设置本站名称 trainDrawFromat.setNextStationName(planNextStation.getStation_name()); // 设置下一站名称 // 设置本站出发时间 时:分:秒 转换为分 String leaveTimeStr = planStation.getPlan_leavestationtime(); trainDrawFromat.setStationTimeX(UtilForTime2X.timeToX(leaveTimeStr)); // 设置下站到站时间 String arriveTimeStr = planNextStation.getPlan_arrivestationtime(); trainDrawFromat.setNextStationTimeX(UtilForTime2X.timeToX(arriveTimeStr)); // System.out.println("车次:" + trainDrawFromat.getTrainName() + " 发站:" + leaveTimeStr + // " 到站:" + arriveTimeStr ); baseParam.appendTrainPlanFromatList(trainDrawFromat); planStation = planNextStation; } } // for1 break; // 退出循环 } // if 语句1 } // for2 } private List<Plan> sortPlanTrainList(List<Plan> list, String trainName) { List<Plan> sortedList = new ArrayList<Plan>(); UtilForStatics utilForStatics = new UtilForStatics(); if ((list == null) || (list.size() == 0) || (trainName.length() == 0)) { return null; } Plan plan = new Plan(); int listLength = list.size(); // 获取指定区段内所有车次的数量 String preStationName = ""; // 查找区段内首站,即第一个车站 for (int i = 0; i < listLength; i++) { plan = list.get(i); if ((plan.getTrain_name().equalsIgnoreCase(trainName)) && (plan.getStation_name().equalsIgnoreCase(plan.getPrestation_name()))) { preStationName = plan.getStation_name(); // System.out.println("首站:"+preStationName); sortedList.add(plan); // 保存数据到ScheduleDataset类的scheduleTrainMap中,用于记录学员调整运行计划 utilForStatics.putScheduleTrainMap(plan); break; } } // 没有找到首站 if (preStationName.length() == 0) { return null; } // 依据首站 依次查找区段内其他站 for (int i = 0; i < listLength; i++) { plan = list.get(i); if (plan.getStation_name().equalsIgnoreCase(plan.getPrestation_name())) { // 首站 continue; } for (int j = 0; j < listLength; j++) { plan = list.get(j); String stationName = plan.getStation_name(); if ((plan.getTrain_name().equalsIgnoreCase(trainName)) && (plan.getStation_name().equalsIgnoreCase(plan.getPrestation_name()))) { // 首站 continue; } else // 非首站 if ((plan.getTrain_name().equalsIgnoreCase(trainName)) && preStationName.equalsIgnoreCase(plan.getPrestation_name())) { // System.out.println("其他站:"+stationName); preStationName = stationName; sortedList.add(plan); // 保存数据到UtilForStatics_x类的scheduleTrainMap中,用于记录学员调整运行计划 utilForStatics.putScheduleTrainMap(plan); } } } return sortedList; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static void main(String args[]) { /*String time = "01:15:00"; DateFormat sdf = new SimpleDateFormat("hh:mm:ss"); //得到现在小时 public static String getHour() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = formatter.format(currentTime); String hour; hour = dateString.substring(11, 13); return hour; } //得到现在分钟 public static String getTime() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = formatter.format(currentTime); String min; min = dateString.substring(14, 16); return min; } public static String getTimeShort() { SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); Date currentTime = new Date(); String dateString = formatter.format(currentTime); return dateString; } */ } }