diff --git a/medical_invoice.pdf b/medical_invoice.pdf index f98e23a..1a1915e 100644 Binary files a/medical_invoice.pdf and b/medical_invoice.pdf differ 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 ec27195..2e7f09e 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java @@ -116,6 +116,7 @@ public class CheckUpPage extends JPanel { private final ResponseListener districtResponseListener = this::handleGetDistrictResponse; private final ResponseListener wardResponseListener = this::handleGetWardResponse; private final ResponseListener callPatientResponseListener = this::handleCallPatientResponse; + private final ResponseListener orderInfoByCheckupListener = this::handleGetOrderInfoByCheckupResponse; private JTextField checkupIdField, customerLastNameField, customerFirstNameField,customerAddressField, customerPhoneField, customerIdField; private JTextArea suggestionField, diagnosisField, conclusionField; // Changed symptomsField to suggestionField private JTextPane notesField; @@ -272,6 +273,7 @@ public class CheckUpPage extends JPanel { ClientHandler.addResponseListener(GetCheckUpQueueResponse.class, checkUpQueueListener); ClientHandler.addResponseListener(GetCheckUpQueueUpdateResponse.class, checkUpQueueUpdateListener); ClientHandler.addResponseListener(GetPatientHistoryResponse.class, patientHistoryListener); + ClientHandler.addResponseListener(GetOrderInfoByCheckupRes.class, orderInfoByCheckupListener); ClientHandler.addResponseListener(GetDistrictResponse.class, districtResponseListener); ClientHandler.addResponseListener(GetWardResponse.class, wardResponseListener); ClientHandler.addResponseListener(CallPatientResponse.class, callPatientResponseListener); @@ -1235,9 +1237,7 @@ public class CheckUpPage extends JPanel { private void handleActionPanelClick(String name) { switch (name) { case "service": - if(serDialog == null) { - serDialog = new ServiceDialog(mainFrame); - } + serDialog = new ServiceDialog(mainFrame, this.servicePrescription); serDialog.setVisible(true); saved = false; servicePrescription = serDialog.getServicePrescription(); @@ -1257,9 +1257,7 @@ public class CheckUpPage extends JPanel { callingStatusLabel.setForeground(new Color(0, 100, 0)); break; case "medicine": - if(medDialog == null) { - medDialog = new MedicineDialog(mainFrame); - } + medDialog = new MedicineDialog(mainFrame, this.medicinePrescription); medDialog.setVisible(true); saved = false; medicinePrescription = medDialog.getMedicinePrescription(); @@ -1478,7 +1476,7 @@ public class CheckUpPage extends JPanel { checkupTypeComboBox.setSelectedItem(selectedPatient.getCheckupType()); NetworkUtil.sendPacket(ClientHandler.ctx.channel(), new GetPatientHistoryRequest(Integer.parseInt(selectedPatient.getCustomerId()))); - + NetworkUtil.sendPacket(ClientHandler.ctx.channel(), new GetOrderInfoByCheckupReq(selectedPatient.getCheckupId())); String fullAddress = selectedPatient.getCustomerAddress(); String[] addressParts = fullAddress.split(", "); if (addressParts.length > 0) customerAddressField.setText(addressParts[0]); @@ -1714,6 +1712,29 @@ public class CheckUpPage extends JPanel { callingStatusLabel.setBackground(new Color(217, 83, 79)); // Red background for calling } + private void handleGetOrderInfoByCheckupResponse(GetOrderInfoByCheckupRes response) { + log.info("Received order info for checkup."); + + // Ensure UI updates are on the Event Dispatch Thread + SwingUtilities.invokeLater(() -> { + this.medicinePrescription = response.getMedicinePrescription() != null ? response.getMedicinePrescription() : new String[0][0]; + this.servicePrescription = response.getServicePrescription() != null ? response.getServicePrescription() : new String[0][0]; + + // Pass the updated prescriptions to the dialogs if they exist + if (medDialog != null) { + // Assuming MedicineDialog has a method to update its data + // medDialog.setPrescription(this.medicinePrescription); + } + if (serDialog != null) { + // Assuming ServiceDialog has a method to update its data + // serDialog.setPrescription(this.servicePrescription); + } + + // Update the UI tree display + updatePrescriptionTree(); + }); + } + private JPanel createImageGalleryViewPanel() { JPanel panel = new JPanel(new BorderLayout(5, 5)); panel.setBorder(BorderFactory.createCompoundBorder( 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 01fcc30..1068149 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 @@ -84,8 +84,24 @@ public class MedicineDialog extends JDialog { NetworkUtil.sendPacket(ClientHandler.ctx.channel(), new GetMedInfoRequest()); } - public MedicineDialog(Frame parent) { - super(parent, "Thêm thuốc", true); + public MedicineDialog(final Frame parent) { + super(parent, "Đơn thuốc", true); + this.medicinePrescription = new String[0][0]; + init(parent); + } + + public MedicineDialog(final Frame parent, String[][] existingPrescription) { + super(parent, "Đơn thuốc", true); + this.medicinePrescription = existingPrescription != null ? existingPrescription : new String[0][0]; + init(parent); + if (existingPrescription != null) { + for (String[] row : existingPrescription) { + selectedTableModel.addRow(row); + } + } + } + + private void init(final Frame parent) { setDefaultCloseOperation(DISPOSE_ON_CLOSE); setSize(1100, 600); setLocationRelativeTo(parent); @@ -112,9 +128,6 @@ public class MedicineDialog extends JDialog { } }); - // Initialize medicinePrescription as empty array - medicinePrescription = new String[0][0]; - // Add response listener and send request for medicine data ClientHandler.addResponseListener(GetMedInfoResponse.class, getMedInfoResponseListener); sendGetMedInfoRequest(); @@ -472,7 +485,6 @@ public class MedicineDialog extends JDialog { }); cancelButton.addActionListener(e -> { - medicinePrescription = null; dispose(); }); } 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 e12bf5a..43bd5d3 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 @@ -71,6 +71,22 @@ public class ServiceDialog extends JDialog { public ServiceDialog(Frame parent) { super(parent, "Thêm dịch vụ", true); + this.servicePrescription = new String[0][0]; + initUI(parent); + } + + public ServiceDialog(Frame parent, String[][] existingPrescription) { + super(parent, "Thêm dịch vụ", true); + this.servicePrescription = existingPrescription != null ? existingPrescription : new String[0][0]; + initUI(parent); + if (existingPrescription != null) { + for (String[] row : existingPrescription) { + selectedTableModel.addRow(row); + } + } + } + + private void initUI(Frame parent) { setDefaultCloseOperation(DISPOSE_ON_CLOSE); setSize(1100, 600); setLocationRelativeTo(parent); @@ -97,9 +113,6 @@ public class ServiceDialog extends JDialog { } }); - // Initialize servicePrescription as empty array - servicePrescription = new String[0][0]; - // Add response listener and send request for service data ClientHandler.addResponseListener(GetSerInfoResponse.class, getSerInfoResponseListener); sendGetSerInfoRequest(); @@ -372,7 +385,6 @@ public class ServiceDialog extends JDialog { }); cancelButton.addActionListener(e -> { - servicePrescription = null; dispose(); }); } @@ -523,19 +535,16 @@ public class ServiceDialog extends JDialog { private void collectPrescriptionData() { int rowCount = selectedTableModel.getRowCount(); - if (rowCount == 0) { - servicePrescription = new String[0][0]; - return; - } - servicePrescription = new String[rowCount][6]; + List prescriptionList = new ArrayList<>(); for (int i = 0; i < rowCount; i++) { - servicePrescription[i][0] = selectedTableModel.getValueAt(i, 0).toString(); - servicePrescription[i][1] = selectedTableModel.getValueAt(i, 1).toString(); - servicePrescription[i][2] = selectedTableModel.getValueAt(i, 2).toString(); - servicePrescription[i][3] = selectedTableModel.getValueAt(i, 3).toString(); - servicePrescription[i][4] = selectedTableModel.getValueAt(i, 4).toString(); - servicePrescription[i][5] = selectedTableModel.getValueAt(i, 5).toString(); + String[] rowData = new String[selectedTableModel.getColumnCount()]; + for (int j = 0; j < selectedTableModel.getColumnCount(); j++) { + Object value = selectedTableModel.getValueAt(i, j); + rowData[j] = (value != null) ? value.toString() : ""; + } + prescriptionList.add(rowData); } + this.servicePrescription = prescriptionList.toArray(new String[0][]); } @Override diff --git a/src/main/java/BsK/common/packet/req/GetOrderInfoByCheckupReq.java b/src/main/java/BsK/common/packet/req/GetOrderInfoByCheckupReq.java new file mode 100644 index 0000000..a14a17e --- /dev/null +++ b/src/main/java/BsK/common/packet/req/GetOrderInfoByCheckupReq.java @@ -0,0 +1,13 @@ +package BsK.common.packet.req; + +import BsK.common.packet.Packet; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@AllArgsConstructor +@Data +public class GetOrderInfoByCheckupReq implements Packet{ + String checkupId; +} diff --git a/src/main/java/BsK/common/packet/res/GetOrderInfoByCheckupRes.java b/src/main/java/BsK/common/packet/res/GetOrderInfoByCheckupRes.java new file mode 100644 index 0000000..4ddbba5 --- /dev/null +++ b/src/main/java/BsK/common/packet/res/GetOrderInfoByCheckupRes.java @@ -0,0 +1,14 @@ +package BsK.common.packet.res; + +import BsK.common.packet.Packet; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@AllArgsConstructor +@Data +public class GetOrderInfoByCheckupRes implements Packet { + String[][] medicinePrescription; + String[][] servicePrescription; +} diff --git a/src/main/java/BsK/common/packet/res/SaveCheckupRes.java b/src/main/java/BsK/common/packet/res/SaveCheckupRes.java new file mode 100644 index 0000000..f8255bb --- /dev/null +++ b/src/main/java/BsK/common/packet/res/SaveCheckupRes.java @@ -0,0 +1,14 @@ +package BsK.common.packet.res; + +import BsK.common.packet.Packet; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@AllArgsConstructor +@Data +public class SaveCheckupRes implements Packet { + boolean success; + String message; +} diff --git a/src/main/java/BsK/server/network/handler/ServerHandler.java b/src/main/java/BsK/server/network/handler/ServerHandler.java index 8fb40aa..5e42e04 100644 --- a/src/main/java/BsK/server/network/handler/ServerHandler.java +++ b/src/main/java/BsK/server/network/handler/ServerHandler.java @@ -757,7 +757,19 @@ public class ServerHandler extends SimpleChannelInboundHandler 0 && prescriptionId != null) { @@ -842,7 +854,15 @@ public class ServerHandler extends SimpleChannelInboundHandler 0) { @@ -877,7 +897,7 @@ public class ServerHandler extends SimpleChannelInboundHandler medList = new ArrayList<>(); + while(medRs.next()) { + String[] med = new String[10]; + med[0] = medRs.getString("med_id"); + med[1] = medRs.getString("med_name"); + med[2] = medRs.getString("quantity_ordered"); + med[3] = medRs.getString("med_unit"); + + // Parse dosage: "Sáng 1, Trưa 1, Chiều 1" + String dosage = medRs.getString("dosage"); + String morning = "0", noon = "0", evening = "0"; + if (dosage != null && !dosage.isEmpty()) { + String[] parts = dosage.split(", "); + for (String part : parts) { + String[] dosagePart = part.split(" "); + if (dosagePart.length == 2) { + if ("Sáng".equals(dosagePart[0])) morning = dosagePart[1]; + else if ("Trưa".equals(dosagePart[0])) noon = dosagePart[1]; + else if ("Chiều".equals(dosagePart[0])) evening = dosagePart[1]; + } + } + } + med[4] = morning; + med[5] = noon; + med[6] = evening; + + med[7] = medRs.getString("price_per_unit"); + med[8] = medRs.getString("total_price"); + med[9] = medRs.getString("notes"); + medList.add(med); + } + medicinePrescription = medList.toArray(new String[0][]); + + } catch (SQLException e) { + log.error("Error getting medicine prescription for checkupId: " + checkupId, e); + } + + // Get Service Prescription + try { + PreparedStatement serStmt = Server.connection.prepareStatement( + """ + SELECT + S.service_id, + S.service_name, + CS.quantity, + S.service_cost, + CS.total_cost + FROM CheckupService CS + JOIN Service S ON CS.service_id = S.service_id + WHERE CS.checkup_id = ? + """ + ); + serStmt.setString(1, checkupId); + ResultSet serRs = serStmt.executeQuery(); + + ArrayList serList = new ArrayList<>(); + while(serRs.next()) { + String[] ser = new String[6]; + ser[0] = serRs.getString("service_id"); + ser[1] = serRs.getString("service_name"); + ser[2] = serRs.getString("quantity"); + ser[3] = serRs.getString("service_cost"); + ser[4] = serRs.getString("total_cost"); + ser[5] = ""; // Notes - not available in CheckupService table + serList.add(ser); + } + servicePrescription = serList.toArray(new String[0][]); + + } catch (SQLException e) { + log.error("Error getting service prescription for checkupId: " + checkupId, e); + } + + UserUtil.sendPacket(currentUser.getSessionId(), new GetOrderInfoByCheckupRes(medicinePrescription, servicePrescription)); + log.info("Sent order info for checkup {} to client", checkupId); + } } } diff --git a/src/main/resources/database/BSK.db b/src/main/resources/database/BSK.db index 7073513..0514555 100644 Binary files a/src/main/resources/database/BSK.db and b/src/main/resources/database/BSK.db differ