diff --git a/src/main/java/com/cardiff/client_project/controller/admin/CommonAdminHospitalController.java b/src/main/java/com/cardiff/client_project/controller/admin/CommonAdminHospitalController.java index 4de2677d6babd91de6e2f5307eafc93353c90d6c..fa508744974e4506fd77f441badc79d5c4aba29c 100644 --- a/src/main/java/com/cardiff/client_project/controller/admin/CommonAdminHospitalController.java +++ b/src/main/java/com/cardiff/client_project/controller/admin/CommonAdminHospitalController.java @@ -1,6 +1,7 @@ package com.cardiff.client_project.controller.admin; import com.cardiff.client_project.pojo.dto.HospitalDTO; +import com.cardiff.client_project.pojo.vo.NurseVO; import com.cardiff.client_project.service.CommonAdminHospitalService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -31,7 +32,7 @@ public class CommonAdminHospitalController { commonAdminHospitalService.addHospital(hospital); return ResponseEntity.ok("Hospital added successfully!"); } catch (Exception e) { - e.printStackTrace(); + e.printStackTrace(); // Print error log return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("Error adding hospital: " + e.getMessage()); } @@ -45,13 +46,8 @@ public class CommonAdminHospitalController { @PutMapping("/update") public ResponseEntity<String> updateHospital(@RequestBody HospitalDTO hospital) { - try { - commonAdminHospitalService.updateHospital(hospital); - return ResponseEntity.ok("Hospital updated successfully!"); - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Error updating hospital: " + e.getMessage()); - } + commonAdminHospitalService.updateHospital(hospital); + return ResponseEntity.ok("Hospital updated successfully!"); } @DeleteMapping("/delete/{id}") @@ -64,4 +60,14 @@ public class CommonAdminHospitalController { .body("Failed to delete hospital: " + e.getMessage()); } } + + @GetMapping("/nurses") + public List<NurseVO> getNurses(@RequestParam(value = "name", required = false) String name, + @RequestParam(value = "hospitalId", required = false) Integer hospitalId) { + if (name == null && hospitalId == null) { + return commonAdminHospitalService.getAllNurses(); + } + return commonAdminHospitalService.searchNurses(name, hospitalId); + } + } diff --git a/src/main/java/com/cardiff/client_project/mapper/CommonAdminHospitalMapper.java b/src/main/java/com/cardiff/client_project/mapper/CommonAdminHospitalMapper.java index a26f4ff0cd3a36f666cf051db16ca3ca79bdda1e..eecf39fc96f45a64b2c82731548776e9b199308f 100644 --- a/src/main/java/com/cardiff/client_project/mapper/CommonAdminHospitalMapper.java +++ b/src/main/java/com/cardiff/client_project/mapper/CommonAdminHospitalMapper.java @@ -1,11 +1,13 @@ package com.cardiff.client_project.mapper; import com.cardiff.client_project.pojo.dto.HospitalDTO; +import com.cardiff.client_project.pojo.vo.NurseVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; +import java.util.ArrayList; import java.util.List; @Repository @@ -14,25 +16,38 @@ public class CommonAdminHospitalMapper { @Autowired JdbcTemplate jdbcTemplate; - // Query all hospital information - public List<HospitalDTO> findAll() { - String sql = "SELECT * FROM hospital"; - return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(HospitalDTO.class)); + // æ›´æ–°åŒ»é™¢ä¿¡æ¯ + public int update(HospitalDTO hospital) { + String sql = "UPDATE hospital SET name=?, address=?, phone=?, totalBeds=?, availableBeds=?, occupancyRate=? WHERE id=?"; + return jdbcTemplate.update(sql, hospital.getName(), hospital.getAddress(), hospital.getPhone(), + hospital.getTotalBeds(), hospital.getAvailableBeds(), hospital.getOccupancyRate(), hospital.getId()); } - // Add Hospital Information - public int save(HospitalDTO hospital) { - String sql = "INSERT INTO hospital (name, location, phone, totalBeds, availableBeds, occupancyRate) VALUES (?, ?, ?, ?, ?, ?)"; - return jdbcTemplate.update(sql, hospital.getName(), hospital.getLocation(), hospital.getPhone(), hospital.getTotalBeds(), hospital.getAvailableBeds(), hospital.getOccupancyRate()); + public List<NurseVO> findAllNurses() { + String sql = "SELECT id, name, status, " + + "CASE WHEN status = 1 THEN 'Active' ELSE 'Inactive' END AS status_str, " + + "hospitalId, type AS gender, age, address, email, phone " + + "FROM nurse"; + return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(NurseVO.class)); } - // Update Hospital Information - public int update(HospitalDTO hospital) { - String sql = "UPDATE hospital SET name=?, location=?, phone=?, totalBeds=?, availableBeds=?, occupancyRate=? WHERE id=?"; - return jdbcTemplate.update(sql, hospital.getName(), hospital.getLocation(), hospital.getPhone(), hospital.getTotalBeds(), hospital.getAvailableBeds(), hospital.getOccupancyRate(), hospital.getId()); + public List<NurseVO> searchNurses(String name, Integer hospitalId) { + StringBuilder sql = new StringBuilder("SELECT id, name, status, "); + sql.append("CASE WHEN status = 1 THEN 'Active' ELSE 'Inactive' END AS status_str, "); + sql.append("hospitalId, type AS gender, age, address, email, phone "); + sql.append("FROM nurse WHERE 1=1"); + + List<Object> params = new ArrayList<>(); + if (name != null && !name.isEmpty()) { + sql.append(" AND name LIKE ?"); + params.add("%" + name + "%"); + } + if (hospitalId != null) { + sql.append(" AND hospitalId = ?"); + params.add(hospitalId); + } + + return jdbcTemplate.query(sql.toString(), params.toArray(), new BeanPropertyRowMapper<>(NurseVO.class)); } - - - } diff --git a/src/main/java/com/cardiff/client_project/service/CommonAdminHospitalService.java b/src/main/java/com/cardiff/client_project/service/CommonAdminHospitalService.java index 7dd5503128c07b5f0134fb9bb64c5107b75d54e4..9bce53158e34312afcd7e585641a29a02cd5affc 100644 --- a/src/main/java/com/cardiff/client_project/service/CommonAdminHospitalService.java +++ b/src/main/java/com/cardiff/client_project/service/CommonAdminHospitalService.java @@ -1,6 +1,9 @@ package com.cardiff.client_project.service; +import com.cardiff.client_project.pojo.dto.SelectDTO; import com.cardiff.client_project.pojo.dto.HospitalDTO; +import com.cardiff.client_project.pojo.vo.NurseVO; +import com.cardiff.client_project.utils.Result; import java.util.List; @@ -11,7 +14,13 @@ public interface CommonAdminHospitalService { void addHospital(HospitalDTO hospital); + Result add(Object entity); + void updateHospital(HospitalDTO hospital); void deleteHospital(int id); + + List<NurseVO> getAllNurses(); + List<NurseVO> searchNurses(String name, Integer hospitalId); + } diff --git a/src/main/java/com/cardiff/client_project/service/imp/CommonAdminHospitalServiceImp.java b/src/main/java/com/cardiff/client_project/service/imp/CommonAdminHospitalServiceImp.java index 3d5352666f8408f3ee334b32294dd143b8e5bfa6..535199c8949f1fd2011910a681d5bbf53a931b30 100644 --- a/src/main/java/com/cardiff/client_project/service/imp/CommonAdminHospitalServiceImp.java +++ b/src/main/java/com/cardiff/client_project/service/imp/CommonAdminHospitalServiceImp.java @@ -1,7 +1,10 @@ package com.cardiff.client_project.service.imp; +import com.cardiff.client_project.mapper.CommonAdminHospitalMapper; import com.cardiff.client_project.pojo.dto.HospitalDTO; +import com.cardiff.client_project.pojo.vo.NurseVO; import com.cardiff.client_project.service.CommonAdminHospitalService; +import com.cardiff.client_project.utils.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; @@ -15,6 +18,9 @@ public class CommonAdminHospitalServiceImp implements CommonAdminHospitalService @Autowired private JdbcTemplate jdbcTemplate; + @Autowired + private CommonAdminHospitalMapper commonAdminHospitalMapper; + @Override public List<HospitalDTO> getAllHospitals() { String sql = "SELECT * FROM hospital"; @@ -23,19 +29,21 @@ public class CommonAdminHospitalServiceImp implements CommonAdminHospitalService @Override public List<HospitalDTO> searchHospitals(String name, String location) { - String sql = "SELECT * FROM hospital WHERE 1=1"; + StringBuilder sql = new StringBuilder("SELECT * FROM hospital WHERE 1=1"); if (name != null && !name.isEmpty()) { - sql += " AND name LIKE '%" + name + "%'"; + sql.append(" AND name LIKE ?"); } if (location != null && !location.isEmpty()) { - sql += " AND location LIKE '%" + location + "%'"; + sql.append(" AND address LIKE ?"); } - return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(HospitalDTO.class)); + return jdbcTemplate.query(sql.toString(), new BeanPropertyRowMapper<>(HospitalDTO.class), + name != null ? "%" + name + "%" : null, + location != null ? "%" + location + "%" : null); } @Override public void addHospital(HospitalDTO hospital) { - if (hospital.getName() == null || hospital.getAddress() == null || // 修改为 address + if (hospital.getName() == null || hospital.getAddress() == null || hospital.getPhone() == null || hospital.getTotalBeds() <= 0 || hospital.getAvailableBeds() < 0) { throw new IllegalArgumentException("Invalid hospital data: Missing or incorrect fields."); @@ -48,18 +56,22 @@ public class CommonAdminHospitalServiceImp implements CommonAdminHospitalService hospital.getTotalBeds(), hospital.getAvailableBeds(), occupancyRate); } + @Override + public Result add(Object entity) { + return null; + } @Override public void updateHospital(HospitalDTO hospital) { - if (hospital.getId() <= 0 || hospital.getName() == null || hospital.getLocation() == null || + if (hospital.getId() <= 0 || hospital.getName() == null || hospital.getAddress() == null || hospital.getPhone() == null || hospital.getTotalBeds() <= 0 || hospital.getAvailableBeds() < 0) { throw new IllegalArgumentException("Invalid hospital data: Missing or incorrect fields."); } - String sql = "UPDATE hospital SET name = ?, location = ?, phone = ?, totalBeds = ?, availableBeds = ?, occupancyRate = ? WHERE id = ?"; + String sql = "UPDATE hospital SET name = ?, address = ?, phone = ?, totalBeds = ?, availableBeds = ?, occupancyRate = ? WHERE id = ?"; double occupancyRate = 1.0 - (double) hospital.getAvailableBeds() / hospital.getTotalBeds(); - int rowsUpdated = jdbcTemplate.update(sql, hospital.getName(), hospital.getLocation(), hospital.getPhone(), + int rowsUpdated = jdbcTemplate.update(sql, hospital.getName(), hospital.getAddress(), hospital.getPhone(), hospital.getTotalBeds(), hospital.getAvailableBeds(), occupancyRate, hospital.getId()); if (rowsUpdated == 0) { @@ -69,21 +81,19 @@ public class CommonAdminHospitalServiceImp implements CommonAdminHospitalService @Override public void deleteHospital(int id) { - // Delete the specified record. - String deleteSql = "DELETE FROM hospital WHERE id = ?"; - jdbcTemplate.update(deleteSql, id); - - // Reorder ID - String reorderSql = "SET @new_id = 0; " + - "UPDATE hospital SET id = (@new_id := @new_id + 1); " + - "ALTER TABLE hospital AUTO_INCREMENT = 1;"; - for (String sql : reorderSql.split(";")) { - if (!sql.trim().isEmpty()) { - jdbcTemplate.execute(sql.trim()); - } - } + String sql = "DELETE FROM hospital WHERE id = ?"; + jdbcTemplate.update(sql, id); } + @Override + public List<NurseVO> getAllNurses() { + return commonAdminHospitalMapper.findAllNurses(); + } + + @Override + public List<NurseVO> searchNurses(String name, Integer hospitalId) { + return commonAdminHospitalMapper.searchNurses(name, hospitalId); + } } diff --git a/src/main/resources/static/html/admin.html b/src/main/resources/static/html/admin.html index 39c0ab949c7262f9d3645550d3de58ff462a78ff..10ec49f919d25b1c79c652f9fd0b46aff99ec539 100644 --- a/src/main/resources/static/html/admin.html +++ b/src/main/resources/static/html/admin.html @@ -10,7 +10,7 @@ <nav class="sidebar"> <div class="text-lg font-semibold">System</div> <a href="#" data-content="hospital">Hospital</a> - <a href="#" data-content="patient">Nursing staff</a> + <a href="#" data-content="nursing">Nursing Staff</a> <a><div onclick="chooseOut()">Sign Out</div></a> </nav> <div class="content"> @@ -68,6 +68,7 @@ function loadHospitalInterface() { dynamicContent.innerHTML = ` + <h2>Hospital Management</h2> <div id="toolbar"> <label for="searchName">Name</label> <input type="text" id="searchName" placeholder="Search by name" /> @@ -84,19 +85,50 @@ <th>Name</th> <th>Address</th> <th>Phone</th> - <th>Total Beds</th> - <th>Available Beds</th> <th>Actions</th> </tr> </thead> - <tbody id="table-body"></tbody> + <tbody id="hospital-table-body"></tbody> </table> `; - bindToolbarEvents(); + bindHospitalToolbarEvents(); loadHospitals(); } + function loadNursingStaffInterface() { + dynamicContent.innerHTML = ` + <h2>Nursing Staff</h2> + <div id="toolbar"> + <label for="searchNurseName">Name</label> + <input type="text" id="searchNurseName" placeholder="Search by name" /> + <label for="searchNurseHospitalId">Hospital ID</label> + <input type="number" id="searchNurseHospitalId" placeholder="Search by Hospital ID" /> + <button id="searchNurseButton">Search</button> + <button id="allNurseButton">All</button> + </div> + <table> + <thead> + <tr> + <th>ID</th> + <th>Name</th> + <th>Status</th> + <th>Hospital ID</th> + <th>Age</th> + <th>Address</th> + <th>Email</th> + <th>Phone</th> + </tr> + </thead> + <tbody id="nursing-table-body"></tbody> + </table> + + `; + + bindNursingToolbarEvents(); + loadNurses(); + } + function openAddHospitalModal() { document.getElementById('modal-title').innerText = "Add New Hospital"; document.getElementById('hospital-modal').style.display = 'flex'; @@ -120,8 +152,8 @@ name: document.getElementById('modal-name').value.trim(), address: document.getElementById('modal-address').value.trim(), phone: document.getElementById('modal-phone').value.trim(), - totalBeds: parseInt(document.getElementById('modal-totalBeds').value, 10), - availableBeds: parseInt(document.getElementById('modal-availableBeds').value, 10), + totalBeds: parseInt(document.getElementById('modal-totalBeds').value.trim()), + availableBeds: parseInt(document.getElementById('modal-availableBeds').value.trim()) }; if (!hospitalData.name || !hospitalData.address || !hospitalData.phone || @@ -153,7 +185,7 @@ fetch(`/commonAdmin/hospital/all?${query}`) .then(response => response.json()) .then(data => { - const tableBody = document.getElementById('table-body'); + const tableBody = document.getElementById('hospital-table-body'); tableBody.innerHTML = ''; data.forEach(hospital => { @@ -163,8 +195,6 @@ <td>${hospital.name}</td> <td>${hospital.address}</td> <td>${hospital.phone}</td> - <td>${hospital.totalBeds}</td> - <td>${hospital.availableBeds}</td> <td> <button class="editButton" data-id="${hospital.id}">Edit</button> <button class="deleteButton" data-id="${hospital.id}">Delete</button> @@ -172,103 +202,85 @@ `; tableBody.appendChild(row); }); - - bindRowEvents(); }) .catch(error => console.error("Error loading hospitals:", error)); } - function handleDeleteHospital(event) { - const id = event.target.getAttribute('data-id'); - - if (confirm(`Are you sure you want to delete the hospital with ID ${id}?`)) { - fetch(`/commonAdmin/hospital/delete/${id}`, { method: 'DELETE' }) - .then(response => { - if (response.ok) { - alert("Deleted successfully!"); - loadHospitals(); - } else { - throw new Error("Failed to delete hospital."); - } - }) - .catch(error => console.error("Error deleting hospital:", error)); - } - } - - function handleEditHospital(event) { - const id = event.target.getAttribute('data-id'); - - fetch(`/commonAdmin/hospital/${id}`) + function loadNurses(filters = {}) { + const query = new URLSearchParams(filters).toString(); + fetch(`/commonAdmin/hospital/nurses?${query}`) .then(response => response.json()) - .then(hospital => { - document.getElementById('modal-title').innerText = "Edit Hospital"; - document.getElementById('modal-name').value = hospital.name; - document.getElementById('modal-address').value = hospital.address; - document.getElementById('modal-phone').value = hospital.phone; - document.getElementById('modal-totalBeds').value = hospital.totalBeds; - document.getElementById('modal-availableBeds').value = hospital.availableBeds; - document.getElementById('hospital-modal').style.display = 'flex'; - - document.getElementById('save-hospital-btn').onclick = () => updateHospital(id); + .then(data => { + const tableBody = document.getElementById('nursing-table-body'); + tableBody.innerHTML = ''; + + data.forEach(nurse => { + const row = document.createElement('tr'); + row.innerHTML = ` + <td>${nurse.id}</td> + <td>${nurse.name}</td> + <td>${nurse.status_str}</td> + <td>${nurse.hospitalId}</td> + <td>${nurse.age}</td> + <td>${nurse.address}</td> + <td>${nurse.email}</td> + <td>${nurse.phone}</td> + `; + tableBody.appendChild(row); + }); }) - .catch(error => console.error("Error fetching hospital details:", error)); + .catch(error => console.error("Error loading nurses:", error)); } - function updateHospital(id) { - const hospitalData = { - id, - name: document.getElementById('modal-name').value.trim(), - address: document.getElementById('modal-address').value.trim(), - phone: document.getElementById('modal-phone').value.trim(), - totalBeds: parseInt(document.getElementById('modal-totalBeds').value, 10), - availableBeds: parseInt(document.getElementById('modal-availableBeds').value, 10), - }; - if (!hospitalData.name || !hospitalData.address || !hospitalData.phone || - isNaN(hospitalData.totalBeds) || isNaN(hospitalData.availableBeds)) { - alert("All fields are required!"); - return; - } - fetch('/commonAdmin/hospital/update', { - method: 'PUT', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(hospitalData), - }).then(response => { - if (response.ok) { - alert("Hospital updated successfully!"); - closeHospitalModal(); - loadHospitals(); - } else { - return response.text().then(text => { throw new Error(text); }); - } - }).catch(error => { - console.error("Error updating hospital:", error); - alert("Failed to update hospital: " + error.message); - }); - } - function bindToolbarEvents() { + function bindHospitalToolbarEvents() { document.getElementById('addHospitalButton').addEventListener('click', openAddHospitalModal); + document.getElementById('searchButton').addEventListener('click', () => { + const name = document.getElementById('searchName').value.trim(); + const address = document.getElementById('searchAddress').value.trim(); + const filters = {}; + + if (name) filters.name = name; + if (address) filters.location = address; + + loadHospitals(filters); + }); + document.getElementById('allButton').addEventListener('click', () => { + loadHospitals(); + }); + + // Add close button event listener + document.getElementById('close-hospital-modal').addEventListener('click', closeHospitalModal); } - function bindRowEvents() { - document.querySelectorAll('.deleteButton').forEach(button => { - button.addEventListener('click', handleDeleteHospital); + function bindNursingToolbarEvents() { + document.getElementById('searchNurseButton').addEventListener('click', () => { + const name = document.getElementById('searchNurseName').value.trim(); + const hospitalId = document.getElementById('searchNurseHospitalId').value.trim(); + const filters = {}; + + if (name) filters.name = name; + if (hospitalId) filters.hospitalId = hospitalId; + + loadNurses(filters); }); - document.querySelectorAll('.editButton').forEach(button => { - button.addEventListener('click', handleEditHospital); + document.getElementById('allNurseButton').addEventListener('click', () => { + loadNurses(); }); } - document.getElementById('close-hospital-modal').addEventListener('click', closeHospitalModal); + document.querySelectorAll(".sidebar a").forEach(link => { link.addEventListener("click", function(event) { event.preventDefault(); const contentKey = this.getAttribute("data-content"); if (contentKey === "hospital") { loadHospitalInterface(); + } else if (contentKey === "nursing") { + loadNursingStaffInterface(); } }); });