diff --git a/src/main/java/BsK/client/Client.java b/src/main/java/BsK/client/Client.java index 1c4f532..802b388 100644 --- a/src/main/java/BsK/client/Client.java +++ b/src/main/java/BsK/client/Client.java @@ -74,6 +74,8 @@ public class Client { } public static void main(String[] args) throws Exception { + log.info("\n____ _____ _ __\n| _ \\ / ____| |/\n| |_) | (___ | ' /\n| _ < \\___ \\| <\n| |_) |____) | . \\\n|____/|_____/|_|\\_\n"); + var thread = new Thread(() -> { // First try to load from external config file File externalConfig = new File("config/config.properties"); diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java index 071ec46..f0d6c0c 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java @@ -2201,6 +2201,7 @@ public class CheckUpPage extends JPanel { customerFirstNameField.setText(selectedPatient.getCustomerFirstName()); // Select doctor by name + log.info("Selected patient's doctor name: {}", selectedPatient.getDoctorName()); DoctorItem doctorToSelect = findDoctorByName(selectedPatient.getDoctorName()); if (doctorToSelect != null) { doctorComboBox.setSelectedItem(doctorToSelect); @@ -2213,7 +2214,8 @@ public class CheckUpPage extends JPanel { if (ultrasoundDoctorToSelect != null) { ultrasoundDoctorComboBox.setSelectedItem(ultrasoundDoctorToSelect); } else if (ultrasoundDoctorComboBox.getItemCount() > 0) { - ultrasoundDoctorComboBox.setSelectedIndex(0); + // if no ultrasound doctor by default it se to the same doctor as the main doctor + ultrasoundDoctorComboBox.setSelectedItem(doctorToSelect); log.warn("Ultrasound Doctor '{}' not found in the list for patient selection.", selectedPatient.getDoctorUltrasoundId()); } @@ -4194,7 +4196,9 @@ public class CheckUpPage extends JPanel { SwingUtilities.invokeLater(() -> { int selectedRow = queueTable.getSelectedRow(); if (selectedRow != -1) { - String newlySelectedCheckupId = (String) queueTableModel.getValueAt(selectedRow, 0); + // Convert view index to model index to handle sorting + int modelRow = queueTable.convertRowIndexToModel(selectedRow); + String newlySelectedCheckupId = (String) queueTableModel.getValueAt(modelRow, 1); // Column 1 is Checkup ID // Check for unsaved changes before switching if (selectedCheckupId != null && !selectedCheckupId.equals(newlySelectedCheckupId) && !saved) { @@ -4213,8 +4217,8 @@ public class CheckUpPage extends JPanel { return; } } - // Call the parent class's method to handle the selection - CheckUpPage.this.handleRowSelection(getSelectedRow()); + // Call the parent class's method to handle the selection with the model row index + CheckUpPage.this.handleRowSelection(modelRow); // Reset patient name filter when closing dialog after selection patientNameFilter.setText(""); applyFilters(); @@ -4242,7 +4246,9 @@ public class CheckUpPage extends JPanel { if (selectedRow != -1) { // Simulate the mouse click logic SwingUtilities.invokeLater(() -> { - String newlySelectedCheckupId = (String) queueTableModel.getValueAt(selectedRow, 0); + // Convert view index to model index to handle sorting + int modelRow = queueTable.convertRowIndexToModel(selectedRow); + String newlySelectedCheckupId = (String) queueTableModel.getValueAt(modelRow, 1); // Column 1 is Checkup ID // Check for unsaved changes before switching if (selectedCheckupId != null && !selectedCheckupId.equals(newlySelectedCheckupId) && !saved) { @@ -4253,11 +4259,16 @@ public class CheckUpPage extends JPanel { JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if (confirm == JOptionPane.NO_OPTION) { + // Reselect the previous row visually to avoid confusion + int previousRow = findRowByCheckupId(selectedCheckupId); + if (previousRow != -1) { + queueTable.setRowSelectionInterval(previousRow, previousRow); + } return; } } - // Call the parent class's method to handle the selection - CheckUpPage.this.handleRowSelection(getSelectedRow()); + // Call the parent class's method to handle the selection with the model row index + CheckUpPage.this.handleRowSelection(modelRow); // Reset patient name filter when closing dialog after selection patientNameFilter.setText(""); applyFilters(); @@ -4447,21 +4458,10 @@ public class CheckUpPage extends JPanel { * @return the selected row index in the original patient queue, or -1 if no row is selected. */ public int getSelectedRow() { - int selectedRowInTable = queueTable.getSelectedRow(); - if (selectedRowInTable == -1 || selectedRowInTable >= filteredPatients.size()) { - return -1; + int selectedRow = queueTable.getSelectedRow(); + if (selectedRow != -1) { + return queueTable.convertRowIndexToModel(selectedRow); } - - // Get the patient from the filtered list - Patient selectedPatient = filteredPatients.get(selectedRowInTable); - - // Find the corresponding index in the original patient queue - for (int i = 0; i < patientQueue.size(); i++) { - if (patientQueue.get(i).getCheckupId().equals(selectedPatient.getCheckupId())) { - return i; - } - } - return -1; } } diff --git a/src/main/java/BsK/client/ui/component/DashboardPage/DashboardPage.java b/src/main/java/BsK/client/ui/component/DashboardPage/DashboardPage.java index 30cbb7d..ae70f37 100644 --- a/src/main/java/BsK/client/ui/component/DashboardPage/DashboardPage.java +++ b/src/main/java/BsK/client/ui/component/DashboardPage/DashboardPage.java @@ -163,7 +163,7 @@ public class DashboardPage extends JPanel { JPanel headerPanel = new JPanel(new BorderLayout()); headerPanel.setOpaque(false); headerPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 20, 0)); - JLabel welcomeLabel = new JLabel("Chào mừng, " + LocalStorage.username); + JLabel welcomeLabel = new JLabel("Xin chào, " + LocalStorage.username); welcomeLabel.setFont(new Font("Segoe UI", Font.BOLD, 28)); welcomeLabel.setForeground(new Color(44, 82, 130)); lastUpdateLabel = new JLabel("Cập nhật lần cuối: " + getCurrentTime()); diff --git a/src/main/java/BsK/client/ui/component/DashboardPage/RecheckUpDialog/RecheckUpDialog.java b/src/main/java/BsK/client/ui/component/DashboardPage/RecheckUpDialog/RecheckUpDialog.java index 5f0c247..8aa3534 100644 --- a/src/main/java/BsK/client/ui/component/DashboardPage/RecheckUpDialog/RecheckUpDialog.java +++ b/src/main/java/BsK/client/ui/component/DashboardPage/RecheckUpDialog/RecheckUpDialog.java @@ -13,6 +13,7 @@ import javax.swing.border.EmptyBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableRowSorter; import java.awt.*; import java.awt.image.BufferedImage; import java.net.URLEncoder; @@ -29,6 +30,8 @@ import BsK.common.packet.req.GetRecheckUpListRequest; import BsK.common.packet.res.GetRecheckUpListResponse; import BsK.client.network.handler.ResponseListener; +import BsK.common.packet.req.AddRemindDateRequest; + public class RecheckUpDialog extends JDialog { private JTable recheckTable; @@ -40,6 +43,8 @@ public class RecheckUpDialog extends JDialog { private JTextArea previewMessageArea; private JCheckBox includeTemplateCheckbox; private JTextArea deepLinkTextArea; + + private int currentCheckUpId = 0; // NEW: Fields for filtering functionality private JComboBox dateFilterComboBox; @@ -103,7 +108,7 @@ public class RecheckUpDialog extends JDialog { JLabel filterLabel = new JLabel("Lọc theo ngày tái khám: "); filterLabel.setFont(new Font("Segoe UI", Font.BOLD, 14)); - String[] filterOptions = {"Tất cả", "Hôm nay", "Ngày mai", "Trong 2 ngày tới", "Trong 3 ngày tới", "Trong 1 tuần tới"}; + String[] filterOptions = {"Hôm nay", "Ngày mai", "Trong 2 ngày tới", "Trong 3 ngày tới", "Trong 1 tuần tới"}; dateFilterComboBox = new JComboBox<>(filterOptions); dateFilterComboBox.setFont(new Font("Segoe UI", Font.PLAIN, 14)); dateFilterComboBox.addActionListener(e -> filterAndDisplayTableData()); @@ -119,11 +124,17 @@ public class RecheckUpDialog extends JDialog { private JPanel createTablePanel() { JPanel tablePanel = new JPanel(new BorderLayout()); tablePanel.setOpaque(false); - String[] columnNames = {"Họ và tên", "Số điện thoại", "Ngày tái khám", "Ngày nhắc"}; + String[] columnNames = {"Họ và tên", "Số điện thoại", "Ngày tái khám", "Ngày nhắc", "ID"}; tableModel = new DefaultTableModel(columnNames, 0) { public boolean isCellEditable(int row, int column) { return false; } }; recheckTable = new JTable(tableModel); + recheckTable.setRowSorter(new TableRowSorter<>(tableModel)); + + recheckTable.getColumnModel().getColumn(4).setMinWidth(0); + recheckTable.getColumnModel().getColumn(4).setMaxWidth(0); + recheckTable.getColumnModel().getColumn(4).setWidth(0); + recheckTable.setRowHeight(30); recheckTable.setFont(new Font("Segoe UI", Font.PLAIN, 14)); recheckTable.getTableHeader().setFont(new Font("Segoe UI", Font.BOLD, 14)); @@ -230,9 +241,22 @@ public class RecheckUpDialog extends JDialog { }); JButton generateButton = new JButton("Tạo Tin & QR"); generateButton.setFont(new Font("Segoe UI", Font.BOLD, 12)); - generateButton.addActionListener(e -> generateMessageAndQr()); + generateButton.addActionListener(e -> { + generateMessageAndQr(); + }); + JButton addRemindDateButton = new JButton("Lưu ngày nhắc"); + addRemindDateButton.setFont(new Font("Segoe UI", Font.BOLD, 12)); + addRemindDateButton.addActionListener(e -> { + if (currentCheckUpId != 0) { + NetworkUtil.sendPacket(ClientHandler.ctx.channel(), new AddRemindDateRequest(String.valueOf(currentCheckUpId))); + } else { + JOptionPane.showMessageDialog(this, "Vui lòng chọn một bệnh nhân.", "Chưa chọn bệnh nhân", JOptionPane.WARNING_MESSAGE); + } + }); + buttonPanel.add(resetButton); buttonPanel.add(generateButton); + buttonPanel.add(addRemindDateButton); rightPanel.add(buttonPanel, BorderLayout.SOUTH); return rightPanel; @@ -249,7 +273,7 @@ public class RecheckUpDialog extends JDialog { String selectedFilter = (String) dateFilterComboBox.getSelectedItem(); if (selectedFilter == null) { - selectedFilter = "Tất cả"; // Default case + selectedFilter = "Hôm nay"; // Default case } LocalDate today = LocalDate.now(); @@ -262,9 +286,6 @@ public class RecheckUpDialog extends JDialog { boolean shouldAddRow = false; switch (selectedFilter) { - case "Tất cả": - shouldAddRow = true; - break; case "Hôm nay": shouldAddRow = recheckDate.isEqual(today); break; @@ -289,36 +310,48 @@ public class RecheckUpDialog extends JDialog { } catch (DateTimeParseException e) { System.err.println("Could not parse date string: " + dateString); // If the filter is "All", add rows with unparseable dates so they are not lost - if ("Tất cả".equals(selectedFilter)) { + if ("Hôm nay".equals(selectedFilter)) { tableModel.addRow(row); } } } } + private int getSelectedModelRow() { + int viewRow = recheckTable.getSelectedRow(); + if (viewRow != -1) { + return recheckTable.convertRowIndexToModel(viewRow); + } + return -1; + } + private void handleTableSelectionChange() { clearRightPanel(); - int selectedRow = recheckTable.getSelectedRow(); - if (selectedRow != -1) { - String sdt = (String) tableModel.getValueAt(selectedRow, 1); + int modelRow = getSelectedModelRow(); + + if (modelRow != -1) { + currentCheckUpId = Integer.parseInt((String) tableModel.getValueAt(modelRow, 4)); + String sdt = (String) tableModel.getValueAt(modelRow, 1); sdtDisplayField.setText(sdt); updatePreview(); + } else { + currentCheckUpId = 0; } } private void updatePreview() { - int selectedRow = recheckTable.getSelectedRow(); - if (selectedRow == -1) { + int modelRow = getSelectedModelRow(); + if (modelRow == -1) { templateArea.setText(""); previewMessageArea.setText(""); return; } - String patientName = (String) tableModel.getValueAt(selectedRow, 0); - String recheckDate = (String) tableModel.getValueAt(selectedRow, 2); + String patientName = (String) tableModel.getValueAt(modelRow, 0); + String recheckDate = (String) tableModel.getValueAt(modelRow, 2); String customContent = contentInputArea.getText(); - String templateText = String.format("Phòng khám Bs.K xin thông báo: Anh/Chị %s có lịch tái khám vào ngày %s.", patientName, recheckDate); + String templateText = String.format("Phòng khám Bs.Khắp xin thông báo: Anh/Chị %s có lịch tái khám vào ngày %s.", patientName, recheckDate); templateArea.setText(templateText); String fullMessage; @@ -331,13 +364,13 @@ public class RecheckUpDialog extends JDialog { } private void generateMessageAndQr() { - int selectedRow = recheckTable.getSelectedRow(); - if (selectedRow == -1) { + int modelRow = getSelectedModelRow(); + if (modelRow == -1) { JOptionPane.showMessageDialog(this, "Vui lòng chọn một bệnh nhân.", "Chưa chọn bệnh nhân", JOptionPane.WARNING_MESSAGE); return; } - String sdt = (String) tableModel.getValueAt(selectedRow, 1); + String sdt = (String) tableModel.getValueAt(modelRow, 1); String messageBody = previewMessageArea.getText(); if (messageBody.isEmpty()) { diff --git a/src/main/java/BsK/client/ui/component/DataDialog/DataDialog.java b/src/main/java/BsK/client/ui/component/DataDialog/DataDialog.java index 609c5ce..a2b8979 100644 --- a/src/main/java/BsK/client/ui/component/DataDialog/DataDialog.java +++ b/src/main/java/BsK/client/ui/component/DataDialog/DataDialog.java @@ -1,5 +1,7 @@ package BsK.client.ui.component.DataDialog; +import BsK.client.ui.component.common.AddDialog.AddDialog; + import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.table.DefaultTableModel; @@ -28,6 +30,9 @@ public class DataDialog extends JDialog { private int recordsPerPage = 20; private int totalRecords = 157; + private JPanel mainPanel; + private JPanel paginationPanel; + public DataDialog(JFrame parent) { super(parent, "Quản Lý Dữ Liệu Khám Bệnh", true); initializeDialog(); @@ -41,13 +46,14 @@ public class DataDialog extends JDialog { setLayout(new BorderLayout()); // Create main panel with padding - JPanel mainPanel = new JPanel(new BorderLayout()); + mainPanel = new JPanel(new BorderLayout()); mainPanel.setBorder(new EmptyBorder(20, 20, 20, 20)); // Add components mainPanel.add(createControlPanel(), BorderLayout.NORTH); mainPanel.add(createDataGridPanel(), BorderLayout.CENTER); - mainPanel.add(createPaginationPanel(), BorderLayout.SOUTH); + paginationPanel = createPaginationPanel(); + mainPanel.add(paginationPanel, BorderLayout.SOUTH); add(mainPanel); } @@ -130,7 +136,8 @@ public class DataDialog extends JDialog { // Add action listeners addNewButton.addActionListener(e -> { - JOptionPane.showMessageDialog(this, "Chức năng thêm mới sẽ chuyển đến trang Thăm khám với form trống", "Thông báo", JOptionPane.INFORMATION_MESSAGE); + AddDialog addDialog = new AddDialog((Frame) getParent()); + addDialog.setVisible(true); }); exportExcelButton.addActionListener(e -> { @@ -288,11 +295,11 @@ public class DataDialog extends JDialog { resultCountLabel.setText(String.format("Hiển thị %d đến %d của %d kết quả", startRecord, endRecord, totalRecords)); // Update pagination buttons - Component parent = firstPageButton.getParent(); - parent.removeAll(); - parent.add(createPaginationPanel()); - parent.revalidate(); - parent.repaint(); + mainPanel.remove(paginationPanel); + paginationPanel = createPaginationPanel(); + mainPanel.add(paginationPanel, BorderLayout.SOUTH); + mainPanel.revalidate(); + mainPanel.repaint(); } // Custom renderer for action buttons diff --git a/src/main/java/BsK/common/packet/req/AddRemindDateRequest.java b/src/main/java/BsK/common/packet/req/AddRemindDateRequest.java new file mode 100644 index 0000000..6533642 --- /dev/null +++ b/src/main/java/BsK/common/packet/req/AddRemindDateRequest.java @@ -0,0 +1,11 @@ +package BsK.common.packet.req; + +import BsK.common.packet.Packet; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class AddRemindDateRequest implements Packet { + private String checkupId; +} diff --git a/src/main/java/BsK/server/Server.java b/src/main/java/BsK/server/Server.java index faf4a55..d6c5be6 100644 --- a/src/main/java/BsK/server/Server.java +++ b/src/main/java/BsK/server/Server.java @@ -265,6 +265,7 @@ public class Server { } public static void main(String[] args) throws InterruptedException, SQLException { + log.info("\n____ _____ _ __\n| _ \\ / ____| |/\n| |_) | (___ | ' /\n| _ < \\___ \\| <\n| |_) |____) | . \\\n|____/|_____/|_|\\_\n"); // Initialize and show server dashboard ServerDashboard dashboard = ServerDashboard.getInstance(); dashboard.setVisible(true); diff --git a/src/main/java/BsK/server/ServerDashboard.java b/src/main/java/BsK/server/ServerDashboard.java index 6ad4ef0..85778b4 100644 --- a/src/main/java/BsK/server/ServerDashboard.java +++ b/src/main/java/BsK/server/ServerDashboard.java @@ -107,7 +107,7 @@ public class ServerDashboard extends JFrame { // Create split pane for logs and network info JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); - splitPane.setResizeWeight(0.6); // Give more space to the top component + splitPane.setResizeWeight(0.1); // Give more space to the top component // Network Information Panel JPanel networkPanel = new JPanel(new BorderLayout()); diff --git a/src/main/java/BsK/server/network/handler/ServerHandler.java b/src/main/java/BsK/server/network/handler/ServerHandler.java index e75f847..5f468bf 100644 --- a/src/main/java/BsK/server/network/handler/ServerHandler.java +++ b/src/main/java/BsK/server/network/handler/ServerHandler.java @@ -752,265 +752,195 @@ public class ServerHandler extends SimpleChannelInboundHandler 0) { + conn.setAutoCommit(false); // Start transaction - // Get next prescription_id - String getNextIdSql = "SELECT COALESCE(MAX(prescription_id), 0) + 1 as next_id FROM MedicineOrder"; - PreparedStatement nextIdStmt = conn.prepareStatement(getNextIdSql); - ResultSet rs = nextIdStmt.executeQuery(); - if (rs.next()) { - prescriptionId = rs.getString("next_id"); + // 1. Insert/Update Customer (Now safe with try-with-resources) + String customerSql = """ + INSERT INTO Customer ( + customer_id, customer_first_name, customer_last_name, customer_dob, + customer_gender, customer_address, customer_number, cccd_ddcn + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(customer_id) DO UPDATE SET + customer_first_name = excluded.customer_first_name, + customer_last_name = excluded.customer_last_name, + customer_dob = excluded.customer_dob, + customer_gender = excluded.customer_gender, + customer_address = excluded.customer_address, + customer_number = excluded.customer_number, + cccd_ddcn = excluded.cccd_ddcn + """; + + try (PreparedStatement customerStmt = conn.prepareStatement(customerSql)) { + customerStmt.setInt(1, saveCheckupRequest.getCustomerId()); + customerStmt.setString(2, saveCheckupRequest.getCustomerFirstName()); + customerStmt.setString(3, saveCheckupRequest.getCustomerLastName()); + customerStmt.setLong(4, saveCheckupRequest.getCustomerDob()); + customerStmt.setString(5, saveCheckupRequest.getCustomerGender()); + customerStmt.setString(6, saveCheckupRequest.getCustomerAddress()); + customerStmt.setString(7, saveCheckupRequest.getCustomerNumber()); + customerStmt.setString(8, saveCheckupRequest.getCustomerCccdDdcn()); + customerStmt.executeUpdate(); + log.info("Customer saved successfully"); } - rs.close(); - nextIdStmt.close(); - } - - // 3. Insert/Update Checkup - String checkupSql = """ - INSERT INTO Checkup ( - checkup_id, customer_id, doctor_id, checkup_date, - suggestion, diagnosis, prescription_id, notes, status, checkup_type, conclusion, reCheckupDate, customer_weight, customer_height, - heart_beat, blood_pressure, doctor_ultrasound_id - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - ON CONFLICT(checkup_id) DO UPDATE SET - suggestion = excluded.suggestion, - diagnosis = excluded.diagnosis, - prescription_id = excluded.prescription_id, - notes = excluded.notes, - status = excluded.status, - checkup_type = excluded.checkup_type, - conclusion = excluded.conclusion, - reCheckupDate = excluded.reCheckupDate, - customer_weight = excluded.customer_weight, - customer_height = excluded.customer_height, - heart_beat = excluded.heart_beat, - blood_pressure = excluded.blood_pressure, - doctor_ultrasound_id = excluded.doctor_ultrasound_id, - doctor_id = excluded.doctor_id - """; - - PreparedStatement checkupStmt = conn.prepareStatement(checkupSql); - checkupStmt.setInt(1, saveCheckupRequest.getCheckupId()); - checkupStmt.setInt(2, saveCheckupRequest.getCustomerId()); - checkupStmt.setInt(3, saveCheckupRequest.getDoctorId()); - checkupStmt.setLong(4, saveCheckupRequest.getCheckupDate()); - checkupStmt.setString(5, saveCheckupRequest.getSuggestions()); - checkupStmt.setString(6, saveCheckupRequest.getDiagnosis()); - checkupStmt.setString(7, prescriptionId); - checkupStmt.setString(8, saveCheckupRequest.getNotes()); - checkupStmt.setString(9, saveCheckupRequest.getStatus()); - checkupStmt.setString(10, saveCheckupRequest.getCheckupType()); - checkupStmt.setString(11, saveCheckupRequest.getConclusion()); - checkupStmt.setLong(12, saveCheckupRequest.getReCheckupDate()); - checkupStmt.setDouble(13, saveCheckupRequest.getCustomerWeight()); - checkupStmt.setDouble(14, saveCheckupRequest.getCustomerHeight()); - checkupStmt.setInt(15, saveCheckupRequest.getHeartBeat()); - checkupStmt.setString(16, saveCheckupRequest.getBloodPressure()); - checkupStmt.setInt(17, saveCheckupRequest.getDoctorUltrasoundId()); - checkupStmt.executeUpdate(); - log.info("Prescription ID generated or edited: {}", prescriptionId); - log.info("Checkup saved successfully"); - - // 4. Handle Medicine Prescriptions - // First, delete all existing items for this checkup to handle edits/removals - try (PreparedStatement deleteOrderItemsStmt = conn.prepareStatement("DELETE FROM OrderItem WHERE checkup_id = ?")) { - deleteOrderItemsStmt.setInt(1, saveCheckupRequest.getCheckupId()); - deleteOrderItemsStmt.executeUpdate(); - } - try (PreparedStatement deleteMedicineOrderStmt = conn.prepareStatement("DELETE FROM MedicineOrder WHERE checkup_id = ?")) { - deleteMedicineOrderStmt.setInt(1, saveCheckupRequest.getCheckupId()); - deleteMedicineOrderStmt.executeUpdate(); - } - log.info("Cleared previous medicine prescription for checkup_id: {}", saveCheckupRequest.getCheckupId()); - - if (saveCheckupRequest.getMedicinePrescription() != null && - saveCheckupRequest.getMedicinePrescription().length > 0 && prescriptionId != null) { - // Calculate total amount for medicine order - double totalMedicineAmount = 0; - for (String[] medicine : saveCheckupRequest.getMedicinePrescription()) { - if (medicine.length > 8) { - try { - totalMedicineAmount += Double.parseDouble(medicine[8]); // total_price - } catch (NumberFormatException e) { - log.warn("Invalid medicine total price: {}", medicine[8]); + // This will hold the new ID generated by the database. + Integer newPrescriptionId = null; + + // 2. Handle Medicine Prescriptions + if (saveCheckupRequest.getMedicinePrescription() != null && + saveCheckupRequest.getMedicinePrescription().length > 0) { + + // First, clear old data for this checkup + try (PreparedStatement deleteOrderItemsStmt = conn.prepareStatement("DELETE FROM OrderItem WHERE checkup_id = ?")) { + deleteOrderItemsStmt.setInt(1, saveCheckupRequest.getCheckupId()); + deleteOrderItemsStmt.executeUpdate(); } - } - } - - // Insert/Update MedicineOrder - String medicineOrderSql = """ - INSERT INTO MedicineOrder ( - prescription_id, checkup_id, customer_id, - total_amount, payment_method, status, - payment_status, processed_by, notes, datetime - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_DATE) - ON CONFLICT(prescription_id, checkup_id) DO UPDATE SET - customer_id = excluded.customer_id, - total_amount = excluded.total_amount, - payment_method = excluded.payment_method, - status = excluded.status, - payment_status = excluded.payment_status, - processed_by = excluded.processed_by, - notes = excluded.notes, - datetime = CURRENT_DATE - """; - - PreparedStatement medicineOrderStmt = conn.prepareStatement(medicineOrderSql); - medicineOrderStmt.setString(1, prescriptionId); - medicineOrderStmt.setInt(2, saveCheckupRequest.getCheckupId()); - medicineOrderStmt.setInt(3, saveCheckupRequest.getCustomerId()); - medicineOrderStmt.setDouble(4, totalMedicineAmount); - medicineOrderStmt.setString(5, ""); // payment_method - medicineOrderStmt.setString(6, "Pending"); // status - medicineOrderStmt.setString(7, "Unpaid"); // payment_status - medicineOrderStmt.setString(8, ""); // processed_by - medicineOrderStmt.setString(9, ""); // notes - medicineOrderStmt.executeUpdate(); - log.info("MedicineOrder saved successfully"); - // Insert OrderItems - String orderItemSql = """ - INSERT INTO OrderItem ( - prescription_id, med_id, quantity_ordered, - dosage, duration, price_per_unit, total_price, checkup_id, notes - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) - ON CONFLICT(order_item_id) DO UPDATE SET - quantity_ordered = excluded.quantity_ordered, - dosage = excluded.dosage, - duration = excluded.duration, - price_per_unit = excluded.price_per_unit, - total_price = excluded.total_price, - checkup_id = excluded.checkup_id, - notes = excluded.notes - """; - log.info("OrderItem saved successfully"); - PreparedStatement orderItemStmt = conn.prepareStatement(orderItemSql); - - for (String[] medicine : saveCheckupRequest.getMedicinePrescription()) { - if (medicine.length >= 10) { - orderItemStmt.setString(1, prescriptionId); - orderItemStmt.setString(2, medicine[0]); // med_id - orderItemStmt.setString(3, medicine[2]); // quantity + try (PreparedStatement deleteMedicineOrderStmt = conn.prepareStatement("DELETE FROM MedicineOrder WHERE checkup_id = ?")) { + deleteMedicineOrderStmt.setInt(1, saveCheckupRequest.getCheckupId()); + deleteMedicineOrderStmt.executeUpdate(); + } + log.info("Cleared previous medicine prescription for checkup_id: {}", saveCheckupRequest.getCheckupId()); + + // A. Insert a new MedicineOrder record to get the auto-generated ID + String medicineOrderSql = """ + INSERT INTO MedicineOrder ( + checkup_id, customer_id, total_amount, payment_method, + status, payment_status, processed_by, notes + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?) + """; - // Build dosage string from morning, noon, evening - String dosage = String.format("Sáng %s, Trưa %s, Chiều %s", - medicine[4], medicine[5], medicine[6]); - orderItemStmt.setString(4, dosage); - orderItemStmt.setString(5, ""); // duration - could be calculated or added to request - orderItemStmt.setString(6, medicine[7]); // unit_price - orderItemStmt.setString(7, medicine[8]); // total_price - orderItemStmt.setInt(8, saveCheckupRequest.getCheckupId()); - orderItemStmt.setString(9, medicine[9]); // notes - orderItemStmt.addBatch(); - } + // Use RETURN_GENERATED_KEYS to get the new ID back + try (PreparedStatement medicineOrderStmt = conn.prepareStatement(medicineOrderSql, PreparedStatement.RETURN_GENERATED_KEYS)) { + // ... (your existing totalMedicineAmount calculation) ... + double totalMedicineAmount = 0; + for (String[] medicine : saveCheckupRequest.getMedicinePrescription()) { + if (medicine.length > 8) { totalMedicineAmount += Double.parseDouble(medicine[8]); } + } + + medicineOrderStmt.setInt(1, saveCheckupRequest.getCheckupId()); + medicineOrderStmt.setInt(2, saveCheckupRequest.getCustomerId()); + medicineOrderStmt.setDouble(3, totalMedicineAmount); + medicineOrderStmt.setString(4, ""); // payment_method + medicineOrderStmt.setString(5, "Pending"); // status + medicineOrderStmt.setString(6, "Unpaid"); // payment_status + medicineOrderStmt.setString(7, ""); // processed_by + medicineOrderStmt.setString(8, ""); // notes + medicineOrderStmt.executeUpdate(); + + // B. Retrieve the generated key + try (ResultSet generatedKeys = medicineOrderStmt.getGeneratedKeys()) { + if (generatedKeys.next()) { + newPrescriptionId = generatedKeys.getInt(1); + log.info("New prescription_id generated: {}", newPrescriptionId); + } else { + throw new SQLException("Creating medicine order failed, no ID obtained."); + } + } + } + + // C. Insert OrderItems using the new prescription_id + String orderItemSql = """ + INSERT INTO OrderItem ( + prescription_id, med_id, quantity_ordered, dosage, duration, + price_per_unit, total_price, checkup_id, notes + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + """; + try (PreparedStatement orderItemStmt = conn.prepareStatement(orderItemSql)) { + for (String[] medicine : saveCheckupRequest.getMedicinePrescription()) { + if (medicine.length >= 10) { + orderItemStmt.setInt(1, newPrescriptionId); // Use the new ID + orderItemStmt.setString(2, medicine[0]); // med_id + orderItemStmt.setString(3, medicine[2]); // quantity + String dosage = String.format("Sáng %s, Trưa %s, Chiều %s", medicine[4], medicine[5], medicine[6]); + orderItemStmt.setString(4, dosage); + orderItemStmt.setString(5, ""); // duration + orderItemStmt.setString(6, medicine[7]); // unit_price + orderItemStmt.setString(7, medicine[8]); // total_price + orderItemStmt.setInt(8, saveCheckupRequest.getCheckupId()); + orderItemStmt.setString(9, medicine[9]); // notes + orderItemStmt.addBatch(); + } + } + orderItemStmt.executeBatch(); + log.info("OrderItems saved for prescription_id: {}", newPrescriptionId); + } } - orderItemStmt.executeBatch(); - } - log.info("Medicine prescriptions saved successfully"); - - // 5. Handle Service Prescriptions - // First, delete all existing services for this checkup - try (PreparedStatement deleteServiceStmt = conn.prepareStatement("DELETE FROM CheckupService WHERE checkup_id = ?")) { - deleteServiceStmt.setInt(1, saveCheckupRequest.getCheckupId()); - deleteServiceStmt.executeUpdate(); - } - log.info("Cleared previous service prescription for checkup_id: {}", saveCheckupRequest.getCheckupId()); - - if (saveCheckupRequest.getServicePrescription() != null && - saveCheckupRequest.getServicePrescription().length > 0) { + + // 3. Insert/Update Checkup with the correct newPrescriptionId + String checkupSql = """ + INSERT INTO Checkup ( + checkup_id, customer_id, doctor_id, checkup_date, suggestion, diagnosis, + prescription_id, notes, status, checkup_type, conclusion, reCheckupDate, + customer_weight, customer_height, heart_beat, blood_pressure, doctor_ultrasound_id + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(checkup_id) DO UPDATE SET + suggestion = excluded.suggestion, diagnosis = excluded.diagnosis, + prescription_id = excluded.prescription_id, notes = excluded.notes, + status = excluded.status, checkup_type = excluded.checkup_type, + conclusion = excluded.conclusion, reCheckupDate = excluded.reCheckupDate, + customer_weight = excluded.customer_weight, customer_height = excluded.customer_height, + heart_beat = excluded.heart_beat, blood_pressure = excluded.blood_pressure, + doctor_ultrasound_id = excluded.doctor_ultrasound_id, doctor_id = excluded.doctor_id + """; - String serviceSql = """ - INSERT INTO CheckupService ( - checkup_id, service_id, quantity, - total_cost, status, checkup_date - ) VALUES (?, ?, ?, ?, ?, CURRENT_DATE) - ON CONFLICT(order_id) DO UPDATE SET - quantity = excluded.quantity, - total_cost = excluded.total_cost, - status = excluded.status - """; - - PreparedStatement serviceStmt = conn.prepareStatement(serviceSql); - - for (String[] service : saveCheckupRequest.getServicePrescription()) { - if (service.length >= 6) { - serviceStmt.setInt(1, saveCheckupRequest.getCheckupId()); - serviceStmt.setString(2, service[0]); // service_id - serviceStmt.setString(3, service[2]); // quantity - serviceStmt.setString(4, service[4]); // total_cost - serviceStmt.setString(5, "PENDING"); // status - - serviceStmt.addBatch(); - } + try (PreparedStatement checkupStmt = conn.prepareStatement(checkupSql)) { + checkupStmt.setInt(1, saveCheckupRequest.getCheckupId()); + checkupStmt.setInt(2, saveCheckupRequest.getCustomerId()); + checkupStmt.setInt(3, saveCheckupRequest.getDoctorId()); + checkupStmt.setLong(4, saveCheckupRequest.getCheckupDate()); + checkupStmt.setString(5, saveCheckupRequest.getSuggestions()); + checkupStmt.setString(6, saveCheckupRequest.getDiagnosis()); + // Use setObject to handle the case where newPrescriptionId is null + checkupStmt.setObject(7, newPrescriptionId); + checkupStmt.setString(8, saveCheckupRequest.getNotes()); + checkupStmt.setString(9, saveCheckupRequest.getStatus()); + checkupStmt.setString(10, saveCheckupRequest.getCheckupType()); + checkupStmt.setString(11, saveCheckupRequest.getConclusion()); + if (saveCheckupRequest.getReCheckupDate() != null) { + checkupStmt.setLong(12, saveCheckupRequest.getReCheckupDate()); + } else { + checkupStmt.setLong(12, 0); + } + checkupStmt.setDouble(13, saveCheckupRequest.getCustomerWeight()); + checkupStmt.setDouble(14, saveCheckupRequest.getCustomerHeight()); + checkupStmt.setInt(15, saveCheckupRequest.getHeartBeat()); + checkupStmt.setString(16, saveCheckupRequest.getBloodPressure()); + checkupStmt.setInt(17, saveCheckupRequest.getDoctorUltrasoundId()); + checkupStmt.executeUpdate(); + log.info("Checkup saved successfully"); } - serviceStmt.executeBatch(); - } - log.info("Service prescriptions saved successfully"); - // Commit transaction - conn.commit(); - log.info("Successfully saved checkup {} with all related data", saveCheckupRequest.getCheckupId()); - - UserUtil.sendPacket(currentUser.getSessionId(), new SaveCheckupRes(true, "Checkup saved successfully")); - + + // 4. Handle Service Prescriptions (Now safe with try-with-resources) + // ... (your existing service handling logic is fine, just wrap it) ... + + conn.commit(); // Commit the entire transaction + log.info("Successfully saved checkup {} with all related data", saveCheckupRequest.getCheckupId()); + UserUtil.sendPacket(currentUser.getSessionId(), new SaveCheckupRes(true, "Checkup saved successfully")); + } catch (Exception e) { - log.error("Error saving checkup transaction", e); - // Rollback transaction on error - if (conn != null) { - try { - conn.rollback(); - log.info("Transaction rolled back due to error"); - } catch (SQLException rollbackEx) { - log.error("Error rolling back transaction", rollbackEx); + log.error("Error saving checkup transaction", e); + if (conn != null) { + try { + conn.rollback(); + log.info("Transaction rolled back due to error"); + } catch (SQLException rollbackEx) { + log.error("Error rolling back transaction", rollbackEx); + } } - } - UserUtil.sendPacket(currentUser.getSessionId(), new ErrorResponse(Error.SQL_EXCEPTION)); + UserUtil.sendPacket(currentUser.getSessionId(), new ErrorResponse(Error.SQL_EXCEPTION)); } finally { - // Restore auto-commit - if (conn != null) { - try { - conn.setAutoCommit(true); - } catch (SQLException e) { - log.error("Error restoring auto-commit", e); + if (conn != null) { + try { + conn.setAutoCommit(true); // Restore auto-commit mode + } catch (SQLException e) { + log.error("Error restoring auto-commit", e); + } } - } } - } + } if (packet instanceof GetOrderInfoByCheckupReq getOrderInfoByCheckupReq) { log.debug("Received GetOrderInfoByCheckupReq for checkupId: {}", getOrderInfoByCheckupReq.getCheckupId()); @@ -1402,46 +1332,65 @@ public class ServerHandler extends SimpleChannelInboundHandler results = new ArrayList<>(); - while (rs.next()) { - String[] row = new String[5]; - row[0] = rs.getString("customer_last_name") + " " + rs.getString("customer_first_name"); - row[1] = rs.getString("customer_number"); - - long recheckTimestamp = rs.getLong("reCheckupDate"); - long remindTimestamp = rs.getLong("remind_date"); - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); - row[2] = sdf.format(new Date(recheckTimestamp)); - row[3] = sdf.format(new Date(remindTimestamp)); - row[4] = rs.getString("checkup_id"); - results.add(row); - } - - UserUtil.sendPacket(currentUser.getSessionId(), new GetRecheckUpListResponse(results.toArray(new String[0][]))); - + stmt.setLong(1, System.currentTimeMillis()); + stmt.setString(2, addRemindDateRequest.getCheckupId()); + stmt.executeUpdate(); + log.info("Updated remind_date for checkup_id: {}", addRemindDateRequest.getCheckupId()); + getRecheckUpList(currentUser.getSessionId()); } catch (SQLException e) { - log.error("Error fetching recheck-up list", e); + log.error("Error updating remind_date", e); UserUtil.sendPacket(currentUser.getSessionId(), new ErrorResponse(Error.SQL_EXCEPTION)); } } } } + private void getRecheckUpList(int sessionId) { + try { + String sql = "SELECT c.customer_last_name, c.customer_first_name, c.customer_number, ch.reCheckupDate, ch.remind_date, ch.checkup_id " + + "FROM Checkup ch " + + "JOIN Customer c ON ch.customer_id = c.customer_id " + + "WHERE ch.reCheckupDate BETWEEN ? AND ?"; + + long fromDate = System.currentTimeMillis(); + long toDate = fromDate + (7L * 24 * 60 * 60 * 1000); + + PreparedStatement stmt = Server.connection.prepareStatement(sql); + stmt.setLong(1, fromDate); + stmt.setLong(2, toDate); + + ResultSet rs = stmt.executeQuery(); + + List results = new ArrayList<>(); + while (rs.next()) { + String[] row = new String[5]; + row[0] = rs.getString("customer_last_name") + " " + rs.getString("customer_first_name"); + row[1] = rs.getString("customer_number"); + + long recheckTimestamp = rs.getLong("reCheckupDate"); + long remindTimestamp = rs.getLong("remind_date"); + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); + row[2] = sdf.format(new Date(recheckTimestamp)); + row[3] = sdf.format(new Date(remindTimestamp)); + row[4] = rs.getString("checkup_id"); + results.add(row); + } + + UserUtil.sendPacket(sessionId, new GetRecheckUpListResponse(results.toArray(new String[0][]))); + + } catch (SQLException e) { + log.error("Error fetching recheck-up list", e); + UserUtil.sendPacket(sessionId, new ErrorResponse(Error.SQL_EXCEPTION)); + } + } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { if (cause instanceof IOException) { diff --git a/src/main/resources/database/BSK.db b/src/main/resources/database/BSK.db index adf7f07..6f727b3 100644 Binary files a/src/main/resources/database/BSK.db and b/src/main/resources/database/BSK.db differ diff --git a/src/main/resources/image/checkup_media/11/IMG_11_20250604_025917.png b/src/main/resources/image/checkup_media/11/IMG_11_20250604_025917.png deleted file mode 100644 index 4a45334..0000000 Binary files a/src/main/resources/image/checkup_media/11/IMG_11_20250604_025917.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/11/VID_11_20250604_032332.mp4 b/src/main/resources/image/checkup_media/11/VID_11_20250604_032332.mp4 deleted file mode 100644 index f82fb92..0000000 Binary files a/src/main/resources/image/checkup_media/11/VID_11_20250604_032332.mp4 and /dev/null differ diff --git a/src/main/resources/image/checkup_media/13/VID_13_20250604_032008.mp4 b/src/main/resources/image/checkup_media/13/VID_13_20250604_032008.mp4 deleted file mode 100644 index 36df072..0000000 Binary files a/src/main/resources/image/checkup_media/13/VID_13_20250604_032008.mp4 and /dev/null differ diff --git a/src/main/resources/image/checkup_media/2/IMG_2_20250611_221402.png b/src/main/resources/image/checkup_media/2/IMG_2_20250611_221402.png deleted file mode 100644 index 8a64c58..0000000 Binary files a/src/main/resources/image/checkup_media/2/IMG_2_20250611_221402.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/2/IMG_2_20250611_221404.png b/src/main/resources/image/checkup_media/2/IMG_2_20250611_221404.png deleted file mode 100644 index 18b236e..0000000 Binary files a/src/main/resources/image/checkup_media/2/IMG_2_20250611_221404.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/2/IMG_2_20250611_221406.png b/src/main/resources/image/checkup_media/2/IMG_2_20250611_221406.png deleted file mode 100644 index 53c7aba..0000000 Binary files a/src/main/resources/image/checkup_media/2/IMG_2_20250611_221406.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/3/IMG_3_20250604_031612.png b/src/main/resources/image/checkup_media/3/IMG_3_20250604_031612.png deleted file mode 100644 index 526c0df..0000000 Binary files a/src/main/resources/image/checkup_media/3/IMG_3_20250604_031612.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/3/VID_3_20250604_031615.mp4 b/src/main/resources/image/checkup_media/3/VID_3_20250604_031615.mp4 deleted file mode 100644 index feb280b..0000000 Binary files a/src/main/resources/image/checkup_media/3/VID_3_20250604_031615.mp4 and /dev/null differ diff --git a/src/main/resources/image/checkup_media/4/IMG_4_20250611_222518.png b/src/main/resources/image/checkup_media/4/IMG_4_20250611_222518.png deleted file mode 100644 index f823137..0000000 Binary files a/src/main/resources/image/checkup_media/4/IMG_4_20250611_222518.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/4/IMG_4_20250611_222520.png b/src/main/resources/image/checkup_media/4/IMG_4_20250611_222520.png deleted file mode 100644 index 3f35963..0000000 Binary files a/src/main/resources/image/checkup_media/4/IMG_4_20250611_222520.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/4/IMG_4_20250611_222522.png b/src/main/resources/image/checkup_media/4/IMG_4_20250611_222522.png deleted file mode 100644 index f34b0a9..0000000 Binary files a/src/main/resources/image/checkup_media/4/IMG_4_20250611_222522.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/4/IMG_4_20250611_222524.png b/src/main/resources/image/checkup_media/4/IMG_4_20250611_222524.png deleted file mode 100644 index 62d1729..0000000 Binary files a/src/main/resources/image/checkup_media/4/IMG_4_20250611_222524.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/6/IMG_6_20250604_025427.png b/src/main/resources/image/checkup_media/6/IMG_6_20250604_025427.png deleted file mode 100644 index 382d95e..0000000 Binary files a/src/main/resources/image/checkup_media/6/IMG_6_20250604_025427.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/6/IMG_6_20250604_025430.png b/src/main/resources/image/checkup_media/6/IMG_6_20250604_025430.png deleted file mode 100644 index d2dab45..0000000 Binary files a/src/main/resources/image/checkup_media/6/IMG_6_20250604_025430.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/6/IMG_6_20250611_151415.png b/src/main/resources/image/checkup_media/6/IMG_6_20250611_151415.png deleted file mode 100644 index e3ef971..0000000 Binary files a/src/main/resources/image/checkup_media/6/IMG_6_20250611_151415.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/6/IMG_6_20250611_151418.png b/src/main/resources/image/checkup_media/6/IMG_6_20250611_151418.png deleted file mode 100644 index 89baa2a..0000000 Binary files a/src/main/resources/image/checkup_media/6/IMG_6_20250611_151418.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/6/IMG_6_20250611_151421.png b/src/main/resources/image/checkup_media/6/IMG_6_20250611_151421.png deleted file mode 100644 index bcf7006..0000000 Binary files a/src/main/resources/image/checkup_media/6/IMG_6_20250611_151421.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/6/IMG_6_20250611_151426.png b/src/main/resources/image/checkup_media/6/IMG_6_20250611_151426.png deleted file mode 100644 index 8dc6161..0000000 Binary files a/src/main/resources/image/checkup_media/6/IMG_6_20250611_151426.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/8/IMG_8_20250608_041453.png b/src/main/resources/image/checkup_media/8/IMG_8_20250608_041453.png deleted file mode 100644 index edae337..0000000 Binary files a/src/main/resources/image/checkup_media/8/IMG_8_20250608_041453.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/8/IMG_8_20250609_155646.png b/src/main/resources/image/checkup_media/8/IMG_8_20250609_155646.png deleted file mode 100644 index ab40f72..0000000 Binary files a/src/main/resources/image/checkup_media/8/IMG_8_20250609_155646.png and /dev/null differ diff --git a/src/main/resources/image/checkup_media/9/VID_9_20250604_030213.mp4 b/src/main/resources/image/checkup_media/9/VID_9_20250604_030213.mp4 deleted file mode 100644 index 3096a7c..0000000 Binary files a/src/main/resources/image/checkup_media/9/VID_9_20250604_030213.mp4 and /dev/null differ diff --git a/src/main/resources/image/checkup_media/9/VID_9_20250604_030547.mp4 b/src/main/resources/image/checkup_media/9/VID_9_20250604_030547.mp4 deleted file mode 100644 index 9975aa8..0000000 Binary files a/src/main/resources/image/checkup_media/9/VID_9_20250604_030547.mp4 and /dev/null differ diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 197a4c2..92a044f 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -3,13 +3,13 @@ + pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p - %-40.40c{1.}:%L : %m%n"/> - %d{yyyy-MM-dd HH:mm:ss.SSS} %5p - %-40.40c{1.} : %m%n + %d{yyyy-MM-dd HH:mm:ss.SSS} %5p - %-40.40c{1.}:%L : %m%n @@ -20,7 +20,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} %5p - %-40.40c{1.} : %m%n + %d{yyyy-MM-dd HH:mm:ss.SSS} %5p - %-40.40c{1.}:%L : %m%n