From a5791639607dce420cdadf93d6ff3f6b32b7c5a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=AA=20Th=C3=A0nh=20=C4=90=E1=BA=A1t?= <91755733+lds217@users.noreply.github.com> Date: Tue, 1 Jul 2025 20:57:40 +0700 Subject: [PATCH] [update] Revise medical invoice generation to include detailed supplement information and enhance printing functionality with JasperReports integration. Update CheckUpPage and MedicineDialog to manage original prescriptions and track changes effectively, improving user experience during prescription modifications. --- medical_invoice.pdf | Bin 26121 -> 96392 bytes pom.xml | 7 + .../BsK/client/ui/assets/gif/Heart beat.gif | Bin 0 -> 7619 bytes .../ui/component/CheckUpPage/CheckUpPage.java | 11 +- .../MedicineDialog/MedicineDialog.java | 78 +- .../PrintDialog/MedicineInvoice.java | 530 +++--- .../print_forms/medserinvoice.jrxml | 1432 +++++++++-------- .../PrintDialog/print_forms/test_print.java | 7 + .../ServiceDialog/ServiceDialog.java | 70 +- .../server/network/handler/ServerHandler.java | 4 +- src/main/resources/database/BSK.db | Bin 1175552 -> 1175552 bytes 11 files changed, 1138 insertions(+), 1001 deletions(-) create mode 100644 src/main/java/BsK/client/ui/assets/gif/Heart beat.gif diff --git a/medical_invoice.pdf b/medical_invoice.pdf index a0ea4cbc1f90a0bc7b7743ed681449a81063c8a1..198f989ff373b5722f5251bb956d217064fbc623 100644 GIT binary patch literal 96392 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

-Yo}ikn!J8g-m0<{g!qi% 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 diff --git a/pom.xml b/pom.xml index 57fbe1a..7ed7cdd 100644 --- a/pom.xml +++ b/pom.xml @@ -267,5 +267,12 @@ 7.0.3 + + + net.sf.jasperreports + jasperreports-pdf + 7.0.3 + + diff --git a/src/main/java/BsK/client/ui/assets/gif/Heart beat.gif b/src/main/java/BsK/client/ui/assets/gif/Heart beat.gif new file mode 100644 index 0000000000000000000000000000000000000000..638c467f79ea1fa51b4230424cd4d4770533197c GIT binary patch literal 7619 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 literal 0 HcmV?d00001 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 31047bc..0da3dfa 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java @@ -1328,8 +1328,15 @@ public class CheckUpPage extends JPanel { genderComboBox.getSelectedItem().toString(), customerAddressField.getText() + ", " + (wardComboBox.getSelectedItem() != null ? wardComboBox.getSelectedItem().toString() : "") + ", " + (districtComboBox.getSelectedItem() != null ? districtComboBox.getSelectedItem().toString() : "") + ", " + (provinceComboBox.getSelectedItem() != null ? provinceComboBox.getSelectedItem().toString() : ""), doctorComboBox.getSelectedItem().toString(), diagnosisField.getText(), - conclusionField.getText(), medicinePrescription, servicePrescription); - medicineInvoice.createDialog(mainFrame); + conclusionField.getText(), medicinePrescription, servicePrescription, + // fake supplements + new String[][] { + {"1", "Vitamin D3", "1", "viên", "1 viên/ngày sau ăn sáng", "30", "2000", "60000", "Bổ sung vitamin D"}, + {"2", "Omega 3", "2", "viên", "2 viên/ngày sau ăn", "60", "1500", "90000", "Bổ sung dầu cá"}, + {"3", "Calcium 500mg", "1", "viên", "1 viên/ngày sau ăn tối", "30", "2500", "75000", "Bổ sung canxi"} + } + ); + medicineInvoice.showDirectJasperViewer(); // Use the direct JasperViewer method break; case "ultrasound": if (selectedImagesForPrint.isEmpty()) { 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 1068149..8579eae 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 @@ -52,6 +52,7 @@ public class MedicineDialog extends JDialog { private List medicines = new ArrayList<>(); private String[][] medicinePrescription; + private String[][] originalPrescription; // Store original data for comparison private static final Logger logger = LoggerFactory.getLogger(MedicineDialog.class); public String[][] getMedicinePrescription() { @@ -87,12 +88,14 @@ public class MedicineDialog extends JDialog { public MedicineDialog(final Frame parent) { super(parent, "Đơn thuốc", true); this.medicinePrescription = new String[0][0]; + this.originalPrescription = 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]; + this.originalPrescription = deepCopyArray(existingPrescription); init(parent); if (existingPrescription != null) { for (String[] row : existingPrescription) { @@ -472,14 +475,35 @@ public class MedicineDialog extends JDialog { okButton.addActionListener(e -> { collectPrescriptionData(); - if (medicinePrescription == null || medicinePrescription.length == 0) { - JOptionPane.showMessageDialog(this, "Chưa có thuốc nào được chọn.", "Thông báo", JOptionPane.INFORMATION_MESSAGE); + + // Check if there are changes compared to the original prescription + boolean hasChanges = hasDataChanged(); + + if (!hasChanges) { + // No changes made, allow closing without warning + logger.info("No changes made to prescription."); + dispose(); return; } + + // If there are changes but no items selected, show a confirmation + if (medicinePrescription == null || medicinePrescription.length == 0) { + int choice = JOptionPane.showConfirmDialog(this, + "Bạn đã xóa tất cả thuốc khỏi đơn. Bạn có muốn lưu thay đổi này không?", + "Xác nhận", + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE); + if (choice != JOptionPane.YES_OPTION) { + return; + } + } + logger.info("Prescription saved."); - for (String[] row : medicinePrescription) { - logger.info("Med: ID={}, Name={}, Qty={}, Unit={}, M={}, N={}, E={}, Price={}, Total={}, Note={}", - row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9]); + if (medicinePrescription != null) { + for (String[] row : medicinePrescription) { + logger.info("Med: ID={}, Name={}, Qty={}, Unit={}, M={}, N={}, E={}, Price={}, Total={}, Note={}", + row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9]); + } } dispose(); }); @@ -660,6 +684,50 @@ public class MedicineDialog extends JDialog { } } + private String[][] deepCopyArray(String[][] original) { + if (original == null) { + return new String[0][0]; + } + String[][] copy = new String[original.length][]; + for (int i = 0; i < original.length; i++) { + if (original[i] != null) { + copy[i] = new String[original[i].length]; + System.arraycopy(original[i], 0, copy[i], 0, original[i].length); + } + } + return copy; + } + + private boolean hasDataChanged() { + collectPrescriptionData(); + + // If lengths are different, there's a change + if (originalPrescription.length != medicinePrescription.length) { + return true; + } + + // If both are empty, no changes + if (originalPrescription.length == 0 && medicinePrescription.length == 0) { + return false; + } + + // Compare each row + for (int i = 0; i < originalPrescription.length; i++) { + if (originalPrescription[i].length != medicinePrescription[i].length) { + return true; + } + for (int j = 0; j < originalPrescription[i].length; j++) { + String original = originalPrescription[i][j]; + String current = medicinePrescription[i][j]; + if (!java.util.Objects.equals(original, current)) { + return true; + } + } + } + + return false; + } + @Override public void dispose() { logger.info("Cleaning up MedicineDialog listeners"); diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/MedicineInvoice.java b/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/MedicineInvoice.java index 1af05bf..b7f58d8 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/MedicineInvoice.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/MedicineInvoice.java @@ -1,19 +1,14 @@ package BsK.client.ui.component.CheckUpPage.PrintDialog; import BsK.client.LocalStorage; -import com.itextpdf.io.image.ImageData; -import com.itextpdf.io.image.ImageDataFactory; -import com.itextpdf.kernel.font.PdfFont; -import com.itextpdf.kernel.font.PdfFontFactory; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfWriter; -import com.itextpdf.layout.Document; -import com.itextpdf.layout.borders.Border; -import com.itextpdf.layout.element.*; -import com.itextpdf.layout.element.Image; -import com.itextpdf.layout.property.UnitValue; -import com.itextpdf.barcodes.Barcode128; -import com.itextpdf.kernel.colors.ColorConstants; +import BsK.client.ui.component.CheckUpPage.PrintDialog.print_forms.InvoiceItem; + +// JasperReports imports +import net.sf.jasperreports.engine.*; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import net.sf.jasperreports.engine.design.JasperDesign; +import net.sf.jasperreports.engine.xml.JRXmlLoader; +import net.sf.jasperreports.view.JasperViewer; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; @@ -50,37 +45,108 @@ public class MedicineInvoice{ private String id; private String[][] med; // Name, Quantity, Price private String[][] services; // Name, Quantity, Price + private String[][] supplements; // Name, Quantity, Price private static final DecimalFormat vndFormatter = new DecimalFormat("#,##0"); public static void main(String[] args) { SwingUtilities.invokeLater(() -> { - JButton openDialogButton = new JButton("Open Medicine Invoice"); + JFrame frame = new JFrame("Medicine Invoice Test"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(600, 400); + frame.setLayout(new GridLayout(3, 2, 10, 10)); - openDialogButton.addActionListener(e -> new MedicineInvoice("1212", "Nguyễn Văn A", "01/01/1990", "0123456789", + // Test Case 1: Only Medicines + JButton medicineOnlyButton = new JButton("Only Medicines"); + medicineOnlyButton.addActionListener(e -> new MedicineInvoice("1001", "Nguyễn Văn A", "01/01/1990", "0123456789", "Nam", "123 Đường ABC, Quận XYZ, TP HCM", "Bác sĩ XYZ", "Sốt cao", "Nghỉ ngơi nhiều, uống nhiều nước", new String[][]{ - {"Paracetamol", "2", "5000"}, - {"Vitamin C", "1", "10000"}, - {"Amoxicillin", "1", "20000"} + {"1", "Paracetamol", "2", "viên", "1", "2", "1", "5000", "10000", "Uống sau ăn"} + }, + new String[][]{}, // No services + new String[][]{} // No supplements + ).createDialog(frame)); + + // Test Case 2: Only Services + JButton serviceOnlyButton = new JButton("Only Services"); + serviceOnlyButton.addActionListener(e -> new MedicineInvoice("1002", "Trần Thị B", "15/05/1985", "0987654321", + "Nữ", "456 Đường DEF, Quận ABC, TP HCM", "Bác sĩ ABC", "Khám tổng quát", + "Theo dõi định kỳ", + new String[][]{}, // No medicines + new String[][] { + {"1", "Khám tổng quát", "1", "150000", "150000", "Kiểm tra sức khỏe tổng quát"}, + {"2", "Xét nghiệm máu", "1", "80000", "80000", "Xét nghiệm công thức máu"} + }, + new String[][]{} // No supplements + ).createDialog(frame)); + + // Test Case 3: Only Supplements + JButton supplementOnlyButton = new JButton("Only Supplements"); + supplementOnlyButton.addActionListener(e -> new MedicineInvoice("1003", "Lê Văn C", "20/12/1992", "0456789123", + "Nam", "789 Đường GHI, Quận DEF, TP HCM", "Bác sĩ DEF", "Tư vấn dinh dưỡng", + "Bổ sung vitamin và khoáng chất", + new String[][]{}, // No medicines + new String[][]{}, // No services + new String[][] { + {"1", "Vitamin D3", "1", "viên", "1 viên/ngày sau ăn sáng", "30", "2000", "60000", "Bổ sung vitamin D"}, + {"2", "Omega 3", "2", "viên", "2 viên/ngày sau ăn", "60", "1500", "90000", "Bổ sung dầu cá"} + } + ).createDialog(frame)); + + // Test Case 4: Medicines + Services (No Supplements) + JButton medServiceButton = new JButton("Medicines + Services"); + medServiceButton.addActionListener(e -> new MedicineInvoice("1004", "Phạm Thị D", "10/03/1988", "0789123456", + "Nữ", "321 Đường JKL, Quận GHI, TP HCM", "Bác sĩ GHI", "Viêm họng", + "Điều trị kháng sinh và theo dõi", + new String[][]{ + {"1", "Amoxicillin", "1", "viên", "1", "1", "0", "20000", "20000", "Uống trước ăn 30 phút"} }, new String[][] { - {"Khám tổng quát", "1", "150000"}, - {"Xét nghiệm máu", "1", "80000"} + {"1", "Khám tai mũi họng", "1", "100000", "100000", "Khám chuyên khoa"} + }, + new String[][]{} // No supplements + ).createDialog(frame)); + + // Test Case 5: All Three Categories + JButton allCategoriesButton = new JButton("All Categories"); + allCategoriesButton.addActionListener(e -> new MedicineInvoice("1005", "Hoàng Văn E", "25/07/1990", "0654321987", + "Nam", "654 Đường MNO, Quận JKL, TP HCM", "Bác sĩ JKL", "Kiểm tra sức khỏe định kỳ", + "Tổng quát + bổ sung dinh dưỡng", + new String[][]{ + {"1", "Vitamin C", "1", "viên", "1", "0", "0", "10000", "10000", "Uống buổi sáng"} + }, + new String[][] { + {"1", "Khám tổng quát", "1", "150000", "150000", "Kiểm tra sức khỏe tổng quát"} + }, + new String[][] { + {"1", "Calcium 500mg", "1", "viên", "1 viên/ngày sau ăn tối", "30", "2500", "75000", "Bổ sung canxi"} } - ).createDialog(null)); - JFrame frame = new JFrame("Main Application"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(400, 300); - frame.setLayout(new FlowLayout()); - frame.add(openDialogButton); + ).createDialog(frame)); + + // Test Case 6: Empty Invoice (No data) + JButton emptyButton = new JButton("Empty Invoice"); + emptyButton.addActionListener(e -> new MedicineInvoice("1006", "Võ Thị F", "05/11/1995", "0321654987", + "Nữ", "987 Đường PQR, Quận MNO, TP HCM", "Bác sĩ MNO", "Tư vấn y tế", + "Chỉ tư vấn, không kê đơn", + new String[][]{}, // No medicines + new String[][]{}, // No services + new String[][]{} // No supplements + ).createDialog(frame)); + + frame.add(medicineOnlyButton); + frame.add(serviceOnlyButton); + frame.add(supplementOnlyButton); + frame.add(medServiceButton); + frame.add(allCategoriesButton); + frame.add(emptyButton); + frame.setVisible(true); }); } public MedicineInvoice(String id, String patientName, String patientDOB, String patientPhone, String patientGender, String patientAddress, String doctorName, String diagnosis, - String notes, String[][] med, String[][] services) { + String notes, String[][] med, String[][] services, String[][] supplements) { this.id = id; this.patientName = patientName; this.patientDOB = patientDOB; @@ -100,9 +166,26 @@ public class MedicineInvoice{ this.date = formattedDate; this.med = med; this.services = services; + this.supplements = supplements; } + /** + * Shows the invoice directly in JasperViewer without creating a custom dialog + */ + public void showDirectJasperViewer() { + try { + String pdfPath = "medical_invoice.pdf"; + generatePdf(pdfPath); + // Use the constructor to prevent the application from closing + JasperViewer viewer = new JasperViewer(jasperPrint, false); + viewer.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(null, "Error generating PDF: " + e.getMessage()); + } + } + public void createDialog(JFrame parent) { dialog = new JDialog(parent, "Medicine Invoice", true); dialog.setSize(600, 600); @@ -179,14 +262,22 @@ public class MedicineInvoice{ } }); - // Print PDF Action + // Print PDF Action - Show JasperViewer printButton.addActionListener(e -> { try { - File pdfFile = new File(pdfPath); - printPdf(pdfFile); + if (jasperPrint != null) { + // Close our custom dialog first + dialog.dispose(); + + // Use the constructor to prevent the application from closing + JasperViewer viewer = new JasperViewer(jasperPrint, false); + viewer.setVisible(true); + } else { + JOptionPane.showMessageDialog(dialog, "Report not generated yet. Please try again."); + } } catch (Exception ex) { ex.printStackTrace(); - JOptionPane.showMessageDialog(dialog, "Error printing PDF: " + ex.getMessage()); + JOptionPane.showMessageDialog(dialog, "Error opening print viewer: " + ex.getMessage()); } }); @@ -194,275 +285,140 @@ public class MedicineInvoice{ dialog.setVisible(true); } + private JasperPrint jasperPrint; // Store JasperPrint for reuse + private void generatePdf(String pdfPath) throws Exception { - PdfWriter writer = new PdfWriter(pdfPath); - PdfDocument pdfDoc = new PdfDocument(writer); - Document document = new Document(pdfDoc); // Default A4 size - - // Set document margins - REDUCED - document.setMargins(20, 25, 20, 25); // Smaller margins (top, right, bottom, left) - - String boldFontPath = "src/main/java/BsK/client/ui/assets/font/SVN-Arial Bold.ttf"; - PdfFont boldFont = PdfFontFactory.createFont(boldFontPath, "Identity-H", true); - - String fontPath = "src/main/java/BsK/client/ui/assets/font/SVN-Arial Regular.ttf"; - PdfFont font = PdfFontFactory.createFont(fontPath, "Identity-H", true); - - // --- HEADER SECTION --- - Table headerTable = new Table(UnitValue.createPercentArray(new float[]{1.5f, 3.5f})) - .setWidth(UnitValue.createPercentValue(100)) - .setBorder(Border.NO_BORDER) - .setMarginBottom(5); // Reduced margin bottom - try { - String logoPath = "src/main/java/BsK/client/ui/assets/icon/clinic_logo.png"; - ImageData imageData = ImageDataFactory.create(logoPath); - Image logo = new Image(imageData).scaleToFit(60, 60).setMarginRight(15); // Slightly smaller logo & margin - headerTable.addCell(new Cell().add(logo).setBorder(Border.NO_BORDER).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); - } catch (Exception e) { - headerTable.addCell(new Cell().setBorder(Border.NO_BORDER)); - System.err.println("Logo image not found or error loading: " + e.getMessage()); - } - - Paragraph clinicInfoParagraph = new Paragraph() - .add(new Text(LocalStorage.ClinicName + "\n").setFont(boldFont).setFontSize(12)) // Reduced font - .add(new Text("Địa chỉ: " + LocalStorage.ClinicAddress + "\n").setFontSize(9)) // Reduced font - .add(new Text("Điện thoại: " + LocalStorage.ClinicPhone).setFontSize(9)) // Reduced font - .setFont(font); - headerTable.addCell(new Cell().add(clinicInfoParagraph) - .setTextAlignment(com.itextpdf.layout.property.TextAlignment.LEFT) - .setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE) - .setBorder(Border.NO_BORDER).setPaddingLeft(5)); // Reduced padding - - document.add(headerTable); + // 1. Create data sources for medicines, services, and supplements + java.util.List medicines = new ArrayList<>(); + java.util.List serviceItems = new ArrayList<>(); + java.util.List supplementItems = new ArrayList<>(); - // --- BARCODE FOR CHECKUP ID --- - if (this.id != null && !this.id.isEmpty()) { - Barcode128 barcode = new Barcode128(pdfDoc); - barcode.setCodeType(Barcode128.CODE128); - barcode.setCode(this.id); // Use the checkup ID for the barcode - barcode.setBarHeight(10f); // Further reduced barcode height (from 15f) - barcode.setX(0.5f); // Further reduce narrow bar width (from 0.6f) - barcode.setN(1.5f); - barcode.setFont(null); - - Image barcodeImage = new Image(barcode.createFormXObject(ColorConstants.BLACK, ColorConstants.BLACK, pdfDoc)); - barcodeImage.setWidth(UnitValue.createPercentValue(15)); // Further reduced width (from 20%) - barcodeImage.setHorizontalAlignment(com.itextpdf.layout.property.HorizontalAlignment.CENTER); - barcodeImage.setMarginTop(1); // Further reduced space above barcode - barcodeImage.setMarginBottom(1); // Further reduced space below barcode - document.add(barcodeImage); - - Paragraph idText = new Paragraph(this.id) - .setFont(font).setFontSize(5) // Further reduced font size for ID text - .setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER) - .setMarginBottom(2); // Further reduced margin for the ID text - document.add(idText); - } - - // --- INVOICE TITLE --- - Paragraph titleParagraph = new Paragraph("TOA THUỐC") - .setFontSize(18).setFont(boldFont) // Reduced font size - .setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER) - .setMarginBottom(8); // Reduced margin - document.add(titleParagraph); - - // --- PATIENT AND INVOICE DETAILS SECTION --- - Table patientDoctorTable = new Table(UnitValue.createPercentArray(new float[]{55, 45})) // Adjusted column widths - .setWidth(UnitValue.createPercentValue(100)) - .setFontSize(9).setFont(font) // Reduced font size - .setMarginBottom(8); // Reduced margin - - Cell patientInfoCell = new Cell().setBorder(Border.NO_BORDER).setPadding(3); // Reduced padding - Paragraph pName = new Paragraph().add(new Text("Họ và tên: ").setFont(boldFont)).add(patientName); - pName.setMultipliedLeading(1.0f); - patientInfoCell.add(pName); - Paragraph pDOB = new Paragraph().add(new Text("Ngày sinh: ").setFont(boldFont)).add(patientDOB); - pDOB.setMultipliedLeading(1.0f); - patientInfoCell.add(pDOB); - Paragraph pGender = new Paragraph().add(new Text("Giới tính: ").setFont(boldFont)).add(patientGender); - pGender.setMultipliedLeading(1.0f); - patientInfoCell.add(pGender); - Paragraph pPhone = new Paragraph().add(new Text("Số điện thoại: ").setFont(boldFont)).add(patientPhone); - pPhone.setMultipliedLeading(1.0f); - patientInfoCell.add(pPhone); - Paragraph pAddress = new Paragraph().add(new Text("Địa chỉ: ").setFont(boldFont)).add(patientAddress); - pAddress.setMultipliedLeading(1.0f); - patientInfoCell.add(pAddress); - patientDoctorTable.addCell(patientInfoCell); - - Cell doctorInvoiceCell = new Cell().setBorder(Border.NO_BORDER).setPadding(3); // Reduced padding - Paragraph pDoctor = new Paragraph().add(new Text("Bác sĩ: ").setFont(boldFont)).add(doctorName); - pDoctor.setMultipliedLeading(1.0f); - doctorInvoiceCell.add(pDoctor); - Paragraph pDate = new Paragraph().add(new Text("Ngày lập: ").setFont(boldFont)).add(date); - pDate.setMultipliedLeading(1.0f); - doctorInvoiceCell.add(pDate); - Paragraph pInvoiceId = new Paragraph().add(new Text("Đơn thuốc số: ").setFont(boldFont)).add(id); - pInvoiceId.setMultipliedLeading(1.0f); - doctorInvoiceCell.add(pInvoiceId); - Paragraph pSpace1 = new Paragraph(" "); - pSpace1.setMultipliedLeading(1.0f); - doctorInvoiceCell.add(pSpace1); - Paragraph pSpace2 = new Paragraph(" "); - pSpace2.setMultipliedLeading(1.0f); - doctorInvoiceCell.add(pSpace2); - patientDoctorTable.addCell(doctorInvoiceCell); - - document.add(patientDoctorTable); - - // --- DIAGNOSIS AND NOTES --- - Paragraph diagnosisParagraph = new Paragraph(); - diagnosisParagraph.add(new Text("Chẩn đoán: ").setFont(boldFont)).add(diagnosis); - diagnosisParagraph.setFont(font).setFontSize(9).setMarginBottom(2).setMultipliedLeading(1.0f); - document.add(diagnosisParagraph); - - if (notes != null && !notes.trim().isEmpty()) { - Paragraph notesParagraph = new Paragraph(); - notesParagraph.add(new Text("Ghi chú (chung): ").setFont(boldFont)).add(notes); - notesParagraph.setFont(font).setFontSize(9).setMarginBottom(5).setMultipliedLeading(1.0f); - document.add(notesParagraph); - } else { - document.add(new Paragraph().setMarginBottom(5)); - } - - // --- MEDICINE TABLE --- - Paragraph medicineSectionTitle = new Paragraph("CHI TIẾT THUỐC") - .setFont(boldFont).setFontSize(11) // Reduced font size - .setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER) - .setMarginTop(3).setMarginBottom(3); // Reduced margins - document.add(medicineSectionTitle); - - Table medTable = new Table(UnitValue.createPercentArray(new float[]{3.8f, 1.7f, 1.5f, 1.5f, 2.5f})) // Adjusted column widths - .setWidth(UnitValue.createPercentValue(100)) - .setFontSize(8).setFont(font) // Reduced font size for table content - .setMarginBottom(5); // Reduced margin - - medTable.addHeaderCell(new Cell().add(new Paragraph("Tên thuốc")).setFont(boldFont).setFontSize(9).setBackgroundColor(com.itextpdf.kernel.colors.ColorConstants.LIGHT_GRAY).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2)); - medTable.addHeaderCell(new Cell().add(new Paragraph("Liều dùng")).setFont(boldFont).setFontSize(9).setBackgroundColor(com.itextpdf.kernel.colors.ColorConstants.LIGHT_GRAY).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2)); - medTable.addHeaderCell(new Cell().add(new Paragraph("Số lượng")).setFont(boldFont).setFontSize(9).setBackgroundColor(com.itextpdf.kernel.colors.ColorConstants.LIGHT_GRAY).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2)); - medTable.addHeaderCell(new Cell().add(new Paragraph("Đơn giá (VNĐ)")).setFont(boldFont).setFontSize(9).setBackgroundColor(com.itextpdf.kernel.colors.ColorConstants.LIGHT_GRAY).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2)); - medTable.addHeaderCell(new Cell().add(new Paragraph("Thành tiền (VNĐ)")).setFont(boldFont).setFontSize(9).setBackgroundColor(com.itextpdf.kernel.colors.ColorConstants.LIGHT_GRAY).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2)); - - long medicineTotal = 0; + // Convert medicine data to InvoiceItem objects if (med != null) { for (String[] medicine : med) { - if (medicine == null || medicine.length < 10) { - medTable.addCell(new Cell(1, 5).add(new Paragraph("Thông tin thuốc không đầy đủ").setItalic().setFontSize(8)).setPadding(2)); - continue; - } - Paragraph medNameAndNote = new Paragraph(); - medNameAndNote.add(new Text(medicine[1]).setFontSize(8)); - if (medicine[9] != null && !medicine[9].isEmpty()) { - medNameAndNote.add(new Text("\nGhi chú: " + medicine[9]).setFontSize(7).setItalic()); - } - medNameAndNote.setMultipliedLeading(1.0f); - medTable.addCell(new Cell().add(medNameAndNote).setPadding(2)); - - String dosageInfo = String.format("S: %s, T: %s, C: %s", medicine[4], medicine[5], medicine[6]); - medTable.addCell(new Cell().add(new Paragraph(dosageInfo).setFontSize(8)).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); - medTable.addCell(new Cell().add(new Paragraph(medicine[2] + " " + medicine[3]).setFontSize(8)).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); - try { - medTable.addCell(new Cell().add(new Paragraph(vndFormatter.format(Long.parseLong(medicine[7]))).setFontSize(8)).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); - medTable.addCell(new Cell().add(new Paragraph(vndFormatter.format(Long.parseLong(medicine[8]))).setFontSize(8)).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); - medicineTotal += Long.parseLong(medicine[8]); - } catch (NumberFormatException e) { - System.err.println("Error parsing medicine price/total: " + medicine[7] + " or " + medicine[8]); - medTable.addCell(new Cell().add(new Paragraph("Lỗi giá")).setFontSize(8).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); - medTable.addCell(new Cell().add(new Paragraph("Lỗi giá")).setFontSize(8).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); + if (medicine != null && medicine.length >= 10) { + try { + String dosageInfo = String.format("S: %s, T: %s, C: %s", + medicine[4] != null ? medicine[4] : "0", + medicine[5] != null ? medicine[5] : "0", + medicine[6] != null ? medicine[6] : "0"); + + medicines.add(InvoiceItem.createMedicine( + medicine[1] != null ? medicine[1] : "", // medName + dosageInfo, // dosage + medicine[2] != null ? Integer.parseInt(medicine[2]) : 0, // amount + medicine[7] != null ? Double.parseDouble(medicine[7]) : 0.0, // unitPrice + medicine[9] != null ? medicine[9] : "" // medNote + )); + } catch (NumberFormatException e) { + System.err.println("Error parsing medicine data: " + e.getMessage()); + } + } } } - } - document.add(medTable); - - Table medTotalTable = new Table(UnitValue.createPercentArray(new float[]{7.5f, 2.5f})) - .setWidth(UnitValue.createPercentValue(100)).setBorder(Border.NO_BORDER).setMarginBottom(3); - medTotalTable.addCell(new Cell().add(new Paragraph("Tổng tiền thuốc:")).setFont(boldFont).setFontSize(9).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setBorder(Border.NO_BORDER).setPadding(1)); - medTotalTable.addCell(new Cell().add(new Paragraph(vndFormatter.format(medicineTotal) + " VNĐ")).setFont(boldFont).setFontSize(9).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setBorder(Border.NO_BORDER).setPadding(1)); - document.add(medTotalTable); - long overallTotal = medicineTotal; - - // --- SERVICES TABLE --- - if (services != null && services.length > 0) { - Paragraph serviceSectionTitle = new Paragraph("CHI TIẾT DỊCH VỤ") - .setFont(boldFont).setFontSize(11) // Reduced font size - .setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER) - .setMarginTop(5).setMarginBottom(3); // Reduced margins - document.add(serviceSectionTitle); - - Table serviceTable = new Table(UnitValue.createPercentArray(new float[]{4.5f, 1.5f, 2f, 2.5f})) // Adjusted column widths - .setWidth(UnitValue.createPercentValue(100)) - .setFontSize(8).setFont(font) // Reduced font size for table content - .setMarginBottom(5); // Reduced margin - - serviceTable.addHeaderCell(new Cell().add(new Paragraph("Tên dịch vụ")).setFont(boldFont).setFontSize(9).setBackgroundColor(com.itextpdf.kernel.colors.ColorConstants.LIGHT_GRAY).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2)); - serviceTable.addHeaderCell(new Cell().add(new Paragraph("Số lượng")).setFont(boldFont).setFontSize(9).setBackgroundColor(com.itextpdf.kernel.colors.ColorConstants.LIGHT_GRAY).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2)); - serviceTable.addHeaderCell(new Cell().add(new Paragraph("Đơn giá (VNĐ)")).setFont(boldFont).setFontSize(9).setBackgroundColor(com.itextpdf.kernel.colors.ColorConstants.LIGHT_GRAY).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2)); - serviceTable.addHeaderCell(new Cell().add(new Paragraph("Thành tiền (VNĐ)")).setFont(boldFont).setFontSize(9).setBackgroundColor(com.itextpdf.kernel.colors.ColorConstants.LIGHT_GRAY).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2)); - - long serviceTotal = 0; + // Convert service data to InvoiceItem objects + if (services != null) { for (String[] service : services) { - if (service == null || service.length < 5) { - serviceTable.addCell(new Cell(1, 4).add(new Paragraph("Thông tin dịch vụ không đầy đủ").setItalic().setFontSize(8)).setPadding(2)); - continue; - } - Paragraph serNameAndNote = new Paragraph(); - serNameAndNote.add(new Text(service[1]).setFontSize(8)); - if (service.length > 5 && service[5] != null && !service[5].isEmpty()) { - serNameAndNote.add(new Text("\nGhi chú: " + service[5]).setFontSize(7).setItalic()); - } - serNameAndNote.setMultipliedLeading(1.0f); - serviceTable.addCell(new Cell().add(serNameAndNote).setPadding(2)); - serviceTable.addCell(new Cell().add(new Paragraph(service[2]).setFontSize(8)).setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); - try { - serviceTable.addCell(new Cell().add(new Paragraph(vndFormatter.format(Long.parseLong(service[3]))).setFontSize(8)).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); - serviceTable.addCell(new Cell().add(new Paragraph(vndFormatter.format(Long.parseLong(service[4]))).setFontSize(8)).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); - serviceTotal += Long.parseLong(service[4]); - } catch (NumberFormatException e) { - System.err.println("Error parsing service price/total: " + service[3] + " or " + service[4]); - serviceTable.addCell(new Cell().add(new Paragraph("Lỗi giá")).setFontSize(8).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); - serviceTable.addCell(new Cell().add(new Paragraph("Lỗi giá")).setFontSize(8).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setPadding(2).setVerticalAlignment(com.itextpdf.layout.property.VerticalAlignment.MIDDLE)); + if (service != null && service.length >= 5) { + try { + serviceItems.add(InvoiceItem.createService( + service[1] != null ? service[1] : "", // serName + service.length > 5 && service[5] != null ? service[5] : "", // serNote + service[2] != null ? Integer.parseInt(service[2]) : 0, // serAmount + service[3] != null ? Double.parseDouble(service[3]) : 0.0 // serUnitPrice + )); + } catch (NumberFormatException e) { + System.err.println("Error parsing service data: " + e.getMessage()); + } + } } } - document.add(serviceTable); - overallTotal += serviceTotal; - Table serTotalTable = new Table(UnitValue.createPercentArray(new float[]{7.5f, 2.5f})) - .setWidth(UnitValue.createPercentValue(100)).setBorder(Border.NO_BORDER).setMarginBottom(3); - serTotalTable.addCell(new Cell().add(new Paragraph("Tổng tiền dịch vụ:")).setFont(boldFont).setFontSize(9).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setBorder(Border.NO_BORDER).setPadding(1)); - serTotalTable.addCell(new Cell().add(new Paragraph(vndFormatter.format(serviceTotal) + " VNĐ")).setFont(boldFont).setFontSize(9).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setBorder(Border.NO_BORDER).setPadding(1)); - document.add(serTotalTable); + // Convert supplement data to InvoiceItem objects + if (supplements != null) { + for (String[] supplement : supplements) { + if (supplement != null && supplement.length >= 9) { + try { + supplementItems.add(InvoiceItem.createSupplement( + supplement[1] != null ? supplement[1] : "", // supName + supplement.length > 8 && supplement[8] != null ? supplement[8] : "", // supNote + supplement[4] != null ? supplement[4] : "", // supDosage + supplement[5] != null ? Integer.parseInt(supplement[5]) : 0, // supAmount + supplement[6] != null ? Double.parseDouble(supplement[6]) : 0.0 // supUnitPrice + )); + } catch (NumberFormatException e) { + System.err.println("Error parsing supplement data: " + e.getMessage()); + } + } + } + } + + // Create data sources + JRBeanCollectionDataSource medicineDS = new JRBeanCollectionDataSource(medicines); + JRBeanCollectionDataSource serviceDS = new JRBeanCollectionDataSource(serviceItems); + JRBeanCollectionDataSource supplementDS = new JRBeanCollectionDataSource(supplementItems); + + // 2. Create parameters map + java.util.Map parameters = new java.util.HashMap<>(); + + // Data sources + parameters.put("medicineDS", medicineDS); + parameters.put("serviceDS", serviceDS); + parameters.put("supplementDS", supplementDS); + + // Set locale for Vietnamese formatting + parameters.put(JRParameter.REPORT_LOCALE, new java.util.Locale("vi", "VN")); + + // Patient information + parameters.put("patientName", patientName != null ? patientName : ""); + parameters.put("patientDOB", patientDOB != null ? patientDOB : ""); + parameters.put("patientGender", patientGender != null ? patientGender : ""); + parameters.put("patientAddress", patientAddress != null ? patientAddress : ""); + + // Clinic information + parameters.put("clinicName", LocalStorage.ClinicName != null ? LocalStorage.ClinicName : ""); + parameters.put("clinicPhone", LocalStorage.ClinicPhone != null ? LocalStorage.ClinicPhone : ""); + parameters.put("clinicAddress", LocalStorage.ClinicAddress != null ? LocalStorage.ClinicAddress : ""); + + // Doctor and medical information + parameters.put("doctorName", doctorName != null ? doctorName : ""); + parameters.put("checkupDate", date != null ? date : ""); + parameters.put("patientDiagnos", diagnosis != null ? diagnosis : ""); + parameters.put("checkupNote", notes != null ? notes : ""); + + // Barcode + parameters.put("barcodeNumber", id != null ? id : ""); + + // Logo image path + String logoPath = System.getProperty("user.dir") + "/src/main/java/BsK/client/ui/assets/icon/logo.jpg"; + parameters.put("logoImage", logoPath); + + // Add conditional parameters to check if data sources have data + parameters.put("hasMedicines", medicines != null && !medicines.isEmpty()); + parameters.put("hasServices", serviceItems != null && !serviceItems.isEmpty()); + parameters.put("hasSupplements", supplementItems != null && !supplementItems.isEmpty()); + + // 3. Load and compile the JRXML template + String jrxmlPath = System.getProperty("user.dir") + "/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/print_forms/medserinvoice.jrxml"; + java.io.InputStream inputStream = new java.io.FileInputStream(new java.io.File(jrxmlPath)); + + JasperDesign jasperDesign = JRXmlLoader.load(inputStream); + JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); + + // 4. Fill the report with data + jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource()); + + // 5. Export to PDF + JasperExportManager.exportReportToPdfFile(jasperPrint, pdfPath); + + inputStream.close(); + + } catch (Exception e) { + e.printStackTrace(); + throw new Exception("Error generating PDF with JasperReports: " + e.getMessage(), e); } - - // --- OVERALL TOTAL --- - document.add(new LineSeparator(new com.itextpdf.kernel.pdf.canvas.draw.SolidLine(0.5f)).setMarginTop(5).setMarginBottom(3)); - Table overallTotalTable = new Table(UnitValue.createPercentArray(new float[]{7.5f, 2.5f})) - .setWidth(UnitValue.createPercentValue(100)).setBorder(Border.NO_BORDER).setMarginBottom(10); - overallTotalTable.addCell(new Cell().add(new Paragraph("TỔNG CỘNG THANH TOÁN:")).setFont(boldFont).setFontSize(10).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setBorder(Border.NO_BORDER).setPadding(1)); - overallTotalTable.addCell(new Cell().add(new Paragraph(vndFormatter.format(overallTotal) + " VNĐ")).setFont(boldFont).setFontSize(10).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT).setBorder(Border.NO_BORDER).setPadding(1)); - document.add(overallTotalTable); - - // --- SIGNATURE AREA --- - Table signatureTable = new Table(UnitValue.createPercentArray(new float[]{50, 50})) - .setWidth(UnitValue.createPercentValue(100)) - .setBorder(Border.NO_BORDER) - .setMarginTop(15); // Reduced margin - - signatureTable.addCell(new Cell().setBorder(Border.NO_BORDER)); - - Paragraph signatureParagraph = new Paragraph(); // Initialize paragraph - signatureParagraph.add(new Text("Ngày " + date.substring(0,2) + " tháng " + date.substring(3,5) + " năm " + date.substring(6) + "\n").setFontSize(9)); - signatureParagraph.add(new Text("Bác sĩ điều trị\n\n\n").setFontSize(9)); // Reduced newlines for space - signatureParagraph.add(new Text("(Ký, ghi rõ họ tên)").setFontSize(8).setItalic()); - signatureParagraph.setFont(font) - .setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER) - .setMultipliedLeading(1.0f); // Applied to the Paragraph - - signatureTable.addCell(new Cell().add(signatureParagraph).setBorder(Border.NO_BORDER)); - document.add(signatureTable); - - document.close(); } private void displayPdfInLabel(String pdfPath, JPanel pdfPanel) throws Exception { 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 669c1f0..1c9e9fa 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 @@ -47,17 +47,26 @@ + + + + + + + + + @@ -68,6 +77,699 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <element kind="image" uuid="c596ac6f-18d9-4cfe-a74e-58b1f7d11ecc" x="-10" y="-4" width="90" height="83"> @@ -79,28 +781,28 @@ <element kind="staticText" uuid="d8e95ce7-3ac0-44a7-ac8f-65821b7f373c" x="80" y="20" width="150" height="15" fontName="Arial" fontSize="12.0" bold="true" hTextAlign="Left"> <text><![CDATA[Địa chỉ: ]]></text> </element> - <element kind="textField" uuid="9883203e-fd4b-4110-a4b9-2c8c257ce5fa" x="126" y="20" width="426" height="15" fontName="Arial" fontSize="12.0"> + <element kind="textField" uuid="9883203e-fd4b-4110-a4b9-2c8c257ce5fa" x="126" y="20" width="346" height="15" fontName="Arial" fontSize="12.0"> <expression><![CDATA[$P{clinicAddress}]]></expression> </element> - <element kind="staticText" uuid="f00706ca-903c-4089-b3a1-33be68f6112b" x="80" y="35" width="150" height="15" fontName="Arial" fontSize="12.0" bold="true" hTextAlign="Left"> + <element kind="staticText" uuid="f00706ca-903c-4089-b3a1-33be68f6112b" x="80" y="36" width="150" height="15" fontName="Arial" fontSize="12.0" bold="true" hTextAlign="Left"> <text><![CDATA[SĐT:]]></text> </element> - <element kind="textField" uuid="2af00e22-702e-42cb-a6fb-19d401a58170" x="110" y="35" width="442" height="15" fontName="Arial" fontSize="12.0"> + <element kind="textField" uuid="2af00e22-702e-42cb-a6fb-19d401a58170" x="110" y="36" width="362" height="15" fontName="Arial" fontSize="12.0"> <expression><![CDATA[$P{clinicPhone}]]></expression> </element> - <element kind="component" uuid="35037abf-0984-4b9e-8a05-f8fae38d7dcc" x="430" y="20" width="79" height="48"> + <element kind="component" uuid="35037abf-0984-4b9e-8a05-f8fae38d7dcc" x="476" y="21" width="79" height="48"> <component kind="barcode4j:Code128"> <codeExpression><![CDATA[$P{barcodeNumber}]]></codeExpression> </component> </element> - <element kind="staticText" uuid="aef24b29-b2af-4cdb-b230-d2acd3ce2892" x="430" y="7" width="80" height="25" fontName="Arial" fontSize="10.0" bold="false" hTextAlign="Center"> + <element kind="staticText" uuid="aef24b29-b2af-4cdb-b230-d2acd3ce2892" x="472" y="10" width="80" height="25" fontName="Arial" fontSize="10.0" bold="false" hTextAlign="Center"> <text><![CDATA[Mã khám bệnh]]></text> </element> <element kind="staticText" uuid="de38fb46-49af-4f48-8c33-f97680bcc7fa" x="192" y="54" width="180" height="25" fontName="Arial" fontSize="18.0" bold="true" hTextAlign="Center"> <text><![CDATA[TOA THUỐC]]></text> </element> - + @@ -116,718 +818,42 @@ - - + + - - - - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -845,7 +871,7 @@ - + diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/print_forms/test_print.java b/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/print_forms/test_print.java index f2dcee2..54e2e1c 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/print_forms/test_print.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/print_forms/test_print.java @@ -65,7 +65,14 @@ public class test_print { parameters.put("clinicName", " BSK CLINIC"); parameters.put("clinicPhone", "0123-456-789"); parameters.put("patientName", "Nguyen Van A"); + parameters.put("patientDOB", "15/03/1990"); + parameters.put("patientGender", "Nam"); + parameters.put("patientAddress", "123 Đường ABC, Phường XYZ, Quận 1, TP.HCM"); parameters.put("clinicAddress", "123 Main Street, City, Country"); + parameters.put("doctorName", "BS. Nguyen Van B"); + parameters.put("checkupDate", "20/12/2024"); + parameters.put("checkupNote", "Bệnh nhân cần nghỉ ngơi và tái khám sau 1 tuần"); + parameters.put("patientDiagnos", "Viêm họng cấp tính, sốt nhẹ"); // Add logo image path String logoPath = System.getProperty("user.dir") + "/src/main/java/BsK/client/ui/assets/icon/logo.jpg"; 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 43bd5d3..44ed949 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 @@ -46,6 +46,7 @@ public class ServiceDialog extends JDialog { private List services = new ArrayList<>(); private String[][] servicePrescription; + private String[][] originalPrescription; // Store original data for comparison private static final Logger logger = LoggerFactory.getLogger(ServiceDialog.class); public String[][] getServicePrescription() { @@ -72,12 +73,14 @@ public class ServiceDialog extends JDialog { public ServiceDialog(Frame parent) { super(parent, "Thêm dịch vụ", true); this.servicePrescription = new String[0][0]; + this.originalPrescription = 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]; + this.originalPrescription = deepCopyArray(existingPrescription); initUI(parent); if (existingPrescription != null) { for (String[] row : existingPrescription) { @@ -376,10 +379,29 @@ public class ServiceDialog extends JDialog { okButton.addActionListener(e -> { collectPrescriptionData(); - if (servicePrescription == null || servicePrescription.length == 0) { - JOptionPane.showMessageDialog(this, "Chưa có dịch vụ nào được chọn.", "Thông báo", JOptionPane.INFORMATION_MESSAGE); + + // Check if there are changes compared to the original prescription + boolean hasChanges = hasDataChanged(); + + if (!hasChanges) { + // No changes made, allow closing without warning + logger.info("No changes made to service prescription."); + dispose(); return; } + + // If there are changes but no items selected, show a confirmation + if (servicePrescription == null || servicePrescription.length == 0) { + int choice = JOptionPane.showConfirmDialog(this, + "Bạn đã xóa tất cả dịch vụ khỏi đơn. Bạn có muốn lưu thay đổi này không?", + "Xác nhận", + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE); + if (choice != JOptionPane.YES_OPTION) { + return; + } + } + logger.info("Service prescription saved."); dispose(); }); @@ -547,6 +569,50 @@ public class ServiceDialog extends JDialog { this.servicePrescription = prescriptionList.toArray(new String[0][]); } + private String[][] deepCopyArray(String[][] original) { + if (original == null) { + return new String[0][0]; + } + String[][] copy = new String[original.length][]; + for (int i = 0; i < original.length; i++) { + if (original[i] != null) { + copy[i] = new String[original[i].length]; + System.arraycopy(original[i], 0, copy[i], 0, original[i].length); + } + } + return copy; + } + + private boolean hasDataChanged() { + collectPrescriptionData(); + + // If lengths are different, there's a change + if (originalPrescription.length != servicePrescription.length) { + return true; + } + + // If both are empty, no changes + if (originalPrescription.length == 0 && servicePrescription.length == 0) { + return false; + } + + // Compare each row + for (int i = 0; i < originalPrescription.length; i++) { + if (originalPrescription[i].length != servicePrescription[i].length) { + return true; + } + for (int j = 0; j < originalPrescription[i].length; j++) { + String original = originalPrescription[i][j]; + String current = servicePrescription[i][j]; + if (!java.util.Objects.equals(original, current)) { + return true; + } + } + } + + return false; + } + @Override public void dispose() { logger.info("Cleaning up ServiceDialog listeners"); diff --git a/src/main/java/BsK/server/network/handler/ServerHandler.java b/src/main/java/BsK/server/network/handler/ServerHandler.java index 710f3b3..326269f 100644 --- a/src/main/java/BsK/server/network/handler/ServerHandler.java +++ b/src/main/java/BsK/server/network/handler/ServerHandler.java @@ -111,7 +111,7 @@ public class ServerHandler extends SimpleChannelInboundHandlermR~Xg~@xd{0S}@EiA{7NEZm`g$+TcXQfe(G~MW~=BX`xid9zOS+ zdw$>V@Ao^0-_)JHsXKl1Ubt|fsTVGMoOmVz8<(y{`gISz46v35v`jPf2;Hmwt(CMZ zTAqHi#G+~KiGZva5JE(}9zxopZ3jZp&QLTaOUOAh^xSwVJwE!>_(U?DdI(pA_`gC- zL}{1KEFE190|4wWpxiUHf^2ermu0DZtW|fb6(FezKo8Od?S^)g{6^C1hMM4Q-d4|TAo~EG19dIM_?%c!3zHaU*ba;68j(zTcm%mFb<4dO~ zsQx4K=|YIVi+QHdjngNq%@{o0w}l{5r_9Yl2OfEy*KoG;bbp--BK(;doDJc`34X|` zhh69Q^SdK6JR1;Vom~e$nHL;3r>dLcqEV-wSBF)dUw1<}ebB9RHYyN6+)EIGhH@gl za%p^2j|KH7Gv8cIRyVybq<>k?P3kc@&vPcTDLtuYQ`uxk!;aA_pSq9HIpds>YQ}7; z+r?dIt6WPMgWP?5q9jUW+gDwdzPr+O{DBWZ192jHmwrmeXq-yghW3T!cR)9e({|EM zoFv09S5c4oeG;D}fNkELc|!=S3=KUx_{hLupTFtvM%`c-p9*868zqK6tcrN7q<&p@n+bD=nd;^Gwc`m zRCugg%`n!0=`x_3^bh(g{fXY9*XasfrhhK6#3kww1wJ*hB-d6lV2;eGYE=&5XdKFM6gMNRZqdNs0~c(y(Jx`E__=n?K3(^|)`||P z7s!Z^QE%HuiVxmoBGjhqk!A-F+Cm|gXV#BvER13?Yh#sNX2+k8Jv))i$XlPuv8Z)* zjrkmgwB^XU*!0O3kIVYG!g}h)C&$KOQR|;F`@um7S72z1yXcl;ah-+iRYiAAP<*At zhV6ptfVg;bjeUj4VN7aW4Di=$u`X8Fe&y@=!-IYLk^Yt3V^(RM^&?WS{1rAKXfJ|` R)>{>JsJa_2mMSb*|1W&PNa6qh delta 773 zcmZ9KZAep57{|}KFT3};d(X3L&QYe@N|7~nzC{*+3k@BCS_^uCN(u}mt)?F{U#JY+ zrgp_kK_P`i(H9#vG%JEWsgdB&MM_Fvf*^ywR7&(L{L~+Q960~y{14A_PWMVp_e#xR z7Bz>qS5b4k@wks>#3p>TE;}JaVhI9Ccnl#p1i5U3C1QH<6yx$_BXN46sDQJIlu|y= zZl{C}XDq!X9LLieqeq)pU-Y!OT309I9o6-92OACqs`*&*jK}2wlgQRJVqF6td&TOs zPueMUSv`Tdi&kT;|FYorWJyL#xJ0h})AUcq-LOBcvxfq4W)*Igj9=j*xpHGRrFVuW z;!o@9A?RiM&})wr%YJ%0r8~x0#ILk=0om!ucSy#!$S%3^CpLvLwnfX8wyQw$9Qj$) zI3F#fqA?QPt6b~^;&!_+DH$!0{mN#NWuRPXx`LPJWtjAEz^nMhJ};*RCOM-hoDU^? zDt2RRvvUjjR55<{m*Kwm>7ZcaZR)fkjk>YH`)X|ZNyWMH1(KS~V3 Mnix+k>jmk50sr6UEC2ui