Browse Source

temp. some codes about tcm offline

Melon 1 year ago
parent
commit
f45cc4d763

+ 9 - 0
lib/database/db.dart

@@ -1,3 +1,4 @@
+import 'package:sqflite/sqflite.dart' as sqf;
 import 'package:flutter/foundation.dart';
 import 'package:vital_local_database/index.dart';
 import 'package:vitalapp/database/entities/diagnosis.dart';
@@ -6,6 +7,9 @@ import 'package:vitalapp/database/repositories/followup.dart';
 import 'package:vitalapp/database/repositories/interfaces/followup.dart';
 import 'db_patch/v3.dart';
 import 'db_patch/v4.dart';
+import 'entities/exam.dart';
+import 'entities/exam_batch.dart';
+import 'entities/followup.dart';
 import 'repositories/interfaces/diagnosis.dart';
 import 'repositories/interfaces/exam.dart';
 import 'repositories/interfaces/exam_batch.dart';
@@ -34,6 +38,11 @@ class VitalDatabaseAccessor
 
   /// 初始化
   Future<void> init() async {
+    // if (kDebugMode) {
+    //   // !!!!危险操作
+    //   await sqf.deleteDatabase("vital.db");
+    // }
+
     _database = await _connection.open();
     if (kDebugMode) {
       await _debugBatch();

+ 5 - 0
lib/database/db_patch/v4.dart

@@ -10,6 +10,11 @@ class DatabasePatchV4 extends BaseDatabasePatch {
 
   @override
   Future<void> executeTask() async {
+    // patient表新增字段
+    await db.database.execute(
+        "ALTER TABLE patients ADD COLUMN examCount INTEGER NOT NULL DEFAULT 0;");
+    await db.database.execute(
+        "ALTER TABLE patients ADD COLUMN tcmConsitutionCount INTEGER NOT NULL DEFAULT 0;");
     // exam表新增字段
     await db.database.execute(
         "ALTER TABLE exams ADD COLUMN templateCode VARCHAR(100) NOT NULL;");

+ 7 - 2
lib/database/entities/patient.dart

@@ -49,10 +49,11 @@ class PatientEntity extends SyncableEntity<PatientEntity> {
   int diagnosisCount = 0;
 
   /// 体检待上传数量
-  ///
-  /// TODO: 尚未支持
   int examCount = 0;
 
+  /// 中医体质待上传数量
+  int tcmConsitutionCount = 0;
+
   /// 整体上传状态
   OfflineDataSyncState overallSyncState = OfflineDataSyncState.wait;
 
@@ -68,6 +69,8 @@ class PatientEntity extends SyncableEntity<PatientEntity> {
     map['extCode'] = extCode;
     map['followUpCount'] = followUpCount;
     map['diagnosisCount'] = diagnosisCount;
+    map['tcmConsitutionCount'] = tcmConsitutionCount;
+    map['examCount'] = examCount;
     map['overallSyncState'] = overallSyncState.index;
     // map['extSyncState'] = extSyncState.index;
     return map;
@@ -82,6 +85,8 @@ class PatientEntity extends SyncableEntity<PatientEntity> {
     extCode = map['extCode'];
     followUpCount = map['followUpCount'];
     diagnosisCount = map['diagnosisCount'];
+    examCount = map['examCount'];
+    tcmConsitutionCount = map['tcmConsitutionCount'];
     overallSyncState = OfflineDataSyncState.values[map['overallSyncState']];
     // extSyncState = OfflineDataSyncState.values[map['extSyncState']];
     return this;

+ 100 - 0
lib/managers/data_sync.dart

@@ -1,4 +1,5 @@
 import 'dart:convert';
+import 'dart:math';
 
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:get/get.dart';
@@ -8,6 +9,8 @@ import 'package:vitalapp/architecture/storage/text_storage.dart';
 import 'package:vitalapp/database/db.dart';
 import 'package:vitalapp/database/entities/defines.dart';
 import 'package:vitalapp/database/entities/diagnosis.dart';
+import 'package:vitalapp/database/entities/exam.dart';
+import 'package:vitalapp/database/entities/exam_batch.dart';
 import 'package:vitalapp/database/entities/followup.dart';
 import 'package:vitalapp/database/entities/patient.dart';
 import 'package:vitalapp/managers/adapters/offline/patient.dart';
@@ -147,6 +150,16 @@ class DataSyncManager implements IDataSyncManager {
           final followUpSyncCount = await syncPatientFollowUp(patientCode);
           patientEntity.followUpCount -= followUpSyncCount;
         }
+
+        if (patientEntity.examCount > 0) {
+          final count = await syncPatientFollowUp(patientCode);
+          patientEntity.followUpCount -= count;
+        }
+
+        if (patientEntity.tcmConsitutionCount > 0) {
+          final count = await syncPatientFollowUp(patientCode);
+          patientEntity.tcmConsitutionCount -= count;
+        }
       }
 
       isSyncCompleted = _checkPatientSyncCompleted(patientEntity);
@@ -264,6 +277,49 @@ class DataSyncManager implements IDataSyncManager {
     return count;
   }
 
+  @override
+  Future<int> syncPatientExam(String patientCode) async {
+    logger.i("DataSyncManager start sync exam...");
+    final list = await db.repositories.followUp
+        .queryAllListByPatient(patientCode, userCode);
+    logger.i("DataSyncManager exam total count: ${list.length}.");
+    int count = 0;
+    try {
+      for (var entity in list) {
+        final success = await _syncSingleFollowUp(entity);
+        if (success) {
+          count++;
+        }
+      }
+    } catch (e) {
+      logger.e("DataSyncManager sync exam error.", e);
+    }
+    logger.i("DataSyncManager stop sync exam; uploaded count: $count.");
+    return count;
+  }
+
+  @override
+  Future<int> syncPatientTCMConsitution(String patientCode) async {
+    logger.i("DataSyncManager start sync TCMConsitution...");
+    final list = await db.repositories.followUp
+        .queryAllListByPatient(patientCode, userCode);
+    logger.i("DataSyncManager TCMConsitution total count: ${list.length}.");
+    int count = 0;
+    try {
+      for (var entity in list) {
+        final success = await _syncSingleFollowUp(entity);
+        if (success) {
+          count++;
+        }
+      }
+    } catch (e) {
+      logger.e("DataSyncManager sync TCMConsitution error.", e);
+    }
+    logger
+        .i("DataSyncManager stop sync TCMConsitution; uploaded count: $count.");
+    return count;
+  }
+
   @override
   Future<PagedDataCollection<OfflineRecordModel>> getOfflinePagedList(
     int pageIndex, {
@@ -455,6 +511,50 @@ class DataSyncManager implements IDataSyncManager {
     return result;
   }
 
+  Future<bool> _syncSingleExam(
+      ExamEntity entity, ExamBatchEntity batchEntity) async {
+    bool result = false;
+    try {
+      if (entity.syncType == OfflineDataSyncType.create) {
+        // TCM KEY: HEITCMC
+        final request = CreateExamRequest(
+          // code: entity.code,
+          batchNumber: entity.batchNumber,
+          key: entity.templateKey,
+          patientCode: entity.patientCode,
+          examData: entity.dataJson,
+          templateCode: entity.templateCode,
+          physicalExamNumber: "",
+          token: Store.user.token,
+        );
+        final code = await rpc.vitalExam.createExamAsync(request);
+        result = code.isNotEmpty;
+        if (result) {
+          entity.code = code; // 更新真实Code
+        }
+      } else {
+        final request = UpdateExamRequest(
+          token: Store.user.token,
+          key: entity.templateKey,
+          examData: entity.dataJson,
+          code: entity.code,
+        );
+        result = await rpc.vitalExam.updateExamAsync(request);
+      }
+      if (result) {
+        entity.syncState = OfflineDataSyncState.success;
+      } else {
+        entity.syncState = OfflineDataSyncState.fail;
+      }
+      final updateRows = await db.repositories.exam.update(entity);
+      result = updateRows > 0;
+    } catch (e) {
+      logger.e(
+          "DataSyncManager_syncSingleFollowUp error. id: ${entity.id}.", e);
+    }
+    return result;
+  }
+
   Future<bool> _syncPatientExt(PatientEntity entity) async {
     if (entity.extJson == null || entity.extJson!.isEmpty) {
       return true;

+ 6 - 0
lib/managers/interfaces/data_sync.dart

@@ -38,6 +38,12 @@ abstract class IDataSyncManager implements IManager {
   /// 同步居民的随访数据
   Future<int> syncPatientFollowUp(String patientCode);
 
+  /// 同步居民的健康体检
+  Future<int> syncPatientExam(String patientCode);
+
+  /// 同步居民的中医体质
+  Future<int> syncPatientTCMConsitution(String patientCode);
+
   /// 获取离线记录分页列表
   Future<PagedDataCollection<OfflineRecordModel>> getOfflinePagedList(
     int pageIndex, {

+ 2 - 0
lib/pages/data_sync/center/widgets/data_table.dart

@@ -13,6 +13,7 @@ enum _SyncCategoryEnum {
   diagnosis,
   exam,
   followUp,
+  tcmConsitution,
 }
 
 class _TableUtils {
@@ -243,6 +244,7 @@ class _SyncCategoryTag extends StatelessWidget {
     _SyncCategoryEnum.diagnosis: ["检测", Colors.orange],
     _SyncCategoryEnum.exam: ["检查", Colors.green],
     _SyncCategoryEnum.followUp: ["随访", Colors.purple],
+    _SyncCategoryEnum.tcmConsitution: ["中医体质", Colors.brown.shade400],
   };
   final _SyncCategoryEnum category;