- 在AndroidManifest.xml中添加USB Host权限和设备过滤器配置 - 新增设备控制国际化词条包括速度档位、吹气时间等 - 重构数据库结构将速度相关字段统一为档位数值存储 - 添加通用KV存储方法用于settings表数据读写 - 优化首页导航实现tab间跳转和状态保持功能 - 更新程序详情页面布局和参数表单界面 - 移除模拟运行器相关测试代码 - 添加USB串口通信依赖包usb_serial
126 lines
3.9 KiB
Dart
126 lines
3.9 KiB
Dart
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<int> importFromJson(String jsonContent) async {
|
|
final data = jsonDecode(jsonContent);
|
|
|
|
// 支持单个程序或程序数组
|
|
final List<dynamic> 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,
|
|
temperature: programData['temperature'] as int? ?? 50,
|
|
airflowTime: programData['airflowTime'] as int? ?? 60,
|
|
);
|
|
|
|
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,
|
|
blowTime: stepData['blowTime'] as int? ?? 0,
|
|
speed: stepData['speed'] as int? ?? 5,
|
|
);
|
|
await _programService.addStep(step);
|
|
}
|
|
}
|
|
|
|
importedCount++;
|
|
} catch (e) {
|
|
// 忽略单个程序导入错误
|
|
continue;
|
|
}
|
|
}
|
|
|
|
return importedCount;
|
|
}
|
|
|
|
/// 验证程序数据
|
|
bool _validateProgramData(Map<String, dynamic> data) {
|
|
return data.containsKey('code') &&
|
|
data.containsKey('name') &&
|
|
data['code'] is String &&
|
|
data['name'] is String;
|
|
}
|
|
|
|
/// 导出程序为 JSON
|
|
Future<String> exportToJson(List<int> 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,
|
|
'temperature': program.temperature,
|
|
'airflowTime': program.airflowTime,
|
|
'steps': steps.map((s) => {
|
|
'position': s.position,
|
|
'name': s.name,
|
|
'mixTime': s.mixTime,
|
|
'magnetTime': s.magnetTime,
|
|
'volume': s.volume,
|
|
'blowTime': s.blowTime,
|
|
'speed': s.speed,
|
|
}).toList(),
|
|
});
|
|
}
|
|
|
|
return jsonEncode({'programs': programs});
|
|
}
|
|
} |