当前位置: 首页 > news >正文

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

一、前言
上一篇完成了环境配置与事务踩坑总结,本篇进入核心业务开发,包含图书借阅、图书归还、逾期罚款计算三大核心功能,提供完整可运行代码,覆盖参数校验、事务控制、边界处理,直接适配毕设 / 实训项目。
二、通用实体与 DTO

  1. 借阅 DTO(接收前端参数)
    java
    运行
    @Data
    public class BorrowDTO {
    @NotNull(message = “用户ID不能为空”)
    private Long userId;
    @NotNull(message = “图书ID不能为空”)
    private Long bookId;
    }

  2. 统一返回结果
    java
    运行
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public 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);
    }
    }
    三、核心业务代码实现

  3. 图书借阅(核心:库存扣减 + 记录插入 + 事务控制)
    java
    运行
    @Service
    @Slf4j
    public class BorrowServiceImpl implements BorrowService {

    @Autowired
    private BookMapper bookMapper;
    @Autowired
    private BorrowRecordMapper borrowRecordMapper;

    @Override
    @Transactional(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("借阅成功");

    }
    }

  4. 图书归还(核心:库存归还 + 状态更新 + 逾期计算)
    java
    运行
    @Override
    @Transactional(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);
    }

  5. 逾期罚款计算逻辑(通用规则:逾期 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 层代码(关键 SQL)
  1. BookMapper
    java
    运行
    public interface BookMapper {
    // 加锁查询图书
    Book getBookByIdLock(Long id);
    // 更新库存(num=+1归还,-1借阅)
    int updateStock(@Param(“id”) Long id, @Param(“num”) Integer num);
    }
    xml

    update book set stock = stock + #{num} where id = #{id}
  2. BorrowRecordMapper
    java
    运行
    public interface BorrowRecordMapper {
    // 查询未归还记录
    Integer selectNoReturn(@Param(“userId”) Long userId, @Param(“bookId”) Long bookId);
    }
    五、边界情况处理
    图书不存在 / 已删除:直接返回错误;
    库存不足:禁止借阅;
    重复借阅:校验未归还记录;
    重复归还:判断状态拦截;
    逾期 0 天:罚款为 0,标记正常归还。
    六、总结
    本篇实现了图书借阅、归还、逾期罚款三大核心业务,代码完整可直接运行,严格遵循事务控制、并发安全、边界校验原则。所有逻辑贴合真实业务,无冗余代码,适配 SpringBoot 项目,下一篇将总结复杂业务中事务一致性的深度解决方案与实训心得。
http://www.jsqmd.com/news/1107660/

相关文章:

  • 规范更新 Avaya 安全证书,以精细化运维杜绝业务停机隐患
  • AI求职作弊席卷职场,企业“AI打AI”反制,诚实求职者何去何从?
  • 多光标≠简单Ctrl+D,IDEA列编辑模式深度解密:6个被官方文档刻意弱化的生产力核弹功能
  • okbiye 毕业论文 AI 写作实操指南|按页面指引一步到位解决全学段论文撰写难题
  • 自助终端与数字标牌场景解决方案:工业触摸一体机选型指南
  • RSA加解密跨语言实战:Java与JavaScript互操作指南与避坑
  • 掏耳勺可视有必要买吗?可视挖耳勺怎么选?2026全网实测清单
  • 民生服务行业标准化复盘:昆明邦尼到家居家保姆服务合规体系落地实践分析
  • 三重降压转换器TPS65263的设计与应用解析
  • TV Bro:专为电视遥控器设计的智能浏览器,让大屏上网体验更舒适
  • AI工具如何提升软件工程毕业设计质量与效率
  • TEKLauncher:方舟生存进化MOD管理的终极解决方案
  • MySQL批量删除海量数据怎么操作
  • IDEA代码折叠实战手册(2024最新版):从基础折叠到自定义区域,JetBrains官方未公开的12个高级技巧
  • 2026原木松木桩定制指南:厂家直供更省心
  • 5分钟掌握ImDisk:Windows虚拟磁盘的魔法工具箱 [特殊字符]
  • 告别网络依赖!国家中小学智慧教育平台电子课本离线下载终极指南
  • 为什么你的IDEA大纲视图总为空?,87%的Java工程师踩过的4个配置陷阱及一键修复方案
  • PPTist:免费在线PPT制作工具的完整指南,告别Office依赖
  • 手把手教你怎么安装Bruker DataAnalysis 4.4 质谱数据处理软件下载安装教程
  • 【计算机毕业设计案例】于 SpringBoot 的便民医疗用品网购服务系统的设计与实现(程序+文档+讲解+定制)
  • 2021 AI技术落地五大突破:多模态、AIGC、医疗可信AI与工程化实践
  • 怎样从零开始玩转AI视频生成:3个秘诀让你轻松创作专业级短视频
  • 出海企业如何应对SBTi 2.0?范围三强制核查下的供应链合规战
  • 科研工作者如何用3个步骤建立高效的知识管理系统
  • C++移动语义
  • 图解人工智能(73)人工智能前沿-预测化学反应分类
  • 【紧急修复必备】IDEA Git历史回滚黄金法则:3类不可逆操作预警+4种安全回滚路径(含可视化操作图谱)
  • OpenMP并行编程优化与性能调优实践
  • 运营商领域全生命周期数据安全合规管控技术落地实践与格局梳理