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