[update] Enhance DataDialog and related components to support search by checkup ID. Introduce new ID search field and update request handling in GetCheckupDataRequest and ServerHandler. Modify ultrasound report templates to include ID and barcode generation for improved data presentation.

This commit is contained in:
Lê Thành Đạt committed 2025-08-04 11:08:15 +07:00
1 parent bb1ee74238
commit 1fcd1e4106
10 files changed
+125 -85

No files matched your search

BIN
View File
Binary file not shown.
@@ -26,6 +26,7 @@ public class LocalStorage {
public static Date dataDialogFromDate = new Date();
public static Date dataDialogToDate = new Date();
public static String dataDialogDoctorName = "Tất cả";
public static String dataDialogIdSearchTerm = "";
public static List<DoctorItem> doctorsName = new ArrayList<>();
public static String[] provinces = new String[]{};
@@ -4833,6 +4833,10 @@ public class CheckUpPage extends JPanel {
recheckupDatePickerButton.setEnabled(false);
}
templateTitle = null;
photoNum = 0;
orientationComboBox.setSelectedItem("ngang");
medicinePrescription = new String[0][0];
servicePrescription = new String[0][0];
updatePrescriptionTree();
@@ -289,7 +289,7 @@ public class UltrasoundResult {
parameters.put("doctorName", this.doctorName);
parameters.put("ultrasoundDoctorName", this.ultrasoundDoctorName);
parameters.put("checkupDate", this.checkupDate);
parameters.put("barcodeNumber", this.checkupId);
parameters.put("id", this.checkupId);
// RTF and plain text content
parameters.put("checkupNote", this.rtfContent != null ? this.rtfContent : "");
@@ -305,6 +305,23 @@ public class UltrasoundResult {
// Template title
parameters.put("templateTitle", this.templateTitle);
try {
// Generate barcode and get file path
String barcodePath = BarcodeGenerator.generateCode128WithFixedName(this.checkupId, 200, 50, "invoice_barcode");
parameters.put("barcodeNumber", barcodePath);
// Generate QR code for the driveURL
String qrcodePath = BarcodeGenerator.generateQRCodeWithFixedName(this.driveUrl, 220, 220, "invoice_qrcode");
parameters.put("driveURL", qrcodePath);
} catch (Exception e) {
log.error("Error generating barcode/QR code images: {}", e.getMessage());
// Set fallback parameters as null or empty if image generation fails
parameters.put("barcodeNumber", null);
parameters.put("driveURL", null);
}
// Extra safety: Ensure no parameter is null or "null" string
for (String key : parameters.keySet()) {
@@ -318,7 +335,7 @@ public class UltrasoundResult {
int numberOfImages = this.selectedImages.size();
parameters.put("numberImage", numberOfImages);
parameters.put("logoImage", System.getProperty("user.dir") + "/src/main/java/BsK/client/ui/assets/icon/logo.jpg");
for (int i = 0; i < 6; i++) {
if (i < numberOfImages) {
@@ -328,8 +345,6 @@ public class UltrasoundResult {
}
}
// Google Drive URL for QR code generation
parameters.put("driveURL", this.driveUrl);
// Load pre-compiled report or compile JRXML as fallback
JasperReport jasperReport = loadCompiledReport(reportName);
@@ -32,6 +32,7 @@ public class DataDialog extends JDialog {
//<editor-fold desc="Properties for Checkup Data Tab">
private JTextField searchField;
private JTextField idSearchField;
private JComboBox<String> doctorComboBox;
private JSpinner fromDateSpinner;
private JSpinner toDateSpinner;
@@ -151,6 +152,14 @@ public class DataDialog extends JDialog {
} else {
doctorComboBox.setSelectedIndex(0);
}
if (LocalStorage.dataDialogIdSearchTerm != null && !LocalStorage.dataDialogIdSearchTerm.isEmpty()) {
idSearchField.setText(LocalStorage.dataDialogIdSearchTerm);
idSearchField.setForeground(Color.BLACK);
} else {
idSearchField.setText("Tìm theo mã phiếu khám...");
idSearchField.setForeground(Color.GRAY);
}
}
private JPanel createControlPanel() {
@@ -221,6 +230,27 @@ public class DataDialog extends JDialog {
bottomRow.add(Box.createHorizontalStrut(20));
bottomRow.add(new JLabel("Bác sĩ:"));
bottomRow.add(Box.createHorizontalStrut(15)); // Thêm khoảng cách
bottomRow.add(new JLabel("Mã Phiếu:"));
idSearchField = new JTextField("Tìm theo mã phiếu khám...", 12); // Tạo field mới
idSearchField.setForeground(Color.GRAY);
idSearchField.setPreferredSize(new Dimension(150, 25));
idSearchField.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
if (idSearchField.getText().equals("Tìm theo mã phiếu khám...")) {
idSearchField.setText("");
idSearchField.setForeground(Color.BLACK);
}
}
public void focusLost(java.awt.event.FocusEvent evt) {
if (idSearchField.getText().isEmpty()) {
idSearchField.setText("Tìm theo mã phiếu khám...");
idSearchField.setForeground(Color.GRAY);
}
}
});
bottomRow.add(idSearchField);
doctorComboBox = new JComboBox<>();
doctorComboBox.addItem("Tất cả");
if (LocalStorage.doctorsName != null) {
@@ -251,7 +281,7 @@ public class DataDialog extends JDialog {
});
getAllButton.addActionListener(e -> {
GetCheckupDataRequest request = new GetCheckupDataRequest(null, null, null, null, 1, recordsPerPage);
GetCheckupDataRequest request = new GetCheckupDataRequest(null, null,null, null, null, 1, recordsPerPage);
NetworkUtil.sendPacket(ClientHandler.ctx.channel(), request);
resultCountLabel.setText("Đang tải tất cả dữ liệu...");
});
@@ -266,7 +296,7 @@ public class DataDialog extends JDialog {
resultCountLabel.setFont(new Font("Arial", Font.PLAIN, 12));
gridPanel.add(resultCountLabel, BorderLayout.NORTH);
String[] columnNames = {"STT", "Mã BN", "Họ và Tên", "Năm sinh", "Giới tính", "Ngày khám", "Bác sĩ khám", "Chẩn đoán", "Kết luận", "Hành động"};
String[] columnNames = {"STT", "Mã khám", "Họ và Tên", "Năm sinh", "Giới tính", "Ngày khám", "Bác sĩ khám", "Chẩn đoán", "Kết luận", "Hành động"};
tableModel = new DefaultTableModel(columnNames, 0) {
@Override
public boolean isCellEditable(int row, int column) {
@@ -301,6 +331,18 @@ public class DataDialog extends JDialog {
searchTerm = null;
}
String checkupIdSearch = idSearchField.getText();
if (checkupIdSearch == null || checkupIdSearch.equals("Tìm theo mã phiếu khám...") || checkupIdSearch.trim().isEmpty()) {
checkupIdSearch = null;
}
// Ưu tiên tìm theo Mã phiếu khám. Nếu có, bỏ qua tìm kiếm chung.
if (checkupIdSearch != null) {
searchTerm = null;
searchField.setText("Tìm theo tên bệnh nhân, mã bệnh nhân...");
searchField.setForeground(Color.GRAY);
}
Date fromDate = (Date) fromDateSpinner.getValue();
Date toDate = (Date) toDateSpinner.getValue();
@@ -335,7 +377,7 @@ public class DataDialog extends JDialog {
}
}
GetCheckupDataRequest request = new GetCheckupDataRequest(searchTerm, fromTimestamp, toTimestamp, doctorId, page, recordsPerPage);
GetCheckupDataRequest request = new GetCheckupDataRequest(searchTerm, checkupIdSearch, fromTimestamp, toTimestamp, doctorId, page, recordsPerPage);
NetworkUtil.sendPacket(ClientHandler.ctx.channel(), request);
resultCountLabel.setText("Đang tải dữ liệu cho trang " + page + "...");
@@ -488,6 +530,12 @@ public class DataDialog extends JDialog {
} else {
LocalStorage.dataDialogSearchTerm = searchTerm;
}
String idSearchTerm = idSearchField.getText();
if (idSearchTerm.equals("Tìm theo mã phiếu khám...")) {
LocalStorage.dataDialogIdSearchTerm = "";
} else {
LocalStorage.dataDialogIdSearchTerm = idSearchTerm;
}
LocalStorage.dataDialogFromDate = (Date) fromDateSpinner.getValue();
LocalStorage.dataDialogToDate = (Date) toDateSpinner.getValue();
@@ -507,10 +555,11 @@ public class DataDialog extends JDialog {
LocalStorage.dataDialogFromDate = today;
LocalStorage.dataDialogToDate = today;
LocalStorage.dataDialogDoctorName = "Tất cả";
LocalStorage.dataDialogIdSearchTerm = "";
}
class ActionButtonRenderer extends JPanel implements TableCellRenderer {
private JButton editButton, deleteButton;
private JButton editButton;
public ActionButtonRenderer() {
setLayout(new FlowLayout(FlowLayout.CENTER, 2, 2));
@@ -521,20 +570,11 @@ public class DataDialog extends JDialog {
}
editButton = new JButton(editIcon);
ImageIcon deleteIcon = new ImageIcon("src/main/java/BsK/client/ui/assets/icon/delete.png");
if (deleteIcon.getImage() != null) {
deleteIcon.setImage(deleteIcon.getImage().getScaledInstance(16, 16, Image.SCALE_SMOOTH));
}
deleteButton = new JButton(deleteIcon);
editButton.setPreferredSize(new Dimension(30, 25));
deleteButton.setPreferredSize(new Dimension(30, 25));
editButton.setToolTipText("Sửa");
deleteButton.setToolTipText("Xóa");
add(editButton);
add(deleteButton);
}
@Override
@@ -550,7 +590,7 @@ public class DataDialog extends JDialog {
class ActionButtonEditor extends DefaultCellEditor {
private JPanel panel;
private JButton editButton, deleteButton;
private JButton editButton;
public ActionButtonEditor(JDialog parentDialog) {
super(new JCheckBox());
@@ -562,14 +602,7 @@ public class DataDialog extends JDialog {
}
editButton = new JButton(editIcon);
ImageIcon deleteIcon = new ImageIcon("src/main/java/BsK/client/ui/assets/icon/delete.png");
if (deleteIcon.getImage() != null) {
deleteIcon.setImage(deleteIcon.getImage().getScaledInstance(16, 16, Image.SCALE_SMOOTH));
}
deleteButton = new JButton(deleteIcon);
editButton.setPreferredSize(new Dimension(30, 25));
deleteButton.setPreferredSize(new Dimension(30, 25));
editButton.addActionListener(e -> {
fireEditingStopped();
@@ -598,25 +631,9 @@ public class DataDialog extends JDialog {
}
});
deleteButton.addActionListener(e -> {
fireEditingStopped();
int row = dataTable.getSelectedRow();
if (row < 0) return;
String patientId = (String) tableModel.getValueAt(row, 1);
int result = JOptionPane.showConfirmDialog(parentDialog,
"Bạn có chắc chắn muốn xóa phiếu khám của bệnh nhân " + patientId + " không?",
"Xác nhận xóa",
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
if (result == JOptionPane.YES_OPTION) {
tableModel.removeRow(row);
JOptionPane.showMessageDialog(parentDialog, "Đã xóa phiếu khám thành công!", "Thông báo", JOptionPane.INFORMATION_MESSAGE);
}
});
panel.add(editButton);
panel.add(deleteButton);
}
@Override
@@ -10,6 +10,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class GetCheckupDataRequest implements Packet {
private String searchTerm;
private String checkupIdSearch;
private Long fromDate; // Use Long for timestamp
private Long toDate; // Use Long for timestamp
private Integer doctorId;
@@ -150,7 +150,7 @@ public final class TextUtils {
// The font size in RTF is in half-points. JTextPane seems to generate
// sizes that are double what is visually represented. Dividing by 2
// brings it to the expected point size for JasperReports.
int newSize = originalSize / 2;
int newSize = (int) (originalSize / 1.5);
// Append the replacement string. We need to escape the backslash for appendReplacement.
matcher.appendReplacement(sb, "\\\\fs" + newSize);
@@ -1368,8 +1368,20 @@ public class ServerHandler extends SimpleChannelInboundHandler<TextWebSocketFram
StringBuilder whereClause = new StringBuilder();
java.util.List<Object> params = new java.util.ArrayList<>();
boolean hasWhere = false;
if (getCheckupDataRequest.getSearchTerm() != null && !getCheckupDataRequest.getSearchTerm().trim().isEmpty()) {
String checkupIdSearch = getCheckupDataRequest.getCheckupIdSearch();
if (checkupIdSearch != null && !checkupIdSearch.trim().isEmpty()) {
whereClause.append("WHERE a.checkup_id = ?");
try {
// Chuyển đổi sang kiểu số để tìm kiếm chính xác và an toàn
params.add(Integer.parseInt(checkupIdSearch.trim()));
} catch (NumberFormatException e) {
// Nếu người dùng nhập chữ, ta truyền một giá trị không thể tìm thấy để trả về 0 kết quả
params.add(-1);
}
hasWhere = true;
}
else if (getCheckupDataRequest.getSearchTerm() != null && !getCheckupDataRequest.getSearchTerm().trim().isEmpty()) {
whereClause.append("WHERE (LOWER(c.customer_first_name) LIKE ? OR LOWER(c.customer_last_name) LIKE ? OR " +
"LOWER(CONCAT(c.customer_last_name, ' ', c.customer_first_name)) LIKE ? OR c.customer_number LIKE ?)");
String searchTerm = "%" + getCheckupDataRequest.getSearchTerm().toLowerCase().trim() + "%";
@@ -39,6 +39,7 @@
<parameter name="driveURL" class="java.lang.String"/>
<parameter name="ultrasoundDoctorName" class="java.lang.String"/>
<parameter name="clinicPrefix" class="java.lang.String"/>
<parameter name="id" class="java.lang.String"/>
<query language="sql"><![CDATA[]]></query>
<background splitType="Stretch"/>
<title splitType="Stretch"/>
@@ -47,16 +48,13 @@
<detail>
<band height="538" splitType="Stretch">
<element kind="frame" uuid="2b7ec588-953c-4145-87b7-1d861c272fe0" x="0" y="0" width="399" height="538">
<element kind="image" uuid="fd80ab38-4cae-409b-84b9-356220d2b1e5" x="0" y="1" width="60" height="60">
<expression><![CDATA[$P{logoImage}]]></expression>
</element>
<element kind="textField" uuid="eb56d4c8-2a0d-45fa-89a2-ad6528f9a99b" x="60" y="0" width="260" height="20" forecolor="#FF0905" fontName="Times New Roman" fontSize="14.0" bold="true" hTextAlign="Center">
<element kind="textField" uuid="eb56d4c8-2a0d-45fa-89a2-ad6528f9a99b" x="2" y="0" width="287" height="20" forecolor="#FF0905" fontName="Times New Roman" fontSize="14.0" bold="true" hTextAlign="Center">
<expression><![CDATA[$P{clinicPrefix}]]></expression>
</element>
<element kind="textField" uuid="796d9ffd-6d2e-4ae3-bdfb-b08183d7d9c0" x="63" y="30" width="229" height="20" fontName="Times New Roman" fontSize="10.0">
<element kind="textField" uuid="796d9ffd-6d2e-4ae3-bdfb-b08183d7d9c0" x="2" y="30" width="287" height="20" fontName="Times New Roman" fontSize="10.0">
<expression><![CDATA[$P{clinicAddress}]]></expression>
</element>
<element kind="textField" uuid="260bb33d-1d11-4178-aceb-3fbf8fcb4b45" x="63" y="42" width="162" height="12" fontName="Times New Roman" fontSize="8.0">
<element kind="textField" uuid="260bb33d-1d11-4178-aceb-3fbf8fcb4b45" x="2" y="42" width="287" height="12" fontName="Times New Roman" fontSize="8.0">
<expression><![CDATA["SDT: " + $P{clinicPhone}]]></expression>
</element>
<element kind="staticText" uuid="6f89a93f-2d10-4506-baa5-226bdd047b17" x="0" y="65" width="100" height="30" forecolor="#FF0905" fontName="Times New Roman" fontSize="14.0" bold="true">
@@ -134,16 +132,11 @@
<element kind="textField" uuid="6b0b21be-2ca3-4594-bbe9-34868e13eb1e" x="45" y="150" width="55" height="16" fontName="Times New Roman" fontSize="10.0">
<expression><![CDATA[$P{checkupBloodPressure} +" mmHg"]]></expression>
</element>
<element kind="component" uuid="e8842007-3343-4399-a101-76a302d0755d" x="354" y="1" width="44" height="37">
<component kind="barcode4j:QRCode">
<codeExpression><![CDATA[$P{driveURL}]]></codeExpression>
</component>
</element>
<element kind="textField" uuid="9763a634-05c2-4f64-a903-c914455b7ee6" x="70" y="60" width="282" height="22" forecolor="#FF0905" fontName="Times New Roman" fontSize="12.0" bold="true" hTextAlign="Center">
<printWhenExpression><![CDATA[$P{templateTitle} != null && !$P{templateTitle}.trim().isEmpty()]]></printWhenExpression>
<expression><![CDATA["PHIẾU " + $P{templateTitle}]]></expression>
</element>
<element kind="textField" uuid="40902efd-728a-46df-8432-f4a5798a4ee3" x="60" y="13" width="260" height="20" forecolor="#FF0905" fontName="Times New Roman" fontSize="14.0" bold="true" hTextAlign="Center">
<element kind="textField" uuid="40902efd-728a-46df-8432-f4a5798a4ee3" x="2" y="13" width="287" height="20" forecolor="#FF0905" fontName="Times New Roman" fontSize="14.0" bold="true" hTextAlign="Center">
<expression><![CDATA[$P{clinicName}]]></expression>
</element>
</element>
@@ -169,11 +162,6 @@
<element kind="textField" uuid="e90ad772-4425-482d-9e75-f2bc66b9084d" x="0" y="358" width="400" height="70" fontName="Times New Roman" fontSize="12.0" bold="true">
<expression><![CDATA[$P{checkupConclusion}]]></expression>
</element>
<element kind="component" uuid="cb28d811-1328-45dc-9461-cfbb88b7eeae" x="-105" y="30" width="59" height="32">
<component kind="barcode4j:Code128">
<codeExpression><![CDATA[$P{barcodeNumber}]]></codeExpression>
</component>
</element>
<element kind="textField" uuid="d63165c2-19e2-43ad-8a3f-004e00bffdfe" x="0" y="450" width="240" height="66" fontName="Times New Roman" fontSize="12.0">
<expression><![CDATA[$P{checkupSuggestion}]]></expression>
</element>
@@ -264,10 +252,19 @@
<expression><![CDATA[$P{image1}]]></expression>
</element>
</element>
<element kind="staticText" uuid="8f35aa72-22a4-45f0-a35e-8e35e832404e" x="-46" y="39" width="44" height="21" fontName="Times New Roman" fontSize="8.0" bold="false" hTextAlign="Center">
<element kind="staticText" uuid="8f35aa72-22a4-45f0-a35e-8e35e832404e" x="-48" y="54" width="44" height="21" fontName="Times New Roman" fontSize="8.0" bold="true" hTextAlign="Center">
<printWhenExpression><![CDATA[$P{driveURL} != null && !$P{driveURL}.trim().isEmpty()]]></printWhenExpression>
<text><![CDATA[Xem KQ online]]></text>
</element>
<element kind="textField" uuid="6d7df7cd-924f-4306-bcea-d643f7a977f0" x="-111" y="42" width="60" height="12" fontName="Times New Roman" fontSize="8.0" hTextAlign="Center">
<expression><![CDATA[$P{id}]]></expression>
</element>
<element kind="image" uuid="16aab6b9-7618-451e-ae48-8bf7bd857bbc" x="-111" y="13" width="61" height="29">
<expression><![CDATA[$P{barcodeNumber}]]></expression>
</element>
<element kind="image" uuid="14220495-3e07-4322-9c5f-ebf98a8083c8" x="-50" y="3" width="48" height="48">
<expression><![CDATA[$P{driveURL}]]></expression>
</element>
</element>
</band>
</detail>
@@ -15,12 +15,8 @@
<parameter name="patientName" class="java.lang.String"/>
<parameter name="patientDOB" class="java.lang.String"/>
<parameter name="clinicAddress" class="java.lang.String"/>
<parameter name="logoImage" class="java.lang.String"/>
<parameter name="barcodeNumber" class="java.lang.String"/>
<parameter name="patientGender" class="java.lang.String"/>
<parameter name="hasMedicines" class="java.lang.Boolean"/>
<parameter name="hasServices" class="java.lang.Boolean"/>
<parameter name="hasSupplements" class="java.lang.Boolean"/>
<parameter name="checkupConclusion" class="java.lang.String"/>
<parameter name="checkupSuggestion" class="java.lang.String"/>
<parameter name="reCheckupDate" class="java.lang.String"/>
@@ -39,6 +35,7 @@
<parameter name="driveURL" class="java.lang.String"/>
<parameter name="ultrasoundDoctorName" class="java.lang.String"/>
<parameter name="clinicPrefix" class="java.lang.String"/>
<parameter name="id" class="java.lang.String"/>
<query language="sql"><![CDATA[]]></query>
<background splitType="Stretch"/>
<title splitType="Stretch"/>
@@ -47,16 +44,13 @@
<detail>
<band height="598" splitType="Stretch">
<element kind="frame" uuid="2b7ec588-953c-4145-87b7-1d861c272fe0" x="0" y="0" width="551" height="598">
<element kind="image" uuid="fd80ab38-4cae-409b-84b9-356220d2b1e5" x="0" y="-5" width="70" height="64">
<expression><![CDATA[$P{logoImage}]]></expression>
</element>
<element kind="textField" uuid="eb56d4c8-2a0d-45fa-89a2-ad6528f9a99b" x="70" y="-5" width="358" height="22" forecolor="#FF0905" fontName="Times New Roman" fontSize="14.0" bold="true" hTextAlign="Center">
<element kind="textField" uuid="eb56d4c8-2a0d-45fa-89a2-ad6528f9a99b" x="1" y="-5" width="398" height="22" forecolor="#FF0905" fontName="Times New Roman" fontSize="14.0" bold="true" hTextAlign="Center">
<expression><![CDATA[$P{clinicPrefix}]]></expression>
</element>
<element kind="textField" uuid="796d9ffd-6d2e-4ae3-bdfb-b08183d7d9c0" x="70" y="29" width="358" height="20" fontName="Times New Roman" fontSize="10.0">
<element kind="textField" uuid="796d9ffd-6d2e-4ae3-bdfb-b08183d7d9c0" x="1" y="29" width="398" height="12" fontName="Times New Roman" fontSize="10.0">
<expression><![CDATA[$P{clinicAddress}]]></expression>
</element>
<element kind="textField" uuid="260bb33d-1d11-4178-aceb-3fbf8fcb4b45" x="70" y="41" width="276" height="15" fontName="Times New Roman" fontSize="8.0">
<element kind="textField" uuid="260bb33d-1d11-4178-aceb-3fbf8fcb4b45" x="1" y="41" width="398" height="15" fontName="Times New Roman" fontSize="8.0">
<expression><![CDATA[$P{clinicPhone}]]></expression>
</element>
<element kind="staticText" uuid="6f89a93f-2d10-4506-baa5-226bdd047b17" x="0" y="65" width="100" height="30" forecolor="#FF0905" fontName="Times New Roman" fontSize="14.0" bold="true">
@@ -134,24 +128,14 @@
<element kind="textField" uuid="6b0b21be-2ca3-4594-bbe9-34868e13eb1e" x="52" y="150" width="58" height="16" fontName="Times New Roman" fontSize="12.0">
<expression><![CDATA[$P{checkupBloodPressure} +" mmHg"]]></expression>
</element>
<element kind="component" uuid="e8842007-3343-4399-a101-76a302d0755d" x="499" y="17" width="52" height="48">
<component kind="barcode4j:QRCode">
<codeExpression><![CDATA[$P{driveURL}]]></codeExpression>
</component>
</element>
<element kind="textField" uuid="9763a634-05c2-4f64-a903-c914455b7ee6" x="70" y="61" width="282" height="20" forecolor="#FF0905" fontName="Times New Roman" fontSize="12.0" bold="true" hTextAlign="Center">
<printWhenExpression><![CDATA[$P{templateTitle} != null && !$P{templateTitle}.trim().isEmpty()]]></printWhenExpression>
<expression><![CDATA["PHIẾU " + $P{templateTitle}]]></expression>
</element>
<element kind="staticText" uuid="8f35aa72-22a4-45f0-a35e-8e35e832404e" x="495" y="64" width="55" height="14" fontName="Times New Roman" fontSize="8.0" bold="false" hTextAlign="Center">
<printWhenExpression><![CDATA[$P{driveURL} != null && !$P{driveURL}.trim().isEmpty()]]></printWhenExpression>
<element kind="staticText" uuid="8f35aa72-22a4-45f0-a35e-8e35e832404e" x="495" y="61" width="55" height="14" fontName="Times New Roman" fontSize="8.0" bold="false" hTextAlign="Center">
<printWhenExpression><![CDATA[$P{driveURL} != null]]></printWhenExpression>
<text><![CDATA[Xem KQ online]]></text>
</element>
<element kind="component" uuid="73f562ce-2891-4577-aec2-7284203c8430" x="429" y="15" width="70" height="49">
<component kind="barcode4j:Code128">
<codeExpression><![CDATA[$P{barcodeNumber}]]></codeExpression>
</component>
</element>
<element kind="image" uuid="692eae9f-a304-4cda-856d-7a3a95fac3df" stretchType="NoStretch" x="400" y="91" width="151" height="124">
<expression><![CDATA[$P{image1}]]></expression>
</element>
@@ -164,9 +148,18 @@
<element kind="image" uuid="129e6c61-d572-48a9-925e-1ab2e4e573e2" x="400" y="466" width="151" height="124">
<expression><![CDATA[$P{image4}]]></expression>
</element>
<element kind="textField" uuid="5fde8538-8d26-4761-9a19-dd716a74749a" x="70" y="12" width="358" height="20" forecolor="#FF0905" fontName="Times New Roman" fontSize="14.0" bold="true" hTextAlign="Center">
<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">
<expression><![CDATA[$P{clinicName}]]></expression>
</element>
<element kind="image" uuid="a38cebd9-fec4-4e7f-8ec2-e6ee57a7464b" x="495" y="1" width="55" height="62">
<expression><![CDATA[$P{driveURL}]]></expression>
</element>
<element kind="image" uuid="69654713-8c32-44f0-9d34-a2a7b9b2bb8d" x="404" y="8" width="80" height="34">
<expression><![CDATA[$P{barcodeNumber}]]></expression>
</element>
<element kind="textField" uuid="989a8031-ea1b-406a-98a4-e797b98c0ccd" x="404" y="43" width="80" height="15" fontName="Times New Roman" fontSize="10.0" hTextAlign="Center">
<expression><![CDATA[$P{id}]]></expression>
</element>
</element>
</band>
</detail>