import 'dart:convert'; import 'package:get_storage/get_storage.dart'; import '../../data/services/db/database_helper.dart'; import '../../data/services/db/sqflite_api.dart'; import '../../data/services/network/api.dart'; class Synchrodata { static final GetStorage _storage = GetStorage(); static List> _records = (_storage.read("operation_records") as List?) ?.map((e) => Map.from(e as Map)) .toList() ?? []; static List _delids = _storage.read("operation_delids") ?? []; static bool _isSynchro = false; // 保存操作记录 static Future saveOperationRecord( String method, dynamic params, ) async { String userId = ''; Map? userInfo = _storage.read("user_info"); if (userInfo != null) { userId = userInfo['user']['uid']; } String id = '${userId}_${params['id']}'; if (params['type'] != null) { params['rtype'] = params['type']; } switch (method) { case 'insert': _records.add({ ...Map.from(params), 'id': id, 'number': params['id'], 'uid': userId, }); _storage.write("operation_records", _records); break; case 'update': Map? foundElement = _records.firstWhere( (element) => element['id'] == id, orElse: () => {}, ); if (foundElement.isNotEmpty) { foundElement.addAll({ ...Map.from(params), 'id': id, 'number': params['id'], }); } else { _records.add({ ...Map.from(params), 'id': id, 'number': params['id'], 'uid': userId, }); } _storage.write("operation_records", _records); break; case 'delete': _delids.add(id); _storage.write("operation_delids", _delids); break; default: break; } } // 上传操作记录 static Future uploadOperationRecords({bool isSynchro = false}) async { if (_isSynchro) return; _isSynchro = true; if (_records.isNotEmpty || _delids.isNotEmpty) { // 获取需要修改的全部数据 List putRecords = []; for (var element in _records) { Map result = {'details': {}}; List speakerList = []; if (!_delids.contains(element['id'])) { result = await SqfliteApi.getMeetingDetails(element['number']); speakerList = await SqfliteApi.getMeetingSpeaker(element['number']); } putRecords.add({ ...Map.from(result), ...Map.from(result['details']), 'rtype': result['type'], 'original': jsonEncode(speakerList), ...Map.from(element), }); } var result = await Api.putOperationRecord({ 'delids': _delids, 'records': putRecords, }); if (result != null) { _records = []; _delids = []; _storage.write("operation_records", _records); _storage.write("operation_delids", _delids); } } if (isSynchro) { await _synchrodata(); } _isSynchro = false; } // 同步数据 static Future _synchrodata() async { final db = await DatabaseHelper().database; var result = await Api.getOperationRecord(); List records = result['records']; await db.transaction((txn) async { for (var element in records) { final List existList = await txn.query( 'meeting', where: 'id = ?', whereArgs: [element['number']], ); Map meetingData = { 'id': element['number'], 'title': element['title'] ?? '', 'type': element['rtype'] ?? '', 'seconds': element['seconds'] ?? 0, 'filepath': '', 'audiourl': element['audiourl'] ?? '', 'tasktype': element['tasktype'] ?? 0, 'creationtime': element['creationtime'] ?? 0, }; Map meetingDetailsData = { 'meetingid': element['number'], 'address': element['address'] ?? '', 'personnel': element['personnel'] ?? '', 'taskid': element['taskid'] ?? '', 'tasktype': element['tasktype'] ?? 0, 'overview': element['overview'] ?? '', 'summary': element['summary'] ?? '', 'mindmap': '', }; if (existList.isNotEmpty) { await txn.update( 'meeting', meetingData, where: 'id = ?', whereArgs: [element['number']], ); await txn.update( 'meetingdetails', meetingDetailsData, where: 'meetingid = ?', whereArgs: [element['number']], ); } else { await txn.insert('meeting', meetingData); await txn.insert('meetingdetails', meetingDetailsData); } if (element['original'].isNotEmpty) { final List existSpeakerList = await txn.query( 'meetingspeaker', where: 'meetingid = ?', whereArgs: [element['number']], ); List speakerList = jsonDecode(element['original']); if (existSpeakerList.isNotEmpty) { final batch = txn.batch(); for (var item in speakerList) { batch.update( 'meetingspeaker', item, where: 'id = ?', whereArgs: [item['id']], ); } await batch.commit(); } else { final batch = txn.batch(); for (var item in speakerList) { batch.insert('meetingspeaker', item); } await batch.commit(); } } } }); } }