Files
railwaysystem/scripts/qa/CheckPackageBInventory.java

153 lines
9.0 KiB
Java

package scripts.qa;
import java.io.File;
import java.nio.file.Files;
import java.sql.*;
public class CheckPackageBInventory {
public static void main(String[] args) throws Exception {
Class.forName("com.kingbase8.Driver");
File envFile = new File(System.getProperty("user.home"), ".railwaysystem-qa.env");
String pass = "";
if (envFile.exists()) {
for (String line : Files.readAllLines(envFile.toPath())) {
line = line.trim();
if (line.startsWith("QA_DB_PASSWORD=")) {
pass = line.substring("QA_DB_PASSWORD=".length()).trim();
if (pass.startsWith("\"") && pass.endsWith("\"")) {
pass = pass.substring(1, pass.length() - 1);
}
}
}
}
if (pass.isEmpty()) {
throw new IllegalStateException("QA_DB_PASSWORD is required in ~/.railwaysystem-qa.env");
}
String dbUrl = "jdbc:kingbase8://192.168.139.218:4321/railwaysystem_integrated_qa_20260916?useUnicode=true&characterEncoding=utf8";
try (Connection conn = DriverManager.getConnection(dbUrl, "kingbase", pass)) {
try (Statement st = conn.createStatement()) {
// 验证当前数据库
try (ResultSet rs = st.executeQuery("SELECT current_database(), current_user")) {
if (rs.next()) {
System.out.println("CURRENT_DATABASE=" + rs.getString(1));
System.out.println("CURRENT_USER=" + rs.getString(2));
}
}
// A. status = 1 但无 class_report
int reportedWithoutReport = 0;
String qA = "SELECT count(*) FROM train_enrollment e WHERE e.enrollment_status = 1 AND NOT EXISTS (SELECT 1 FROM train_class_report r WHERE r.enrollment_id = e.enrollment_id)";
try (ResultSet rs = st.executeQuery(qA)) {
if (rs.next()) reportedWithoutReport = rs.getInt(1);
}
System.out.println("REPORTED_WITHOUT_REPORT_COUNT=" + reportedWithoutReport);
// B. status = 0 但已有 class_report
int waitingWithReport = 0;
String qB = "SELECT count(*) FROM train_enrollment e WHERE e.enrollment_status = 0 AND EXISTS (SELECT 1 FROM train_class_report r WHERE r.enrollment_id = e.enrollment_id)";
try (ResultSet rs = st.executeQuery(qB)) {
if (rs.next()) waitingWithReport = rs.getInt(1);
}
System.out.println("WAITING_WITH_REPORT_COUNT=" + waitingWithReport);
// C. status = 4 但无 class_report
int completedWithoutReport = 0;
String qC = "SELECT count(*) FROM train_enrollment e WHERE e.enrollment_status = 4 AND NOT EXISTS (SELECT 1 FROM train_class_report r WHERE r.enrollment_id = e.enrollment_id)";
try (ResultSet rs = st.executeQuery(qC)) {
if (rs.next()) completedWithoutReport = rs.getInt(1);
}
System.out.println("COMPLETED_WITHOUT_REPORT_COUNT=" + completedWithoutReport);
// D. status = 2 且有 report
int leaveAfterReport = 0;
String qD = "SELECT count(*) FROM train_enrollment e WHERE e.enrollment_status = 2 AND EXISTS (SELECT 1 FROM train_class_report r WHERE r.enrollment_id = e.enrollment_id)";
try (ResultSet rs = st.executeQuery(qD)) {
if (rs.next()) leaveAfterReport = rs.getInt(1);
}
System.out.println("LEAVE_AFTER_REPORT_COUNT=" + leaveAfterReport);
// E. status = 2 且无 report
int leaveBeforeReport = 0;
String qE = "SELECT count(*) FROM train_enrollment e WHERE e.enrollment_status = 2 AND NOT EXISTS (SELECT 1 FROM train_class_report r WHERE r.enrollment_id = e.enrollment_id)";
try (ResultSet rs = st.executeQuery(qE)) {
if (rs.next()) leaveBeforeReport = rs.getInt(1);
}
System.out.println("LEAVE_BEFORE_REPORT_COUNT=" + leaveBeforeReport);
// F. status = 3 且有 report
int abandonedAfterReport = 0;
String qF = "SELECT count(*) FROM train_enrollment e WHERE e.enrollment_status = 3 AND EXISTS (SELECT 1 FROM train_class_report r WHERE r.enrollment_id = e.enrollment_id)";
try (ResultSet rs = st.executeQuery(qF)) {
if (rs.next()) abandonedAfterReport = rs.getInt(1);
}
System.out.println("ABANDONED_AFTER_REPORT_COUNT=" + abandonedAfterReport);
// G. status = 3 且无 report
int abandonedBeforeReport = 0;
String qG = "SELECT count(*) FROM train_enrollment e WHERE e.enrollment_status = 3 AND NOT EXISTS (SELECT 1 FROM train_class_report r WHERE r.enrollment_id = e.enrollment_id)";
try (ResultSet rs = st.executeQuery(qG)) {
if (rs.next()) abandonedBeforeReport = rs.getInt(1);
}
System.out.println("ABANDONED_BEFORE_REPORT_COUNT=" + abandonedBeforeReport);
// 考勤盘点: CHECKIN_WITHOUT_SIGNIN_COUNT
int checkinWithoutSignin = 0;
String qCheckinNoSignin = "SELECT count(*) FROM train_student_checkin WHERE sign_in_time IS NULL";
try (ResultSet rs = st.executeQuery(qCheckinNoSignin)) {
if (rs.next()) checkinWithoutSignin = rs.getInt(1);
}
System.out.println("CHECKIN_WITHOUT_SIGNIN_COUNT=" + checkinWithoutSignin);
// 考勤盘点: SIGNOUT_ONLY_NORMAL_COUNT
int signoutOnlyNormal = 0;
String qSignoutOnlyNormal = "SELECT count(*) FROM train_student_checkin WHERE sign_in_time IS NULL AND sign_out_time IS NOT NULL AND attendance_status = 1";
try (ResultSet rs = st.executeQuery(qSignoutOnlyNormal)) {
if (rs.next()) signoutOnlyNormal = rs.getInt(1);
}
System.out.println("SIGNOUT_ONLY_NORMAL_COUNT=" + signoutOnlyNormal);
// DRY RUN anomaly list (sign_in_time IS NULL)
System.out.println("--- DRY RUN ANOMALY LIST (CHECKIN WITHOUT SIGNIN) ---");
String qAnomalyRows = "SELECT checkin_id, enrollment_id, lesson_id, attendance_status, sign_in_time, sign_out_time FROM train_student_checkin WHERE sign_in_time IS NULL ORDER BY checkin_id";
try (ResultSet rs = st.executeQuery(qAnomalyRows)) {
while (rs.next()) {
System.out.println(String.format("ANOMALY_ROW: checkin_id=%d, enrollment_id=%d, lesson_id=%d, attendance_status=%d, sign_in_time=%s, sign_out_time=%s",
rs.getLong("checkin_id"),
rs.getLong("enrollment_id"),
rs.getLong("lesson_id"),
rs.getInt("attendance_status"),
String.valueOf(rs.getTimestamp("sign_in_time")),
String.valueOf(rs.getTimestamp("sign_out_time"))
));
}
}
// PLAN_COMPLETION_BLOCKING_SAMPLE_COUNT
// 统计处于进行中/未结训状态(plan_status != 2 AND plan_status != 3),但其参训人员中存在 status=0 或 status=2 或 (status=1但无report) 的计划数量
int blockingPlanCount = 0;
String qBlockingPlans = "SELECT count(DISTINCT p.plan_id) FROM train_class_plan p " +
"JOIN train_enrollment e ON e.plan_id = p.plan_id " +
"WHERE p.plan_status NOT IN (2, 3) AND (" +
" e.enrollment_status = 0 OR e.enrollment_status = 2 OR " +
" (e.enrollment_status = 1 AND NOT EXISTS (SELECT 1 FROM train_class_report r WHERE r.enrollment_id = e.enrollment_id))" +
")";
try (ResultSet rs = st.executeQuery(qBlockingPlans)) {
if (rs.next()) blockingPlanCount = rs.getInt(1);
}
System.out.println("PLAN_COMPLETION_BLOCKING_SAMPLE_COUNT=" + blockingPlanCount);
// 如果存在 A/B/C 异常,打印 DRY RUN 修复建议
System.out.println("--- DRY RUN REMEDIATION REPORT ---");
if (reportedWithoutReport == 0 && waitingWithReport == 0 && completedWithoutReport == 0) {
System.out.println("REMEDIATION_NEEDED=NONE (No enrollment/report inconsistency detected)");
} else {
System.out.println(String.format("REMEDIATION_NEEDED=YES (A=%d, B=%d, C=%d). DRY RUN ONLY, NO UPDATE PERFORMED.",
reportedWithoutReport, waitingWithReport, completedWithoutReport));
}
}
}
}
}