[update] Enhance CheckUpPage with improved ultrasound folder scanning and media handling. Introduce new status panels for room availability, update UI components for better user experience, and refine print dialog options for invoice generation. Adjust layout and properties for better display and interaction. Update binary files for invoices and QR codes.

This commit is contained in:
Lê Thành Đạt committed 2025-08-08 02:54:35 +07:00
1 parent 45cd567da5
commit 985143be63
33 files changed
+539 -415

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 KiB

File diff suppressed because it is too large. Load diff
@@ -8,6 +8,13 @@ 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 net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimplePrintServiceExporterConfiguration;
import net.sf.jasperreports.engine.export.JRPrintServiceExporter;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Fidelity;
import javax.print.attribute.standard.MediaSizeName;
import javax.swing.*;
@@ -378,7 +385,7 @@ public class MedicineInvoice{
try {
String medName = medicine[1];
String amount = medicine[2] + " " + medicine[3];
String dosageInfo = String.format("S: %s, T: %s, C: %s", medicine[4], medicine[5], medicine[6]);
String dosageInfo = String.format("Sáng: %s, Trưa: %s, Chiều: %s", medicine[4], medicine[5], medicine[6]);
String note = medicine[9];
String route = medicine[11];
@@ -414,7 +421,7 @@ public class MedicineInvoice{
try {
String supName = supplement[1];
String amount = supplement[2] + " " + supplement[3];
String dosageInfo = String.format("S: %s, T: %s, C: %s", supplement[4], supplement[5], supplement[6]);
String dosageInfo = String.format("Sáng: %s, Trưa: %s, Chiều: %s", supplement[4], supplement[5], supplement[6]);
String supNote = supplement[9];
String supRoute = supplement[11];
@@ -496,4 +503,77 @@ public class MedicineInvoice{
}
}
/**
* Shows a dialog to select paper size (A4/A5) and then opens the system print dialog.
* @param parent The parent frame for the dialogs.
*/
public void showPrintDialogWithOptions(JFrame parent) {
try {
// Step 1: Ensure the report data is compiled and filled.
// This populates the 'jasperPrint' object.
log.info("Preparing report data for printing...");
fillJasperPrint();
if (jasperPrint == null) {
JOptionPane.showMessageDialog(parent, "Could not generate the report data.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
// Step 2: Show the paper size selection dialog.
Object[] options = {"A4", "A5"};
int choice = JOptionPane.showOptionDialog(parent,
"Chọn khổ giấy để in:",
"Print Options",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[0]);
// Step 3: If the user cancels, do nothing.
if (choice == JOptionPane.CLOSED_OPTION) {
log.info("User cancelled the print operation.");
return;
}
// Step 4: Determine the selected paper size.
MediaSizeName selectedPaperSize = (choice == 0) ? MediaSizeName.ISO_A4 : MediaSizeName.ISO_A5;
log.info("User selected paper size: {}", selectedPaperSize);
// Step 5: Call the direct printing method with the chosen size.
printDirectly(selectedPaperSize);
} catch (Exception e) {
log.error("Failed during the print process with options", e);
JOptionPane.showMessageDialog(parent, "Lỗi khi chuẩn bị in: " + e.getMessage(), "Lỗi In", JOptionPane.ERROR_MESSAGE);
}
}
/**
* Private helper method to print the report directly using JRPrintServiceExporter.
* @param paperSize The MediaSizeName (e.g., A4 or A5) to use for printing.
* @throws JRException
*/
private void printDirectly(MediaSizeName paperSize) throws JRException {
// This set of instructions tells the printer to use the selected paper size
// and allows it to scale the content down if necessary.
PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
printRequestAttributeSet.add(paperSize);
printRequestAttributeSet.add(Fidelity.FIDELITY_FALSE); // CRITICAL: This allows scaling!
// Configure the exporter with our printing instructions
JRPrintServiceExporter exporter = new JRPrintServiceExporter();
SimplePrintServiceExporterConfiguration configuration = new SimplePrintServiceExporterConfiguration();
configuration.setPrintRequestAttributeSet(printRequestAttributeSet);
configuration.setDisplayPageDialog(false); // Optional: Do not show page setup dialog
configuration.setDisplayPrintDialog(true); // Show the main system print dialog
// Export the report to the printer
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setConfiguration(configuration);
log.info("Exporting report to printer with configuration...");
exporter.exportReport();
log.info("Print job sent to the system.");
}
}
@@ -11,14 +11,16 @@ import java.awt.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays; // Import Arrays
import java.util.Calendar;
import java.util.Comparator; // Import Comparator
import java.util.Date;
import java.util.List;
public class QueueViewPage extends JFrame {
private DefaultTableModel tvQueueTableModel;
private JTable tvQueueTable;
private final String[] tvQueueColumns = {"STT", "Họ và Tên", "Năm sinh"};
private final String[] tvQueueColumns = {"STT", "Họ và Tên", "Năm sinh", "Trạng thái"};
private JLabel clinicNameLabel;
private JLabel clinicAddressLabel;
@@ -45,7 +47,7 @@ public class QueueViewPage extends JFrame {
setLayout(new BorderLayout(0, 10)); // Main layout with vertical gap
getContentPane().setBackground(Color.DARK_GRAY); // Dark background for TV
// --- Top Panel ---
// --- Top Panel ---
JPanel topPanel = new JPanel(new BorderLayout(20, 0)); // Hgap for spacing
topPanel.setOpaque(false); // Transparent to show frame background
topPanel.setBorder(new EmptyBorder(20, 20, 10, 20)); // Padding
@@ -160,11 +162,9 @@ public class QueueViewPage extends JFrame {
}
private void styleRoomLabel(JLabel label, JPanel panel, Color bgColor, String statusText) {
// The label's main text (PHÒNG 1 or PHÒNG 2) is set at initialization and doesn't change.
// This method now only updates the status part of the text and background color.
String baseRoomText = label.getText().split("<br>")[0]; // Get "PHÒNG X"
if (baseRoomText.contains("html")) baseRoomText = (label == room1StatusLabel ? "PHÒNG 1" : "PHÒNG 2"); // Fallback if parsing fails
if (baseRoomText.contains("html")) baseRoomText = (label == room1StatusLabel ? "PHÒNG 1" : "PHÒNG 2");
label.setFont(new Font("Segoe UI", Font.BOLD, 32));
label.setForeground(Color.WHITE);
label.setText("<html><div style='text-align: center;'>" + baseRoomText + "<br>" + statusText + "</div></html>");
@@ -231,18 +231,12 @@ public class QueueViewPage extends JFrame {
if (status == BsK.common.entity.Status.PROCESSING) {
styleRoomLabel(targetLabel, targetPanel, Color.RED.darker(), "STT: " + queueNumberForRoomBox);
if (roomId == 1) {
room1PatientInfo = fullPatientInfoForCentralDisplay;
} else {
room2PatientInfo = fullPatientInfoForCentralDisplay;
}
if (roomId == 1) room1PatientInfo = fullPatientInfoForCentralDisplay;
else room2PatientInfo = fullPatientInfoForCentralDisplay;
} else { // EMPTY, DONE, etc.
styleRoomLabel(targetLabel, targetPanel, Color.GREEN.darker(), "TRỐNG");
if (roomId == 1) {
room1PatientInfo = null;
} else {
room2PatientInfo = null;
}
if (roomId == 1) room1PatientInfo = null;
else room2PatientInfo = null;
}
updateNowCallingDisplay();
}
@@ -250,33 +244,26 @@ public class QueueViewPage extends JFrame {
public void markRoomAsFree(int roomId) {
JLabel targetLabel;
JPanel targetPanel;
String roomName; // Not strictly needed here if styleRoomLabel handles base text
if (roomId == 1) {
targetLabel = room1StatusLabel;
targetPanel = room1Panel;
// roomName = "PHÒNG 1"; // Base text is already PHÒNG 1
} else if (roomId == 2) {
targetLabel = room2StatusLabel;
targetPanel = room2Panel;
// roomName = "PHÒNG 2"; // Base text is already PHÒNG 2
} else {
System.err.println("QueueViewPage: Invalid roomId for marking as free: " + roomId);
return;
}
styleRoomLabel(targetLabel, targetPanel, Color.GREEN.darker(), "TRỐNG");
if (roomId == 1) {
room1PatientInfo = null;
} else {
room2PatientInfo = null;
}
if (roomId == 1) room1PatientInfo = null;
else room2PatientInfo = null;
updateNowCallingDisplay();
}
public void updateQueueData(String[][] fullQueueData) {
if (fullQueueData == null) {
tvQueueTableModel.setRowCount(0);
// Reset room labels to their base text + TRỐNG
styleRoomLabel(room1StatusLabel, room1Panel, Color.GREEN.darker(), "TRỐNG");
styleRoomLabel(room2StatusLabel, room2Panel, Color.GREEN.darker(), "TRỐNG");
room1PatientInfo = null;
@@ -284,26 +271,44 @@ public class QueueViewPage extends JFrame {
updateNowCallingDisplay();
return;
}
// --- CHANGE: Added sorting logic ---
// Sort the array in descending order based on the queue number (STT) at index 24.
Arrays.sort(fullQueueData, new Comparator<String[]>() {
@Override
public int compare(String[] row1, String[] row2) {
try {
// Assuming STT is at index 24
int stt1 = Integer.parseInt(row1[24]);
int stt2 = Integer.parseInt(row2[24]);
// Compare in reverse order for descending sort (largest first)
return Integer.compare(stt2, stt1);
} catch (NumberFormatException e) {
// Handle cases where the STT is not a valid number
return 0;
}
}
});
// --- END OF CHANGE ---
List<Object[]> tvDataList = new ArrayList<>();
SimpleDateFormat inputDateFormat = new SimpleDateFormat("dd/MM/yyyy");
for (String[] row : fullQueueData) {
if (row.length > 24) { // Ensure we have all data including queue number
String queueNumber = row[24]; // Use the new queue number from index 24
if (row.length > 24) {
String queueNumber = row[24];
String ho = row[2];
String ten = row[3];
String hoVaTen = ho + " " + ten;
String customerDob = row[15]; // Use customer DOB instead of checkup date
String namSinh = "N/A";
String customerDob = row[15];
String namSinh = "N/A";
String status = row[8];
if (customerDob != null && !customerDob.isEmpty()) {
// Extract year from DOB using DateUtils for consistency
int year = DateUtils.extractYearFromTimestamp(customerDob);
if (year != -1) {
namSinh = String.valueOf(year);
} else {
// Fallback: try to parse as date string and extract year
try {
Date dobDate = DateUtils.convertToDate(customerDob);
if (dobDate != null) {
@@ -316,25 +321,22 @@ public class QueueViewPage extends JFrame {
}
}
}
tvDataList.add(new Object[]{queueNumber, hoVaTen, namSinh});
tvDataList.add(new Object[]{queueNumber, hoVaTen, namSinh, status});
}
}
tvQueueTableModel.setDataVector(tvDataList.toArray(new Object[0][0]), tvQueueColumns);
// Set column widths for TV display
tvQueueTable.getColumnModel().getColumn(0).setPreferredWidth(150); // STT
tvQueueTable.getColumnModel().getColumn(0).setPreferredWidth(150);
tvQueueTable.getColumnModel().getColumn(0).setMaxWidth(200);
tvQueueTable.getColumnModel().getColumn(2).setPreferredWidth(250); // Năm sinh
tvQueueTable.getColumnModel().getColumn(2).setPreferredWidth(250);
tvQueueTable.getColumnModel().getColumn(2).setMaxWidth(300);
// The specific room status (patient ID in box) is now handled by updateSpecificRoomStatus
// and markRoomAsFree. The general updateQueueData should not override this detailed status.
// If no patients are called, updateNowCallingDisplay will reflect that rooms are free if their info is null.
tvQueueTable.getColumnModel().getColumn(3).setPreferredWidth(250);
tvQueueTable.getColumnModel().getColumn(3).setMaxWidth(300);
}
@Override
public void setVisible(boolean b) {
if (b) {
if (b) {
loadClinicInfo();
}
super.setVisible(b);
@@ -342,6 +344,6 @@ public class QueueViewPage extends JFrame {
public void optimizeForTv() {
setExtendedState(JFrame.MAXIMIZED_BOTH);
// setUndecorated(true); // Optional: removes window borders, use with caution
// setUndecorated(true);
}
}
}
@@ -427,7 +427,7 @@ public class AddDialog extends JDialog {
patientInfoPanel.add(genderLabel, gbc);
gbc.gridx = 3;
patientGenderField = new JComboBox<>(new String[]{"Nam", "Nữ"});
patientGenderField = new JComboBox<>(new String[]{"Nữ", "Nam"});
patientGenderField.setFont(textFont);
patientGenderField.setPreferredSize(comboBoxSize);
patientInfoPanel.add(patientGenderField, gbc);
@@ -538,7 +538,7 @@ public class AddDialog extends JDialog {
gbc.gridx = 3;
gbc.gridwidth = 1;
gbc.weightx = 0.5;
String[] checkupTypeOptions = {"BỆNH", "THAI", "KHÁC"};
String[] checkupTypeOptions = {"PHỤ KHOA", "THAI", "KHÁC"};
checkupTypeComboBox = new JComboBox<>(checkupTypeOptions);
checkupTypeComboBox.setFont(textFont);
checkupTypeComboBox.setPreferredSize(comboBoxSize);
@@ -385,6 +385,7 @@ public class MedicineDialog extends JDialog {
eveningSpinner.setPreferredSize(new Dimension(60,30));
dosagePanel.add(eveningSpinner, gbc);
gbc.weightx = 0.0;
gbc.gridy = 0;
gbc.gridx = 0;
@@ -691,7 +691,10 @@ public class ServerHandler extends SimpleChannelInboundHandler<TextWebSocketFram
// Gửi phản hồi thành công và broadcast cập nhật
UserUtil.sendPacket(currentUser.getSessionId(), new AddCheckupResponse(true, "Thêm bệnh nhân thành công", queueNumber));
broadcastQueueUpdate();
UserUtil.sendPacket(currentUser.getSessionId(), new SetCounterResponse(queueNumber));
int maxCurId = SessionManager.getMaxSessionId();
for (int sessionId = 1; sessionId <= maxCurId; sessionId++) {
UserUtil.sendPacket(sessionId, new SetCounterResponse(queueNumber));
}
// Tạo thư mục Google Drive bất đồng bộ
createCheckupGoogleDriveFolderAsync(generatedCheckupId, addCheckupRequest.getCustomerId());
@@ -161,55 +161,55 @@
</element>
<element kind="frame" uuid="2f301804-acfa-4b6f-9f52-236c04fd1197" x="0" y="0" width="400" height="344">
<printWhenExpression><![CDATA[$P{numberImage}.intValue() == 6]]></printWhenExpression>
<element kind="image" uuid="fe4e4fa7-8b26-4817-ae86-4c147a25abbe" x="83" y="3" width="111" height="113">
<element kind="image" uuid="fe4e4fa7-8b26-4817-ae86-4c147a25abbe" x="83" y="3" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image1}]]></expression>
</element>
<element kind="image" uuid="9c6302ea-8b4a-48d6-8c42-68313154be77" x="83" y="117" width="111" height="113">
<element kind="image" uuid="9c6302ea-8b4a-48d6-8c42-68313154be77" x="83" y="117" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image3}]]></expression>
</element>
<element kind="image" uuid="d7d6a47e-a129-4726-80b1-701113d0d9c2" x="83" y="231" width="111" height="113">
<element kind="image" uuid="d7d6a47e-a129-4726-80b1-701113d0d9c2" x="83" y="231" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image5}]]></expression>
</element>
<element kind="image" uuid="7cd3d01b-f3ac-48d1-9749-ab5787497ab9" x="198" y="232" width="111" height="113">
<element kind="image" uuid="7cd3d01b-f3ac-48d1-9749-ab5787497ab9" x="198" y="232" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image6}]]></expression>
</element>
<element kind="image" uuid="65610203-a91f-4b55-9a33-d6bfb7ffa7a6" x="199" y="117" width="111" height="113">
<element kind="image" uuid="65610203-a91f-4b55-9a33-d6bfb7ffa7a6" x="199" y="117" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image4}]]></expression>
</element>
<element kind="image" uuid="127b0f54-33e9-43a5-af62-64152d74958f" x="199" y="3" width="111" height="113">
<element kind="image" uuid="127b0f54-33e9-43a5-af62-64152d74958f" x="199" y="3" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image2}]]></expression>
</element>
</element>
<element kind="frame" uuid="58523878-7ef9-46fe-aad7-ee5bd65115aa" x="0" y="1" width="400" height="344">
<printWhenExpression><![CDATA[$P{numberImage}.intValue() == 5]]></printWhenExpression>
<element kind="image" uuid="6870ae02-5ee4-40e8-9787-1ad084dc3b7f" x="83" y="3" width="111" height="113">
<element kind="image" uuid="6870ae02-5ee4-40e8-9787-1ad084dc3b7f" x="83" y="3" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image1}]]></expression>
</element>
<element kind="image" uuid="4216a22f-f20f-4bf1-9e93-79ccc3bbd5c6" x="83" y="117" width="111" height="113">
<element kind="image" uuid="4216a22f-f20f-4bf1-9e93-79ccc3bbd5c6" x="83" y="117" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image3}]]></expression>
</element>
<element kind="image" uuid="3069d087-6d97-455c-bb0d-211b0698b54c" x="142" y="231" width="111" height="113">
<element kind="image" uuid="3069d087-6d97-455c-bb0d-211b0698b54c" x="142" y="231" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image5}]]></expression>
</element>
<element kind="image" uuid="34187787-d55d-495a-be82-9ff67702211f" x="199" y="117" width="111" height="113">
<element kind="image" uuid="34187787-d55d-495a-be82-9ff67702211f" x="199" y="117" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image4}]]></expression>
</element>
<element kind="image" uuid="7b2d4efb-1f35-4c37-80a1-685195e1218e" x="199" y="3" width="111" height="113">
<element kind="image" uuid="7b2d4efb-1f35-4c37-80a1-685195e1218e" x="199" y="3" width="111" height="113" scaleImage="RetainShape">
<expression><![CDATA[$P{image2}]]></expression>
</element>
</element>
<element kind="frame" uuid="33b6f6ef-93e4-4488-a421-08de09b5458c" x="0" y="0" width="400" height="344">
<printWhenExpression><![CDATA[$P{numberImage}.intValue() == 4]]></printWhenExpression>
<element kind="image" uuid="1378905c-276f-42ba-9101-18b27ba14e0b" x="28" y="3" width="161" height="165">
<element kind="image" uuid="1378905c-276f-42ba-9101-18b27ba14e0b" x="21" y="3" width="181" height="165" scaleImage="RetainShape">
<expression><![CDATA[$P{image1}]]></expression>
</element>
<element kind="image" uuid="58917767-70d5-4822-bb6f-7f5aba6f660e" x="29" y="173" width="161" height="165">
<element kind="image" uuid="58917767-70d5-4822-bb6f-7f5aba6f660e" x="22" y="173" width="181" height="165" scaleImage="RetainShape">
<expression><![CDATA[$P{image3}]]></expression>
</element>
<element kind="image" uuid="6026efa4-cfd7-4b1d-90be-fe8912eb43c3" x="210" y="3" width="161" height="165">
<element kind="image" uuid="6026efa4-cfd7-4b1d-90be-fe8912eb43c3" x="203" y="3" width="181" height="165" scaleImage="RetainShape">
<expression><![CDATA[$P{image2}]]></expression>
</element>
<element kind="image" uuid="6c5adc41-f3d7-4e32-997a-e1845d7170c5" x="211" y="173" width="161" height="165">
<element kind="image" uuid="6c5adc41-f3d7-4e32-997a-e1845d7170c5" x="204" y="173" width="181" height="165" scaleImage="RetainShape">
<expression><![CDATA[$P{image4}]]></expression>
</element>
</element>
@@ -217,29 +217,31 @@
<printWhenExpression><![CDATA[$P{numberImage}.intValue() == 3]]></printWhenExpression>
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.x" value="px"/>
<element kind="image" uuid="3ab88449-e282-41cd-898e-ab91aeef70b9" x="28" y="3" width="161" height="165">
<element kind="image" uuid="3ab88449-e282-41cd-898e-ab91aeef70b9" x="2" y="3" width="197" height="165" scaleImage="RetainShape">
<expression><![CDATA[$P{image1}]]></expression>
</element>
<element kind="image" uuid="119378b1-674d-457a-bc69-a9823f2160b7" x="121" y="173" width="161" height="165">
<element kind="image" uuid="119378b1-674d-457a-bc69-a9823f2160b7" x="100" y="173" width="210" height="165" scaleImage="RetainShape">
<expression><![CDATA[$P{image3}]]></expression>
<property name="com.jaspersoft.studio.unit.x" value="px"/>
</element>
<element kind="image" uuid="8ac7bc19-5ae6-4569-87fb-c9cf72936b50" x="210" y="3" width="161" height="165">
<element kind="image" uuid="8ac7bc19-5ae6-4569-87fb-c9cf72936b50" x="205" y="3" width="195" height="165" scaleImage="RetainShape">
<expression><![CDATA[$P{image2}]]></expression>
<property name="com.jaspersoft.studio.unit.x" value="px"/>
</element>
</element>
<element kind="frame" uuid="935efa61-0cd7-47ab-b7d8-6508a1726537" x="0" y="0" width="400" height="344">
<printWhenExpression><![CDATA[$P{numberImage}.intValue() == 2]]></printWhenExpression>
<element kind="image" uuid="8f2957f9-fb76-49d1-94ce-08c723aec7ce" x="121" y="3" width="161" height="165">
<element kind="image" uuid="8f2957f9-fb76-49d1-94ce-08c723aec7ce" x="70" y="3" width="270" height="165" scaleImage="RetainShape">
<expression><![CDATA[$P{image1}]]></expression>
</element>
<element kind="image" uuid="f5585019-40b7-4b1b-9c7a-8b10386cf210" x="121" y="173" width="161" height="165">
<element kind="image" uuid="f5585019-40b7-4b1b-9c7a-8b10386cf210" x="70" y="173" width="270" height="165" scaleImage="RetainShape">
<expression><![CDATA[$P{image2}]]></expression>
</element>
</element>
<element kind="frame" uuid="dfa0c283-dbfc-40de-97e0-d1d04db85c96" x="0" y="0" width="400" height="344">
<printWhenExpression><![CDATA[$P{numberImage}.intValue() == 1]]></printWhenExpression>
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<element kind="image" uuid="a7cef70f-1dbe-4d6f-a007-7543bbc2b9b8" x="29" y="4" width="342" height="335">
<element kind="image" uuid="a7cef70f-1dbe-4d6f-a007-7543bbc2b9b8" x="10" y="4" width="381" height="335" scaleImage="RetainShape">
<expression><![CDATA[$P{image1}]]></expression>
</element>
</element>
@@ -256,7 +258,7 @@
<element kind="image" uuid="14220495-3e07-4322-9c5f-ebf98a8083c8" x="-50" y="3" width="48" height="48">
<expression><![CDATA[$P{driveURL}]]></expression>
</element>
<element kind="staticText" uuid="fbffa5e9-b68c-4bd9-be86-34d3537fbfa5" x="2" y="538" width="196" height="15" fontName="Times New Roman" fontSize="12.0" bold="true" italic="true" hTextAlign="Left">
<element kind="staticText" uuid="fbffa5e9-b68c-4bd9-be86-34d3537fbfa5" x="2" y="538" width="196" height="15" fontName="Times New Roman" fontSize="12.0" italic="true" bold="true" hTextAlign="Left">
<text><![CDATA[Lưu ý: Mang phiếu khi tái khám]]></text>
</element>
</element>
@@ -139,16 +139,16 @@
<printWhenExpression><![CDATA[$P{driveURL} != null]]></printWhenExpression>
<text><![CDATA[Xem KQ online]]></text>
</element>
<element kind="image" uuid="692eae9f-a304-4cda-856d-7a3a95fac3df" stretchType="NoStretch" x="400" y="97" width="151" height="124">
<element kind="image" uuid="692eae9f-a304-4cda-856d-7a3a95fac3df" stretchType="NoStretch" x="400" y="97" width="151" height="124" scaleImage="RetainShape">
<expression><![CDATA[$P{image1}]]></expression>
</element>
<element kind="image" uuid="9a15475c-d08c-4c8f-bbdf-70cf98f97e90" x="400" y="222" width="151" height="124">
<element kind="image" uuid="9a15475c-d08c-4c8f-bbdf-70cf98f97e90" x="400" y="222" width="151" height="124" scaleImage="RetainShape">
<expression><![CDATA[$P{image2}]]></expression>
</element>
<element kind="image" uuid="2902cf3c-31dd-4b96-be87-fa8a13ba88ae" x="400" y="347" width="151" height="124">
<element kind="image" uuid="2902cf3c-31dd-4b96-be87-fa8a13ba88ae" x="400" y="347" width="151" height="124" scaleImage="RetainShape">
<expression><![CDATA[$P{image3}]]></expression>
</element>
<element kind="image" uuid="129e6c61-d572-48a9-925e-1ab2e4e573e2" x="400" y="472" width="151" height="124">
<element kind="image" uuid="129e6c61-d572-48a9-925e-1ab2e4e573e2" x="400" y="472" width="151" height="124" scaleImage="RetainShape">
<expression><![CDATA[$P{image4}]]></expression>
</element>
<element kind="textField" uuid="5fde8538-8d26-4761-9a19-dd716a74749a" x="1" y="12" width="398" height="20" forecolor="#FF0905" fontName="Times New Roman" fontSize="14.0" bold="true" hTextAlign="Center">
@@ -191,7 +191,7 @@
<element kind="textField" uuid="4d8aeb33-ab41-4a5b-a5d1-52bab4043246" x="48" y="155" width="150" height="15" fontName="Times New Roman" fontSize="12.0">
<expression><![CDATA[$P{reCheckupDate}]]></expression>
</element>
<element kind="staticText" uuid="f1223127-533c-4ecf-a950-7324b8aae0fa" x="0" y="170" width="196" height="15" fontName="Times New Roman" fontSize="12.0" bold="true" italic="true" hTextAlign="Left">
<element kind="staticText" uuid="f1223127-533c-4ecf-a950-7324b8aae0fa" x="0" y="170" width="196" height="15" fontName="Times New Roman" fontSize="12.0" italic="true" bold="true" hTextAlign="Left">
<text><![CDATA[Lưu ý: Mang phiếu khi tái khám]]></text>
</element>
</summary>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 B

After

Width:  |  Height:  |  Size: 102 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 516 B

After

Width:  |  Height:  |  Size: 520 B