import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; /// 数据库服务 class DatabaseService { static final DatabaseService instance = DatabaseService._internal(); static Database? _database; DatabaseService._internal(); Future get database async { if (_database != null) return _database!; _database = await _initDatabase(); return _database!; } Future _initDatabase() async { final dbPath = await getDatabasesPath(); final path = join(dbPath, 'kuaishai.db'); return await openDatabase( path, version: 2, onCreate: _onCreate, onUpgrade: _onUpgrade, ); } Future _onCreate(Database db, int version) async { // 程序表 await db.execute(''' CREATE TABLE programs ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL UNIQUE, name TEXT NOT NULL, created_at TEXT NOT NULL, status INTEGER DEFAULT 1 ) '''); // 步骤表 await db.execute(''' CREATE TABLE steps ( id INTEGER PRIMARY KEY AUTOINCREMENT, program_id INTEGER NOT NULL, step_no INTEGER NOT NULL, position TEXT NOT NULL, name TEXT NOT NULL, mix_time INTEGER DEFAULT 0, magnet_time INTEGER DEFAULT 0, volume INTEGER DEFAULT 0, mix_speed TEXT DEFAULT '中速', blow_speed TEXT DEFAULT '中速', blow_time INTEGER DEFAULT 0, needle_speed INTEGER DEFAULT 5, FOREIGN KEY (program_id) REFERENCES programs(id) ON DELETE CASCADE ) '''); // 设置表(密码存储) await db.execute(''' CREATE TABLE settings ( key TEXT PRIMARY KEY, value TEXT NOT NULL ) '''); // 初始化默认密码 await db.insert('settings', {'key': 'password', 'value': '123456'}); } /// 数据库升级 Future _onUpgrade(Database db, int oldVersion, int newVersion) async { if (oldVersion < 2) { // 添加 settings 表 await db.execute(''' CREATE TABLE settings ( key TEXT PRIMARY KEY, value TEXT NOT NULL ) '''); // 初始化默认密码 await db.insert('settings', {'key': 'password', 'value': '123456'}); } } Future close() async { if (_database != null) { await _database!.close(); _database = null; } } /// 初始化测试数据(仅调试模式使用) Future initTestData() async { final db = await database; // 检查是否已有数据 final count = Sqflite.firstIntValue( await db.rawQuery('SELECT COUNT(*) FROM programs'), ); if (count != null && count > 0) return; // 插入测试程序并添加步骤 final testPrograms = [ {'code': 'P001', 'name': '标准检测程序', 'created_at': '2026-05-19', 'status': 1}, {'code': 'P002', 'name': '快速检测程序', 'created_at': '2026-05-18', 'status': 1}, {'code': 'P003', 'name': '深度检测程序', 'created_at': '2026-05-17', 'status': 1}, {'code': 'P004', 'name': '样本预处理程序', 'created_at': '2026-05-16', 'status': 0}, {'code': 'P005', 'name': '磁珠分离程序', 'created_at': '2026-05-15', 'status': 1}, ]; for (final program in testPrograms) { final programId = await db.insert('programs', program); // 为每个程序添加测试步骤 final testSteps = [ { 'program_id': programId, 'step_no': 1, 'position': 'A1', 'name': '混合', 'mix_time': 60, 'magnet_time': 0, 'volume': 100, 'mix_speed': '中速', 'blow_speed': '中速', 'blow_time': 0, 'needle_speed': 5, }, { 'program_id': programId, 'step_no': 2, 'position': 'A1', 'name': '吸磁', 'mix_time': 0, 'magnet_time': 30, 'volume': 0, 'mix_speed': '中速', 'blow_speed': '中速', 'blow_time': 0, 'needle_speed': 5, }, { 'program_id': programId, 'step_no': 3, 'position': 'A2', 'name': '吹气', 'mix_time': 0, 'magnet_time': 0, 'volume': 0, 'mix_speed': '中速', 'blow_speed': '高速', 'blow_time': 10, 'needle_speed': 8, }, ]; for (final step in testSteps) { await db.insert('steps', step); } } } }