Kamixitong/app/api/ticket.py
2025-11-11 21:39:12 +08:00

92 lines
3.1 KiB
Python

from flask import request, jsonify, current_app
from datetime import datetime
from app import db
from app.models import Ticket, Product
from . import api_bp
from .license import require_admin
@api_bp.route('/tickets', methods=['GET'])
@require_admin
def get_tickets():
"""获取工单列表"""
try:
page = request.args.get('page', 1, type=int)
per_page = min(request.args.get('per_page', 20, type=int), 100)
status = request.args.get('status', type=int)
priority = request.args.get('priority', type=int)
product_id = request.args.get('product_id')
query = Ticket.query
if status is not None:
query = query.filter_by(status=status)
if priority is not None:
query = query.filter_by(priority=priority)
if product_id:
query = query.filter_by(product_id=product_id)
query = query.order_by(Ticket.create_time.desc())
pagination = query.paginate(page=page, per_page=per_page, error_out=False)
tickets = [ticket.to_dict() for ticket in pagination.items]
return jsonify({
'success': True,
'data': {
'tickets': tickets,
'pagination': {
'page': page,
'per_page': per_page,
'total': pagination.total,
'pages': pagination.pages
}
}
})
except Exception as e:
current_app.logger.error(f"获取工单列表失败: {str(e)}")
return jsonify({'success': False, 'message': '服务器内部错误'}), 500
@api_bp.route('/tickets', methods=['POST'])
def create_ticket():
"""创建工单(用户接口)"""
try:
data = request.get_json()
if not data:
return jsonify({'success': False, 'message': '请求数据为空'}), 400
title = data.get('title', '').strip()
product_id = data.get('product_id')
description = data.get('description', '').strip()
if not all([title, product_id, description]):
return jsonify({'success': False, 'message': '缺少必要参数'}), 400
# 验证产品存在
product = Product.query.filter_by(product_id=product_id).first()
if not product:
return jsonify({'success': False, 'message': '产品不存在'}), 404
ticket = Ticket(
title=title,
product_id=product_id,
software_version=data.get('software_version'),
machine_code=data.get('machine_code'),
license_key=data.get('license_key'),
description=description,
priority=data.get('priority', 1)
)
db.session.add(ticket)
db.session.commit()
return jsonify({
'success': True,
'message': '工单创建成功',
'data': ticket.to_dict()
})
except Exception as e:
db.session.rollback()
current_app.logger.error(f"创建工单失败: {str(e)}")
return jsonify({'success': False, 'message': '服务器内部错误'}), 500