import 'dart:convert'; import '../../programs/models/program.dart'; import '../../programs/models/step.dart'; import '../../programs/services/program_service.dart'; /// 程序导入服务 class ProgramImportService { static final ProgramImportService instance = ProgramImportService._internal(); final ProgramService _programService = ProgramService.instance; ProgramImportService._internal(); /// 从 JSON 字符串导入程序 /// 返回导入的程序数量 Future importFromJson(String jsonContent) async { final data = jsonDecode(jsonContent); // 支持单个程序或程序数组 final List programsData; if (data is List) { programsData = data; } else if (data is Map && data.containsKey('programs')) { programsData = data['programs'] as List; } else { programsData = [data]; } int importedCount = 0; for (final programData in programsData) { try { // 验证必填字段 if (!_validateProgramData(programData)) { continue; } // 检查编号是否已存在 final existingPrograms = await _programService.getAllPrograms(); final code = programData['code'] as String; if (existingPrograms.any((p) => p.code == code)) { // 编号已存在,跳过或使用新编号 continue; } // 创建程序 final program = Program( code: code, name: programData['name'] as String, createdAt: programData['createdAt'] ?? DateTime.now().toString().split('.')[0], status: programData['status'] ?? 1, ); final programId = await _programService.addProgram(program); // 导入步骤 final stepsData = programData['steps'] as List?; if (stepsData != null) { for (int i = 0; i < stepsData.length; i++) { final stepData = stepsData[i]; final step = Step( programId: programId, stepNo: i + 1, position: stepData['position'] as String? ?? 'A1', name: stepData['name'] as String? ?? '步骤${i + 1}', mixTime: stepData['mixTime'] as int? ?? 0, magnetTime: stepData['magnetTime'] as int? ?? 0, volume: stepData['volume'] as int? ?? 0, mixSpeed: stepData['mixSpeed'] as String? ?? '中速', blowSpeed: stepData['blowSpeed'] as String? ?? '中速', blowTime: stepData['blowTime'] as int? ?? 0, needleSpeed: stepData['needleSpeed'] as int? ?? 5, ); await _programService.addStep(step); } } importedCount++; } catch (e) { // 忽略单个程序导入错误 continue; } } return importedCount; } /// 验证程序数据 bool _validateProgramData(Map data) { return data.containsKey('code') && data.containsKey('name') && data['code'] is String && data['name'] is String; } /// 导出程序为 JSON Future exportToJson(List programIds) async { final programs = []; for (final id in programIds) { final program = await _programService.getProgramById(id); if (program == null) continue; final steps = await _programService.getStepsByProgramId(id); programs.add({ 'code': program.code, 'name': program.name, 'createdAt': program.createdAt, 'status': program.status, 'steps': steps.map((s) => { 'position': s.position, 'name': s.name, 'mixTime': s.mixTime, 'magnetTime': s.magnetTime, 'volume': s.volume, 'mixSpeed': s.mixSpeed, 'blowSpeed': s.blowSpeed, 'blowTime': s.blowTime, 'needleSpeed': s.needleSpeed, }).toList(), }); } return jsonEncode({'programs': programs}); } }