83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
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))
|