202 lines
6.3 KiB
Python
202 lines
6.3 KiB
Python
from flask import request, jsonify, current_app
|
||
from . import api_bp
|
||
from ..models import Order, Product
|
||
from .. import db
|
||
from .decorators import require_admin
|
||
from datetime import datetime
|
||
|
||
@api_bp.route('/orders', methods=['GET'])
|
||
@require_admin
|
||
def get_orders():
|
||
"""获取订单列表(管理员)"""
|
||
try:
|
||
# 获取查询参数
|
||
page = request.args.get('page', 1, type=int)
|
||
per_page = request.args.get('per_page', 10, type=int)
|
||
keyword = request.args.get('keyword', '').strip()
|
||
status = request.args.get('status', type=int)
|
||
product_id = request.args.get('product_id')
|
||
date_range = request.args.get('date_range')
|
||
|
||
# 构建查询
|
||
query = Order.query
|
||
|
||
# 关键词搜索
|
||
if keyword:
|
||
query = query.filter(
|
||
db.or_(
|
||
Order.order_number.contains(keyword),
|
||
Order.contact_person.contains(keyword),
|
||
Order.phone.contains(keyword)
|
||
)
|
||
)
|
||
|
||
# 状态筛选
|
||
if status is not None:
|
||
query = query.filter(Order.status == status)
|
||
|
||
# 产品筛选
|
||
if product_id:
|
||
query = query.filter(Order.product_id == product_id)
|
||
|
||
# 日期范围筛选
|
||
if date_range:
|
||
# 解析日期范围(格式:YYYY-MM-DD to YYYY-MM-DD)
|
||
try:
|
||
start_date_str, end_date_str = date_range.split(' to ')
|
||
start_date = datetime.strptime(start_date_str, '%Y-%m-%d')
|
||
end_date = datetime.strptime(end_date_str, '%Y-%m-%d')
|
||
# 设置结束时间为当天23:59:59
|
||
end_date = end_date.replace(hour=23, minute=59, second=59)
|
||
query = query.filter(Order.create_time.between(start_date, end_date))
|
||
except Exception as e:
|
||
current_app.logger.warning(f"日期范围解析失败: {str(e)}")
|
||
|
||
# 排序
|
||
query = query.order_by(Order.create_time.desc())
|
||
|
||
# 分页
|
||
pagination = query.paginate(
|
||
page=page, per_page=per_page, error_out=False
|
||
)
|
||
|
||
orders = pagination.items
|
||
|
||
return jsonify({
|
||
'success': True,
|
||
'data': {
|
||
'orders': [order.to_dict() for order in orders],
|
||
'pagination': {
|
||
'current_page': pagination.page,
|
||
'per_page': pagination.per_page,
|
||
'total_pages': pagination.pages,
|
||
'total_items': pagination.total
|
||
}
|
||
}
|
||
})
|
||
|
||
except Exception as e:
|
||
current_app.logger.error(f"获取订单列表失败: {str(e)}")
|
||
return jsonify({
|
||
'success': False,
|
||
'message': '服务器内部错误'
|
||
}), 500
|
||
|
||
|
||
@api_bp.route('/orders/<int:order_id>', methods=['GET'])
|
||
@require_admin
|
||
def get_order(order_id):
|
||
"""获取订单详情(管理员)"""
|
||
try:
|
||
order = Order.query.get_or_404(order_id)
|
||
return jsonify({
|
||
'success': True,
|
||
'data': order.to_dict()
|
||
})
|
||
|
||
except Exception as e:
|
||
current_app.logger.error(f"获取订单详情失败: {str(e)}")
|
||
return jsonify({
|
||
'success': False,
|
||
'message': '服务器内部错误'
|
||
}), 500
|
||
|
||
|
||
@api_bp.route('/orders/<int:order_id>/confirm-payment', methods=['POST'])
|
||
@require_admin
|
||
def confirm_order_payment(order_id):
|
||
"""确认订单支付(管理员)"""
|
||
try:
|
||
order = Order.query.get_or_404(order_id)
|
||
|
||
if order.status != 0: # 只有待支付的订单可以确认支付
|
||
return jsonify({
|
||
'success': False,
|
||
'message': '订单状态不允许此操作'
|
||
}), 400
|
||
|
||
# 更新订单状态
|
||
order.status = 1 # 已支付
|
||
order.payment_time = datetime.utcnow()
|
||
order.payment_method = 'manual' # 手动确认
|
||
|
||
db.session.commit()
|
||
|
||
return jsonify({
|
||
'success': True,
|
||
'message': '订单支付确认成功'
|
||
})
|
||
|
||
except Exception as e:
|
||
db.session.rollback()
|
||
current_app.logger.error(f"确认订单支付失败: {str(e)}")
|
||
return jsonify({
|
||
'success': False,
|
||
'message': '服务器内部错误'
|
||
}), 500
|
||
|
||
|
||
@api_bp.route('/orders/<int:order_id>/complete', methods=['POST'])
|
||
@require_admin
|
||
def complete_order(order_id):
|
||
"""完成订单(管理员)"""
|
||
try:
|
||
order = Order.query.get_or_404(order_id)
|
||
|
||
if order.status != 1: # 只有已支付的订单可以完成
|
||
return jsonify({
|
||
'success': False,
|
||
'message': '订单状态不允许此操作'
|
||
}), 400
|
||
|
||
# 更新订单状态
|
||
order.status = 3 # 已完成
|
||
order.update_time = datetime.utcnow()
|
||
|
||
db.session.commit()
|
||
|
||
return jsonify({
|
||
'success': True,
|
||
'message': '订单完成操作成功'
|
||
})
|
||
|
||
except Exception as e:
|
||
db.session.rollback()
|
||
current_app.logger.error(f"完成订单失败: {str(e)}")
|
||
return jsonify({
|
||
'success': False,
|
||
'message': '服务器内部错误'
|
||
}), 500
|
||
|
||
|
||
@api_bp.route('/orders/<int:order_id>/cancel', methods=['POST'])
|
||
@require_admin
|
||
def cancel_order(order_id):
|
||
"""取消订单(管理员)"""
|
||
try:
|
||
order = Order.query.get_or_404(order_id)
|
||
|
||
if order.status not in [0, 1]: # 只有待支付和已支付的订单可以取消
|
||
return jsonify({
|
||
'success': False,
|
||
'message': '订单状态不允许此操作'
|
||
}), 400
|
||
|
||
# 更新订单状态
|
||
order.status = 2 # 已取消
|
||
order.update_time = datetime.utcnow()
|
||
|
||
db.session.commit()
|
||
|
||
return jsonify({
|
||
'success': True,
|
||
'message': '订单取消操作成功'
|
||
})
|
||
|
||
except Exception as e:
|
||
db.session.rollback()
|
||
current_app.logger.error(f"取消订单失败: {str(e)}")
|
||
return jsonify({
|
||
'success': False,
|
||
'message': '服务器内部错误'
|
||
}), 500 |