data_sync.dart 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import 'dart:convert';
  2. import 'package:fis_jsonrpc/services/patient.m.dart';
  3. import 'package:vital_local_database/core/interface/queryable.dart';
  4. import 'package:vitalapp/database/db.dart';
  5. import 'package:vitalapp/database/entities/defines.dart';
  6. import 'package:vitalapp/database/entities/patient.dart';
  7. import 'package:vitalapp/managers/adapters/offline/patient.dart';
  8. import 'package:vitalapp/managers/interfaces/models/common.dart';
  9. import 'package:vitalapp/rpc.dart';
  10. import 'package:vitalapp/store/store.dart';
  11. import 'interfaces/data_sync.dart';
  12. import 'package:fis_common/logger/logger.dart';
  13. class DataSyncManager implements IDataSyncManager {
  14. @override
  15. Future<PagedDataCollection<PatientEntity>> getPatientPagedList(
  16. int pageIndex, {
  17. int pageSize = 50,
  18. OfflineDataSyncState? syncState,
  19. }) async {
  20. try {
  21. final query = db.repositories.patient.queryable.where((x) {
  22. final list = <IDbColumnCondition>[];
  23. list.add(x.isValid.equals(true));
  24. if (syncState != null) {
  25. list.add(x.syncState.equals(syncState));
  26. }
  27. return list;
  28. });
  29. final count = await query.count();
  30. final offset = pageSize * (pageIndex - 1);
  31. final entities = await query.offset(offset).limit(pageSize).toList();
  32. return PagedDataCollection<PatientEntity>(
  33. totalCount: count,
  34. pageIndex: pageIndex,
  35. pageSize: pageSize,
  36. data: entities,
  37. );
  38. } catch (e) {
  39. logger.e("DataSyncManager getPatientPagedList error.", e);
  40. return PagedDataCollection<PatientEntity>(
  41. totalCount: 0,
  42. pageIndex: pageIndex,
  43. pageSize: pageSize,
  44. data: [],
  45. );
  46. }
  47. }
  48. @override
  49. Future<bool> syncPatient(PatientEntity entity) async {
  50. try {
  51. final jsonMap = jsonDecode(entity.dataJson);
  52. final dto = PatientDTO.fromJson(jsonMap);
  53. bool syncResult = false;
  54. if (entity.syncType == OfflineDataSyncType.create) {
  55. final request = PatientDtoConverter.dto2Create(dto);
  56. request.token = Store.user.token;
  57. final code = await rpc.patient.createPatientAsync(request);
  58. syncResult = code.isNotEmpty;
  59. } else {
  60. final request = PatientDtoConverter.dto2Update(dto);
  61. request.token = Store.user.token;
  62. syncResult = await rpc.patient.updatePatientAsync(request);
  63. }
  64. entity.syncState =
  65. syncResult ? OfflineDataSyncState.success : OfflineDataSyncState.fail;
  66. await db.repositories.patient.update(entity);
  67. return syncResult;
  68. } catch (e) {
  69. logger.e("DataSyncManager syncPatient error.", e);
  70. return false;
  71. }
  72. }
  73. }