2025-05-01 22:34:54 +08:00

161 lines
4.6 KiB
Python

from flask import Blueprint, request, redirect, url_for, flash, g, jsonify
from flask_login import current_user, login_required
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))
@borrow_bp.route('/add/<int:book_id>', methods=['POST'])
@login_required
def add_borrow(book_id):
# 验证图书存在
book = Book.query.get_or_404(book_id)
# 默认借阅天数
borrow_days = 14
# 检查库存
if book.stock <= 0:
return jsonify({
'success': False,
'message': f'{book.title}》当前无库存,无法借阅'
})
# 检查是否已借阅
existing_borrow = BorrowRecord.query.filter_by(
user_id=current_user.id, # 使用current_user
book_id=book_id,
status=1 # 1表示借阅中
).first()
if existing_borrow:
return jsonify({
'success': False,
'message': f'您已借阅《{book.title}》,请勿重复借阅'
})
try:
# 创建借阅记录
now = datetime.datetime.now()
due_date = now + datetime.timedelta(days=borrow_days)
borrow_record = BorrowRecord(
user_id=current_user.id, # 使用current_user
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=current_user.id, # 使用current_user
remark='用户借书',
changed_at=now
)
db.session.add(inventory_log)
db.session.commit()
return jsonify({
'success': True,
'message': f'成功借阅《{book.title}》,请在 {due_date.strftime("%Y-%m-%d")} 前归还'
})
except Exception as e:
db.session.rollback()
return jsonify({
'success': False,
'message': f'借阅失败: {str(e)}'
})