checkup data recieve fail

This commit is contained in:
lethanhdat committed 2025-01-01 01:49:53 -06:00
1 parent e1fba71f12
commit faa7aa7ea6
20 files changed
+291 -130

No files matched your search

@@ -54,14 +54,8 @@ public class ClientHandler extends SimpleChannelInboundHandler<TextWebSocketFram
ClientHandler.ctx = ctx;
ClientHandler.frame = frame;
var Thread = new Thread(() -> {
try {
UIHandler.INSTANCE.showUI();
} catch (Exception e) {
throw new RuntimeException(e);
}
});
Thread.start();
UIHandler.INSTANCE.showUI();
// When the handshake is complete, the UI is shown
return; // No further processing needed for handshake response
}
@@ -1,17 +1,49 @@
package BsK.client.ui.component.CheckUpPage;
import BsK.client.LocalStorage;
import BsK.client.network.handler.ClientHandler;
import BsK.client.ui.component.MainFrame;
import BsK.client.ui.component.common.RoundedButtonUI;
import BsK.client.ui.component.common.RoundedPanel;
import BsK.common.packet.req.GetCheckUpQueueRequest;
import BsK.common.packet.res.ErrorResponse;
import BsK.common.packet.res.GetCheckUpQueueResponse;
import BsK.common.packet.res.LoginSuccessResponse;
import BsK.common.util.network.NetworkUtil;
import lombok.extern.slf4j.Slf4j;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.table.DefaultTableModel;
import static BsK.client.network.handler.ClientHandler.frame;
@Slf4j
public class CheckUpPage extends JPanel {
private boolean debugMode = false; // Enable debug mode
// update checkup queue
private String[][] queue;
public void updateQueue() {
ClientHandler.addResponseListener(GetCheckUpQueueResponse.class, response -> {
log.info("Received update queue: {}", frame.text());
});
ClientHandler.addResponseListener(ErrorResponse.class, response -> {
log.error("Error response: {}", response.getError());
});
NetworkUtil.sendPacket(ClientHandler.ctx.channel(), new GetCheckUpQueueRequest());
}
public CheckUpPage(MainFrame mainFrame) {
updateQueue();
setLayout(new BorderLayout());
// Sidebar panel
@@ -27,10 +59,6 @@ public class CheckUpPage extends JPanel {
GradientPaint gp = new GradientPaint(0, 0, color1, 0, height, color2);
g2d.setPaint(gp);
g2d.fillRect(0, 0, width, height);
if (debugMode) {
drawBoundingBox(g2d, this);
}
}
};
sidebar.setBackground(new Color(63, 81, 181));
@@ -80,15 +108,7 @@ public class CheckUpPage extends JPanel {
sidebarScrollPane.setOpaque(false);
// Topbar panel
JPanel topbar = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (debugMode) {
drawBoundingBox((Graphics2D) g, this);
}
}
};
JPanel topbar = new JPanel();
topbar.setLayout(new BorderLayout());
topbar.setBackground(Color.WHITE);
topbar.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
@@ -101,39 +121,11 @@ public class CheckUpPage extends JPanel {
userInfo.setHorizontalAlignment(SwingConstants.RIGHT);
topbar.add(userInfo, BorderLayout.EAST);
// Main content panel
JPanel mainContent = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (debugMode) {
drawBoundingBox((Graphics2D) g, this);
}
}
};
mainContent.setLayout(new BorderLayout());
mainContent.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
// Data table inside a RoundedPanel
RoundedPanel dataTable1 = new RoundedPanel(20, Color.WHITE, false) {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (debugMode) {
drawBoundingBox((Graphics2D) g, this);
}
}
};
RoundedPanel leftPanel = new RoundedPanel(20, Color.WHITE, false);
RoundedPanel dataTable2 = new RoundedPanel(20, Color.WHITE, false) {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (debugMode) {
drawBoundingBox((Graphics2D) g, this);
}
}
};
RoundedPanel rightPanel = new RoundedPanel(20, Color.WHITE, false);
JLabel titleText1 = new JLabel();
titleText1.setText("Check Up Queue 1");
@@ -142,78 +134,200 @@ public class CheckUpPage extends JPanel {
titleText1.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Padding
JLabel titleText2 = new JLabel();
titleText2.setText("Check Up Queue 2");
titleText2.setText("Patient Info");
titleText2.setFont(new Font("Arial", Font.BOLD, 16));
titleText2.setBackground(Color.WHITE);
titleText2.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Padding
dataTable1.setLayout(new BorderLayout());
dataTable1.add(titleText1, BorderLayout.NORTH);
dataTable1.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 10)); // Adjust padding for better appearance
leftPanel.setLayout(new BorderLayout());
leftPanel.add(titleText1, BorderLayout.NORTH);
leftPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 10)); // Adjust padding for better appearance
dataTable2.setLayout(new BorderLayout());
dataTable2.add(titleText2, BorderLayout.NORTH);
dataTable2.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 10)); // Adjust padding for better appearance
rightPanel.setLayout(new BorderLayout());
rightPanel.add(titleText2, BorderLayout.NORTH);
rightPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 10));
String[] columns = {"Name", "Gender", "Course"};
String[] columns = {"Name", "Gender", "Age"};
String[][] data = {
{"John", "Male", "Java"},
{"Dara", "Male", "C++"},
{"Bora", "Male", "C#"},
{"John", "Male", "20"},
{"Dara", "Male", "20"},
{"Bora", "Male", "21"},
};
JTable table1 = new JTable(data, columns);
JScrollPane tableScroll1 = new JScrollPane(table1);
tableScroll1.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Inner padding
dataTable1.add(tableScroll1, BorderLayout.CENTER);
JTable table2 = new JTable(data, columns);
JScrollPane tableScroll2 = new JScrollPane(table2);
tableScroll2.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Inner padding
dataTable2.add(tableScroll2, BorderLayout.CENTER);
UIManager.getDefaults().put("SplitPane.border", BorderFactory.createEmptyBorder()); // Remove border
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, dataTable1, dataTable2);
splitPane.setResizeWeight(0.5); // Split
// Add the split pane to the main content
mainContent.add(splitPane, BorderLayout.CENTER);
// Notice board
JPanel noticeBoard = new RoundedPanel(20, Color.WHITE, false) {
DefaultTableModel model = new DefaultTableModel(data, columns) {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (debugMode) {
drawBoundingBox((Graphics2D) g, this);
}
public boolean isCellEditable(int row, int column) {
return false; // All cells are non-editable
}
};
noticeBoard.setLayout(new BorderLayout());
noticeBoard.setBorder(BorderFactory.createTitledBorder("Notice Board"));
noticeBoard.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
JTable table1 = new JTable(model);
JTextArea noticeText = new JTextArea("04/10/2021\nHidemode Now\n\n03/10/2021\nFurther Reading\n");
noticeText.setEditable(false);
noticeBoard.add(new JScrollPane(noticeText), BorderLayout.CENTER);
// Set preferred size for the table
table1.setPreferredScrollableViewportSize(new Dimension(400, 200));
// Customize the font for the table header and cells
table1.getTableHeader().setFont(new Font("Arial", Font.BOLD, 14));
table1.setFont(new Font("Arial", Font.PLAIN, 12));
table1.setRowHeight(25);
JScrollPane tableScroll1 = new JScrollPane(table1);
tableScroll1.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Inner padding
leftPanel.add(tableScroll1, BorderLayout.CENTER);
RoundedPanel inputPanel = new RoundedPanel(20, Color.WHITE, false);
inputPanel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 5, 5, 5); // Add some padding between components
// Username label and text field
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
inputPanel.add(new JLabel("Username:"), gbc);
gbc.gridx = 1;
JTextField usernameField = new JTextField(10);
inputPanel.add(usernameField, gbc);
// Sex label and option field
gbc.gridx = 0;
gbc.gridy = 1;
inputPanel.add(new JLabel("Sex:"), gbc);
gbc.gridx = 1;
String[] sexOptions = {"Male", "Female"};
JComboBox<String> sexComboBox = new JComboBox<>(sexOptions);
inputPanel.add(sexComboBox, gbc);
// Age label and number field
gbc.gridx = 0;
gbc.gridy = 2;
inputPanel.add(new JLabel("Age:"), gbc);
gbc.gridx = 1;
JSpinner ageSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 120, 1));
inputPanel.add(ageSpinner, gbc);
table1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int selectedRow = table1.getSelectedRow();
if (selectedRow != -1) {
// Get the data from the selected row
String name = (String) table1.getValueAt(selectedRow, 0);
String gender = (String) table1.getValueAt(selectedRow, 1);
String age = (String) table1.getValueAt(selectedRow, 2);
// Transfer the data to the inputPanel fields
usernameField.setText(name);
sexComboBox.setSelectedItem(gender);
ageSpinner.setValue(Integer.parseInt(age));
}
}
});
JPanel iconPanel = new JPanel();
iconPanel.setLayout(new GridLayout(1, 5));
iconPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Padding
iconPanel.setBackground(Color.WHITE);
String[] iconName = {"add", "edit", "save", "delete"};
for (String name : iconName) {
ImageIcon originalIcon = new ImageIcon("src/main/resources/icon/" + name + ".png");
Image scaledImage = originalIcon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH); // Resize to 32x32
ImageIcon scaledIcon = new ImageIcon(scaledImage);
JLabel iconLabel = new JLabel(scaledIcon);
iconLabel.setHorizontalAlignment(SwingConstants.CENTER);
iconLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
iconLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
switch (name) {
case "add":
// Add action
JOptionPane.showMessageDialog(null, "Add action triggered");
break;
case "edit":
// Edit action
JOptionPane.showMessageDialog(null, "Edit action triggered");
break;
case "save": {
//Warning message
int option = JOptionPane.showOptionDialog(null, "Do you want to save changes?",
"Save Changes", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
null, null, null);
if (option == JOptionPane.NO_OPTION) {
return;
}
int selectedRow = table1.getSelectedRow();
if (selectedRow != -1) {
// Get the data from the input fields
String name = usernameField.getText();
String gender = (String) sexComboBox.getSelectedItem();
int age = (Integer) ageSpinner.getValue();
// Update the data in the selected row
table1.setValueAt(name, selectedRow, 0);
table1.setValueAt(gender, selectedRow, 1);
table1.setValueAt(String.valueOf(age), selectedRow, 2);
} else
JOptionPane.showMessageDialog(null, "Please select a row to save changes");
break;
}
case "delete":
// Delete action
JOptionPane.showMessageDialog(null, "Delete action triggered");
break;
default:
throw new IllegalStateException("Unexpected value: " + name);
}
}
@Override
public void mouseEntered(MouseEvent e) {
iconLabel.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));
}
@Override
public void mouseExited(MouseEvent e) {
iconLabel.setBorder(null);
}
});
iconPanel.add(iconLabel);
}
rightPanel.add(inputPanel, BorderLayout.CENTER);
rightPanel.add(iconPanel, BorderLayout.SOUTH);
UIManager.getDefaults().put("SplitPane.border", BorderFactory.createEmptyBorder()); // Remove border
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel);
splitPane.setResizeWeight(0.5); // Split
splitPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Remove border
//mainContent.add(noticeBoard, BorderLayout.EAST);
// Adding panels to the frame
add(sidebarScrollPane, BorderLayout.WEST);
add(topbar, BorderLayout.NORTH);
add(mainContent, BorderLayout.CENTER);
add(splitPane , BorderLayout.CENTER);
}
private void drawBoundingBox(Graphics2D g2d, JComponent component) {
g2d.setColor(Color.RED);
g2d.setStroke(new BasicStroke(2));
g2d.drawRect(0, 0, component.getWidth() - 1, component.getHeight() - 1);
}
public static void main(String[] args) {
// JFrame frame = new JFrame("Dashboard");
// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame.setSize(800, 600);
// frame.add(new CheckUpPage();
// frame.setVisible(true);
}
// @Override
// public void removeNotify() {
// super.removeNotify();
// // Remove listeners to avoid memory leaks
// ClientHandler.removeResponseListener(GetCheckUpQueueResponse.class, this::handleGetCheckUpQueueResponse);
// ClientHandler.removeResponseListener(ErrorResponse.class, this::handleErrorResponse);
// }
//
// private void handleGetCheckUpQueueResponse(GetCheckUpQueueResponse response) {
// log.debug("Received checkup queue: {}", frame.text());
// }
//
// private void handleErrorResponse(ErrorResponse response) {
// log.error("Error response: {}", response.getError());
// }
}
@@ -78,7 +78,7 @@ public class LoginPage extends JPanel {
NetworkUtil.sendPacket(ClientHandler.ctx.channel(), loginRequest);
});
// Register listeners for login-related responses
ClientHandler.addResponseListener(LoginSuccessResponse.class, response -> {
log.info("Login successful, UserId: {}, Role: {}", response.getUserId(), response.getRole());
LocalStorage.username = loginField.getText();
@@ -24,6 +24,7 @@ public class MainFrame extends JFrame {
// Add pages to the main panel
mainPanel.add(new LandingPage(this), "LandingPage");
// mainPanel.add(new CheckUpPage(this), "CheckUpPage");
add(mainPanel);
}
@@ -0,0 +1,5 @@
package BsK.common.packet.req;
import BsK.common.packet.Packet;
public class GetCheckUpQueueRequest implements Packet {}
@@ -0,0 +1,11 @@
package BsK.common.packet.res;
import BsK.common.packet.Packet;
import lombok.AllArgsConstructor;
import lombok.Data;
@AllArgsConstructor
@Data
public class GetCheckUpQueueResponse implements Packet {
private String[][] queue;
}
@@ -33,7 +33,7 @@ public class User {
} else {
while(rs.next())
{
log.info(rs.getString("name") + " logged in");
log.info(rs.getString("user_name") + " logged in");
role = Role.valueOf(rs.getString("role_name"));
userId = rs.getInt("user_id");
}
@@ -2,17 +2,12 @@ package BsK.server.network.handler;
import BsK.common.packet.Packet;
import BsK.common.packet.PacketSerializer;
import BsK.common.packet.req.GetPatientInfoReq;
import BsK.common.packet.req.GetCheckUpQueueRequest;
import BsK.common.packet.req.LoginRequest;
import BsK.common.packet.req.RegisterRequest;
import BsK.common.packet.res.ErrorResponse;
import BsK.common.packet.res.*;
import BsK.common.packet.res.ErrorResponse.Error;
import BsK.common.packet.res.GetPatientInfoRes;
import BsK.common.packet.res.HandshakeCompleteResponse;
import BsK.common.packet.res.LoginSuccessResponse;
import BsK.common.util.network.NetworkUtil;
import BsK.server.database.entity.Patient;
import BsK.server.database.entity.Patient.Sex;
import BsK.server.network.manager.SessionManager;
import BsK.server.network.util.UserUtil;
import io.netty.channel.ChannelHandlerContext;
@@ -22,9 +17,14 @@ import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler.Han
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import java.io.IOException;
import java.util.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import lombok.extern.slf4j.Slf4j;
import static BsK.server.Server.statement;
@Slf4j
public class ServerHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
@@ -54,28 +54,64 @@ public class ServerHandler extends SimpleChannelInboundHandler<TextWebSocketFram
registerRequest.getPassword());
// Tạo user trong database hoặc check exist
boolean isUserExist = false;
if (isUserExist) {
var errorResponse = new ErrorResponse(Error.USER_ALREADY_EXISTS);
NetworkUtil.sendPacket(ctx.channel(), errorResponse);
}
} else {
// Gia su packet nay can verify la user da login
// Check if user is authenticated
var user = SessionManager.getUserByChannel(ctx.channel().id().asLongText());
if (!user.isAuthenticated()) {
log.warn("Received packet from unauthenticated user: {}", packet);
return;
}
if (packet instanceof GetCheckUpQueueRequest) {
log.debug("Received GetCheckUpQueueRequest");
try {
ResultSet rs = statement.executeQuery(
"select a.checkup_date, c.customer_last_name, c.customer_first_name, " +
"d.doctor_first_name, d.doctor_last_name, a.symptoms, a.diagnosis, a.notes, a.status " +
"from checkup as a " +
"join customer as c on a.customer_id = c.customer_id " +
"join Doctor D on a.doctor_id = D.doctor_id " +
"where a.status = 'PROCESSING' " +
"order by checkup_id"
);
switch (packet) {
case GetPatientInfoReq getPatientInfoReq -> {
var patientInfo =
new Patient(getPatientInfoReq.getPatientId(), new Date(1999, 01, 01), "test",
Sex.MALE);
var response = new GetPatientInfoRes(patientInfo);
UserUtil.sendPacket(user.getUserId(), response);
if (!rs.isBeforeFirst()) {
System.out.println("No data found in the checkup table.");
} else {
ArrayList<String> resultList = new ArrayList<>();
while (rs.next()) {
String checkupDate = rs.getString("checkup_date");
String customerLastName = rs.getString("customer_last_name");
String customerFirstName = rs.getString("customer_first_name");
String doctorFirstName = rs.getString("doctor_first_name");
String doctorLastName = rs.getString("doctor_last_name");
String symptoms = rs.getString("symptoms");
String diagnosis = rs.getString("diagnosis");
String notes = rs.getString("notes");
String status = rs.getString("status");
String result = String.join(", ",
checkupDate, customerLastName, customerFirstName,
doctorFirstName, doctorLastName, symptoms,
diagnosis, notes, status
);
resultList.add(result);
}
String[] resultString = resultList.toArray(new String[0]);
String[][] resultArray = new String[resultString.length][];
for (int i = 0; i < resultString.length; i++) {
resultArray[i] = resultString[i].split(", ");
}
UserUtil.sendPacket(user.getSessionId(), new GetCheckUpQueueResponse(resultArray));
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
case null, default -> log.warn("Received unknown packet: {}", packet);
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File renamed without changes.
File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

File renamed without changes.
File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

File renamed without changes.