当前位置: 首页 > 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.gsyq.cn/news/1619629.html

相关文章:

  • TEKLauncher:方舟生存进化MOD管理的终极解决方案
  • RSA加解密跨语言实战:Java与JavaScript互操作指南与避坑
  • 民生服务行业标准化复盘:昆明邦尼到家居家保姆服务合规体系落地实践分析
  • IDEA代码折叠实战手册(2024最新版):从基础折叠到自定义区域,JetBrains官方未公开的12个高级技巧
  • 2026原木松木桩定制指南:厂家直供更省心
  • 手把手教你怎么安装Bruker DataAnalysis 4.4 质谱数据处理软件下载安装教程
  • 2021 AI技术落地五大突破:多模态、AIGC、医疗可信AI与工程化实践
  • 出海企业如何应对SBTi 2.0?范围三强制核查下的供应链合规战
  • 【紧急修复必备】IDEA Git历史回滚黄金法则:3类不可逆操作预警+4种安全回滚路径(含可视化操作图谱)
  • OpenMP并行编程优化与性能调优实践
  • 跨区公有云节点 DNS 解析故障排查与自动化修复记录
  • 国家中小学智慧教育平台电子课本下载器:三步获取PDF教材的完整方案
  • 【Git Diff可视化权威标准】:基于JetBrains官方API文档逆向验证的12项IDEA差异比对最佳实践
  • 【Spring Boot项目结构黄金标准】:20年架构师亲授5大不可违背的模块划分铁律
  • 2026年亲测AI论文写作软件合集(合规高效版)
  • STM32F411RE键盘扩展方案:74HC32实现16功能输入
  • 2026年正规1688代运营服务商 TOP10榜
  • 游戏窗口分辨率自由调整:打破屏幕限制的终极解决方案
  • 紧急修复场景必备:IDEA中5秒内从混乱工作区安全提取关键变更并重建stash栈(含.git/index快照回滚法)
  • 美图ai模特一键换装,提升电商图片质感的实用工具全测评
  • IDEA书签功能被严重低估?JetBrains内部培训文档流出:4层嵌套标记+Git集成跳转的独家实践
  • 每天几万条群消息,用个人微信api做增量私域内容沉淀怎么才不撑爆服务器?
  • XInputTest:3分钟测出你的游戏手柄真实延迟,告别操作卡顿
  • 项目启动后类名搜索突然变慢?揭秘IDEA 2024.1新增的Classpath Watcher机制与3种降级策略
  • Python爬虫经典案例023:视频网站爬取——B站视频信息采集实战
  • 2026年企业级大文件传输加速新突破:源头厂家揭秘
  • Diablo Edit2:3步打造完美暗黑破坏神II角色的终极指南
  • LV30条码扫描器与TM4C1299微控制器的嵌入式系统设计
  • 行业观点:2026年GEO行业趋势判断与新开道的思考
  • 我的第二次作业