5 changed files with 1190 additions and 0 deletions
@ -0,0 +1,234 @@ |
|||||||
|
package org.leolo.rail.report; |
||||||
|
|
||||||
|
import java.util.HashSet; |
||||||
|
|
||||||
|
import org.leolo.rail.model.ScheduleType; |
||||||
|
|
||||||
|
public class BasicTrainScheduleEntry { |
||||||
|
private String suid; |
||||||
|
private String trainUid; |
||||||
|
private ScheduleType scheduleType; |
||||||
|
private String signalId; |
||||||
|
private String toc; |
||||||
|
private String trainClass; |
||||||
|
private String origin; |
||||||
|
private long originTime; |
||||||
|
private String destination; |
||||||
|
private long destinationTime; |
||||||
|
private long departTime; |
||||||
|
private String departPlatform; |
||||||
|
private long arriveTime; |
||||||
|
private String arrivePlatform; |
||||||
|
|
||||||
|
private HashSet<BasicTrainScheduleEntry> assoicatedEntry = new HashSet<>(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() { |
||||||
|
final int prime = 31; |
||||||
|
int result = 1; |
||||||
|
result = prime * result + ((arrivePlatform == null) ? 0 : arrivePlatform.hashCode()); |
||||||
|
result = prime * result + (int) (arriveTime ^ (arriveTime >>> 32)); |
||||||
|
result = prime * result + ((assoicatedEntry == null) ? 0 : assoicatedEntry.hashCode()); |
||||||
|
result = prime * result + ((departPlatform == null) ? 0 : departPlatform.hashCode()); |
||||||
|
result = prime * result + (int) (departTime ^ (departTime >>> 32)); |
||||||
|
result = prime * result + ((destination == null) ? 0 : destination.hashCode()); |
||||||
|
result = prime * result + (int) (destinationTime ^ (destinationTime >>> 32)); |
||||||
|
result = prime * result + ((origin == null) ? 0 : origin.hashCode()); |
||||||
|
result = prime * result + (int) (originTime ^ (originTime >>> 32)); |
||||||
|
result = prime * result + ((scheduleType == null) ? 0 : scheduleType.name().hashCode()); |
||||||
|
result = prime * result + ((signalId == null) ? 0 : signalId.hashCode()); |
||||||
|
result = prime * result + ((suid == null) ? 0 : suid.hashCode()); |
||||||
|
result = prime * result + ((toc == null) ? 0 : toc.hashCode()); |
||||||
|
result = prime * result + ((trainClass == null) ? 0 : trainClass.hashCode()); |
||||||
|
result = prime * result + ((trainUid == null) ? 0 : trainUid.hashCode()); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(Object obj) { |
||||||
|
if (this == obj) |
||||||
|
return true; |
||||||
|
if (obj == null) |
||||||
|
return false; |
||||||
|
if (getClass() != obj.getClass()) |
||||||
|
return false; |
||||||
|
BasicTrainScheduleEntry other = (BasicTrainScheduleEntry) obj; |
||||||
|
if (arrivePlatform == null) { |
||||||
|
if (other.arrivePlatform != null) |
||||||
|
return false; |
||||||
|
} else if (!arrivePlatform.equals(other.arrivePlatform)) |
||||||
|
return false; |
||||||
|
if (arriveTime != other.arriveTime) |
||||||
|
return false; |
||||||
|
if (assoicatedEntry == null) { |
||||||
|
if (other.assoicatedEntry != null) |
||||||
|
return false; |
||||||
|
} else if (!assoicatedEntry.equals(other.assoicatedEntry)) |
||||||
|
return false; |
||||||
|
if (departPlatform == null) { |
||||||
|
if (other.departPlatform != null) |
||||||
|
return false; |
||||||
|
} else if (!departPlatform.equals(other.departPlatform)) |
||||||
|
return false; |
||||||
|
if (departTime != other.departTime) |
||||||
|
return false; |
||||||
|
if (destination == null) { |
||||||
|
if (other.destination != null) |
||||||
|
return false; |
||||||
|
} else if (!destination.equals(other.destination)) |
||||||
|
return false; |
||||||
|
if (destinationTime != other.destinationTime) |
||||||
|
return false; |
||||||
|
if (origin == null) { |
||||||
|
if (other.origin != null) |
||||||
|
return false; |
||||||
|
} else if (!origin.equals(other.origin)) |
||||||
|
return false; |
||||||
|
if (originTime != other.originTime) |
||||||
|
return false; |
||||||
|
if (scheduleType != other.scheduleType) |
||||||
|
return false; |
||||||
|
if (signalId == null) { |
||||||
|
if (other.signalId != null) |
||||||
|
return false; |
||||||
|
} else if (!signalId.equals(other.signalId)) |
||||||
|
return false; |
||||||
|
if (suid == null) { |
||||||
|
if (other.suid != null) |
||||||
|
return false; |
||||||
|
} else if (!suid.equals(other.suid)) |
||||||
|
return false; |
||||||
|
if (toc == null) { |
||||||
|
if (other.toc != null) |
||||||
|
return false; |
||||||
|
} else if (!toc.equals(other.toc)) |
||||||
|
return false; |
||||||
|
if (trainClass == null) { |
||||||
|
if (other.trainClass != null) |
||||||
|
return false; |
||||||
|
} else if (!trainClass.equals(other.trainClass)) |
||||||
|
return false; |
||||||
|
if (trainUid == null) { |
||||||
|
if (other.trainUid != null) |
||||||
|
return false; |
||||||
|
} else if (!trainUid.equals(other.trainUid)) |
||||||
|
return false; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSuid() { |
||||||
|
return suid; |
||||||
|
} |
||||||
|
|
||||||
|
public ScheduleType getScheduleType() { |
||||||
|
return scheduleType; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSignalId() { |
||||||
|
return signalId; |
||||||
|
} |
||||||
|
|
||||||
|
public String getToc() { |
||||||
|
return toc; |
||||||
|
} |
||||||
|
|
||||||
|
public String getTrainClass() { |
||||||
|
return trainClass; |
||||||
|
} |
||||||
|
|
||||||
|
public String getOrigin() { |
||||||
|
return origin; |
||||||
|
} |
||||||
|
|
||||||
|
public long getOriginTime() { |
||||||
|
return originTime; |
||||||
|
} |
||||||
|
|
||||||
|
public String getDestination() { |
||||||
|
return destination; |
||||||
|
} |
||||||
|
|
||||||
|
public long getDestinationTime() { |
||||||
|
return destinationTime; |
||||||
|
} |
||||||
|
|
||||||
|
public HashSet<BasicTrainScheduleEntry> getAssoicatedEntry() { |
||||||
|
return assoicatedEntry; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSuid(String suid) { |
||||||
|
this.suid = suid; |
||||||
|
} |
||||||
|
|
||||||
|
public void setScheduleType(ScheduleType scheduleType) { |
||||||
|
this.scheduleType = scheduleType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSignalId(String signalId) { |
||||||
|
this.signalId = signalId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setToc(String toc) { |
||||||
|
this.toc = toc; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTrainClass(String trainClass) { |
||||||
|
this.trainClass = trainClass; |
||||||
|
} |
||||||
|
|
||||||
|
public void setOrigin(String origin) { |
||||||
|
this.origin = origin; |
||||||
|
} |
||||||
|
|
||||||
|
public void setOriginTime(long originTime) { |
||||||
|
this.originTime = originTime; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDestination(String destination) { |
||||||
|
this.destination = destination; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDestinationTime(long destinationTime) { |
||||||
|
this.destinationTime = destinationTime; |
||||||
|
} |
||||||
|
|
||||||
|
public String getTrainUid() { |
||||||
|
return trainUid; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTrainUid(String trainUid) { |
||||||
|
this.trainUid = trainUid; |
||||||
|
} |
||||||
|
|
||||||
|
public long getDepartTime() { |
||||||
|
return departTime; |
||||||
|
} |
||||||
|
|
||||||
|
public String getDepartPlatform() { |
||||||
|
return departPlatform; |
||||||
|
} |
||||||
|
|
||||||
|
public long getArriveTime() { |
||||||
|
return arriveTime; |
||||||
|
} |
||||||
|
|
||||||
|
public String getArrivePlatform() { |
||||||
|
return arrivePlatform; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDepartTime(long departTime) { |
||||||
|
this.departTime = departTime; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDepartPlatform(String departPlatform) { |
||||||
|
this.departPlatform = departPlatform; |
||||||
|
} |
||||||
|
|
||||||
|
public void setArriveTime(long arriveTime) { |
||||||
|
this.arriveTime = arriveTime; |
||||||
|
} |
||||||
|
|
||||||
|
public void setArrivePlatform(String arrivePlatform) { |
||||||
|
this.arrivePlatform = arrivePlatform; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,740 @@ |
|||||||
|
package org.leolo.rail.report; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.PrintWriter; |
||||||
|
import java.sql.Connection; |
||||||
|
import java.sql.Date; |
||||||
|
import java.sql.PreparedStatement; |
||||||
|
import java.sql.ResultSet; |
||||||
|
import java.sql.SQLException; |
||||||
|
import java.text.ParseException; |
||||||
|
import java.util.Comparator; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.TreeMap; |
||||||
|
import java.util.TreeSet; |
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager; |
||||||
|
import org.apache.logging.log4j.Logger; |
||||||
|
import org.leolo.rail.DatabaseManager; |
||||||
|
import org.leolo.rail.model.ScheduleType; |
||||||
|
|
||||||
|
public class ReportGenerator { |
||||||
|
public static Logger log = LogManager.getLogger(ReportGenerator.class); |
||||||
|
|
||||||
|
public static final String SQL_1 = "SELECT \r\n" + |
||||||
|
" lts.suid suid, lts.train_uid uid, lts.sch_type sch_type, lts.signal_id signal_id, lts.atoc_code toc,\r\n" + |
||||||
|
" lts.train_category train_category, \r\n" + |
||||||
|
" tiploc_to_crs(lts.origin) origin, TIME_TO_SEC(lts.origin_time) origin_time,\r\n" + |
||||||
|
" tiploc_to_crs(lts.destination) destination, TIME_TO_SEC(lts.destination_time) destination_time,\r\n" + |
||||||
|
" TIME_TO_SEC(al1.pub_departure) pub_departure, al1.platform dPlat,\r\n"+ |
||||||
|
" TIME_TO_SEC(al3.pub_arrival) pub_arrival, al3.platform aPlat\r\n"+ |
||||||
|
" FROM\r\n" + |
||||||
|
" ltp_location al1\r\n" + |
||||||
|
" LEFT JOIN ltp_location al3 ON al1.suid = al3.suid AND al1.seq < al3.seq\r\n" + |
||||||
|
" LEFT JOIN ltp_schedule lts ON al1.suid = lts.suid\r\n" + |
||||||
|
" LEFT JOIN tiploc tipo ON lts.origin = tipo.tiploc_code\r\n" + |
||||||
|
" LEFT JOIN tiploc tipd ON lts.destination = tipd.tiploc_code \r\n" + |
||||||
|
" WHERE\r\n" + |
||||||
|
" 1=1\r\n" + |
||||||
|
" AND al1.tiploc_code IN (SELECT tiploc_code FROM tiploc WHERE stanox IN (SELECT stanox FROM tiploc WHERE crs = ?))\r\n" + |
||||||
|
" AND al3.tiploc_code IN (SELECT tiploc_code FROM tiploc WHERE stanox IN (SELECT stanox FROM tiploc WHERE crs = ?))\r\n" + |
||||||
|
" AND ? BETWEEN lts.start_date AND lts.end_date\r\n" + |
||||||
|
" AND lts.days LIKE get_wd_str(?)\r\n" + |
||||||
|
" AND al1.pub_departure IS NOT null\r\n" + |
||||||
|
" AND al3.pub_arrival IS NOT NULL"; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static final String LATEX_PREMBLE_1 = "\\documentclass[a4paper]{article}\r\n" + |
||||||
|
"\\usepackage{tocloft}\r\n" + |
||||||
|
"\\usepackage[utf8]{inputenc}\r\n" + |
||||||
|
"\\usepackage[margin=0.675in]{geometry}\r\n" + |
||||||
|
"\\usepackage[colorlinks = true]{hyperref}\r\n" + |
||||||
|
"\\usepackage{color}\r\n" + |
||||||
|
"\\usepackage{colortbl}\r\n" + |
||||||
|
"\\usepackage[british]{babel}\r\n" + |
||||||
|
"\\usepackage{longtable}\r\n" + |
||||||
|
"\\usepackage{textcomp}\r\n" + |
||||||
|
"\\usepackage{fancyhdr}\r\n" + |
||||||
|
"\\usepackage{ulem}\r\n" + |
||||||
|
"\\usepackage{array}\r\n" + |
||||||
|
"\r\n" + |
||||||
|
"\\pagestyle{fancy}\r\n" + |
||||||
|
"\r\n" + |
||||||
|
"\\newcommand{\\hr}{\\noindent\\hrulefill}\r\n" + |
||||||
|
"\\newcommand{\\dfa}{\\cftdotfill{2}}\r\n" + |
||||||
|
"\\newcommand{\\dfb}{\\cftdotfill{4}}\r\n" + |
||||||
|
"\\newcommand{\\pa}{\\textit{(PASS)}}\r\n" + |
||||||
|
"\\renewcommand\\cftsecleader{\\cftdotfill{\\cftdotsep}}\r\n" + |
||||||
|
"\r\n" + |
||||||
|
"\\setcounter{secnumdepth}{1}\r\n" + |
||||||
|
"\\setcounter{tocdepth}{1}\r\n" + |
||||||
|
"\r\n" + |
||||||
|
"\\definecolor{hl1}{gray}{0.9}\r\n" + |
||||||
|
"\\definecolor{hl2}{gray}{0.8}\r\n" + |
||||||
|
"\r\n" + |
||||||
|
"\\definecolor{e1}{rgb}{0,0,1}\r\n" + |
||||||
|
"\\definecolor{ot}{rgb}{0,0,0}\r\n" + |
||||||
|
"\\definecolor{l1}{rgb}{1.0,0.33,0.33}\r\n" + |
||||||
|
"\\definecolor{l2}{rgb}{1.0,0,0}\r\n" + |
||||||
|
"\\definecolor{l3}{rgb}{0.67,0,0}"; |
||||||
|
|
||||||
|
public static void main(String [] args) throws ParseException, IOException { |
||||||
|
final String ORIGIN = "RDG"; |
||||||
|
final String DESTINATION = "PAD"; |
||||||
|
final java.util.Date RPT_DATE = new java.text.SimpleDateFormat("yyyy-MM-dd").parse("2022-03-16"); |
||||||
|
generateLaTeX(ORIGIN, DESTINATION, RPT_DATE); |
||||||
|
} |
||||||
|
|
||||||
|
public static File generateLaTeX(String origin, String destination, java.util.Date rptDate) throws IOException{ |
||||||
|
log.atInfo().log("{} -> {} on {}", origin, destination, rptDate); |
||||||
|
TreeSet<String> tocList = new TreeSet<>(); |
||||||
|
TreeSet<String> tcList = new TreeSet<>(); |
||||||
|
TreeSet<String> locList = new TreeSet<>(); |
||||||
|
HashMap<String, String> tocCache = new HashMap<>(); |
||||||
|
HashMap<String, String> tcCache = new HashMap<>(); |
||||||
|
HashMap<String, String> locCache = new HashMap<>(); |
||||||
|
TreeSet<BasicTrainScheduleEntry> trains = new TreeSet<>(new Comparator<BasicTrainScheduleEntry>() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public int compare(BasicTrainScheduleEntry arg0, BasicTrainScheduleEntry arg1) { |
||||||
|
int val = Long.compare(arg0.getDepartTime(), arg1.getDepartTime()); |
||||||
|
if(val!=0) return val; |
||||||
|
val = Long.compare(arg0.getArriveTime(), arg1.getArriveTime()); |
||||||
|
if(val!=0) return val; |
||||||
|
return Integer.compare(arg0.getScheduleType().ordinal(), arg1.getScheduleType().ordinal()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
TreeSet<TrainScheduleEntry> trainGroup = new TreeSet<>(new Comparator<TrainScheduleEntry>() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public int compare(TrainScheduleEntry arg0, TrainScheduleEntry arg1) { |
||||||
|
int val = Long.compare(arg0.getDepartTime(), arg1.getDepartTime()); |
||||||
|
if(val!=0) return val; |
||||||
|
val = Long.compare(arg0.getArriveTime(), arg1.getArriveTime()); |
||||||
|
if(val!=0) return val; |
||||||
|
return Integer.compare(arg0.getScheduleType().ordinal(), arg1.getScheduleType().ordinal()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
HashMap<String, TrainScheduleEntry> trainGroups = new HashMap<>(); |
||||||
|
java.sql.Date sqlDate = new java.sql.Date(rptDate.getTime()); |
||||||
|
locList.add(origin); |
||||||
|
locList.add(destination); |
||||||
|
//Stage 1: get the basic train information for trains
|
||||||
|
try( |
||||||
|
Connection conn = DatabaseManager.getInstance().getConnection(); |
||||||
|
PreparedStatement pstmt = conn.prepareStatement(SQL_1) |
||||||
|
){ |
||||||
|
pstmt.setString(1, origin); |
||||||
|
pstmt.setString(2, destination); |
||||||
|
pstmt.setDate(3, sqlDate); |
||||||
|
pstmt.setDate(4, sqlDate); |
||||||
|
try(ResultSet rs = pstmt.executeQuery()){ |
||||||
|
int rowCount = 0; |
||||||
|
while(rs.next()) { |
||||||
|
rowCount++; |
||||||
|
BasicTrainScheduleEntry btse = new BasicTrainScheduleEntry(); |
||||||
|
btse.setSuid(rs.getString(1)); |
||||||
|
btse.setTrainUid(rs.getString(2)); |
||||||
|
btse.setScheduleType(ScheduleType.valueOf(rs.getString(3))); |
||||||
|
btse.setSignalId(rs.getString(4)); |
||||||
|
btse.setToc(rs.getString(5)); |
||||||
|
btse.setTrainClass(rs.getString(6)); |
||||||
|
btse.setOrigin(rs.getString(7)); |
||||||
|
btse.setOriginTime(rs.getLong(8)); |
||||||
|
btse.setDestination(rs.getString(9)); |
||||||
|
btse.setDestinationTime(rs.getLong(10)); |
||||||
|
btse.setDepartTime(rs.getLong(11)); |
||||||
|
btse.setDepartPlatform(rs.getString(12)); |
||||||
|
btse.setArriveTime(rs.getLong(13)); |
||||||
|
btse.setArrivePlatform(rs.getString(14)); |
||||||
|
trains.add(btse); |
||||||
|
tocList.add(btse.getToc()); |
||||||
|
tcList.add(btse.getTrainClass()); |
||||||
|
locList.add(btse.getOrigin()); |
||||||
|
locList.add(btse.getDestination()); |
||||||
|
if(!trainGroups.containsKey(btse.getTrainUid())) { |
||||||
|
trainGroups.put(btse.getTrainUid(), new TrainScheduleEntry()); |
||||||
|
} |
||||||
|
trainGroups.get(btse.getTrainUid()).addEntry(btse); |
||||||
|
} |
||||||
|
log.atInfo().log("{} train schedule found.", rowCount); |
||||||
|
log.atInfo().log("{} train group formed.", trainGroups.size()); |
||||||
|
} |
||||||
|
}catch(SQLException e) { |
||||||
|
log.atError().log(e.getMessage(), e); |
||||||
|
} |
||||||
|
for(TrainScheduleEntry tse:trainGroups.values()) { |
||||||
|
trainGroup.add(tse); |
||||||
|
} |
||||||
|
//Scan for earlier train arrives later
|
||||||
|
for(TrainScheduleEntry tse:trainGroup) { |
||||||
|
for(TrainScheduleEntry otse:trainGroup) { |
||||||
|
if(tse.getTrainUid().equals(otse.getTrainUid())) { |
||||||
|
continue;//No need to check with self
|
||||||
|
} |
||||||
|
if(tse.getDepartTime() <= otse.getDepartTime() && tse.getArriveTime() >= otse.getArriveTime() && otse.getArriveTime() > otse.getDepartTime()) { |
||||||
|
tse.setNote("A"); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
try( |
||||||
|
Connection conn = DatabaseManager.getInstance().getConnection(); |
||||||
|
PreparedStatement stmt = conn.prepareStatement("SELECT tps_desc FROM tiploc WHERE crs = ?"); |
||||||
|
){ |
||||||
|
for(String crs:locList) { |
||||||
|
stmt.setString(1, crs); |
||||||
|
try(ResultSet rs = stmt.executeQuery()){ |
||||||
|
if(rs.next()) { |
||||||
|
locCache.put(crs, rs.getString(1)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
}catch(SQLException e) { |
||||||
|
log.atError().log(e.getMessage(), e); |
||||||
|
} |
||||||
|
|
||||||
|
//Generate output
|
||||||
|
try(PrintWriter pw = new PrintWriter(new File("Z:\\output.tex"))){ |
||||||
|
pw.print(LATEX_PREMBLE_1); |
||||||
|
pw.println("\\begin{document}"); |
||||||
|
pw.println("\\begin{center}\\begin{LARGE}"); |
||||||
|
pw.println("Train running record from \\\\"+locCache.get(origin)+"\\\\to\\\\"+locCache.get(destination)+"\\\\on\\\\"+new java.text.SimpleDateFormat("dd-MM-yyyy").format(rptDate)); |
||||||
|
pw.println("\\end{LARGE}\\end{center}"); |
||||||
|
pw.println(); |
||||||
|
pw.println("\\hr\r\n" + |
||||||
|
" \r\n" + |
||||||
|
" The information in this report is generated from data feed provided by Network Rail Infrastructure Limited.\r\n" + |
||||||
|
" \r\n" + |
||||||
|
" \\hr\r\n" + |
||||||
|
" \\tableofcontents"); |
||||||
|
//Part 1: Definations
|
||||||
|
pw.println("\\section{Definations}"); |
||||||
|
pw.println("\\subsection{TOC}"); |
||||||
|
try( |
||||||
|
Connection conn = DatabaseManager.getInstance().getConnection(); |
||||||
|
PreparedStatement stmt = conn.prepareStatement("SELECT name FROM toc WHERE atoc_code = ? LIMIT 1"); |
||||||
|
){ |
||||||
|
int count = 0; |
||||||
|
for(String toc:tocList) { |
||||||
|
stmt.setString(1, toc); |
||||||
|
try(ResultSet rs = stmt.executeQuery()){ |
||||||
|
if(rs.next()) { |
||||||
|
pw.print(rs.getString(1)); |
||||||
|
if(++count%2==0) |
||||||
|
pw.print("\\dfa "); |
||||||
|
else |
||||||
|
pw.print("\\dfb "); |
||||||
|
pw.print(toc); |
||||||
|
pw.println("\\\\"); |
||||||
|
tocCache.put(toc, rs.getString(1)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
}catch(SQLException e) { |
||||||
|
log.atError().log(e.getMessage(), e); |
||||||
|
} |
||||||
|
pw.println("\\subsection{Train Class}"); |
||||||
|
try( |
||||||
|
Connection conn = DatabaseManager.getInstance().getConnection(); |
||||||
|
PreparedStatement stmt = conn.prepareStatement("SELECT category_name FROM train_category WHERE category = ? LIMIT 1"); |
||||||
|
){ |
||||||
|
int count = 0; |
||||||
|
for(String tc:tcList) { |
||||||
|
stmt.setString(1, tc); |
||||||
|
try(ResultSet rs = stmt.executeQuery()){ |
||||||
|
if(rs.next()) { |
||||||
|
pw.print(rs.getString(1)); |
||||||
|
if(++count%2==0) |
||||||
|
pw.print("\\dfa "); |
||||||
|
else |
||||||
|
pw.print("\\dfb "); |
||||||
|
pw.print(tc); |
||||||
|
pw.println("\\\\"); |
||||||
|
tcCache.put(tc, rs.getString(1)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
}catch(SQLException e) { |
||||||
|
log.atError().log(e.getMessage(), e); |
||||||
|
} |
||||||
|
pw.println("\\subsection{Location}"); |
||||||
|
int locCount = 0; |
||||||
|
for(String loc:locList) { |
||||||
|
pw.print(locCache.get(loc).replace("&", "\\&")); |
||||||
|
if(++locCount%2==0) |
||||||
|
pw.print("\\dfa "); |
||||||
|
else |
||||||
|
pw.print("\\dfb "); |
||||||
|
pw.print(loc); |
||||||
|
pw.print("\\\\"); |
||||||
|
} |
||||||
|
//Part 2: Print the train List
|
||||||
|
pw.println("\\section{Train Schedule}"); |
||||||
|
pw.println("\\begin{longtable}[l]{|c|c|c||cc|cc|cc|cc||c|c|}"); |
||||||
|
pw.println("\\hline\r\n" + |
||||||
|
" UID & TOC & Train class & " |
||||||
|
+ "\\multicolumn{2}{c|}{Origin}& \\multicolumn{2}{c|}{"+origin+"} & " |
||||||
|
+ "\\multicolumn{2}{c|}{"+destination+"} &\\multicolumn{2}{c||}{Destination} & Detail Page &Note\\\\\\hline\\endhead"); |
||||||
|
int recCount = 0; |
||||||
|
TrainScheduleEntry ltse = null; |
||||||
|
for(TrainScheduleEntry tse:trainGroup) { |
||||||
|
if(ltse!=null) { |
||||||
|
if(getHour(ltse.getDepartTime())!=getHour(tse.getDepartTime())) { |
||||||
|
pw.println("\\\\\\hline"); |
||||||
|
}else { |
||||||
|
pw.println("\\\\"); |
||||||
|
} |
||||||
|
} |
||||||
|
if(tse.getSubentryCount()==1) { |
||||||
|
//Basic layout
|
||||||
|
pw.print(tse.getSignalId()); |
||||||
|
pw.print("&"); |
||||||
|
pw.print(tse.getToc()); |
||||||
|
pw.print("&"); |
||||||
|
pw.print(tse.getTrainClass()); |
||||||
|
pw.print("&"); |
||||||
|
pw.print(tse.getOrigin()); |
||||||
|
pw.print("&"); |
||||||
|
pw.print(getTime(tse.getOriginTime())); |
||||||
|
pw.print("&"); |
||||||
|
pw.print(getTime(tse.getDepartTime())); |
||||||
|
pw.print("&\\small{"); |
||||||
|
pw.print(tse.getDepartPlatform()); |
||||||
|
pw.print("}&"); |
||||||
|
pw.print(getTime(tse.getArriveTime())); |
||||||
|
pw.print("&\\small{"); |
||||||
|
pw.print(tse.getArrivePlatform()); |
||||||
|
pw.print("}&"); |
||||||
|
pw.print(tse.getDestination()); |
||||||
|
pw.print("&"); |
||||||
|
pw.print(getTime(tse.getDestinationTime())); |
||||||
|
pw.print("&\\pageref{td:"); |
||||||
|
pw.print(tse.getTrainUid()); |
||||||
|
pw.print("}&"); |
||||||
|
pw.print(tse.getNote()); |
||||||
|
if(tse.getScheduleType()==ScheduleType.CAN) |
||||||
|
pw.print("C"); |
||||||
|
}else { |
||||||
|
//Advance layout
|
||||||
|
recCount++; |
||||||
|
BasicTrainScheduleEntry assoc = tse.getAssocEntry(); |
||||||
|
boolean hasChange = false; |
||||||
|
//Print main record
|
||||||
|
if(recCount%2==0) |
||||||
|
pw.print("\\rowcolor{hl1}"); |
||||||
|
else |
||||||
|
pw.print("\\rowcolor{hl2}"); |
||||||
|
if(!tse.getSignalId().equals(assoc.getSignalId())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print(tse.getSignalId()); |
||||||
|
if(!tse.getSignalId().equals(assoc.getSignalId())) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getToc().equals(assoc.getToc())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print(tse.getToc()); |
||||||
|
if(!tse.getToc().equals(assoc.getToc())) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getTrainClass().equals(assoc.getTrainClass())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print(tse.getTrainClass()); |
||||||
|
if(!tse.getTrainClass().equals(assoc.getTrainClass())) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getOrigin().equals(assoc.getOrigin())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print(tse.getOrigin()); |
||||||
|
if(!tse.getOrigin().equals(assoc.getOrigin())) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(tse.getOriginTime()!=assoc.getOriginTime()) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print(getTime(tse.getOriginTime())); |
||||||
|
if(tse.getOriginTime()!=assoc.getOriginTime()) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(tse.getDepartTime()!=assoc.getDepartTime()) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print(getTime(tse.getDepartTime())); |
||||||
|
if(tse.getDepartTime()!=assoc.getDepartTime()) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getDepartPlatform().equals(assoc.getDepartPlatform())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print("\\small{"); |
||||||
|
pw.print(tse.getDepartPlatform()); |
||||||
|
pw.print("}"); |
||||||
|
if(!tse.getDepartPlatform().equals(assoc.getDepartPlatform())) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(tse.getArriveTime()!=assoc.getArriveTime()) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print(getTime(tse.getArriveTime())); |
||||||
|
if(tse.getArriveTime()!=assoc.getArriveTime()) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getArrivePlatform().equals(assoc.getArrivePlatform())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print("\\small{"); |
||||||
|
pw.print(tse.getArrivePlatform()); |
||||||
|
pw.print("}"); |
||||||
|
if(!tse.getArrivePlatform().equals(assoc.getArrivePlatform())) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getDestination().equals(assoc.getDestination())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print(tse.getDestination()); |
||||||
|
if(!tse.getDestination().equals(assoc.getDestination())) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(tse.getDestinationTime()!=assoc.getDestinationTime()) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\textcolor{red}{"); |
||||||
|
} |
||||||
|
pw.print(getTime(tse.getDestinationTime())); |
||||||
|
if(tse.getDestinationTime()!=assoc.getDestinationTime()) { |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&\\pageref{td:"); |
||||||
|
pw.print(tse.getTrainUid()); |
||||||
|
pw.print("}&"); |
||||||
|
pw.print(tse.getNote()); |
||||||
|
pw.print("B"); |
||||||
|
if(tse.getScheduleType()==ScheduleType.CAN) |
||||||
|
pw.print("C"); |
||||||
|
if(hasChange) { |
||||||
|
pw.print("\\\\*"); |
||||||
|
//Print ORIGINAL record
|
||||||
|
if(recCount%2==0) |
||||||
|
pw.print("\\rowcolor{hl1}"); |
||||||
|
else |
||||||
|
pw.print("\\rowcolor{hl2}"); |
||||||
|
if(!tse.getSignalId().equals(assoc.getSignalId())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print(assoc.getSignalId()); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getToc().equals(assoc.getToc())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print(assoc.getToc()); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getTrainClass().equals(assoc.getTrainClass())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print(assoc.getTrainClass()); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getOrigin().equals(assoc.getOrigin())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print(assoc.getOrigin()); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(tse.getOriginTime()!=assoc.getOriginTime()) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print(getTime(assoc.getOriginTime())); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(tse.getDepartTime()!=assoc.getDepartTime()) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print(getTime(assoc.getDepartTime())); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getDepartPlatform().equals(assoc.getDepartPlatform())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print("\\small{"); |
||||||
|
pw.print(assoc.getDepartPlatform()); |
||||||
|
pw.print("}"); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(tse.getArriveTime()!=assoc.getArriveTime()) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print(getTime(assoc.getArriveTime())); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getArrivePlatform().equals(assoc.getArrivePlatform())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print("\\small{"); |
||||||
|
pw.print(assoc.getArrivePlatform()); |
||||||
|
pw.print("}"); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(!tse.getDestination().equals(assoc.getDestination())) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print(assoc.getDestination()); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(tse.getDestinationTime()!=assoc.getDestinationTime()) { |
||||||
|
hasChange = true; |
||||||
|
pw.print("\\sout{"); |
||||||
|
pw.print(getTime(assoc.getDestinationTime())); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.print("&&"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
ltse = tse; |
||||||
|
} |
||||||
|
pw.println("\\\\\\hline\\end{longtable}"); |
||||||
|
pw.println("Note:\\\\"); |
||||||
|
pw.println("A\\dfa Faster train available\\\\"); |
||||||
|
pw.println("B\\dfb Changes to timetable applies\\\\"); |
||||||
|
pw.println("C\\dfa Scheduled cancellation\\\\"); |
||||||
|
pw.println("\\pageref{xx:ukn}\\dfb No train details found\\\\"); |
||||||
|
|
||||||
|
//Details
|
||||||
|
pw.println("\\section{Schedule Details}"); |
||||||
|
for(TrainScheduleEntry tse:trainGroup) { |
||||||
|
TrainRunningRecord trr = getRunningRecord(tse.getMainSUID(), rptDate); |
||||||
|
if(trr==null) { |
||||||
|
log.atWarn().log("No record for {}", tse.getMainSUID()); |
||||||
|
continue; |
||||||
|
} |
||||||
|
pw.println("\\subsection{"+tse.getSignalId()+" "+getTime(tse.getOriginTime())+" to "+locCache.get(tse.getDestination()).replace("&", "\\&")+"}\\label{td:"+tse.getTrainUid()+"}"); |
||||||
|
pw.println(); |
||||||
|
pw.println("Basic infomation\\\\"); |
||||||
|
pw.println("From "+locCache.get(tse.getOrigin()).replace("&", "\\&")+" to "+locCache.get(tse.getDestination()).replace("&", "\\&")+"\\\\"); |
||||||
|
pw.println("Operated by "+tocCache.get(tse.getToc())+"\\\\"); |
||||||
|
pw.println(tcCache.get(tse.getTrainClass())+"\\\\"); |
||||||
|
pw.println("Train UID: "+tse.getTrainUid()+"\\\\"); |
||||||
|
try( |
||||||
|
Connection conn = DatabaseManager.getInstance().getConnection(); |
||||||
|
PreparedStatement pstmt = conn.prepareStatement("SELECT power_type, planned_speed, class, sleeper, reservation, catering, atoc_code, rsid FROM ltp_schedule WHERE suid = ?") |
||||||
|
){ |
||||||
|
pstmt.setString(1, tse.getMainSUID()); |
||||||
|
try(ResultSet rs = pstmt.executeQuery()){ |
||||||
|
if(rs.next()) { |
||||||
|
pw.println("Train ID: "+trr.getTrainId()+"\\\\"); |
||||||
|
pw.println("Activated on: "+new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date(trr.getActivate()))+"\\\\"); |
||||||
|
pw.println("Power type: "+rs.getString(1)+"\\\\"); |
||||||
|
pw.println("Planned speed "+rs.getString(2)+"mph\\\\"); |
||||||
|
if("".equals(rs.getString(3))||"B".equals(rs.getString(3))) { |
||||||
|
pw.println("First class available\\\\"); |
||||||
|
}else { |
||||||
|
pw.println("Only ordinary class available\\\\"); |
||||||
|
} |
||||||
|
if(rs.getString(8)!=null) { |
||||||
|
pw.println("National Reservation System headcode : "+rs.getString(7)+rs.getString(8)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}catch(SQLException e) { |
||||||
|
log.atError().log(e.getMessage(), e); |
||||||
|
} |
||||||
|
pw.println(); |
||||||
|
pw.println("\\begin{longtable}[l]{|p{5.5cm}r|ccc|ccc|lr|}"); |
||||||
|
pw.println("\\hline\r\n" + |
||||||
|
" \\multicolumn{2}{|c|}{Station} & \\multicolumn{3}{c|}{Arrival}& \\multicolumn{3}{c|}{Departure}&\r\n" + |
||||||
|
" Plat. & Diff.\\\\\r\n" + |
||||||
|
" & & GBTT & WTT & Actual & GBTT & WTT & Actual & &\\\\\\hline\\endhead"); |
||||||
|
for(TrainRunningRecordEntry trre:trr.getEntries()) { |
||||||
|
if(trre.getLocationName()==null) |
||||||
|
continue; |
||||||
|
boolean pass = false; |
||||||
|
if(origin.equals(trre.getCrs())) |
||||||
|
pw.print("\\rowcolor{hl1}"); |
||||||
|
if(destination.equals(trre.getCrs())) |
||||||
|
pw.print("\\rowcolor{hl2}"); |
||||||
|
pw.print(trre.getLocationName().replace("&", "\\&")); |
||||||
|
pw.print("&"); |
||||||
|
if(trre.getCrs()!=null) |
||||||
|
pw.print(trre.getCrs()); |
||||||
|
pw.print("&"); |
||||||
|
//ARRIVAL
|
||||||
|
if(trre.getAgbtt()!=0) |
||||||
|
pw.print(getTime(trre.getAgbtt())); |
||||||
|
pw.print("&"); |
||||||
|
if(trre.getAwtt()!=0) |
||||||
|
pw.print(getTime(trre.getAwtt())); |
||||||
|
pw.print("&"); |
||||||
|
if(trre.getAact()!=0) |
||||||
|
pw.print(getTime(trre.getAact())); |
||||||
|
pw.print("&"); |
||||||
|
//ARRIVAL
|
||||||
|
if(trre.getDgbtt()!=0) |
||||||
|
pw.print(getTime(trre.getDgbtt())); |
||||||
|
else if(trre.getDwtt()!=0) { |
||||||
|
pw.print("\\pa"); |
||||||
|
pass = true; |
||||||
|
} |
||||||
|
pw.print("&"); |
||||||
|
if(trre.getDwtt()!=0) |
||||||
|
pw.print(getTime(trre.getDwtt())); |
||||||
|
pw.print("&"); |
||||||
|
if(trre.getDact()!=0) |
||||||
|
pw.print(getTime(trre.getDact())); |
||||||
|
pw.print("&"); |
||||||
|
if(trre.getPlatform()!=null) |
||||||
|
pw.print(trre.getPlatform()); |
||||||
|
pw.print("&"); |
||||||
|
long sch, act; |
||||||
|
if(pass||(trre.getAgbtt()==0&&trre.getAwtt()==0&&trre.getAact()==0)) { |
||||||
|
sch = trre.getDgbtt()!=0?trre.getDgbtt():trre.getDwtt(); |
||||||
|
act = trre.getDact(); |
||||||
|
}else { |
||||||
|
sch = trre.getAgbtt()!=0?trre.getAgbtt():trre.getAwtt(); |
||||||
|
act = trre.getAact(); |
||||||
|
} |
||||||
|
if(sch!=0 && !tse.getOrigin().equals(trre.getCrs())) { |
||||||
|
int diffMin = (int)(act-sch)/60; |
||||||
|
if(diffMin < -240) diffMin+=1440; |
||||||
|
if(diffMin < 0) pw.print("\\textcolor{e1}{"); |
||||||
|
else if(diffMin > 30) pw.print("\\textcolor{l3}{"); |
||||||
|
else if(diffMin > 15) pw.print("\\textcolor{l2}{"); |
||||||
|
else if(diffMin > 0) pw.print("\\textcolor{l1}{"); |
||||||
|
else pw.print("\\textcolor{ot}{"); |
||||||
|
pw.print(diffMin); |
||||||
|
pw.print("}"); |
||||||
|
} |
||||||
|
pw.println("\\\\"); |
||||||
|
|
||||||
|
} |
||||||
|
pw.println("\\hline\\end{longtable}"); |
||||||
|
pw.println(); |
||||||
|
|
||||||
|
} |
||||||
|
pw.println("This is the end of the report"); |
||||||
|
pw.println("\\end{document}"); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private static TrainRunningRecord getRunningRecord(String suid, java.util.Date opDate) { |
||||||
|
TrainRunningRecord trr = new TrainRunningRecord(); |
||||||
|
try(Connection conn = DatabaseManager.getInstance().getConnection()){ |
||||||
|
//Step 1: Find the activation record
|
||||||
|
try(PreparedStatement stmt = conn.prepareStatement("SELECT train_id, activate_time FROM current_train WHERE suid=? AND op_date=?")){ |
||||||
|
stmt.setString(1, suid); |
||||||
|
stmt.setDate(2, new java.sql.Date(opDate.getTime())); |
||||||
|
try(ResultSet rs = stmt.executeQuery()){ |
||||||
|
if(rs.next()) { |
||||||
|
trr.setTrainId(rs.getString(1)); |
||||||
|
trr.setActivate(rs.getTimestamp(2).getTime()); |
||||||
|
}else { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
//Step 2: get the actual record
|
||||||
|
try(PreparedStatement stmt = conn.prepareStatement("SELECT get_stanox_name(loc_stanox) loc, stanox_to_crs(loc_stanox) crs,\r\n" + |
||||||
|
" TIME_TO_SEC(gbtt_time) ttt, TIME_TO_SEC(plan_time) plt, TIME_TO_SEC(movt_time) act,\r\n" + |
||||||
|
" platform plat, CASE evnt_type WHEN 'DEPARTURE' THEN 'D' WHEN 'ARRIVAL' THEN 'A' ELSE '?' END, loc_stanox t\r\n" + |
||||||
|
" FROM current_train_movement WHERE train_id = ? ORDER BY movt_time, evnt_type;")){ |
||||||
|
stmt.setString(1, trr.getTrainId()); |
||||||
|
try(ResultSet rs = stmt.executeQuery()){ |
||||||
|
TrainRunningRecordEntry trre = new TrainRunningRecordEntry(); |
||||||
|
while(rs.next()) { |
||||||
|
if(!rs.getString(8).equals(trre.getStanox())) { |
||||||
|
//Changed
|
||||||
|
trr.getEntries().add(trre); |
||||||
|
trre = new TrainRunningRecordEntry(); |
||||||
|
} |
||||||
|
trre.setCrs(rs.getString(2)); |
||||||
|
String locName = rs.getString(1); |
||||||
|
if(locName.length()>20) { |
||||||
|
locName=locName |
||||||
|
.replace("JUNCTION", "JN") |
||||||
|
.replace("INTERNATIONAL", "INTL") |
||||||
|
.replace("THAMESLINK", "TL"); |
||||||
|
} |
||||||
|
trre.setLocationName(locName); |
||||||
|
trre.setPlatform(rs.getString(6)); |
||||||
|
trre.setStanox(rs.getString(8)); |
||||||
|
if("A".equals(rs.getString(7))) { |
||||||
|
//Arrival
|
||||||
|
trre.setAgbtt(rs.getLong(3)); |
||||||
|
trre.setAwtt(rs.getLong(4)); |
||||||
|
trre.setAact(rs.getLong(5)); |
||||||
|
}else { |
||||||
|
//Departure
|
||||||
|
trre.setDgbtt(rs.getLong(3)); |
||||||
|
trre.setDwtt(rs.getLong(4)); |
||||||
|
trre.setDact(rs.getLong(5)); |
||||||
|
} |
||||||
|
} |
||||||
|
trr.getEntries().add(trre); |
||||||
|
} |
||||||
|
} |
||||||
|
}catch(SQLException e) { |
||||||
|
log.atError().log(e.getMessage(), e); |
||||||
|
} |
||||||
|
return trr; |
||||||
|
} |
||||||
|
|
||||||
|
private static String getTime(long sec) { |
||||||
|
long h = sec/3600; |
||||||
|
long m = (sec/60)%60; |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
if(h<10) sb.append("0"); |
||||||
|
sb.append(h).append(":"); |
||||||
|
if(m<10) sb.append("0"); |
||||||
|
sb.append(m); |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
private static int getHour(long sec) { |
||||||
|
return (int) sec/3600; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,35 @@ |
|||||||
|
package org.leolo.rail.report; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Vector; |
||||||
|
|
||||||
|
public class TrainRunningRecord { |
||||||
|
private String trainId; |
||||||
|
private long activate; |
||||||
|
|
||||||
|
private Vector<TrainRunningRecordEntry> entries = new Vector<>(); |
||||||
|
|
||||||
|
public String getTrainId() { |
||||||
|
return trainId; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public Vector<TrainRunningRecordEntry> getEntries() { |
||||||
|
return entries; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTrainId(String trainId) { |
||||||
|
this.trainId = trainId; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public long getActivate() { |
||||||
|
return activate; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void setActivate(long activate) { |
||||||
|
this.activate = activate; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,76 @@ |
|||||||
|
package org.leolo.rail.report; |
||||||
|
|
||||||
|
public class TrainRunningRecordEntry { |
||||||
|
private String locationName; |
||||||
|
private String crs; |
||||||
|
private String stanox; |
||||||
|
private String platform; |
||||||
|
|
||||||
|
private long agbtt; |
||||||
|
private long awtt; |
||||||
|
private long aact; |
||||||
|
private long dgbtt; |
||||||
|
private long dwtt; |
||||||
|
private long dact; |
||||||
|
public String getLocationName() { |
||||||
|
return locationName; |
||||||
|
} |
||||||
|
public String getCrs() { |
||||||
|
return crs; |
||||||
|
} |
||||||
|
public long getAgbtt() { |
||||||
|
return agbtt; |
||||||
|
} |
||||||
|
public long getAwtt() { |
||||||
|
return awtt; |
||||||
|
} |
||||||
|
public long getAact() { |
||||||
|
return aact; |
||||||
|
} |
||||||
|
public long getDgbtt() { |
||||||
|
return dgbtt; |
||||||
|
} |
||||||
|
public long getDwtt() { |
||||||
|
return dwtt; |
||||||
|
} |
||||||
|
public long getDact() { |
||||||
|
return dact; |
||||||
|
} |
||||||
|
public void setLocationName(String locationName) { |
||||||
|
this.locationName = locationName; |
||||||
|
} |
||||||
|
public void setCrs(String crs) { |
||||||
|
this.crs = crs; |
||||||
|
} |
||||||
|
public void setAgbtt(long agbtt) { |
||||||
|
this.agbtt = agbtt; |
||||||
|
} |
||||||
|
public void setAwtt(long awtt) { |
||||||
|
this.awtt = awtt; |
||||||
|
} |
||||||
|
public void setAact(long aact) { |
||||||
|
this.aact = aact; |
||||||
|
} |
||||||
|
public void setDgbtt(long dgbtt) { |
||||||
|
this.dgbtt = dgbtt; |
||||||
|
} |
||||||
|
public void setDwtt(long dwtt) { |
||||||
|
this.dwtt = dwtt; |
||||||
|
} |
||||||
|
public void setDact(long dact) { |
||||||
|
this.dact = dact; |
||||||
|
} |
||||||
|
public String getPlatform() { |
||||||
|
return platform; |
||||||
|
} |
||||||
|
public void setPlatform(String platform) { |
||||||
|
this.platform = platform; |
||||||
|
} |
||||||
|
public String getStanox() { |
||||||
|
return stanox; |
||||||
|
} |
||||||
|
public void setStanox(String stanox) { |
||||||
|
this.stanox = stanox; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,105 @@ |
|||||||
|
package org.leolo.rail.report; |
||||||
|
|
||||||
|
import java.util.HashSet; |
||||||
|
|
||||||
|
import org.leolo.rail.model.ScheduleType; |
||||||
|
|
||||||
|
public class TrainScheduleEntry { |
||||||
|
|
||||||
|
private HashSet<BasicTrainScheduleEntry> subEntry = new HashSet<>(); |
||||||
|
private BasicTrainScheduleEntry mainEntry = null; |
||||||
|
private String note = ""; |
||||||
|
|
||||||
|
public void addEntry(BasicTrainScheduleEntry entry) { |
||||||
|
subEntry.add(entry); |
||||||
|
if(mainEntry==null) { |
||||||
|
mainEntry = entry; |
||||||
|
}else if(entry.getScheduleType() == ScheduleType.OVL) { |
||||||
|
mainEntry = entry; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public int getSubentryCount() { |
||||||
|
return subEntry.size(); |
||||||
|
} |
||||||
|
|
||||||
|
public BasicTrainScheduleEntry getAssocEntry() { |
||||||
|
for(BasicTrainScheduleEntry btse:subEntry) { |
||||||
|
if(btse!=mainEntry) { |
||||||
|
return btse; |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getMainSUID() { |
||||||
|
return mainEntry.getSuid(); |
||||||
|
} |
||||||
|
|
||||||
|
public ScheduleType getScheduleType() { |
||||||
|
return mainEntry.getScheduleType(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getSignalId() { |
||||||
|
return mainEntry.getSignalId(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getToc() { |
||||||
|
return mainEntry.getToc(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getTrainClass() { |
||||||
|
return mainEntry.getTrainClass(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getOrigin() { |
||||||
|
return mainEntry.getOrigin(); |
||||||
|
} |
||||||
|
|
||||||
|
public long getOriginTime() { |
||||||
|
return mainEntry.getOriginTime(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getDestination() { |
||||||
|
return mainEntry.getDestination(); |
||||||
|
} |
||||||
|
|
||||||
|
public long getDestinationTime() { |
||||||
|
return mainEntry.getDestinationTime(); |
||||||
|
} |
||||||
|
|
||||||
|
public HashSet<BasicTrainScheduleEntry> getAssoicatedEntry() { |
||||||
|
return mainEntry.getAssoicatedEntry(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public String getTrainUid() { |
||||||
|
return mainEntry.getTrainUid(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public long getDepartTime() { |
||||||
|
return mainEntry.getDepartTime(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getDepartPlatform() { |
||||||
|
return mainEntry.getDepartPlatform(); |
||||||
|
} |
||||||
|
|
||||||
|
public long getArriveTime() { |
||||||
|
return mainEntry.getArriveTime(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getArrivePlatform() { |
||||||
|
return mainEntry.getArrivePlatform(); |
||||||
|
} |
||||||
|
|
||||||
|
public String getNote() { |
||||||
|
return note; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNote(String note) { |
||||||
|
this.note = note; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue