Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 20 additions & 19 deletions src/main/java/com/pethospital/dao/impl/HealthRecordDaoImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -478,56 +478,57 @@ private HealthRecord mapResultSetToHealthRecord(ResultSet rs) throws SQLExceptio
public PageResult<HealthRecord> findByCondition(String petName, String diagnosis, String doctorName,
Date visitDateStart, Date visitDateEnd, Integer ownerId,
int currentPage, int pageSize) {
// 构建查询条件
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append("SELECT hr.*, p.pet_name, p.pet_type, p.breed ");
sqlBuilder.append("FROM health_records hr ");
sqlBuilder.append("LEFT JOIN pets p ON hr.pet_id = p.pet_id ");
sqlBuilder.append("WHERE 1=1 ");
// 构建WHERE条件部分(复用于数据查询和数量查询)
StringBuilder whereBuilder = new StringBuilder("FROM health_records hr ");
whereBuilder.append("LEFT JOIN pets p ON hr.pet_id = p.pet_id ");
whereBuilder.append("WHERE 1=1 ");

List<Object> params = new ArrayList<>();

if (petName != null && !petName.trim().isEmpty()) {
sqlBuilder.append("AND p.pet_name LIKE ? ");
whereBuilder.append("AND p.pet_name LIKE ? ");
params.add("%" + petName.trim() + "%");
}

if (diagnosis != null && !diagnosis.trim().isEmpty()) {
sqlBuilder.append("AND hr.diagnosis LIKE ? ");
whereBuilder.append("AND hr.diagnosis LIKE ? ");
params.add("%" + diagnosis.trim() + "%");
}

if (doctorName != null && !doctorName.trim().isEmpty()) {
sqlBuilder.append("AND hr.doctor_name = ? ");
whereBuilder.append("AND hr.doctor_name = ? ");
params.add(doctorName.trim());
}

if (visitDateStart != null) {
sqlBuilder.append("AND hr.visit_date >= ? ");
whereBuilder.append("AND hr.visit_date >= ? ");
params.add(visitDateStart);
}

if (visitDateEnd != null) {
sqlBuilder.append("AND hr.visit_date <= ? ");
whereBuilder.append("AND hr.visit_date <= ? ");
params.add(visitDateEnd);
}

if (ownerId != null) {
sqlBuilder.append("AND p.owner_id = ? ");
whereBuilder.append("AND p.owner_id = ? ");
params.add(ownerId);
}

// 先查询总记录数
String countSql = sqlBuilder.toString().replace("SELECT hr.*, p.pet_name, p.pet_type, p.breed", "SELECT COUNT(*)");
// 先查询总记录数(独立构造COUNT查询)
String countSql = "SELECT COUNT(*) " + whereBuilder.toString();
long totalCount = executeCountQuery(countSql, params);

// 添加排序和分页
sqlBuilder.append("ORDER BY hr.visit_date DESC LIMIT ? OFFSET ?");
params.add(pageSize);
params.add((currentPage - 1) * pageSize);
// 添加排序和分页(构造数据查询)
String dataSql = "SELECT hr.*, p.pet_name, p.pet_type, p.breed " +
whereBuilder.toString() +
"ORDER BY hr.visit_date DESC LIMIT ? OFFSET ?";
List<Object> dataParams = new ArrayList<>(params);
dataParams.add(pageSize);
dataParams.add((currentPage - 1) * pageSize);

// 查询分页数据
List<HealthRecord> healthRecords = executeQuery(sqlBuilder.toString(), params);
List<HealthRecord> healthRecords = executeQuery(dataSql, dataParams);

return new PageResult<>(healthRecords, currentPage, pageSize, totalCount);
}
Expand Down
19 changes: 1 addition & 18 deletions src/main/java/com/pethospital/dao/impl/PetDaoImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,33 +57,16 @@ public List<Pet> findByOwnerId(Integer ownerId) {
ResultSet rs = null;
List<Pet> pets = new ArrayList<>();

System.out.println("DEBUG: PetDaoImpl.findByOwnerId() 执行SQL查询,ownerId: " + ownerId);
System.out.println("DEBUG: SQL: " + sql);

try {
conn = DBUtil.getConnection();
System.out.println("DEBUG: 数据库连接获取成功: " + (conn != null));

pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, ownerId);
rs = pstmt.executeQuery();

int count = 0;
while (rs.next()) {
Pet pet = mapResultSetToPet(rs);
pets.add(pet);
count++;
System.out.println("DEBUG: 找到宠物 " + count + " - ID: " + pet.getPetId() +
", 名称: " + pet.getPetName() +
", 类型: " + pet.getPetType() +
", 品种: " + pet.getBreed() +
", 主人ID: " + pet.getOwnerId());
pets.add(mapResultSetToPet(rs));
}

System.out.println("DEBUG: 总共找到 " + count + " 只宠物");

} catch (SQLException e) {
System.out.println("DEBUG: 数据库查询异常: " + e.getMessage());
e.printStackTrace();
} finally {
DBUtil.closeAll(conn, pstmt, rs);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/pethospital/entity/HealthRecord.java
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ public void setPet(Pet pet) {
*/
public boolean needsFollowUp() {
if (nextVisitDate == null) return false;
return nextVisitDate.after(new Date(System.currentTimeMillis()));
return !nextVisitDate.before(new Date(System.currentTimeMillis()));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,12 @@ public Pet getPetById(Integer petId) {

@Override
public List<Pet> getPetsByOwnerId(Integer ownerId) {
System.out.println("DEBUG: PetServiceImpl.getPetsByOwnerId() 被调用,ownerId: " + ownerId);

if (ownerId == null || ownerId <= 0) {
System.out.println("DEBUG: ownerId 无效,返回 null");
return null;
return new java.util.ArrayList<>();
}

List<Pet> pets = petDao.findByOwnerId(ownerId);
System.out.println("DEBUG: DAO 返回的宠物数量: " + (pets != null ? pets.size() : "null"));

return pets;
return pets != null ? pets : new java.util.ArrayList<>();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,11 @@ public boolean updateUser(User user) {

// 检查邮箱是否被其他用户使用
if (user.getEmail() != null && !user.getEmail().trim().isEmpty()) {
User existingUser = userDao.findByUsername(user.getUsername());
if (existingUser != null && !existingUser.getUserId().equals(user.getUserId()) &&
user.getEmail().equals(existingUser.getEmail())) {
return false;
if (userDao.existsByEmail(user.getEmail().trim())) {
User currentStoredUser = userDao.findById(user.getUserId());
if (currentStoredUser == null || !user.getEmail().trim().equals(currentStoredUser.getEmail())) {
return false;
}
}
}

Expand Down
43 changes: 1 addition & 42 deletions src/main/java/com/pethospital/servlet/AppointmentServlet.java
Original file line number Diff line number Diff line change
Expand Up @@ -358,49 +358,8 @@ private void forwardToAddPage(HttpServletRequest request, HttpServletResponse re
} else {
// 普通用户只能看到自己的宠物
List<Pet> myPets = petService.getPetsByOwnerId(currentUser.getUserId());

// 调试信息:打印用户ID和宠物数量
System.out.println("DEBUG: 当前用户ID: " + currentUser.getUserId());
System.out.println("DEBUG: 用户名: " + currentUser.getUsername());
System.out.println("DEBUG: 查询到的宠物数量: " + (myPets != null ? myPets.size() : "null"));
if (myPets != null && !myPets.isEmpty()) {
for (Pet pet : myPets) {
System.out.println("DEBUG: 宠物详情 - ID: " + pet.getPetId() +
", 名称: '" + pet.getPetName() + "'" +
", 类型: '" + pet.getPetType() + "'" +
", 品种: '" + pet.getBreed() + "'" +
", 主人ID: " + pet.getOwnerId());

// 检查并修复异常的宠物名称
if (pet.getPetName() == null || pet.getPetName().trim().isEmpty() ||
pet.getPetName().matches("\\d+")) { // 如果名称是纯数字
System.out.println("DEBUG: 发现异常宠物名称,尝试修复...");
String newName = "宠物" + pet.getPetId(); // 临时名称
pet.setPetName(newName);
System.out.println("DEBUG: 已临时修复宠物名称为: " + newName);
}
}
} else {
System.out.println("DEBUG: 宠物列表为空或null");
}

// 如果宠物列表为空或null,创建一个测试宠物
if (myPets == null || myPets.isEmpty()) {
System.out.println("DEBUG: 宠物列表为空,创建测试宠物");
if (myPets == null) {
myPets = new java.util.ArrayList<>();
Pet testPet = new Pet();
testPet.setPetId(999);
testPet.setPetName("测试宠物");
testPet.setPetType("狗");
testPet.setBreed("测试品种");
testPet.setOwnerId(currentUser.getUserId());
myPets.add(testPet);
System.out.println("DEBUG: 已添加测试宠物");
}

System.out.println("DEBUG: 最终设置到request的宠物数量: " + myPets.size());
for (Pet pet : myPets) {
System.out.println("DEBUG: 最终宠物 - ID: " + pet.getPetId() + ", 名称: " + pet.getPetName());
}

request.setAttribute("myPets", myPets);
Expand Down
2 changes: 0 additions & 2 deletions src/main/java/com/pethospital/servlet/PetServlet.java
Original file line number Diff line number Diff line change
Expand Up @@ -447,8 +447,6 @@ private void handleUpdate(HttpServletRequest request, HttpServletResponse respon
}
}

System.out.println("更新宠物 - petIdStr: " + petIdStr);

if (petIdStr == null || petIdStr.trim().isEmpty()) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "宠物ID不能为空");
return;
Expand Down
35 changes: 1 addition & 34 deletions src/main/java/com/pethospital/servlet/UserServlet.java
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ private void handleRegister(HttpServletRequest request, HttpServletResponse resp
String address = request.getParameter("address");

// 验证密码确认
if (!password.equals(confirmPassword)) {
if (password == null || !password.equals(confirmPassword)) {
request.setAttribute("error", "两次输入的密码不一致");
request.getRequestDispatcher("/pages/common/register.jsp").forward(request, response);
return;
Expand Down Expand Up @@ -860,7 +860,6 @@ private void handleImport(HttpServletRequest request, HttpServletResponse respon

// 解析Excel文件
List<User> users = parseExcelFile(fileItem.getInputStream());
System.out.println("解析到的用户数量: " + users.size());

if (users.isEmpty()) {
out.write("{\"success\":false,\"message\":\"Excel文件中没有有效的用户数据,请检查文件格式是否正确\"}");
Expand All @@ -870,10 +869,6 @@ private void handleImport(HttpServletRequest request, HttpServletResponse respon
// 导入用户数据
Map<String, Object> result = importUsers(users, skipDuplicates);

System.out.println("导入结果 - 成功: " + result.get("success") +
", 跳过: " + result.get("skip") +
", 失败: " + result.get("error"));

Integer successCount = (Integer) result.get("success");
Integer skipCount = (Integer) result.get("skip");
Integer errorCount = (Integer) result.get("error");
Expand Down Expand Up @@ -1004,13 +999,10 @@ private List<User> parseExcelFile(InputStream inputStream) throws Exception {
Workbook workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheetAt(0);

System.out.println("Excel文件总行数: " + (sheet.getLastRowNum() + 1));

// 跳过标题行,从第二行开始读取数据
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
if (row == null) {
System.out.println("第" + (i+1) + "行为空,跳过");
continue;
}

Expand All @@ -1028,28 +1020,22 @@ private List<User> parseExcelFile(InputStream inputStream) throws Exception {
}

if (isEmptyRow) {
System.out.println("第" + (i+1) + "行为空行,跳过");
continue;
}

try {
System.out.println("正在解析第" + (i+1) + "行数据");
User user = new User();

// 用户名(必填)
String username = getCellValueAsString(row.getCell(0));
System.out.println("用户名: " + username);
if (username == null || username.trim().isEmpty()) {
System.out.println("用户名为空,跳过第" + (i+1) + "行");
continue; // 跳过用户名为空的行
}
user.setUsername(username.trim());

// 真实姓名(必填)
String realName = getCellValueAsString(row.getCell(1));
System.out.println("真实姓名: " + realName);
if (realName == null || realName.trim().isEmpty()) {
System.out.println("真实姓名为空,跳过第" + (i+1) + "行");
continue; // 跳过真实姓名为空的行
}
user.setRealName(realName.trim());
Expand All @@ -1072,9 +1058,6 @@ private List<User> parseExcelFile(InputStream inputStream) throws Exception {
phone = phone.trim().replaceAll("[^0-9]", "");
if (phone.length() == 11 && phone.startsWith("1")) {
user.setPhone(phone);
System.out.println("手机号: " + phone);
} else {
System.out.println("手机号格式不正确,跳过: " + phone);
}
}

Expand Down Expand Up @@ -1104,16 +1087,11 @@ private List<User> parseExcelFile(InputStream inputStream) throws Exception {
// 设置默认密码
user.setPassword("123456");

System.out.println("成功解析用户: " + user.getUsername() + ", 真实姓名: " + user.getRealName() +
", 类型: " + user.getUserType() + ", 状态: " + user.getStatus());

users.add(user);

} catch (Exception e) {
System.out.println("解析第" + (i+1) + "行时发生异常: " + e.getMessage());
e.printStackTrace();
// 跳过解析失败的行
continue;
}
}

Expand Down Expand Up @@ -1161,24 +1139,18 @@ private Map<String, Object> importUsers(List<User> users, boolean skipDuplicates
int errorCount = 0;
StringBuilder errorDetails = new StringBuilder();

System.out.println("开始导入用户,总数: " + users.size() + ", 跳过重复: " + skipDuplicates);

for (User user : users) {
try {
System.out.println("正在处理用户: " + user.getUsername());

// 验证用户数据
String validationResult = userService.validateUser(user, false);
if (validationResult != null) {
System.out.println("用户验证失败: " + user.getUsername() + ", 原因: " + validationResult);
errorDetails.append("用户[").append(user.getUsername()).append("]: ").append(validationResult).append("; ");
errorCount++;
continue;
}

// 检查用户名是否已存在
if (userService.isUsernameExists(user.getUsername())) {
System.out.println("用户名已存在: " + user.getUsername());
if (skipDuplicates) {
skipCount++;
continue;
Expand All @@ -1192,7 +1164,6 @@ private Map<String, Object> importUsers(List<User> users, boolean skipDuplicates
// 检查邮箱是否已存在
if (user.getEmail() != null && !user.getEmail().trim().isEmpty() &&
userService.isEmailExists(user.getEmail())) {
System.out.println("邮箱已存在: " + user.getEmail());
if (skipDuplicates) {
skipCount++;
continue;
Expand All @@ -1204,18 +1175,14 @@ private Map<String, Object> importUsers(List<User> users, boolean skipDuplicates
}

// 注册用户
System.out.println("尝试注册用户: " + user.getUsername());
if (userService.register(user)) {
System.out.println("用户注册成功: " + user.getUsername());
successCount++;
} else {
System.out.println("用户注册失败: " + user.getUsername());
errorDetails.append("用户[").append(user.getUsername()).append("]: 注册失败; ");
errorCount++;
}

} catch (Exception e) {
System.out.println("处理用户时发生异常: " + user.getUsername() + ", 异常: " + e.getMessage());
errorDetails.append("用户[").append(user.getUsername()).append("]: ").append(e.getMessage()).append("; ");
e.printStackTrace();
errorCount++;
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ CREATE TABLE IF NOT EXISTS users (
password VARCHAR(100) NOT NULL COMMENT '密码',
real_name VARCHAR(50) NOT NULL COMMENT '真实姓名',
phone VARCHAR(20) COMMENT '电话号码',
email VARCHAR(100) COMMENT '邮箱',
email VARCHAR(100) UNIQUE COMMENT '邮箱',
address VARCHAR(200) COMMENT '地址',
user_type ENUM('admin', 'user') DEFAULT 'user' COMMENT '用户类型:admin-管理员,user-普通用户',
status ENUM('active', 'inactive') DEFAULT 'active' COMMENT '状态:active-激活,inactive-禁用',
Expand Down
Loading