92 lines
3.1 KiB
Python
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 |