图书借还、逾期罚款核心业务逻辑完整代码讲解

📅 2026/7/2 7:55:13
图书借还、逾期罚款核心业务逻辑完整代码讲解
一、前言上一篇完成了环境配置与事务踩坑总结本篇进入核心业务开发包含图书借阅、图书归还、逾期罚款计算三大核心功能提供完整可运行代码覆盖参数校验、事务控制、边界处理直接适配毕设 / 实训项目。二、通用实体与 DTO借阅 DTO接收前端参数java运行Datapublic class BorrowDTO {NotNull(message “用户ID不能为空”)private Long userId;NotNull(message “图书ID不能为空”)private Long bookId;}统一返回结果java运行DataAllArgsConstructorNoArgsConstructorpublic class Result {private Integer code;private String msg;private T data;public static Result success(T data) {return new Result(200, “操作成功”, data);}public static Result error(String msg) {return new Result(500, msg, null);}}三、核心业务代码实现图书借阅核心库存扣减 记录插入 事务控制java运行ServiceSlf4jpublic class BorrowServiceImpl implements BorrowService {Autowiredprivate BookMapper bookMapper;Autowiredprivate BorrowRecordMapper borrowRecordMapper;OverrideTransactional(rollbackFor Exception.class)public Result borrowBook(BorrowDTO dto) {// 1. 校验参数if(dto.getUserId() null || dto.getBookId() null) {return Result.error(“参数不能为空”);}// 2. 加锁查询图书防止超卖Book book bookMapper.getBookByIdLock(dto.getBookId());if(book null) {return Result.error(“图书不存在”);}if(book.getStock() 0) {return Result.error(“图书库存不足”);}// 3. 校验是否已借阅未归还Integer count borrowRecordMapper.selectNoReturn(dto.getUserId(), dto.getBookId());if(count 0) {return Result.error(“该图书已借阅未归还”);}// 4. 扣减库存bookMapper.updateStock(dto.getBookId(), -1);// 5. 插入借阅记录BorrowRecord record new BorrowRecord();record.setUserId(dto.getUserId());record.setBookId(dto.getBookId());record.setBorrowTime(new Date());record.setStatus(1); // 1-借阅中record.setFine(BigDecimal.ZERO);borrowRecordMapper.insert(record);log.info(用户{}借阅图书{}成功, dto.getUserId(), dto.getBookName()); return Result.success(借阅成功);}}图书归还核心库存归还 状态更新 逾期计算java运行OverrideTransactional(rollbackFor Exception.class)public Result returnBook(Long recordId) {// 1. 查询借阅记录BorrowRecord record borrowRecordMapper.selectById(recordId);if(record null) {return Result.error(“借阅记录不存在”);}if(record.getStatus() 2) {return Result.error(“该图书已归还”);}// 2. 计算逾期罚款BigDecimal fine calculateFine(record.getBorrowTime());// 3. 更新归还信息record.setReturnTime(new Date());record.setStatus(fine.compareTo(BigDecimal.ZERO) 0 ? 3 : 2); // 3-逾期 2-正常归还record.setFine(fine);borrowRecordMapper.updateById(record);// 4. 增加库存bookMapper.updateStock(record.getBookId(), 1);log.info(“图书归还成功罚款金额{}”, fine);return Result.success(fine);}逾期罚款计算逻辑通用规则逾期 1 天罚 1 元java运行/**计算逾期罚款param borrowTime 借阅时间默认借阅期限7天*/private BigDecimal calculateFine(Date borrowTime) {// 借阅期限7天long expireTime borrowTime.getTime() 7L * 24 * 60 * 60 * 1000;long now System.currentTimeMillis();// 未逾期if(now expireTime) {return BigDecimal.ZERO;}// 计算逾期天数long days (now - expireTime) / (1000 * 60 * 60 * 24);// 每天罚款1元return new BigDecimal(days).multiply(new BigDecimal(“1.00”));}四、Mapper 层代码关键 SQLBookMapperjava运行public interface BookMapper {// 加锁查询图书Book getBookByIdLock(Long id);// 更新库存num1归还-1借阅int updateStock(Param(“id”) Long id, Param(“num”) Integer num);}xmlupdate book set stock stock #{num} where id #{id}BorrowRecordMapperjava运行public interface BorrowRecordMapper {// 查询未归还记录Integer selectNoReturn(Param(“userId”) Long userId, Param(“bookId”) Long bookId);}五、边界情况处理图书不存在 / 已删除直接返回错误库存不足禁止借阅重复借阅校验未归还记录重复归还判断状态拦截逾期 0 天罚款为 0标记正常归还。六、总结本篇实现了图书借阅、归还、逾期罚款三大核心业务代码完整可直接运行严格遵循事务控制、并发安全、边界校验原则。所有逻辑贴合真实业务无冗余代码适配 SpringBoot 项目下一篇将总结复杂业务中事务一致性的深度解决方案与实训心得。