diff --git a/README.md b/README.md index f3fa73a..a1b7e98 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,11 @@ flutter pub run build_runner build --delete-conflicting-outputs~ ``` ## flutter打包 ``` -flutter build apk --build-name 1.3.0 --build-number 130 +flutter build apk --build-name 1.7.4 --build-number 174 --build-name为版本号(展示) --build-number为版本号(内部比较) +``` +## 打印日志 +``` +adb -s 8d06b935c69accd4 logcat -v time -s flutter ``` \ No newline at end of file diff --git a/android/app/src/main/java/io/flutter/plugins/facediscern/database/DatabaseHelper.java b/android/app/src/main/java/io/flutter/plugins/facediscern/database/DatabaseHelper.java index d27878d..49ad8cd 100644 --- a/android/app/src/main/java/io/flutter/plugins/facediscern/database/DatabaseHelper.java +++ b/android/app/src/main/java/io/flutter/plugins/facediscern/database/DatabaseHelper.java @@ -15,7 +15,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_PATH = "pj_cashier/database"; private static final String DATABASE_NAME = "cash_register.db"; - private static final int DATABASE_VERSION = 7; + private static final int DATABASE_VERSION = 8; public DatabaseHelper(Context context) { super(context, getCustomDatabasePath(context), null, DATABASE_VERSION); diff --git a/lib/common/services/database/database.dart b/lib/common/services/database/database.dart index 87c5f8b..8763771 100644 --- a/lib/common/services/database/database.dart +++ b/lib/common/services/database/database.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:io'; import 'package:floor/floor.dart'; import 'package:pj_supermarket_cloud/common/index.dart'; @@ -41,7 +40,7 @@ const typeConverters = [ BoolConverter, ]; -@Database(version: 7, entities: entities) +@Database(version: 8, entities: entities) @TypeConverters(typeConverters) abstract class AppDatabase extends FloorDatabase { BroadcastDao get getBroadcastDao; diff --git a/lib/common/services/database/database.g.dart b/lib/common/services/database/database.g.dart index 8db3b37..f2a57bb 100644 --- a/lib/common/services/database/database.g.dart +++ b/lib/common/services/database/database.g.dart @@ -104,7 +104,7 @@ class _$AppDatabase extends AppDatabase { Callback? callback, ]) async { final databaseOptions = sqflite.OpenDatabaseOptions( - version: 7, + version: 8, onConfigure: (database) async { await database.execute('PRAGMA foreign_keys = ON'); await callback?.onConfigure?.call(database); @@ -473,7 +473,7 @@ class _$OrderDao extends OrderDao { productDesc: row['productDesc'] as String?, count: row['count'] as int, weight: row['weight'] as double, - payTime: _dateTimeEmptyConverter.decode(row['payTime'] as String), + payTime: _dateTimeEmptyConverter.decode(row['payTime'] as String?), createTime: _dateTimeConverter.decode(row['createTime'] as String)), arguments: [ status, @@ -533,7 +533,7 @@ class _$OrderDao extends OrderDao { productDesc: row['productDesc'] as String?, count: row['count'] as int, weight: row['weight'] as double, - payTime: _dateTimeEmptyConverter.decode(row['payTime'] as String), + payTime: _dateTimeEmptyConverter.decode(row['payTime'] as String?), createTime: _dateTimeConverter.decode(row['createTime'] as String)), arguments: [ sysType, @@ -565,7 +565,7 @@ class _$OrderDao extends OrderDao { productDesc: row['productDesc'] as String?, count: row['count'] as int, weight: row['weight'] as double, - payTime: _dateTimeEmptyConverter.decode(row['payTime'] as String), + payTime: _dateTimeEmptyConverter.decode(row['payTime'] as String?), createTime: _dateTimeConverter.decode(row['createTime'] as String)), arguments: [id]); } @@ -1460,7 +1460,7 @@ class _$PrintHistoryDao extends PrintHistoryDao { Future> getAll(String status) async { return _queryAdapter.queryList( 'SELECT * FROM print_history WHERE (?1 = \'-1\' OR status = ?1)', - mapper: (Map row) => PrintHistoryEntity(id: row['id'] as int?, orderId: row['orderId'] as String, serviceOrderId: row['serviceOrderId'] as String, servicePrintId: row['servicePrintId'] as String, invoiceUrl: row['invoiceUrl'] as String, status: _printStatusConverter.decode(row['status'] as String), printTime: row['printTime'] as String?, syncTime: _dateTimeEmptyConverter.decode(row['syncTime'] as String), createTime: _dateTimeConverter.decode(row['createTime'] as String)), + mapper: (Map row) => PrintHistoryEntity(id: row['id'] as int?, orderId: row['orderId'] as String, serviceOrderId: row['serviceOrderId'] as String, servicePrintId: row['servicePrintId'] as String, invoiceUrl: row['invoiceUrl'] as String, status: _printStatusConverter.decode(row['status'] as String), printTime: row['printTime'] as String?, syncTime: _dateTimeEmptyConverter.decode(row['syncTime'] as String?), createTime: _dateTimeConverter.decode(row['createTime'] as String)), arguments: [status]); } @@ -1598,13 +1598,13 @@ class _$UserDao extends UserDao { walletBalance: row['walletBalance'] as int?, canteenId: row['canteenId'] as String?, createTime: - _dateTimeEmptyConverter.decode(row['createTime'] as String), + _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: - _dateTimeEmptyConverter.decode(row['updateTime'] as String), + _dateTimeEmptyConverter.decode(row['updateTime'] as String?), discountsUpdateTime: _dateTimeEmptyConverter - .decode(row['discountsUpdateTime'] as String), - discountsList: - _listDiscountsConverter.decode(row['discountsList'] as String)), + .decode(row['discountsUpdateTime'] as String?), + discountsList: _listDiscountsConverter + .decode(row['discountsList'] as String?)), arguments: [userId]); } @@ -1624,13 +1624,13 @@ class _$UserDao extends UserDao { walletBalance: row['walletBalance'] as int?, canteenId: row['canteenId'] as String?, createTime: - _dateTimeEmptyConverter.decode(row['createTime'] as String), + _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: - _dateTimeEmptyConverter.decode(row['updateTime'] as String), + _dateTimeEmptyConverter.decode(row['updateTime'] as String?), discountsUpdateTime: _dateTimeEmptyConverter - .decode(row['discountsUpdateTime'] as String), - discountsList: - _listDiscountsConverter.decode(row['discountsList'] as String)), + .decode(row['discountsUpdateTime'] as String?), + discountsList: _listDiscountsConverter + .decode(row['discountsList'] as String?)), arguments: [walletCardNumber]); } @@ -1780,9 +1780,9 @@ class _$FaceDao extends FaceDao { path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: - _dateTimeEmptyConverter.decode(row['createTime'] as String), + _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: - _dateTimeEmptyConverter.decode(row['updateTime'] as String)), + _dateTimeEmptyConverter.decode(row['updateTime'] as String?)), arguments: [id]); } @@ -1800,9 +1800,9 @@ class _$FaceDao extends FaceDao { path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: - _dateTimeEmptyConverter.decode(row['createTime'] as String), + _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: - _dateTimeEmptyConverter.decode(row['updateTime'] as String)), + _dateTimeEmptyConverter.decode(row['updateTime'] as String?)), arguments: [sampleId]); } @@ -1820,9 +1820,9 @@ class _$FaceDao extends FaceDao { path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: - _dateTimeEmptyConverter.decode(row['createTime'] as String), + _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: - _dateTimeEmptyConverter.decode(row['updateTime'] as String)), + _dateTimeEmptyConverter.decode(row['updateTime'] as String?)), arguments: [userId]); } @@ -1834,7 +1834,7 @@ class _$FaceDao extends FaceDao { ) async { return _queryAdapter.queryList( 'SELECT * FROM face WHERE (?1 = \'-1\' OR userName LIKE \'%\' || ?1 || \'%\') LIMIT ?2 OFFSET ?3', - mapper: (Map row) => FaceEntity(id: row['id'] as int?, userId: row['userId'] as String, sampleId: row['sampleId'] as String, userName: row['userName'] as String, deptId: row['deptId'] as String?, deptName: row['deptName'] as String?, imagePath: row['imagePath'] as String, path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: _dateTimeEmptyConverter.decode(row['createTime'] as String), updateTime: _dateTimeEmptyConverter.decode(row['updateTime'] as String)), + mapper: (Map row) => FaceEntity(id: row['id'] as int?, userId: row['userId'] as String, sampleId: row['sampleId'] as String, userName: row['userName'] as String, deptId: row['deptId'] as String?, deptName: row['deptName'] as String?, imagePath: row['imagePath'] as String, path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: _dateTimeEmptyConverter.decode(row['updateTime'] as String?)), arguments: [userName, pageSize, offset]); } @@ -1860,9 +1860,9 @@ class _$FaceDao extends FaceDao { path: row['path'] as String?, faceModel: _listIntConverter.decode(row['faceModel'] as String), createTime: - _dateTimeEmptyConverter.decode(row['createTime'] as String), + _dateTimeEmptyConverter.decode(row['createTime'] as String?), updateTime: - _dateTimeEmptyConverter.decode(row['updateTime'] as String))); + _dateTimeEmptyConverter.decode(row['updateTime'] as String?))); } @override diff --git a/lib/common/services/database/database_migration.dart b/lib/common/services/database/database_migration.dart index c68bd69..2048ddb 100644 --- a/lib/common/services/database/database_migration.dart +++ b/lib/common/services/database/database_migration.dart @@ -183,6 +183,39 @@ abstract class DatabaseMigration { } }); + /// 从版本7到版本8的迁移:补齐user_record表遗漏字段 + static Migration migration7To8 = Migration(7, 8, (database) async { + final columns = await database.rawQuery("PRAGMA table_info(user_record)"); + bool hasCanteenId = false; + bool hasDiscountsList = false; + bool hasDiscountsUpdateTime = false; + for (final c in columns) { + final name = c['name']; + if (name == 'canteenId') hasCanteenId = true; + if (name == 'discountsList') hasDiscountsList = true; + if (name == 'discountsUpdateTime') hasDiscountsUpdateTime = true; + } + if (!hasCanteenId) { + await database + .execute("ALTER TABLE user_record ADD COLUMN canteenId TEXT"); + } + if (!hasDiscountsList) { + await database + .execute("ALTER TABLE user_record ADD COLUMN discountsList TEXT"); + } + await database.execute( + "UPDATE user_record SET discountsList = '[]' WHERE discountsList IS NULL", + ); + if (!hasDiscountsUpdateTime) { + await database.execute( + "ALTER TABLE user_record ADD COLUMN discountsUpdateTime TEXT", + ); + } + await database.execute( + "UPDATE user_record SET discountsUpdateTime = '' WHERE discountsUpdateTime IS NULL", + ); + }); + static List getDatabaseMigrations() { return [ migration1To2, @@ -191,6 +224,7 @@ abstract class DatabaseMigration { migration4To5, migration5To6, migration6To7, + migration7To8, ]; } } diff --git a/lib/common/services/database/type_converter/type_converter.dart b/lib/common/services/database/type_converter/type_converter.dart index 30b45a4..f4196c9 100644 --- a/lib/common/services/database/type_converter/type_converter.dart +++ b/lib/common/services/database/type_converter/type_converter.dart @@ -17,19 +17,19 @@ class DateTimeConverter extends TypeConverter { } } -class DateTimeEmptyConverter extends TypeConverter { +class DateTimeEmptyConverter extends TypeConverter { @override - DateTime? decode(String databaseValue) { + DateTime? decode(String? databaseValue) { if (ObjectUtil.isEmpty(databaseValue)) { return null; } - return DateUtil.getDateTime(databaseValue); + return DateUtil.getDateTime(databaseValue!); } @override - String encode(DateTime? value) { + String? encode(DateTime? value) { if (ObjectUtil.isEmpty(value)) { - return ""; + return null; } return DateUtil.formatDate(value); } @@ -150,11 +150,11 @@ class ListIntConverter extends TypeConverter?, String> { } class ListDiscountsConverter - extends TypeConverter?, String> { + extends TypeConverter?, String?> { @override - List decode(String databaseValue) { - if (databaseValue.isEmpty) return []; - final raw = json.decode(databaseValue); + List decode(String? databaseValue) { + if (ObjectUtil.isEmpty(databaseValue)) return []; + final raw = json.decode(databaseValue!); if (raw is List) { return raw .map( @@ -168,8 +168,8 @@ class ListDiscountsConverter } @override - String encode(List? value) { - if (ObjectUtil.isEmptyList(value)) return '[]'; + String? encode(List? value) { + if (ObjectUtil.isEmptyList(value)) return null; return json.encode(value!.map((e) => e.toJson()).toList()); } } diff --git a/lib/common/utils/logger/logger_tool.dart b/lib/common/utils/logger/logger_tool.dart index 349261a..9716a52 100644 --- a/lib/common/utils/logger/logger_tool.dart +++ b/lib/common/utils/logger/logger_tool.dart @@ -8,6 +8,7 @@ import 'package:logger/logger.dart'; import 'package:pj_supermarket_cloud/common/index.dart'; final logger = Logger( + filter: AppLogFilter(), printer: customPrinter, output: ConsoleOutput(), ); @@ -20,6 +21,13 @@ final customPrinter = PrettyPrinter( printTime: true, ); +class AppLogFilter extends LogFilter { + @override + bool shouldLog(LogEvent event) { + return true; + } +} + class ConsoleOutput extends LogOutput { String? _filePath; IOSink? _sink; @@ -70,12 +78,12 @@ class ConsoleOutput extends LogOutput { for (final v in event.lines) { print(v); } - } else { - if (_filePath == null) return; - if (_sink == null) return; - if (Level.debug == event.level) return; - _sink?.writeAll(event.lines, '\n'); } + if (_filePath == null || _sink == null) return; + if (Level.debug == event.level) return; + _sink!.writeAll(event.lines, '\n'); + _sink!.writeln(); + unawaited(_sink!.flush()); } catch (e, stack) { print("写入日志错误error:|$e|stack:|$stack|"); } diff --git a/lib/pages/panel/controller.dart b/lib/pages/panel/controller.dart index e3d2e18..5129c2a 100644 --- a/lib/pages/panel/controller.dart +++ b/lib/pages/panel/controller.dart @@ -65,6 +65,7 @@ class PanelController extends GetxController { } }, ); + logger.i("菜单页面 Controller 初始化完成"); } @override