from flask import Blueprint, request, redirect, url_for, flash, g from app.models.book import Book from app.models.borrow import BorrowRecord from app.models.inventory import InventoryLog from app.models.user import db # 修正:从 user 模型导入 db from app.utils.auth import login_required import datetime # 创建借阅蓝图 borrow_bp = Blueprint('borrow', __name__, url_prefix='/borrow') @borrow_bp.route('/book', methods=['POST']) @login_required def borrow_book(): book_id = request.form.get('book_id', type=int) borrow_days = request.form.get('borrow_days', type=int, default=14) if not book_id: flash('请选择要借阅的图书', 'danger') return redirect(url_for('book.book_list')) book = Book.query.get_or_404(book_id) # 检查库存 if book.stock <= 0: flash(f'《{book.title}》当前无库存,无法借阅', 'danger') return redirect(url_for('book.book_detail', book_id=book_id)) # 检查当前用户是否已借阅此书 existing_borrow = BorrowRecord.query.filter_by( user_id=g.user.id, book_id=book_id, status=1 # 1表示借阅中 ).first() if existing_borrow: flash(f'您已借阅《{book.title}》,请勿重复借阅', 'warning') return redirect(url_for('book.book_detail', book_id=book_id)) try: # 创建借阅记录 now = datetime.datetime.now() due_date = now + datetime.timedelta(days=borrow_days) borrow_record = BorrowRecord( user_id=g.user.id, book_id=book_id, borrow_date=now, due_date=due_date, status=1, # 1表示借阅中 created_at=now, updated_at=now ) # 更新图书库存 book.stock -= 1 book.updated_at = now db.session.add(borrow_record) db.session.commit() # 添加库存变更日志 inventory_log = InventoryLog( book_id=book_id, change_type='借出', change_amount=-1, after_stock=book.stock, operator_id=g.user.id, remark='用户借书', changed_at=now ) db.session.add(inventory_log) db.session.commit() flash(f'成功借阅《{book.title}》,请在 {due_date.strftime("%Y-%m-%d")} 前归还', 'success') except Exception as e: db.session.rollback() flash(f'借阅失败: {str(e)}', 'danger') return redirect(url_for('book.book_detail', book_id=book_id))