v2.dart 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import 'package:vitalapp/database/db.dart';
  2. import 'package:vitalapp/database/entities/exam.dart';
  3. import 'package:vitalapp/database/entities/exam_batch.dart';
  4. import 'package:vitalapp/database/entities/followup.dart';
  5. import 'package:fis_common/logger/logger.dart';
  6. import 'base.dart';
  7. class DatabasePatchV2 extends BaseDatabasePatch {
  8. DatabasePatchV2(super.database);
  9. @override
  10. int get targetVersion => 1;
  11. @override
  12. Future<void> executeTask() async {
  13. // 新增表
  14. await db.database.execute(FollowUpEntity.TABLE_CREATE_SQL);
  15. await db.database.execute(ExamEntity.TABLE_CREATE_SQL);
  16. await db.database.execute(ExamBatchEntity.TABLE_CREATE_SQL);
  17. // patient表新增字段
  18. await db.database.execute(
  19. 'ALTER TABLE patients ADD COLUMN overallSyncState INTEGER NOT NULL DEFAULT 0;');
  20. await db.database.execute(
  21. 'ALTER TABLE patients ADD COLUMN followUpCount INTEGER NOT NULL DEFAULT 0;');
  22. await db.database.execute(
  23. 'ALTER TABLE patients ADD COLUMN diagnosisCount INTEGER NOT NULL DEFAULT 0;');
  24. await db.database.execute(
  25. "ALTER TABLE patients ADD COLUMN orgCode VARCHAR(100) NOT NULL DEFAULT '';");
  26. await _cleanDuplicatePatients();
  27. await _calcAndUpdateDiagnosisCount();
  28. await _updateOverallSyncState();
  29. // 填充历史数据 patient.overallSyncState 值
  30. await db.database.execute(
  31. 'UPDATE patients SET overallSyncState = syncState WHERE 1=1 AND isValid = 1;');
  32. }
  33. /// 检测并清除重复多余的居民数据
  34. Future<void> _cleanDuplicatePatients() async {
  35. final rows = await db.database.query(
  36. "SELECT code,mid FROM( SELECT code,name, COUNT(0) AS pcount,MAX(id) AS mid FROM patients WHERE 1=1 AND isValid=1 GROUP BY code HAVING pcount>1);");
  37. if (rows.isEmpty) return;
  38. for (var row in rows) {
  39. try {
  40. final code = row['code'];
  41. final maxId = row['mid'];
  42. /// 把旧的记录置为无效
  43. await db.database.execute(
  44. "UPDATE patients SET isValid=0, code='${code}_del' WHERE code='$code' AND isValid=1 AND id!=$maxId;");
  45. } catch (e) {
  46. logger.e("DatabasePatchV2 cleanDuplicatePatient error,", e);
  47. }
  48. }
  49. }
  50. /// 计算并更新居民的未上传健康检测数量
  51. Future<void> _calcAndUpdateDiagnosisCount() async {
  52. const querySql = "SELECT p.code, COUNT(d.code) AS dcount FROM patients p "
  53. "LEFT JOIN diagnosis d ON d.patientCode = p.code AND d.isValid = 1 AND d.syncState!=1 "
  54. "WHERE 1=1 AND p.isValid=1 GROUP BY p.code; ";
  55. const updateSql = "CREATE TEMPORARY TABLE temp_counts AS $querySql"
  56. "UPDATE patients SET diagnosisCount =( SELECT dcount FROM temp_counts WHERE code = patients.code) WHERE EXISTS ( SELECT 1 FROM temp_counts WHERE code = patients.code ); "
  57. "DROP TABLE temp_counts;";
  58. await db.database.execute(updateSql);
  59. }
  60. /// 更新居民新字段OverallSync的值
  61. Future<void> _updateOverallSyncState() async {
  62. // 先同步居民档案状态-》整体同步状态
  63. await db.database
  64. .execute("UPDATE patients SET overallSyncState = syncState WHERE 1=1;");
  65. // 有未上传检测数据的,整体同步状态更新为未上传
  66. await db.database.execute(
  67. "UPDATE patients SET overallSyncState = 0 WHERE 1=1 AND isValid=1 AND diagnosisCount >0;");
  68. }
  69. }