diff --git a/pom.xml b/pom.xml index 3a52d4c..d22f155 100644 --- a/pom.xml +++ b/pom.xml @@ -104,5 +104,13 @@ sqlite-jdbc 3.47.1.0 + + + org.jdatepicker + jdatepicker + 1.3.4 + + + 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 743dc95..b44fc3b 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java @@ -3,18 +3,29 @@ 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.DateLabelFormatter; import BsK.client.ui.component.common.RoundedPanel; import BsK.common.packet.req.GetCheckUpQueueRequest; +import BsK.common.packet.req.GetDoctorGeneralInfo; import BsK.common.packet.res.ErrorResponse; import BsK.common.packet.res.GetCheckUpQueueResponse; +import BsK.common.packet.res.GetDoctorGeneralInfoResponse; import BsK.common.util.network.NetworkUtil; import lombok.extern.slf4j.Slf4j; +import org.jdatepicker.impl.JDatePanelImpl; +import org.jdatepicker.impl.JDatePickerImpl; +import org.jdatepicker.impl.UtilDateModel; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Properties; @Slf4j public class CheckUpPage extends JPanel { @@ -30,11 +41,21 @@ public class CheckUpPage extends JPanel { NetworkUtil.sendPacket(ClientHandler.ctx.channel(), new GetCheckUpQueueRequest()); } + private String[] doctorOptions; + + public void getDoctors() { + // listener + ClientHandler.addResponseListener(GetDoctorGeneralInfoResponse.class, this::handleGetDoctorGeneralInfoResponse); + ClientHandler.addResponseListener(ErrorResponse.class, this::handleErrorResponse); + + NetworkUtil.sendPacket(ClientHandler.ctx.channel(), new GetDoctorGeneralInfo()); + } + public CheckUpPage(MainFrame mainFrame) { setLayout(new BorderLayout()); updateQueue(); - + getDoctors(); // Sidebar panel JPanel sidebar = new JPanel() { @Override @@ -133,7 +154,7 @@ public class CheckUpPage extends JPanel { rightPanel.add(titleText2, BorderLayout.NORTH); rightPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 10)); - String[] columns = {"Ngày Tháng", "Họ", "Tên", "Tên BS", "Họ BS", "Triệu chứng", "Chẩn đoán", "Ghi chú", "Trạng thái"}; + String[] columns = {"Mã khám bệnh", "Ngày Tháng", "Họ", "Tên", "Bác Sĩ", "Triệu chứng", "Chẩn đoán", "Ghi chú", "Trạng thái"}; this.queue = new String[][]{}; // Initialize with empty data model = new DefaultTableModel(this.queue, columns) { @@ -156,60 +177,72 @@ public class CheckUpPage extends JPanel { tableScroll1.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Inner padding leftPanel.add(tableScroll1, BorderLayout.CENTER); // "Ngày Tháng", "Họ", "Tên", "Ten BS", "Họ BS", "Triệu chứng", "Chẩn đoán", "Ghi chú", "Trạng thái" - RoundedPanel inputPanel = new RoundedPanel(20, Color.WHITE, false); + JPanel inputPanel = new JPanel(); inputPanel.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(5, 5, 5, 5); // Add some padding between components + gbc.fill = GridBagConstraints.HORIZONTAL; - // Username label and text field - gbc.gridx = 0; gbc.gridy = 0; - gbc.anchor = GridBagConstraints.WEST; - inputPanel.add(new JLabel("Ngày tháng:"), gbc); + gbc.gridwidth = 1; + gbc.anchor = GridBagConstraints.NORTHWEST; + + inputPanel.add(new JLabel("Mã khám bệnh:"), gbc); gbc.gridx = 1; - JTextField usernameField = new JTextField(20); - inputPanel.add(usernameField, gbc); + JTextField checkupIdField = new JTextField(); + checkupIdField.setEditable(false); + inputPanel.add(checkupIdField, gbc); + + UtilDateModel model = new UtilDateModel(); + Properties p = new Properties(); + p.put("text.today", "Today"); + p.put("text.month", "Month"); + p.put("text.year", "Year"); + JDatePanelImpl datePanel = new JDatePanelImpl(model, p); + JDatePickerImpl datePicker = new JDatePickerImpl(datePanel, new DateLabelFormatter()); + datePicker.setPreferredSize(new Dimension(150, 30)); + + gbc.gridx = 2; + inputPanel.add(new JLabel("Ngày tháng:"), gbc); + + gbc.gridx = 3; + inputPanel.add(datePicker, gbc); + - // Sex label and option field gbc.gridx = 0; gbc.gridy++; inputPanel.add(new JLabel("Họ"), gbc); + gbc.gridx = 1; - JTextField customerLastNameField = new JTextField(20); + JTextField customerLastNameField = new JTextField(5); inputPanel.add(customerLastNameField, gbc); - gbc.gridx = 0; - gbc.gridy++; + gbc.gridx = 2; inputPanel.add(new JLabel("Tên"), gbc); - gbc.gridx = 1; - JTextField customerFirstNameField = new JTextField(20); + gbc.gridx = 3; + JTextField customerFirstNameField = new JTextField(5); inputPanel.add(customerFirstNameField, gbc); + gbc.gridwidth = 4; gbc.gridx = 0; gbc.gridy++; - inputPanel.add(new JLabel("Tên BS"), gbc); + inputPanel.add(new JLabel("Bác Sĩ"), gbc); gbc.gridx = 1; - JTextField doctorFirstNameField = new JTextField(20); - inputPanel.add(doctorFirstNameField, gbc); + JComboBox doctorComboBox = new JComboBox<>(doctorOptions); + inputPanel.add(doctorComboBox, gbc); - gbc.gridx = 0; - gbc.gridy++; - inputPanel.add(new JLabel("Họ BS"), gbc); - gbc.gridx = 1; - JTextField doctorLastNameField = new JTextField(20); - inputPanel.add(doctorLastNameField, gbc); gbc.gridx = 0; gbc.gridy++; inputPanel.add(new JLabel("Triệu chứng"), gbc); gbc.gridx = 1; - JTextField symptomsField = new JTextField(20); + JTextArea symptomsField = new JTextArea(3, 20); inputPanel.add(symptomsField, gbc); gbc.gridx = 0; @@ -217,7 +250,7 @@ public class CheckUpPage extends JPanel { inputPanel.add(new JLabel("Chẩn đoán"), gbc); gbc.gridx = 1; - JTextField diagnosisField = new JTextField(20); + JTextArea diagnosisField = new JTextArea(3, 20); inputPanel.add(diagnosisField, gbc); gbc.gridx = 0; @@ -225,7 +258,7 @@ public class CheckUpPage extends JPanel { inputPanel.add(new JLabel("Ghi chú"), gbc); gbc.gridx = 1; - JTextField notesField = new JTextField(20); + JTextArea notesField = new JTextArea(3, 20); inputPanel.add(notesField, gbc); gbc.gridx = 0; @@ -243,27 +276,40 @@ public class CheckUpPage extends JPanel { public void mouseClicked(MouseEvent e) { int selectedRow = table1.getSelectedRow(); if (selectedRow != -1) { - String date = (String) table1.getValueAt(selectedRow, 0); - String customerLastName = (String) table1.getValueAt(selectedRow, 1); - String customerFirstName = (String) table1.getValueAt(selectedRow, 2); - String doctorFirstName = (String) table1.getValueAt(selectedRow, 3); - String doctorLastName = (String) table1.getValueAt(selectedRow, 4); + String checkupId = (String) table1.getValueAt(selectedRow, 0); + String date = (String) table1.getValueAt(selectedRow, 1); + String customerLastName = (String) table1.getValueAt(selectedRow, 2); + String customerFirstName = (String) table1.getValueAt(selectedRow, 3); + String doctor = (String) table1.getValueAt(selectedRow, 4); String symptoms = (String) table1.getValueAt(selectedRow, 5); String diagnosis = (String) table1.getValueAt(selectedRow, 6); String notes = (String) table1.getValueAt(selectedRow, 7); String status = (String) table1.getValueAt(selectedRow, 8); - usernameField.setText(date); + checkupIdField.setText(checkupId); + + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); + try { + Date parsedDate = dateFormat.parse(date); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(parsedDate); + datePicker.getModel().setDate(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); + datePicker.getModel().setSelected(true); + } catch (ParseException exception) { + exception.printStackTrace(); + } + customerLastNameField.setText(customerLastName); customerFirstNameField.setText(customerFirstName); - doctorFirstNameField.setText(doctorFirstName); - doctorLastNameField.setText(doctorLastName); + doctorComboBox.setSelectedItem(doctor); symptomsField.setText(symptoms); diagnosisField.setText(diagnosis); notesField.setText(notes); statusComboBox.setSelectedItem(status); } } + + }); JPanel iconPanel = new JPanel(); @@ -333,8 +379,6 @@ public class CheckUpPage extends JPanel { add(sidebarScrollPane, BorderLayout.WEST); add(topbar, BorderLayout.NORTH); add(splitPane, BorderLayout.CENTER); - - } @Override @@ -345,10 +389,15 @@ public class CheckUpPage extends JPanel { ClientHandler.removeResponseListener(ErrorResponse.class, this::handleErrorResponse); } + private void handleGetDoctorGeneralInfoResponse(GetDoctorGeneralInfoResponse response) { + log.info("Received doctor general info"); + this.doctorOptions = response.getDoctorsName(); + } + private void handleGetCheckUpQueueResponse(GetCheckUpQueueResponse response) { log.info("Received checkup queue"); this.queue = response.getQueue(); - model.setDataVector(this.queue, new String[]{"Ngày Tháng", "Họ", "Tên", "Ten BS", "Họ BS", "Triệu chứng", "Chẩn đoán", "Ghi chú", "Trạng thái"}); + model.setDataVector(this.queue, new String[]{"Mã khám bệnh", "Ngày Tháng", "Họ", "Tên", "Bác Sĩ", "Triệu chứng", "Chẩn đoán", "Ghi chú", "Trạng thái"}); } private void handleErrorResponse(ErrorResponse response) { diff --git a/src/main/java/BsK/client/ui/component/common/DateLabelFormatter.java b/src/main/java/BsK/client/ui/component/common/DateLabelFormatter.java new file mode 100644 index 0000000..00670a8 --- /dev/null +++ b/src/main/java/BsK/client/ui/component/common/DateLabelFormatter.java @@ -0,0 +1,31 @@ +package BsK.client.ui.component.common; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Locale; + +import org.jdatepicker.*; + +import javax.swing.*; + +public class DateLabelFormatter extends JFormattedTextField.AbstractFormatter { + + private String datePattern = "dd/MM/yyyy"; + private SimpleDateFormat dateFormatter = new SimpleDateFormat(datePattern, Locale.ENGLISH); + + @Override + public Object stringToValue(String text) throws ParseException { + return dateFormatter.parseObject(text); + } + + @Override + public String valueToString(Object value) throws ParseException { + if (value != null) { + Calendar cal = (Calendar) value; + return dateFormatter.format(cal.getTime()); + } + + return ""; + } +} \ No newline at end of file diff --git a/src/main/java/BsK/common/packet/req/GetDoctorGeneralInfo.java b/src/main/java/BsK/common/packet/req/GetDoctorGeneralInfo.java new file mode 100644 index 0000000..e61956b --- /dev/null +++ b/src/main/java/BsK/common/packet/req/GetDoctorGeneralInfo.java @@ -0,0 +1,6 @@ +package BsK.common.packet.req; + +import BsK.common.packet.Packet; + +public class GetDoctorGeneralInfo implements Packet { +} diff --git a/src/main/java/BsK/common/packet/res/GetDoctorGeneralInfoResponse.java b/src/main/java/BsK/common/packet/res/GetDoctorGeneralInfoResponse.java new file mode 100644 index 0000000..555bcbe --- /dev/null +++ b/src/main/java/BsK/common/packet/res/GetDoctorGeneralInfoResponse.java @@ -0,0 +1,13 @@ +package BsK.common.packet.res; + +import BsK.common.packet.Packet; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data + +public class GetDoctorGeneralInfoResponse implements Packet { + String[] doctorsName; +} diff --git a/src/main/java/BsK/server/network/handler/ServerHandler.java b/src/main/java/BsK/server/network/handler/ServerHandler.java index c92e561..ac75596 100644 --- a/src/main/java/BsK/server/network/handler/ServerHandler.java +++ b/src/main/java/BsK/server/network/handler/ServerHandler.java @@ -3,6 +3,7 @@ package BsK.server.network.handler; import BsK.common.packet.Packet; import BsK.common.packet.PacketSerializer; import BsK.common.packet.req.GetCheckUpQueueRequest; +import BsK.common.packet.req.GetDoctorGeneralInfo; import BsK.common.packet.req.LoginRequest; import BsK.common.packet.req.RegisterRequest; import BsK.common.packet.res.*; @@ -69,13 +70,12 @@ public class ServerHandler extends SimpleChannelInboundHandler resultList = new ArrayList<>(); while (rs.next()) { + String checkupId = rs.getString("checkup_id"); String checkupDate = rs.getString("checkup_date"); long checkupDateLong = Long.parseLong(checkupDate); Timestamp timestamp = new Timestamp(checkupDateLong); @@ -99,9 +100,9 @@ public class ServerHandler extends SimpleChannelInboundHandler resultList = new ArrayList<>(); + while (rs.next()) { + String doctorName = rs.getString(1); + resultList.add(doctorName); + } + String[] resultString = resultList.toArray(new String[0]); + UserUtil.sendPacket(user.getSessionId(), new GetDoctorGeneralInfoResponse(resultString)); + } + } + catch (SQLException e) { + throw new RuntimeException(e); + } + } } }