diff --git a/lib/app/core/bindings/initial_binding.dart b/lib/app/core/bindings/initial_binding.dart index e1046b2..c78874d 100644 --- a/lib/app/core/bindings/initial_binding.dart +++ b/lib/app/core/bindings/initial_binding.dart @@ -4,12 +4,10 @@ import 'package:problem_check_system/app/core/controllers/app_controller.dart'; import 'package:problem_check_system/app/core/services/database_service.dart'; import 'package:problem_check_system/app/core/services/network_status_service.dart'; import 'package:problem_check_system/app/core/services/http_provider.dart'; -import 'package:problem_check_system/app/core/services/sqlite_service.dart'; import 'package:problem_check_system/app/core/repositories/auth_repository.dart'; import 'package:problem_check_system/app/core/repositories/file_repository.dart'; import 'package:problem_check_system/app/core/repositories/image_repository.dart'; import 'package:problem_check_system/app/core/repositories/image_repository_impl.dart'; -import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart'; import 'package:problem_check_system/app/core/services/upgrader_service.dart'; import 'package:uuid/uuid.dart'; @@ -25,7 +23,6 @@ class InitialBinding implements Bindings { Get.put(GetStorage(), permanent: true); Get.put(Uuid(), permanent: true); Get.put(HttpProvider()); - Get.put(SQLiteService()); Get.put(DatabaseService()); Get.put(NetworkStatusService()); Get.put(UpgraderService()); @@ -45,14 +42,6 @@ class InitialBinding implements Bindings { networkStatusService: Get.find(), ), ); - Get.lazyPut( - () => ProblemRepository( - sqliteService: Get.find(), - httpProvider: Get.find(), - networkStatusService: Get.find(), - authRepository: Get.find(), - ), - ); } void _registerControllers() { diff --git a/lib/app/core/models/problem_sync_status.dart b/lib/app/core/models/problem_sync_status.dart index 920c887..0a0967f 100644 --- a/lib/app/core/models/problem_sync_status.dart +++ b/lib/app/core/models/problem_sync_status.dart @@ -1,6 +1,6 @@ import 'package:get/get.dart'; import 'package:problem_check_system/app/core/models/image_metadata_model.dart'; -import 'package:problem_check_system/app/core/models/problem_model.dart'; +import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart'; import 'package:problem_check_system/app/core/repositories/auth_repository.dart'; import 'package:uuid/uuid.dart'; diff --git a/lib/app/core/services/sqlite_service.dart b/lib/app/core/services/sqlite_service.dart deleted file mode 100644 index 4c164c9..0000000 --- a/lib/app/core/services/sqlite_service.dart +++ /dev/null @@ -1,254 +0,0 @@ -// sqlite_provider.dart - -import 'package:get/get.dart'; -import 'package:problem_check_system/app/core/models/problem_sync_status.dart'; -import 'package:problem_check_system/app/core/models/problem_model.dart'; -import 'package:sqflite/sqflite.dart'; -import 'package:path/path.dart'; - -/// `SQLiteService` 是一个 GetxService,负责管理本地 SQLite 数据库。 -/// 作为一个单例服务,它在整个应用生命周期中只会被创建一次。 -class SQLiteService extends GetxService { - static const String _dbName = 'problems.db'; - static const String _tableName = 'problems'; - static const int _dbVersion = 1; - - late Database _database; - - @override - void onInit() { - super.onInit(); - _initDatabase(); - } - - /// 异步初始化数据库连接 - Future _initDatabase() async { - try { - final databasePath = await getDatabasesPath(); - final path = join(databasePath, _dbName); - - _database = await openDatabase( - path, - version: _dbVersion, - onCreate: _onCreate, - onUpgrade: _onUpgrade, - ); - - Get.log('数据库初始化成功'); - } catch (e) { - Get.log('数据库初始化失败:$e', isError: true); - rethrow; - } - } - - /// 数据库创建时的回调函数 - Future _onCreate(Database db, int version) async { - await db.execute(''' - CREATE TABLE $_tableName( - id TEXT PRIMARY KEY, - description TEXT NOT NULL, - location TEXT NOT NULL, - imageUrls TEXT NOT NULL, - creationTime INTEGER NOT NULL, - creatorId TEXT NOT NULL, - lastModifiedTime INTEGER NOT NULL, - syncStatus INTEGER NOT NULL, - censorTaskId TEXT, - bindData TEXT, - isChecked INTEGER NOT NULL - ) - '''); - - Get.log('数据库表创建成功'); - } - - /// 数据库版本升级处理 - Future _onUpgrade(Database db, int oldVersion, int newVersion) async { - Get.log('正在将数据库从版本 $oldVersion 升级到 $newVersion...'); - - // 版本升级迁移逻辑 - for (int version = oldVersion + 1; version <= newVersion; version++) { - await _runMigration(db, version); - } - - Get.log('数据库升级完成'); - } - - /// 执行特定版本的数据库迁移 - Future _runMigration(Database db, int version) async { - switch (version) { - case 2: - // 版本2迁移逻辑 - // await db.execute('ALTER TABLE $_tableName ADD COLUMN newColumn TEXT;'); - break; - // 添加更多版本迁移逻辑 - default: - Get.log('没有找到版本 $version 的迁移脚本'); - } - } - - /// 插入问题记录,并设置同步状态为未同步 - Future insertProblem(Problem problem) async { - try { - final result = await _database.insert( - _tableName, - problem.toMap(), - conflictAlgorithm: ConflictAlgorithm.replace, - ); - - Get.log('问题记录插入成功,ID: ${problem.id}'); - return result; - } catch (e) { - Get.log('插入问题失败(ID: ${problem.id}):$e', isError: true); - throw Exception(''); - } - } - - /// 从数据库物理删除问题记录 - Future deleteProblem(String problemId) async { - try { - final result = await _database.delete( - _tableName, - where: 'id = ?', - whereArgs: [problemId], - ); - - if (result > 0) { - Get.log('问题删除成功,ID: $problemId'); - } else { - Get.log('未找到要删除的问题,ID: $problemId'); - } - - return result; - } catch (e) { - Get.log('删除问题失败(ID: $problemId):$e', isError: true); - return 0; - } - } - - /// 更新问题记录,并设置同步状态为未同步 - Future updateProblem(Problem problem) async { - try { - final result = await _database.update( - _tableName, - problem.toMap(), - where: 'id = ?', - whereArgs: [problem.id], - ); - - if (result > 0) { - Get.log('问题更新成功,ID: ${problem.id}'); - } - - return result; - } catch (e) { - Get.log('更新问题失败(ID: ${problem.id}):$e', isError: true); - return 0; - } - } - - /// 标记问题为已同步(在同步成功后调用) - Future markAsSynced(String id) async { - try { - final result = await _database.update( - _tableName, - {'syncStatus': ProblemSyncStatus.synced.index}, - where: 'id = ?', - whereArgs: [id], - ); - - if (result > 0) { - Get.log('问题标记为已同步,ID: $id'); - } - - return result; - } catch (e) { - Get.log('标记同步状态失败(ID: $id):$e', isError: true); - return 0; - } - } - - /// 根据ID获取问题记录 - Future getProblemById(String id) async { - try { - final results = await _database.query( - _tableName, - where: 'id = ?', - whereArgs: [id], - limit: 1, - ); - - return results.isNotEmpty ? Problem.fromMap(results.first) : null; - } catch (e) { - Get.log('获取问题失败(ID: $id):$e', isError: true); - return null; - } - } - - /// 获取问题列表(支持多种筛选条件) - Future> getProblems({ - DateTime? startDate, - DateTime? endDate, - String? syncStatus, - String? bindStatus, - }) async { - try { - final whereClauses = []; - final whereArgs = []; - - // 时间范围筛选 - if (startDate != null) { - whereClauses.add('creationTime >= ?'); - whereArgs.add(startDate.millisecondsSinceEpoch); - } - - if (endDate != null) { - whereClauses.add('creationTime <= ?'); - whereArgs.add(endDate.millisecondsSinceEpoch); - } - - // 同步状态筛选 - if (syncStatus != null && syncStatus != '全部') { - if (syncStatus == '未上传') { - whereClauses.add('syncStatus IN (?, ?, ?)'); - whereArgs.addAll([ - ProblemSyncStatus.pendingCreate.index, - ProblemSyncStatus.pendingUpdate.index, - ProblemSyncStatus.pendingDelete.index, - ]); - } else { - whereClauses.add('syncStatus = ?'); - whereArgs.add(ProblemSyncStatus.synced.index); - } - } - - // 绑定状态筛选 - if (bindStatus != null && bindStatus != '全部') { - if (bindStatus == '已绑定') { - whereClauses.add('bindData IS NOT NULL AND bindData != ""'); - } else { - whereClauses.add('(bindData IS NULL OR bindData = "")'); - } - } - - final results = await _database.query( - _tableName, - where: whereClauses.isNotEmpty ? whereClauses.join(' AND ') : null, - whereArgs: whereArgs.isEmpty ? null : whereArgs, - orderBy: 'creationTime DESC', - ); - - return results.map((json) => Problem.fromMap(json)).toList(); - } catch (e) { - Get.log('获取问题列表失败:$e', isError: true); - return []; - } - } - - @override - void onClose() { - _database.close(); - Get.log('数据库连接已关闭'); - super.onClose(); - } -} diff --git a/lib/app/features/navigation/presentation/controllers/navigation_controller.dart b/lib/app/features/navigation/presentation/controllers/navigation_controller.dart index 2efd41a..9a7fddc 100644 --- a/lib/app/features/navigation/presentation/controllers/navigation_controller.dart +++ b/lib/app/features/navigation/presentation/controllers/navigation_controller.dart @@ -106,15 +106,16 @@ class NavigationController extends GetxController { if (result == true) { enterpriseListController.search(); } - break; case 2: // 问题列表页面 Get.log("当前在问题页面,准备跳转到问题上传页..."); Get.toNamed(AppRoutes.problemUpload); break; default: - // 在其他页面(如首页、我的)点击时,可以不响应或给一个提示 - Get.snackbar("提示", "当前页面没有可上传的内容", snackPosition: SnackPosition.BOTTOM); + final result = await Get.toNamed(AppRoutes.enterpriseUpload); + if (result == true) { + enterpriseListController.search(); + } break; } } diff --git a/lib/app/features/problem/data/datasources/problem_local_datasource.dart b/lib/app/features/problem/data/datasources/problem_local_datasource.dart index 21f0cfa..4edef34 100644 --- a/lib/app/features/problem/data/datasources/problem_local_datasource.dart +++ b/lib/app/features/problem/data/datasources/problem_local_datasource.dart @@ -1,4 +1,4 @@ -import 'package:problem_check_system/app/core/models/problem_model.dart'; +import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart'; import 'package:problem_check_system/app/core/models/problem_sync_status.dart'; import 'package:problem_check_system/app/core/services/database_service.dart'; import 'package:sqflite/sqflite.dart'; @@ -14,8 +14,8 @@ abstract class ProblemLocalDataSource { Future> getProblems({ DateTime? startDate, DateTime? endDate, - List? syncStatuses, - bool? hasBindData, + String? syncStatus, + String? bindStatus, }); } @@ -69,30 +69,42 @@ class ProblemLocalDataSourceImpl implements ProblemLocalDataSource { Future> getProblems({ DateTime? startDate, DateTime? endDate, - List? syncStatuses, - bool? hasBindData, + String? syncStatus, + String? bindStatus, }) async { final db = await _databaseService.database; final whereClauses = []; final whereArgs = []; + // 时间范围筛选 if (startDate != null) { whereClauses.add('creationTime >= ?'); whereArgs.add(startDate.millisecondsSinceEpoch); } + if (endDate != null) { whereClauses.add('creationTime <= ?'); whereArgs.add(endDate.millisecondsSinceEpoch); } - if (syncStatuses != null && syncStatuses.isNotEmpty) { - final statuses = syncStatuses.map((s) => s.index).toList(); - whereClauses.add( - 'syncStatus IN (${List.filled(statuses.length, '?').join(',')})', - ); - whereArgs.addAll(statuses); + + // 同步状态筛选 + if (syncStatus != null && syncStatus != '全部') { + if (syncStatus == '未上传') { + whereClauses.add('syncStatus IN (?, ?, ?)'); + whereArgs.addAll([ + ProblemSyncStatus.pendingCreate.index, + ProblemSyncStatus.pendingUpdate.index, + ProblemSyncStatus.pendingDelete.index, + ]); + } else { + whereClauses.add('syncStatus = ?'); + whereArgs.add(ProblemSyncStatus.synced.index); + } } - if (hasBindData != null) { - if (hasBindData) { + + // 绑定状态筛选 + if (bindStatus != null && bindStatus != '全部') { + if (bindStatus == '已绑定') { whereClauses.add('bindData IS NOT NULL AND bindData != ""'); } else { whereClauses.add('(bindData IS NULL OR bindData = "")'); @@ -105,6 +117,7 @@ class ProblemLocalDataSourceImpl implements ProblemLocalDataSource { whereArgs: whereArgs.isEmpty ? null : whereArgs, orderBy: 'creationTime DESC', ); + return results.map((json) => Problem.fromMap(json)).toList(); } } diff --git a/lib/app/core/models/problem_model.dart b/lib/app/features/problem/data/model/problem_model.dart similarity index 95% rename from lib/app/core/models/problem_model.dart rename to lib/app/features/problem/data/model/problem_model.dart index 026b08e..57c94ce 100644 --- a/lib/app/core/models/problem_model.dart +++ b/lib/app/features/problem/data/model/problem_model.dart @@ -9,6 +9,9 @@ class Problem { /// 问题的唯一标识符,可空。 final String id; + /// 企业id + final String? companyId; + /// 问题的详细描述。 final String description; @@ -51,11 +54,13 @@ class Problem { this.censorTaskId, this.bindData, this.isChecked = false, + this.companyId, }); /// copyWith 方法,用于创建对象的副本并修改指定字段 Problem copyWith({ String? id, + String? companyId, String? description, String? location, List? imageUrls, @@ -70,6 +75,7 @@ class Problem { }) { return Problem( id: id ?? this.id, + companyId: companyId ?? this.companyId, description: description ?? this.description, location: location ?? this.location, imageUrls: imageUrls ?? this.imageUrls, @@ -87,6 +93,7 @@ class Problem { Map toMap() { return { 'id': id, + 'companyId': companyId, 'description': description, 'location': location, 'imageUrls': json.encode(imageUrls.map((e) => e.toMap()).toList()), @@ -116,6 +123,7 @@ class Problem { return Problem( id: map['id'], + companyId: map['companyId'], description: map['description'], location: map['location'], imageUrls: imageUrlsList, diff --git a/lib/app/features/problem/data/repositories/problem_repository.dart b/lib/app/features/problem/data/repositories/problem_repository.dart index 10e3767..299edbb 100644 --- a/lib/app/features/problem/data/repositories/problem_repository.dart +++ b/lib/app/features/problem/data/repositories/problem_repository.dart @@ -2,17 +2,17 @@ import 'package:dio/dio.dart'; import 'package:get/get.dart' hide MultipartFile, FormData, Response; import 'package:problem_check_system/app/core/extensions/http_response_extension.dart'; import 'package:problem_check_system/app/core/utils/constants/api_endpoints.dart'; -import 'package:problem_check_system/app/core/models/problem_model.dart'; +import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart'; import 'package:problem_check_system/app/core/models/server_problem.dart'; import 'package:problem_check_system/app/core/services/network_status_service.dart'; import 'package:problem_check_system/app/core/services/http_provider.dart'; -import 'package:problem_check_system/app/core/services/sqlite_service.dart'; import 'package:problem_check_system/app/core/repositories/auth_repository.dart'; +import 'package:problem_check_system/app/features/problem/data/datasources/problem_local_datasource.dart'; /// 问题仓库,负责处理问题数据的本地持久化。 /// 它封装了底层数据库操作,为业务逻辑层提供一个简洁的接口。 class ProblemRepository extends GetxService { - final SQLiteService sqliteService; + final ProblemLocalDataSource problemLocalDataSource; final HttpProvider httpProvider; final NetworkStatusService networkStatusService; final AuthRepository authRepository; @@ -20,7 +20,7 @@ class ProblemRepository extends GetxService { RxBool get isOnline => networkStatusService.isOnline; ProblemRepository({ - required this.sqliteService, + required this.problemLocalDataSource, required this.httpProvider, required this.networkStatusService, required this.authRepository, @@ -28,7 +28,7 @@ class ProblemRepository extends GetxService { /// 更新本地数据库中的一个问题。 Future updateProblem(Problem problem) async { - await sqliteService.updateProblem(problem); + await problemLocalDataSource.updateProblem(problem); } /// 通用查询方法,根据可选的筛选条件获取问题列表。 @@ -41,7 +41,7 @@ class ProblemRepository extends GetxService { String? syncStatus, String? bindStatus, }) async { - return await sqliteService.getProblems( + return await problemLocalDataSource.getProblems( startDate: startDate, endDate: endDate, syncStatus: syncStatus, @@ -50,11 +50,11 @@ class ProblemRepository extends GetxService { } Future insertProblem(Problem problem) async { - await sqliteService.insertProblem(problem); + await problemLocalDataSource.insertProblem(problem); } Future deleteProblem(String problemId) async { - await sqliteService.deleteProblem(problemId); + await problemLocalDataSource.deleteProblem(problemId); } // 在ProblemRepository中添加 diff --git a/lib/app/features/problem/domain/repositoies/problem_repository.dart b/lib/app/features/problem/domain/repositoies/problem_repository.dart index 4cc94c3..fa4b59f 100644 --- a/lib/app/features/problem/domain/repositoies/problem_repository.dart +++ b/lib/app/features/problem/domain/repositoies/problem_repository.dart @@ -1,4 +1,4 @@ -import 'package:problem_check_system/app/core/models/problem_model.dart'; +import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart'; /// Problem 仓库的抽象接口 /// 定义了业务逻辑层需要的数据操作。 diff --git a/lib/app/features/problem/presentation/bindings/problem_binding.dart b/lib/app/features/problem/presentation/bindings/problem_binding.dart index 55d1f8d..6ef7436 100644 --- a/lib/app/features/problem/presentation/bindings/problem_binding.dart +++ b/lib/app/features/problem/presentation/bindings/problem_binding.dart @@ -1,11 +1,28 @@ import 'package:get/get.dart'; import 'package:problem_check_system/app/core/models/problem_sync_status.dart'; +import 'package:problem_check_system/app/core/services/database_service.dart'; +import 'package:problem_check_system/app/core/services/http_provider.dart'; +import 'package:problem_check_system/app/core/services/network_status_service.dart'; +import 'package:problem_check_system/app/features/problem/data/datasources/problem_local_datasource.dart'; import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart'; import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_controller.dart'; class ProblemBinding extends Bindings { @override void dependencies() { + Get.lazyPut( + () => ProblemLocalDataSourceImpl( + databaseService: Get.find(), + ), + ); + Get.lazyPut( + () => ProblemRepository( + problemLocalDataSource: Get.find(), + httpProvider: Get.find(), + networkStatusService: Get.find(), + authRepository: Get.find(), + ), + ); Get.put(ProblemStateManager(uuid: Get.find(), authRepository: Get.find())); /// 注册问题控制器 diff --git a/lib/app/features/problem/presentation/bindings/problem_form_binding.dart b/lib/app/features/problem/presentation/bindings/problem_form_binding.dart index b9baba8..2404e65 100644 --- a/lib/app/features/problem/presentation/bindings/problem_form_binding.dart +++ b/lib/app/features/problem/presentation/bindings/problem_form_binding.dart @@ -1,5 +1,5 @@ import 'package:get/get.dart'; -import 'package:problem_check_system/app/core/models/problem_model.dart'; +import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart'; import 'package:problem_check_system/app/core/models/problem_sync_status.dart'; import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_form_controller.dart'; diff --git a/lib/app/features/problem/presentation/controllers/problem_controller.dart b/lib/app/features/problem/presentation/controllers/problem_controller.dart index 565f003..ed53478 100644 --- a/lib/app/features/problem/presentation/controllers/problem_controller.dart +++ b/lib/app/features/problem/presentation/controllers/problem_controller.dart @@ -15,7 +15,7 @@ import 'package:problem_check_system/app/core/models/server_problem.dart'; import 'package:problem_check_system/app/core/repositories/file_repository.dart'; import 'package:problem_check_system/app/core/repositories/image_repository.dart'; import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart'; -import 'package:problem_check_system/app/core/models/problem_model.dart'; +import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart'; import 'package:problem_check_system/app/features/problem/presentation/controllers/sync_progress_state.dart'; import 'package:problem_check_system/app/features/problem/presentation/views/widgets/models/date_range_enum.dart'; import 'package:problem_check_system/app/features/problem/presentation/views/widgets/models/dropdown_option.dart'; @@ -499,6 +499,7 @@ class ProblemController extends GetxController // 错误时也确保关闭 Get.back(closeOverlays: true); + Get.log('错误: $e'); Get.snackbar('同步失败', '错误: $e', snackPosition: SnackPosition.TOP); } finally { isLoading.value = false; diff --git a/lib/app/features/problem/presentation/controllers/problem_form_controller.dart b/lib/app/features/problem/presentation/controllers/problem_form_controller.dart index 0fe2c18..b8559fa 100644 --- a/lib/app/features/problem/presentation/controllers/problem_form_controller.dart +++ b/lib/app/features/problem/presentation/controllers/problem_form_controller.dart @@ -9,7 +9,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:problem_check_system/app/core/models/image_status.dart'; import 'package:problem_check_system/app/core/models/image_metadata_model.dart'; import 'dart:io'; -import 'package:problem_check_system/app/core/models/problem_model.dart'; +import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart'; import 'package:problem_check_system/app/core/models/problem_sync_status.dart'; import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart'; import 'package:uuid/uuid.dart'; diff --git a/lib/app/features/problem/presentation/views/widgets/problem_card.dart b/lib/app/features/problem/presentation/views/widgets/problem_card.dart index 6a0a4e8..3d54ef0 100644 --- a/lib/app/features/problem/presentation/views/widgets/problem_card.dart +++ b/lib/app/features/problem/presentation/views/widgets/problem_card.dart @@ -4,7 +4,7 @@ import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:problem_check_system/app/core/routes/app_routes.dart'; import 'package:problem_check_system/app/core/models/problem_sync_status.dart'; -import 'package:problem_check_system/app/core/models/problem_model.dart'; +import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart'; import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_controller.dart'; import 'package:problem_check_system/app/features/problem/presentation/views/widgets/custom_button.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; diff --git a/lib/app/features/problem/presentation/views/widgets/problem_list_page.dart b/lib/app/features/problem/presentation/views/widgets/problem_list_page.dart index fb797f9..81b20b8 100644 --- a/lib/app/features/problem/presentation/views/widgets/problem_list_page.dart +++ b/lib/app/features/problem/presentation/views/widgets/problem_list_page.dart @@ -4,7 +4,7 @@ import 'package:get/get.dart'; import 'package:easy_refresh/easy_refresh.dart'; import 'package:problem_check_system/app/core/models/problem_sync_status.dart'; import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_controller.dart'; -import 'package:problem_check_system/app/core/models/problem_model.dart'; +import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart'; import 'package:problem_check_system/app/features/problem/presentation/views/widgets/problem_card.dart'; class ProblemListPage extends GetView {