前言
💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。热爱技术,喜欢钻研新工具和框架,也乐于通过代码解决实际问题,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💕💕文末获取源码联系 计算机程序员小杨 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目 计算机毕业设计选题 💜💜
一.开发工具简介
开发语言:Java+Python(两个版本都支持) 后端框架:Spring Boot(Spring+SpringMVC+Mybatis)+Django(两个版本都支持) 前端:Vue+ElementUI+HTML 数据库:MySQL 系统架构:B/S 开发工具:IDEA(Java的)或者PyCharm(Python的)
二.系统内容简介
云宠之家管理系统是一款面向宠物主人与宠物护理服务机构的综合性管理平台,基于Spring Boot后端框架与Vue前端技术构建,采用MySQL数据库实现数据管理。系统围绕宠物护理服务的全流程展开,涵盖了宠物信息录入、护理师资源管理、护理类型分类、预约护理申请、护理安排调度、护理完成反馈等核心业务环节,形成从预约到服务完成的闭环管理。平台集成了宠物商城功能,用户可以在线选购宠物用品并通过订单管理模块跟踪配送状态,同时配备充值记录管理为用户提供便捷的支付方式。系统搭建了交流论坛与留言反馈两大互动模块,宠物主人可以在论坛分类中分享养宠经验、讨论护理技巧,通过留言反馈向平台提出建议或咨询问题,管理员通过举报记录管理维护社区秩序。针对不同用户角色设置了差异化权限,普通用户管理自己的宠物信息并预约护理服务,护理师查看分配的护理任务并提交完成报告,管理员统筹整个平台的运营包括护理师调度、商品上架、订单处理等,实现了宠物护理服务从预约到交付的数字化、透明化管理。
三.系统功能演示
四.系统界面展示
五.系统源码展示
/**
* 预约护理管理 - 提交护理预约
* 处理用户提交的宠物护理预约请求,包括宠物信息验证、护理师资源匹配、时间冲突检测等业务逻辑
*/
@PostMapping("/submitAppointment")
public Result submitAppointment(@RequestBody CareAppointment appointment, HttpSession session) {
User currentUser = (User) session.getAttribute("user");
if (currentUser == null) {
return Result.error("用户未登录");
}
// 验证宠物信息归属权
Pet pet = petMapper.selectById(appointment.getPetId());
if (pet == null) {
return Result.error("宠物信息不存在");
}
if (!pet.getOwnerId().equals(currentUser.getId())) {
return Result.error("无权为该宠物预约护理服务");
}
// 检查宠物健康状态是否适合护理
if (pet.getHealthStatus() == 2) {
return Result.error("宠物健康状态异常,建议先就医检查");
}
// 查询护理类型详情
CareType careType = careTypeMapper.selectById(appointment.getCareTypeId());
if (careType == null || careType.getStatus() != 1) {
return Result.error("护理类型不可用");
}
// 验证预约时间合法性
Date appointmentTime = appointment.getAppointmentTime();
if (appointmentTime.before(new Date())) {
return Result.error("预约时间不能早于当前时间");
}
Calendar maxTimeCalendar = Calendar.getInstance();
maxTimeCalendar.add(Calendar.DAY_OF_MONTH, 30);
if (appointmentTime.after(maxTimeCalendar.getTime())) {
return Result.error("预约时间不能超过30天");
}
// 检查用户是否有未完成的同类型预约
QueryWrapper<CareAppointment> existWrapper = new QueryWrapper<>();
existWrapper.eq("user_id", currentUser.getId())
.eq("pet_id", appointment.getPetId())
.eq("care_type_id", appointment.getCareTypeId())
.in("status", Arrays.asList(0, 1, 2)); // 0待分配 1已分配 2护理中
CareAppointment existingAppointment = careAppointmentMapper.selectOne(existWrapper);
if (existingAppointment != null) {
return Result.error("该宠物存在进行中的相同护理预约,请勿重复提交");
}
// 查询符合条件的护理师
QueryWrapper<Caretaker> caretakerWrapper = new QueryWrapper<>();
caretakerWrapper.like("care_skills", careType.getTypeName())
.eq("status", 1); // 在职状态
List<Caretaker> availableCaretakers = caretakerMapper.selectList(caretakerWrapper);
if (availableCaretakers.isEmpty()) {
return Result.error("暂无可提供该护理服务的护理师,请稍后再试");
}
// 填充预约单基本信息
appointment.setUserId(currentUser.getId());
appointment.setUserName(currentUser.getUsername());
appointment.setUserPhone(currentUser.getPhone());
appointment.setPetName(pet.getPetName());
appointment.setPetCategory(pet.getCategoryName());
appointment.setCareTypeName(careType.getTypeName());
appointment.setEstimateDuration(careType.getDuration());
appointment.setServicePrice(careType.getPrice());
appointment.setStatus(0); // 待分配
appointment.setCreateTime(new Date());
appointment.setAppointmentNo("CA" + System.currentTimeMillis() + RandomUtil.randomNumbers(4));
// 根据宠物年龄和体型计算服务费用调整
BigDecimal finalPrice = careType.getPrice();
if (pet.getAge() < 1 || pet.getAge() > 10) {
finalPrice = finalPrice.multiply(new BigDecimal("1.2")); // 幼年或老年宠物加收20%
}
if ("大型犬".equals(pet.getCategoryName()) || pet.getWeight() > 25) {
finalPrice = finalPrice.multiply(new BigDecimal("1.3")); // 大型宠物加收30%
}
appointment.setFinalPrice(finalPrice);
// 检查用户余额是否充足
UserAccount account = userAccountMapper.selectOne(new QueryWrapper<UserAccount>().eq("user_id", currentUser.getId()));
if (account == null || account.getBalance().compareTo(finalPrice) < 0) {
return Result.error("账户余额不足,请先充值");
}
// 保存预约单
int insertResult = careAppointmentMapper.insert(appointment);
if (insertResult > 0) {
// 冻结相应金额
account.setFrozenAmount(account.getFrozenAmount().add(finalPrice));
userAccountMapper.updateById(account);
// 记录操作日志
SystemLog log = new SystemLog();
log.setUserId(currentUser.getId());
log.setOperation("提交护理预约");
log.setDetails("宠物:" + pet.getPetName() + ",护理类型:" + careType.getTypeName() + ",预约号:" + appointment.getAppointmentNo());
log.setCreateTime(new Date());
systemLogMapper.insert(log);
return Result.success("预约提交成功,预约号:" + appointment.getAppointmentNo());
}
return Result.error("预约失败,请重试");
}
/**
* 护理安排管理 - 分配护理师
* 管理员将护理预约分配给合适的护理师,考虑护理师技能、工作负荷、时间冲突等因素
*/
@PostMapping("/assignCaretaker")
public Result assignCaretaker(@RequestParam Long appointmentId, @RequestParam Long caretakerId, HttpSession session) {
User admin = (User) session.getAttribute("user");
if (admin == null || admin.getRole() != 1) {
return Result.error("无权限操作");
}
// 查询预约详情
CareAppointment appointment = careAppointmentMapper.selectById(appointmentId);
if (appointment == null) {
return Result.error("预约记录不存在");
}
if (appointment.getStatus() != 0) {
return Result.error("该预约已分配或已完成,无法重复分配");
}
// 查询护理师信息
Caretaker caretaker = caretakerMapper.selectById(caretakerId);
if (caretaker == null) {
return Result.error("护理师不存在");
}
if (caretaker.getStatus() != 1) {
return Result.error("该护理师当前不在职");
}
// 验证护理师技能匹配度
String careTypeName = appointment.getCareTypeName();
if (!caretaker.getCareSkills().contains(careTypeName)) {
return Result.error("护理师技能与护理类型不匹配,可能影响服务质量");
}
// 检查护理师在预约时间段是否有冲突
Date appointmentTime = appointment.getAppointmentTime();
Integer duration = appointment.getEstimateDuration();
Calendar endTimeCalendar = Calendar.getInstance();
endTimeCalendar.setTime(appointmentTime);
endTimeCalendar.add(Calendar.MINUTE, duration);
Date appointmentEndTime = endTimeCalendar.getTime();
QueryWrapper<CareAppointment> conflictWrapper = new QueryWrapper<>();
conflictWrapper.eq("caretaker_id", caretakerId)
.in("status", Arrays.asList(1, 2))
.apply("appointment_time < {0} AND DATE_ADD(appointment_time, INTERVAL estimate_duration MINUTE) > {1}",
appointmentEndTime, appointmentTime);
Long conflictCount = careAppointmentMapper.selectCount(conflictWrapper);
if (conflictCount > 0) {
return Result.error("护理师在该时间段已有其他预约,存在时间冲突");
}
// 查询护理师当天工作负荷
Calendar dayStart = Calendar.getInstance();
dayStart.setTime(appointmentTime);
dayStart.set(Calendar.HOUR_OF_DAY, 0);
dayStart.set(Calendar.MINUTE, 0);
dayStart.set(Calendar.SECOND, 0);
Calendar dayEnd = Calendar.getInstance();
dayEnd.setTime(appointmentTime);
dayEnd.set(Calendar.HOUR_OF_DAY, 23);
dayEnd.set(Calendar.MINUTE, 59);
dayEnd.set(Calendar.SECOND, 59);
QueryWrapper<CareAppointment> workloadWrapper = new QueryWrapper<>();
workloadWrapper.eq("caretaker_id", caretakerId)
.in("status", Arrays.asList(1, 2))
.between("appointment_time", dayStart.getTime(), dayEnd.getTime());
Long todayWorkload = careAppointmentMapper.selectCount(workloadWrapper);
if (todayWorkload >= 8) {
return Result.error("护理师当日预约已达上限,建议分配给其他护理师");
}
// 更新预约分配信息
appointment.setCaretakerId(caretakerId);
appointment.setCaretakerName(caretaker.getName());
appointment.setCaretakerPhone(caretaker.getPhone());
appointment.setStatus(1); // 已分配
appointment.setAssignTime(new Date());
appointment.setAssignBy(admin.getUsername());
int updateResult = careAppointmentMapper.updateById(appointment);
if (updateResult > 0) {
// 创建护理安排记录
CareArrangement arrangement = new CareArrangement();
arrangement.setAppointmentId(appointmentId);
arrangement.setAppointmentNo(appointment.getAppointmentNo());
arrangement.setCaretakerId(caretakerId);
arrangement.setCaretakerName(caretaker.getName());
arrangement.setPetName(appointment.getPetName());
arrangement.setCareTypeName(appointment.getCareTypeName());
arrangement.setScheduledTime(appointmentTime);
arrangement.setEstimateDuration(duration);
arrangement.setArrangeBy(admin.getId());
arrangement.setArrangeTime(new Date());
careArrangementMapper.insert(arrangement);
// 更新护理师统计数据
caretaker.setTotalAppointments(caretaker.getTotalAppointments() + 1);
caretakerMapper.updateById(caretaker);
// 发送通知给用户(这里简化为记录日志)
SystemLog notifyLog = new SystemLog();
notifyLog.setUserId(appointment.getUserId());
notifyLog.setOperation("护理师分配通知");
notifyLog.setDetails("您的预约" + appointment.getAppointmentNo() + "已分配护理师:" + caretaker.getName());
notifyLog.setCreateTime(new Date());
systemLogMapper.insert(notifyLog);
return Result.success("分配成功");
}
return Result.error("分配失败");
}
六.系统文档展示
结束
💕💕文末获取源码联系 计算机程序员小杨