diff --git a/logs/bsk_server-3.log.gz b/logs/bsk_server-3.log.gz new file mode 100644 index 0000000..347065b Binary files /dev/null and b/logs/bsk_server-3.log.gz differ diff --git a/medical_invoice.pdf b/medical_invoice.pdf index 81b32b6..5936645 100644 Binary files a/medical_invoice.pdf and b/medical_invoice.pdf differ diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/AddDialog/AddDialog.java b/src/main/java/BsK/client/ui/component/CheckUpPage/AddDialog/AddDialog.java index 89e24c3..3cd0884 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/AddDialog/AddDialog.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/AddDialog/AddDialog.java @@ -115,9 +115,11 @@ public class AddDialog extends JDialog { public void dispose() { // Clean up listeners log.info("Cleaning up listeners"); - ClientHandler.deleteListener(AddCheckupResponse.class); - ClientHandler.deleteListener(AddPatientResponse.class); - ClientHandler.deleteListener(GetRecentPatientResponse.class); + ClientHandler.deleteListener(AddCheckupResponse.class, addCheckupResponseListener); + ClientHandler.deleteListener(AddPatientResponse.class, addPatientResponseListener); + ClientHandler.deleteListener(GetRecentPatientResponse.class, getRecentPatientResponseListener); + ClientHandler.deleteListener(GetDistrictResponse.class, districtResponseListener); + ClientHandler.deleteListener(GetWardResponse.class, wardResponseListener); super.dispose(); } @@ -213,7 +215,7 @@ public class AddDialog extends JDialog { } } }); - + // Send request to get the latest 20 patients in the database sendGetRecentPatientRequest(); ClientHandler.addResponseListener(GetDistrictResponse.class, districtResponseListener); 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 7649343..69660cf 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java @@ -426,7 +426,17 @@ public class CheckUpPage extends JPanel { addPatientButton.setBorder(BorderFactory.createEmptyBorder(8, 20, 8, 20)); // Reduced vertical padding from 10 to 8 addPatientButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); addPatientButton.addActionListener(e -> { - addDialog = new AddDialog(mainFrame); + // Dispose any existing dialog to ensure clean listener removal + if (addDialog != null) { + addDialog.dispose(); + } + addDialog = new AddDialog(mainFrame) { + @Override + public void dispose() { + super.dispose(); + addDialog = null; // Clear the reference when dialog is disposed + } + }; addDialog.setVisible(true); updateUpdateQueue(); }); diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/MedicineDialog/MedicineDialog.java b/src/main/java/BsK/client/ui/component/CheckUpPage/MedicineDialog/MedicineDialog.java index 9c70cb8..bedeb4a 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/MedicineDialog/MedicineDialog.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/MedicineDialog/MedicineDialog.java @@ -45,7 +45,7 @@ public class MedicineDialog extends JDialog { private JTextArea noteField; private DefaultTableModel tableModel, selectedTableModel; private String[] medcineColumns = {"ID", "Tên thuốc", "Công ty", "Mô tả", "Tồn kho", "ĐVT", "Giá"}; - private String[] suggestionColumns = {"Tên thuốc", "Tồn kho", "ĐVT", "Giá"}; + private String[] suggestionColumns = {"Tên thuốc", "Tồn kho", "ĐVT", "Giá", "Supplement"}; private String[][] medicineData; private final ResponseListener getMedInfoResponseListener = this::getMedInfoHandler; private TableColumnModel columnModel; @@ -512,10 +512,10 @@ public class MedicineDialog extends JDialog { if (selectedRow == -1) return; handleMedicineTableRowSelection(selectedRow); // Populate fields on any click - + suggestionPopup.setVisible(false); // Close popup on single click + if (e.getClickCount() == 2) { addSelectedMedicine(); - suggestionPopup.setVisible(false); } }); } @@ -646,11 +646,14 @@ public class MedicineDialog extends JDialog { for (Medicine med : medicines) { if (filterText.isEmpty() || TextUtils.removeAccents(med.getName().toLowerCase()).contains(lowerCaseFilterText)) { filteredMedicines.add(med); + // Show "Có" if supplement is "1", otherwise "Không" + String isSupplementText = "1".equals(med.getSupplement()) ? "Có" : "Không"; filteredDisplayData.add(new String[]{ med.getName(), med.getQuantity(), med.getUnit(), - med.getSellingPrice() + med.getSellingPrice(), + isSupplementText }); } } @@ -680,10 +683,11 @@ public class MedicineDialog extends JDialog { private void resizeSuggestionTableColumns() { columnModel = suggestionTable.getColumnModel(); - columnModel.getColumn(0).setPreferredWidth(200); // Tên thuốc + columnModel.getColumn(0).setPreferredWidth(180); // Tên thuốc columnModel.getColumn(1).setPreferredWidth(50); // Tồn kho columnModel.getColumn(2).setPreferredWidth(50); // ĐVT - columnModel.getColumn(3).setPreferredWidth(80); // Giá + columnModel.getColumn(3).setPreferredWidth(70); // Giá + columnModel.getColumn(4).setPreferredWidth(70); // Supplement } private void handleMedicineTableRowSelection(int viewRow) { diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/print_forms/medserinvoice.jrxml b/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/print_forms/medserinvoice.jrxml index 3a4d1ac..0d93802 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/print_forms/medserinvoice.jrxml +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/print_forms/medserinvoice.jrxml @@ -81,7 +81,7 @@ - + @@ -90,7 +90,7 @@ - + @@ -111,7 +111,7 @@ - + @@ -120,7 +120,7 @@ - + @@ -141,7 +141,7 @@ - + @@ -160,7 +160,7 @@ - + @@ -180,7 +180,7 @@ - + @@ -191,7 +191,7 @@ - + @@ -204,7 +204,7 @@ - + @@ -225,7 +225,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -253,7 +253,7 @@ - + @@ -301,7 +301,7 @@ - + @@ -322,7 +322,7 @@ - + @@ -331,7 +331,7 @@ - + @@ -351,7 +351,7 @@ - + @@ -370,7 +370,7 @@ - + @@ -390,7 +390,7 @@ - + @@ -401,7 +401,7 @@ - + @@ -413,7 +413,7 @@ - + @@ -434,7 +434,7 @@ - + @@ -445,7 +445,7 @@ - + @@ -462,7 +462,7 @@ - + @@ -506,7 +506,7 @@ - + @@ -528,7 +528,7 @@ - + @@ -537,7 +537,7 @@ - + @@ -557,7 +557,7 @@ - + @@ -576,7 +576,7 @@ - + @@ -596,7 +596,7 @@ - + @@ -607,7 +607,7 @@ - + @@ -619,7 +619,7 @@ - + @@ -640,7 +640,7 @@ - + @@ -651,7 +651,7 @@ - + @@ -668,7 +668,7 @@ - + @@ -783,7 +783,7 @@ - + diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/ServiceDialog/ServiceDialog.java b/src/main/java/BsK/client/ui/component/CheckUpPage/ServiceDialog/ServiceDialog.java index 0daa3f9..5e77656 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/ServiceDialog/ServiceDialog.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/ServiceDialog/ServiceDialog.java @@ -401,10 +401,10 @@ public class ServiceDialog extends JDialog { if (selectedRow == -1) return; handleServiceTableRowSelection(selectedRow); // Populate fields on any click - + suggestionPopup.setVisible(false); // Close popup on single click + if (e.getClickCount() == 2) { addSelectedService(); - suggestionPopup.setVisible(false); } }); } diff --git a/src/main/java/BsK/server/network/handler/ServerHandler.java b/src/main/java/BsK/server/network/handler/ServerHandler.java index 1d64e2b..c1895b0 100644 --- a/src/main/java/BsK/server/network/handler/ServerHandler.java +++ b/src/main/java/BsK/server/network/handler/ServerHandler.java @@ -711,7 +711,8 @@ public class ServerHandler extends SimpleChannelInboundHandler