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/', 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//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//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//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