126 lines
4.4 KiB
Python
126 lines
4.4 KiB
Python
from flask import request, jsonify, current_app
|
|
from datetime import datetime
|
|
from app import db
|
|
from app.models import Device, Product, License
|
|
from . import api_bp
|
|
from .license import require_admin
|
|
from sqlalchemy import func, or_
|
|
|
|
@api_bp.route('/devices', methods=['GET'])
|
|
@require_admin
|
|
def get_devices():
|
|
"""获取设备列表"""
|
|
try:
|
|
page = request.args.get('page', 1, type=int)
|
|
per_page = min(request.args.get('per_page', 20, type=int), 100)
|
|
product_id = request.args.get('product_id')
|
|
software_version = request.args.get('software_version')
|
|
status = request.args.get('status', type=int)
|
|
keyword = request.args.get('keyword', '').strip()
|
|
product = request.args.get('product')
|
|
license_key = request.args.get('license')
|
|
|
|
query = Device.query.join(Product, Device.product_id == Product.product_id)
|
|
|
|
# 添加搜索条件
|
|
if product_id:
|
|
query = query.filter(Device.product_id == product_id)
|
|
if software_version:
|
|
query = query.filter(Device.software_version == software_version)
|
|
if status is not None:
|
|
query = query.filter(Device.status == status)
|
|
if keyword:
|
|
query = query.filter(
|
|
or_(
|
|
func.lower(Device.machine_code).like(f'%{keyword.lower()}%'),
|
|
func.cast(Device.device_id, db.String).like(f'%{keyword}%')
|
|
)
|
|
)
|
|
if product:
|
|
query = query.filter(
|
|
or_(
|
|
db.cast(Product.product_id, db.String).like(f'%{product}%'),
|
|
Product.product_name.like(f'%{product}%')
|
|
)
|
|
)
|
|
if license_key and license_key.strip():
|
|
query = query.join(License, Device.license_id == License.license_id)
|
|
query = query.filter(db.cast(License.license_key, db.String).like(f'%{license_key}%'))
|
|
|
|
query = query.order_by(db.desc(Device.last_verify_time))
|
|
pagination = query.paginate(page=page, per_page=per_page, error_out=False)
|
|
|
|
devices = [device.to_dict() for device in pagination.items]
|
|
|
|
return jsonify({
|
|
'success': True,
|
|
'data': {
|
|
'devices': devices,
|
|
'pagination': {
|
|
'page': page,
|
|
'per_page': per_page,
|
|
'total': pagination.total,
|
|
'pages': pagination.pages,
|
|
'has_prev': pagination.has_prev,
|
|
'has_next': pagination.has_next
|
|
}
|
|
}
|
|
})
|
|
|
|
except Exception as e:
|
|
current_app.logger.error(f"获取设备列表失败: {str(e)}")
|
|
return jsonify({'success': False, 'message': '服务器内部错误'}), 500
|
|
|
|
@api_bp.route('/devices/<int:device_id>/status', methods=['PUT'])
|
|
@require_admin
|
|
def update_device_status(device_id):
|
|
"""更新设备状态"""
|
|
try:
|
|
device = Device.query.get(device_id)
|
|
if not device:
|
|
return jsonify({'success': False, 'message': '设备不存在'}), 404
|
|
|
|
data = request.get_json()
|
|
status = data.get('status')
|
|
|
|
if status is None:
|
|
return jsonify({'success': False, 'message': '状态参数不能为空'}), 400
|
|
|
|
if status not in [0, 1, 2]:
|
|
return jsonify({'success': False, 'message': '无效的状态值'}), 400
|
|
|
|
device.status = status
|
|
db.session.commit()
|
|
|
|
return jsonify({
|
|
'success': True,
|
|
'message': '设备状态更新成功',
|
|
'data': device.to_dict()
|
|
})
|
|
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
current_app.logger.error(f"更新设备状态失败: {str(e)}")
|
|
return jsonify({'success': False, 'message': '服务器内部错误'}), 500
|
|
|
|
@api_bp.route('/devices/<int:device_id>', methods=['DELETE'])
|
|
@require_admin
|
|
def delete_device(device_id):
|
|
"""删除设备"""
|
|
try:
|
|
device = Device.query.get(device_id)
|
|
if not device:
|
|
return jsonify({'success': False, 'message': '设备不存在'}), 404
|
|
|
|
db.session.delete(device)
|
|
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 |