Browse Source

feat : 更新企业信息

dev
徐振升 2 weeks ago
parent
commit
517488e1fd
  1. 8
      .vscode/settings.json
  2. 21
      lib/app/core/extensions/datetime_extension.dart
  3. 11
      lib/app/core/services/database_service.dart
  4. 132
      lib/app/features/enterprise/data/datasources/enterprise_local_data_source.dart
  5. 24
      lib/app/features/enterprise/data/model/enterprise_list_item_model.dart
  6. 47
      lib/app/features/enterprise/data/repositories_impl/enterprise_repository_impl.dart
  7. 29
      lib/app/features/enterprise/domain/entities/enterprise.dart
  8. 24
      lib/app/features/enterprise/domain/entities/enterprise_list_item.dart
  9. 16
      lib/app/features/enterprise/domain/repositories/enterprise_repository.dart
  10. 12
      lib/app/features/enterprise/domain/usecases/add_enterprise.dart
  11. 36
      lib/app/features/enterprise/domain/usecases/add_enterprise_usecase.dart
  12. 0
      lib/app/features/enterprise/domain/usecases/editor_enterprise.dart
  13. 26
      lib/app/features/enterprise/domain/usecases/editor_enterprise_usecase.dart
  14. 22
      lib/app/features/enterprise/domain/usecases/get_enterprise_list_usecase.dart
  15. 24
      lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart
  16. 113
      lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart
  17. 80
      lib/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart
  18. 164
      lib/app/features/enterprise/presentation/pages/enterprise_form_page.dart
  19. 237
      lib/app/features/enterprise/presentation/pages/enterprise_list_page.dart
  20. 25
      lib/app/features/enterprise/presentation/widgets/enterprise_card.dart
  21. 3
      lib/app/features/home/bindings/home_binding.dart
  22. 28
      lib/app/features/navigation/presentation/bindings/navigation_binding.dart
  23. 1
      lib/app/features/navigation/presentation/pages/navigation_page.dart

8
.vscode/settings.json vendored

@ -1,3 +1,9 @@
{ {
"cSpell.words": ["fenix", "Getx", "tdesign"] "cSpell.words": [
"fenix",
"Getx",
"tdesign",
"usecase",
"usecases"
]
} }

21
lib/app/core/extensions/datetime_extension.dart

@ -0,0 +1,21 @@
// lib/app/core/extensions/datetime_extension.dart
import 'package:intl/intl.dart';
extension DateTimeFormatting on DateTime {
/// 'yyyy-MM-dd HH:mm:ss'
String toDateTimeString() {
return DateFormat('yyyy-MM-dd HH:mm:ss').format(this);
}
/// 'yyyy-MM-dd'
String toDateString() {
return DateFormat('yyyy-MM-dd').format(this);
}
/// 'HH:mm:ss'
String toTimeString() {
return DateFormat('HH:mm:ss').format(this);
}
//
}

11
lib/app/core/services/database_service.dart

@ -6,6 +6,7 @@ import 'package:path/path.dart';
const String _createProblemsTable = ''' const String _createProblemsTable = '''
CREATE TABLE problems( CREATE TABLE problems(
id TEXT PRIMARY KEY, id TEXT PRIMARY KEY,
enterpriseId TEXT NOT NULL,
description TEXT NOT NULL, description TEXT NOT NULL,
location TEXT NOT NULL, location TEXT NOT NULL,
imageUrls TEXT NOT NULL, imageUrls TEXT NOT NULL,
@ -39,7 +40,7 @@ const String _createEnterprisesTable = '''
/// ///
/// ///
class DatabaseService extends GetxService { class DatabaseService extends GetxService {
static const String _dbName = 'problems.db'; static const String _dbName = 'database.db';
static const int _dbVersion = 1; static const int _dbVersion = 1;
Database? _database; Database? _database;
@ -88,6 +89,14 @@ class DatabaseService extends GetxService {
Future<void> _onUpgrade(Database db, int oldVersion, int newVersion) async { Future<void> _onUpgrade(Database db, int oldVersion, int newVersion) async {
Get.log('正在将数据库从版本 $oldVersion 升级到 $newVersion...'); Get.log('正在将数据库从版本 $oldVersion 升级到 $newVersion...');
// //
if (oldVersion < 2) {
// 1 2
// problems enterpriseId
await db.execute('''
ALTER TABLE problems ADD COLUMN enterpriseId TEXT
''');
Get.log('`problems` 表已成功添加 `enterpriseId` 字段');
}
} }
@override @override

132
lib/app/features/enterprise/data/datasources/enterprise_local_data_source.dart

@ -1,20 +1,136 @@
import 'package:problem_check_system/app/core/models/sync_status.dart';
import 'package:problem_check_system/app/core/services/database_service.dart';
import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_list_item_model.dart';
import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart'; import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart';
import 'package:sqflite/sqflite.dart'; import 'package:sqflite/sqflite.dart';
abstract class EnterpriseLocalDataSource { abstract class EnterpriseLocalDataSource {
///
Future<void> addEnterprise(EnterpriseModel enterprise); Future<void> addEnterprise(EnterpriseModel enterprise);
Future<void> updateEnterprise(EnterpriseModel enterprise);
Future<List<EnterpriseListItemModel>> getEnterpriseListItems({
String? name,
String? type,
DateTime? startDate,
DateTime? endDate,
});
///
} }
class EnterpriseLocalDataSourceImpl implements EnterpriseLocalDataSource { class EnterpriseLocalDataSourceImpl implements EnterpriseLocalDataSource {
final DatabaseService _databaseService;
const EnterpriseLocalDataSourceImpl({
required DatabaseService databaseService,
}) : _databaseService = databaseService;
@override @override
Future<void> addEnterprise(EnterpriseModel enterprise) async { Future<void> addEnterprise(EnterpriseModel enterprise) async {
// // Enterprise final db = await _databaseService.database;
// // 使 SQLiteSharedPreferences await db.insert(
// final db = await databaseService.database; "enterprises",
// await db.insert( enterprise.toMap(),
// 'enterprises', // // conflictAlgorithm (id)
// enterprise.toMap(), // ConflictAlgorithm.replace ID
// conflictAlgorithm: ConflictAlgorithm.replace, //
// ); conflictAlgorithm: ConflictAlgorithm.replace,
);
}
@override
Future<void> updateEnterprise(EnterpriseModel enterprise) async {
final db = await _databaseService.database;
await db.update(
'enterprises',
enterprise.toMap(),
where: 'id = ?', // ID
whereArgs: [enterprise.id],
);
}
@override
Future<List<EnterpriseListItemModel>> getEnterpriseListItems({
String? name,
String? type,
DateTime? startDate,
DateTime? endDate,
}) async {
final db = await _databaseService.database;
// pendingCreate 0
final int pendingCreateIndex = SyncStatus.pendingCreate.index;
// WHERE
final List<String> whereClauses = [];
final List<dynamic> whereArgs = [];
// 1. ()
if (name != null && name.isNotEmpty) {
whereClauses.add('e.name LIKE ?');
whereArgs.add('%$name%');
}
// 2. ()
if (type != null && type.isNotEmpty) {
whereClauses.add('e.type = ?');
whereArgs.add(type);
}
// 3.
if (startDate != null) {
whereClauses.add('e.creationTime >= ?');
whereArgs.add(startDate.millisecondsSinceEpoch);
}
// 4. []
if (endDate != null) {
// endDate
final endOfDay = DateTime(
endDate.year,
endDate.month,
endDate.day,
23,
59,
59,
);
whereClauses.add('e.creationTime <= ?');
whereArgs.add(endOfDay.millisecondsSinceEpoch);
}
// --- ---
// WHERE
final String whereString = whereClauses.isNotEmpty
? 'WHERE ${whereClauses.join(' AND ')}'
: '';
// SQL
final String sql =
'''
SELECT
e.*,
COUNT(p.id) AS totalProblems,
COUNT(CASE WHEN p.syncStatus != $pendingCreateIndex THEN 1 ELSE NULL END) AS uploadedProblems,
COUNT(CASE WHEN p.syncStatus == $pendingCreateIndex THEN 1 ELSE NULL END) AS pendingProblems
FROM
enterprises e
LEFT JOIN
problems p ON e.id = p.enterpriseId
$whereString
GROUP BY
e.id
ORDER BY
e.creationTime DESC
''';
//
// Get.log('查询 SQL: $sql');
// Get.log('参数: $whereArgs');
final List<Map<String, dynamic>> maps = await db.rawQuery(sql, whereArgs);
return List.generate(maps.length, (i) {
return EnterpriseListItemModel.fromMap(maps[i]);
});
} }
} }

24
lib/app/features/enterprise/data/model/enterprise_list_item_model.dart

@ -0,0 +1,24 @@
import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise_list_item.dart';
class EnterpriseListItemModel extends EnterpriseListItem {
const EnterpriseListItemModel({
required super.enterprise,
required super.totalProblems,
required super.uploadedProblems,
required super.pendingProblems,
});
/// Map
/// map JOIN COUNT
factory EnterpriseListItemModel.fromMap(Map<String, dynamic> map) {
return EnterpriseListItemModel(
// EnterpriseModel fromMap
enterprise: EnterpriseModel.fromMap(map),
// map
totalProblems: map['totalProblems'] ?? 0,
uploadedProblems: map['uploadedProblems'] ?? 0,
pendingProblems: map['pendingProblems'] ?? 0,
);
}
}

47
lib/app/features/enterprise/data/repositories_impl/enterprise_repository_impl.dart

@ -1,10 +1,8 @@
// ...
import 'package:problem_check_system/app/core/models/sync_status.dart';
import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_local_data_source.dart'; import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_local_data_source.dart';
import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_remote_data_source.dart'; import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_remote_data_source.dart';
import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart'; import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart'; import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise_list_item.dart';
import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart'; import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
@ -20,23 +18,8 @@ class EnterpriseRepositoryImpl implements EnterpriseRepository {
@override @override
Future<void> addEnterprise(Enterprise enterprise) async { Future<void> addEnterprise(Enterprise enterprise) async {
final now = DateTime.now(); final enterpriseModel = EnterpriseModel.fromEntity(enterprise);
// 1.
final fullEnterprise = Enterprise(
id: uuid.v4(), // ID
name: enterprise.name,
type: enterprise.type,
// ... ...
syncStatus: SyncStatus.pendingCreate, //
lastModifiedTime: now,
creationTime: now,
);
// 2.
final enterpriseModel = EnterpriseModel.fromEntity(fullEnterprise);
// 3.
await localDataSource.addEnterprise(enterpriseModel); await localDataSource.addEnterprise(enterpriseModel);
} }
@ -63,4 +46,30 @@ class EnterpriseRepositoryImpl implements EnterpriseRepository {
// TODO: implement syncUpdate // TODO: implement syncUpdate
throw UnimplementedError(); throw UnimplementedError();
} }
@override
Future<List<EnterpriseListItem>> getEnterpriseListItems({
String? name,
String? type,
DateTime? startDate,
DateTime? endDate,
}) async {
// DataSource
final models = await localDataSource.getEnterpriseListItems(
name: name,
type: type,
startDate: startDate,
endDate: endDate,
);
// EnterpriseListItemModel EnterpriseListItem
return models;
}
@override
Future<void> updateEnterprise(Enterprise enterprise) async {
//
final enterpriseModel = EnterpriseModel.fromEntity(enterprise);
//
await localDataSource.updateEnterprise(enterpriseModel);
}
} }

29
lib/app/features/enterprise/domain/entities/enterprise.dart

@ -33,6 +33,35 @@ class Enterprise extends Equatable implements SyncableEntity {
required this.syncStatus, required this.syncStatus,
}); });
Enterprise copyWith({
String? id,
SyncStatus? syncStatus,
DateTime? lastModifiedTime,
String? name,
String? type,
String? address,
String? scale,
String? contactPerson,
String? contactPhone,
String? majorHazardsDescription,
DateTime? creationTime,
}) {
return Enterprise(
id: id ?? this.id,
syncStatus: syncStatus ?? this.syncStatus,
lastModifiedTime: lastModifiedTime ?? this.lastModifiedTime,
name: name ?? this.name,
type: type ?? this.type,
address: address ?? this.address,
scale: scale ?? this.scale,
contactPerson: contactPerson ?? this.contactPerson,
contactPhone: contactPhone ?? this.contactPhone,
majorHazardsDescription:
majorHazardsDescription ?? this.majorHazardsDescription,
creationTime: creationTime ?? this.creationTime,
);
}
@override @override
List<Object?> get props => [id, syncStatus, name, type]; List<Object?> get props => [id, syncStatus, name, type];
} }

24
lib/app/features/enterprise/domain/entities/enterprise_list_item.dart

@ -0,0 +1,24 @@
import 'package:equatable/equatable.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
class EnterpriseListItem extends Equatable {
final Enterprise enterprise;
final int totalProblems;
final int uploadedProblems;
final int pendingProblems;
const EnterpriseListItem({
required this.enterprise,
required this.totalProblems,
required this.uploadedProblems,
required this.pendingProblems,
});
@override
List<Object?> get props => [
enterprise,
totalProblems,
uploadedProblems,
pendingProblems,
];
}

16
lib/app/features/enterprise/domain/repositories/enterprise_repository.dart

@ -1,12 +1,20 @@
import 'package:problem_check_system/app/core/repositories/syncable_repository.dart'; import 'package:problem_check_system/app/core/repositories/syncable_repository.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise_list_item.dart';
import '../entities/enterprise.dart'; import '../entities/enterprise.dart';
abstract class EnterpriseRepository implements SyncableRepository<Enterprise> { abstract class EnterpriseRepository implements SyncableRepository<Enterprise> {
/// ///
/// ID生成
Future<void> addEnterprise(Enterprise enterprise); Future<void> addEnterprise(Enterprise enterprise);
// --- --- ///
// Future<List<EnterpriseListItem>> getEnterpriseListItems(); Future<void> updateEnterprise(Enterprise enterprise);
///
Future<List<EnterpriseListItem>> getEnterpriseListItems({
String? name,
String? type,
DateTime? startDate,
DateTime? endDate,
});
} }

12
lib/app/features/enterprise/domain/usecases/add_enterprise.dart

@ -1,12 +0,0 @@
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart';
class AddEnterprise {
final EnterpriseRepository repository;
AddEnterprise({required this.repository});
Future<void> call(Enterprise enterprise) async {
await repository.addEnterprise(enterprise);
}
}

36
lib/app/features/enterprise/domain/usecases/add_enterprise_usecase.dart

@ -0,0 +1,36 @@
import 'package:problem_check_system/app/core/models/sync_status.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart';
import 'package:uuid/uuid.dart';
class AddEnterpriseUsecase {
final EnterpriseRepository repository;
final Uuid uuid;
AddEnterpriseUsecase({required this.repository, required this.uuid});
Future<void> call({
required String name,
required String type,
String address = "",
String scale = "",
String contactPerson = "",
String contactPhone = "",
String majorHazardsDescription = "",
}) async {
final enterprise = Enterprise(
id: uuid.v4(),
name: name,
type: type,
address: address,
scale: scale,
contactPerson: contactPerson,
contactPhone: contactPhone,
majorHazardsDescription: majorHazardsDescription,
lastModifiedTime: DateTime.now(),
creationTime: DateTime.now(),
syncStatus: SyncStatus.pendingCreate,
);
await repository.addEnterprise(enterprise);
}
}

0
lib/app/features/enterprise/domain/usecases/editor_enterprise.dart

26
lib/app/features/enterprise/domain/usecases/editor_enterprise_usecase.dart

@ -0,0 +1,26 @@
import 'package:problem_check_system/app/core/models/sync_status.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart';
class EditEnterpriseUsecase {
final EnterpriseRepository repository;
EditEnterpriseUsecase({required this.repository});
/// [] Usecase
/// Enterprise
Future<void> call(Enterprise updatedEnterprise) async {
// 1.
final enterpriseToSave = updatedEnterprise.copyWith(
lastModifiedTime: DateTime.now(),
// 2.
//
syncStatus: updatedEnterprise.syncStatus == SyncStatus.pendingCreate
? SyncStatus.pendingCreate
: SyncStatus.pendingUpdate,
);
// 3.
await repository.updateEnterprise(enterpriseToSave);
}
}

22
lib/app/features/enterprise/domain/usecases/get_enterprise_list_usecase.dart

@ -0,0 +1,22 @@
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise_list_item.dart';
import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart';
class GetEnterpriseListUsecase {
final EnterpriseRepository repository;
const GetEnterpriseListUsecase({required this.repository});
Future<List<EnterpriseListItem>> call({
String? name,
String? type,
DateTime? startDate,
DateTime? endDate,
}) async {
return await repository.getEnterpriseListItems(
name: name,
type: type,
startDate: startDate,
endDate: endDate,
);
}
}

24
lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart

@ -1,13 +1,16 @@
// lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart // lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:problem_check_system/app/core/services/database_service.dart';
import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_local_data_source.dart'; import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_local_data_source.dart';
import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_remote_data_source.dart'; import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_remote_data_source.dart';
import 'package:problem_check_system/app/features/enterprise/data/repositories_impl/enterprise_repository_impl.dart'; import 'package:problem_check_system/app/features/enterprise/data/repositories_impl/enterprise_repository_impl.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart'; import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart'; import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart';
import 'package:problem_check_system/app/features/enterprise/domain/usecases/add_enterprise.dart'; import 'package:problem_check_system/app/features/enterprise/domain/usecases/add_enterprise_usecase.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart'; // import 'package:problem_check_system/app/features/enterprise/domain/usecases/editor_enterprise_usecase.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart';
import 'package:uuid/uuid.dart'; //
class EnterpriseFormBinding extends Bindings { class EnterpriseFormBinding extends Bindings {
@override @override
@ -19,7 +22,9 @@ class EnterpriseFormBinding extends Bindings {
final Enterprise? enterpriseToEdit = Get.arguments as Enterprise?; final Enterprise? enterpriseToEdit = Get.arguments as Enterprise?;
Get.lazyPut<EnterpriseLocalDataSource>( Get.lazyPut<EnterpriseLocalDataSource>(
() => EnterpriseLocalDataSourceImpl(), () => EnterpriseLocalDataSourceImpl(
databaseService: Get.find<DatabaseService>(),
),
); );
Get.lazyPut<EnterpriseRemoteDataSource>( Get.lazyPut<EnterpriseRemoteDataSource>(
() => EnterpriseRemoteDataSourceImpl(), () => EnterpriseRemoteDataSourceImpl(),
@ -30,15 +35,22 @@ class EnterpriseFormBinding extends Bindings {
remoteDataSource: Get.find<EnterpriseRemoteDataSource>(), remoteDataSource: Get.find<EnterpriseRemoteDataSource>(),
)), )),
); );
Get.lazyPut<AddEnterprise>( Get.lazyPut<AddEnterpriseUsecase>(
() => AddEnterprise(repository: Get.find<EnterpriseRepository>()), () => AddEnterpriseUsecase(
repository: Get.find<EnterpriseRepository>(),
uuid: Get.find<Uuid>(),
),
);
Get.lazyPut<EditEnterpriseUsecase>(
() => EditEnterpriseUsecase(repository: Get.find<EnterpriseRepository>()),
); );
// 2. null Controller // 2. null Controller
Get.lazyPut<EnterpriseFormController>( Get.lazyPut<EnterpriseFormController>(
() => EnterpriseFormController( () => EnterpriseFormController(
initialData: enterpriseToEdit, initialData: enterpriseToEdit,
usecase: Get.find(), addEnterpriseUsecase: Get.find<AddEnterpriseUsecase>(),
editEnterpriseUsecase: Get.find<EditEnterpriseUsecase>(),
), ),
); );
} }

113
lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart

@ -1,19 +1,25 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:problem_check_system/app/core/models/company_enum.dart'; import 'package:problem_check_system/app/core/models/company_enum.dart';
import 'package:problem_check_system/app/core/models/sync_status.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart'; import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
import 'package:problem_check_system/app/features/enterprise/domain/usecases/add_enterprise.dart'; import 'package:problem_check_system/app/features/enterprise/domain/usecases/add_enterprise_usecase.dart';
import 'package:uuid/uuid.dart'; import 'package:problem_check_system/app/features/enterprise/domain/usecases/editor_enterprise_usecase.dart';
class EnterpriseFormController extends GetxController { class EnterpriseFormController extends GetxController {
// //
final Enterprise? initialData; final Enterprise? initialData;
final AddEnterprise usecase; final AddEnterpriseUsecase addEnterpriseUsecase;
final EditEnterpriseUsecase editEnterpriseUsecase;
final formKey = GlobalKey<FormState>();
EnterpriseFormController({this.initialData, required this.usecase}); EnterpriseFormController({
this.initialData,
required this.addEnterpriseUsecase,
required this.editEnterpriseUsecase,
});
// --- --- // --- ---
var isSubmitting = false.obs;
var isEditMode = false.obs; var isEditMode = false.obs;
var pageTitle = '新增企业'.obs; var pageTitle = '新增企业'.obs;
final Rx<CompanyType?> selectedType = Rx<CompanyType?>(null); final Rx<CompanyType?> selectedType = Rx<CompanyType?>(null);
@ -39,7 +45,16 @@ class EnterpriseFormController extends GetxController {
pageTitle.value = '修改信息'; pageTitle.value = '修改信息';
// //
enterpriseNameController.text = initialData!.name; enterpriseNameController.text = initialData!.name;
// ... enterpriseAddressController.text = initialData!.address ?? '';
contactPersonController.text = initialData!.contactPerson ?? '';
contactPhoneController.text = initialData!.contactPhone ?? '';
hazardSourceController.text = initialData!.majorHazardsDescription ?? '';
selectedType.value = CompanyType.values.firstWhereOrNull(
(e) => e.displayText == initialData!.type,
);
selectedScope.value = CompanyScope.values.firstWhereOrNull(
(e) => e.displayText == initialData!.scale,
);
} else { } else {
isEditMode.value = false; isEditMode.value = false;
pageTitle.value = '新增企业'; pageTitle.value = '新增企业';
@ -49,36 +64,74 @@ class EnterpriseFormController extends GetxController {
// //
void submitForm() { void submitForm() {
if (isEditMode.value) { if (formKey.currentState?.validate() ?? false) {
_updateEnterprise(); if (isEditMode.value) {
} else { _updateEnterprise();
_createEnterprise(); } else {
_createEnterprise();
}
} }
} }
void _createEnterprise() async { void _createEnterprise() async {
final enterprise = Enterprise( try {
id: Uuid().v4(), isSubmitting.value = true; //
name: enterpriseNameController.text, await addEnterpriseUsecase(
type: selectedType.value!.displayText, name: enterpriseNameController.text,
address: enterpriseAddressController.text, type: selectedType.value!.displayText,
scale: selectedScope.value!.displayText, address: enterpriseAddressController.text,
contactPerson: contactPersonController.text, scale: selectedScope.value == null
contactPhone: contactPhoneController.text, ? ""
majorHazardsDescription: hazardSourceController.text, : selectedScope.value!.displayText,
lastModifiedTime: DateTime.now(), contactPerson: contactPersonController.text,
creationTime: DateTime.now(), contactPhone: contactPhoneController.text,
syncStatus: SyncStatus.pendingCreate, majorHazardsDescription: hazardSourceController.text,
); );
await usecase.call(enterprise); Get.back(result: true); //
Get.back(result: true); // // []
Get.snackbar('成功', '企业信息已保存');
} catch (e) {
// []
Get.snackbar('错误', '保存失败,请稍后重试');
} finally {
isSubmitting.value = false; //
}
} }
void _updateEnterprise() { void _updateEnterprise() async {
print('执行修改逻辑, ID: ${initialData!.id}'); // initialData null
// API if (initialData == null) return;
// Get.find<ApiService>().updateEnterprise(initialData!.id, ...);
Get.back(result: true); // try {
// 1. UI ()
isSubmitting.value = true;
// 2. UI
// 使 Usecase copyWith 便
// id, creationTime
final updatedEnterprise = initialData!.copyWith(
name: enterpriseNameController.text,
type: selectedType.value!.displayText,
address: enterpriseAddressController.text,
scale: selectedScope.value?.displayText,
contactPerson: contactPersonController.text,
contactPhone: contactPhoneController.text,
majorHazardsDescription: hazardSourceController.text,
);
// 3. EditEnterpriseUsecase
await editEnterpriseUsecase(updatedEnterprise);
// 4.
Get.back(result: true);
Get.snackbar('成功', '企业信息已更新');
} catch (e) {
// 5.
Get.snackbar('错误', '更新失败,请稍后重试');
} finally {
// 6. UI
isSubmitting.value = false;
}
} }
@override @override

80
lib/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart

@ -1,14 +1,27 @@
// lib/app/modules/enterprise_list/enterprise_list_controller.dart // lib/app/modules/enterprise_list/enterprise_list_controller.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:problem_check_system/app/core/models/sync_status.dart'; import 'package:problem_check_system/app/core/models/company_enum.dart';
import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart';
import 'package:problem_check_system/app/core/routes/app_routes.dart'; import 'package:problem_check_system/app/core/routes/app_routes.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart'; import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise_list_item.dart';
import 'package:problem_check_system/app/features/enterprise/domain/usecases/get_enterprise_list_usecase.dart';
class EnterpriseListController extends GetxController { class EnterpriseListController extends GetxController {
// 使 .obs 使UI会自动更新 // --- ---
final enterpriseList = <Enterprise>[].obs; var isLoading = false.obs;
var enterpriseList = <EnterpriseListItem>[].obs;
// --- ---
final nameController = TextEditingController();
final Rx<CompanyType?> selectedType = Rx<CompanyType?>(null);
final Rx<DateTime?> startDate = Rx<DateTime?>(null);
final Rx<DateTime?> endDate = Rx<DateTime?>(null);
final GetEnterpriseListUsecase getEnterpriseListUsecase;
EnterpriseListController({required this.getEnterpriseListUsecase});
@override @override
void onInit() { void onInit() {
@ -16,35 +29,46 @@ class EnterpriseListController extends GetxController {
fetchEnterprises(); // fetchEnterprises(); //
} }
///
Future<void> fetchEnterprises() async {
try {
isLoading.value = true;
final result = await getEnterpriseListUsecase.call(
name: nameController.text,
type: selectedType.value?.displayText,
startDate: startDate.value,
endDate: endDate.value,
);
enterpriseList.assignAll(result);
} catch (e) {
Get.snackbar('错误', '加载企业列表失败: $e');
} finally {
isLoading.value = false;
}
}
/// UI
void search() {
fetchEnterprises();
}
void refreshList() { void refreshList() {
fetchEnterprises(); // fetchEnterprises();
} }
// API获取数据的过程 ///
void fetchEnterprises() { void clearFilters() {
// nameController.clear();
Future.delayed(const Duration(milliseconds: 500), () { selectedType.value = null;
// // startDate.value = null;
// var mockData = [ endDate.value = null;
// Enterprise( fetchEnterprises();
// id: "1",
// name: '企业A',
// type: '类型1',
// address: '地址A',
// contactPerson: '联系人A',
// contactPhone: '123456',
// lastModifiedTime: DateTime.now(),
// creationTime: DateTime.now(),
// syncStatus: SyncStatus.synced,
// ),
// ];
// enterpriseList.assignAll(mockData); //
});
} }
// @override
void onSearch() { void onClose() {
// nameController.dispose();
super.onClose();
} }
/// ///

164
lib/app/features/enterprise/presentation/pages/enterprise_form_page.dart

@ -15,62 +15,74 @@ class EnterpriseFormPage extends GetView<EnterpriseFormController> {
backgroundColor: const Color(0xFFF5F5F5), backgroundColor: const Color(0xFFF5F5F5),
appBar: _buildAppBar(), appBar: _buildAppBar(),
body: SafeArea( body: SafeArea(
child: Column( child: Form(
children: [ key: controller.formKey,
Expanded( child: Column(
child: SingleChildScrollView( children: [
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h), Expanded(
child: Column( child: SingleChildScrollView(
children: [ padding: EdgeInsets.symmetric(
buildTitleSection(title: '必填信息'), horizontal: 16.w,
SizedBox(height: 12.h), vertical: 12.h,
_buildInfoSection( ),
children: [ child: Column(
_buildTextField( children: [
label: '企业名称', buildTitleSection(title: '必填信息'),
hint: '达拉特旗', SizedBox(height: 12.h),
textController: controller.enterpriseNameController, _buildInfoSection(
isRequired: true, children: [
), _buildTextField(
_buildCompanyTypeDropdown(), label: '企业名称',
], hint: '达拉特旗',
), textController: controller.enterpriseNameController,
SizedBox(height: 12.h), validator: (value) {
buildTitleSection(title: '选填信息'), if (value == null || value.isEmpty) {
SizedBox(height: 12.h), return '企业名称不能为空';
_buildInfoSection( }
children: [ return null;
_buildTextField( },
label: '企业地址', isRequired: true,
hint: '请输入企业地址', ),
textController: _buildCompanyTypeDropdown(),
controller.enterpriseAddressController, ],
), ),
_buildCompanyScopeDropdown(), SizedBox(height: 12.h),
_buildTextField( buildTitleSection(title: '选填信息'),
label: '联系人', SizedBox(height: 12.h),
hint: '请输入联系人姓名', _buildInfoSection(
textController: controller.contactPersonController, children: [
), _buildTextField(
_buildTextField( label: '企业地址',
label: '联系电话', hint: '请输入企业地址',
hint: '请输入联系电话', textController:
textController: controller.contactPhoneController, controller.enterpriseAddressController,
), ),
_buildTextField( _buildCompanyScopeDropdown(),
label: '有无重大危险源;重大危险源情况', _buildTextField(
hint: '请输入有无重大危险源;重大危险源情况', label: '联系人',
textController: controller.hazardSourceController, hint: '请输入联系人姓名',
hasDivider: false, textController: controller.contactPersonController,
), ),
], _buildTextField(
), label: '联系电话',
], hint: '请输入联系电话',
textController: controller.contactPhoneController,
),
_buildTextField(
label: '有无重大危险源;重大危险源情况',
hint: '请输入有无重大危险源;重大危险源情况',
textController: controller.hazardSourceController,
hasDivider: false,
),
],
),
],
),
), ),
), ),
), _buildBottomButtons(),
_buildBottomButtons(), ],
], ),
), ),
), ),
); );
@ -149,6 +161,7 @@ class EnterpriseFormPage extends GetView<EnterpriseFormController> {
required TextEditingController textController, required TextEditingController textController,
bool isRequired = false, bool isRequired = false,
bool hasDivider = true, bool hasDivider = true,
String? Function(String?)? validator,
}) { }) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -159,6 +172,7 @@ class EnterpriseFormPage extends GetView<EnterpriseFormController> {
), ),
TextFormField( TextFormField(
controller: textController, controller: textController,
validator: validator,
decoration: InputDecoration( decoration: InputDecoration(
hintText: hint, hintText: hint,
hintStyle: TextStyle(color: Colors.grey[400], fontSize: 14.sp), hintStyle: TextStyle(color: Colors.grey[400], fontSize: 14.sp),
@ -187,6 +201,12 @@ class EnterpriseFormPage extends GetView<EnterpriseFormController> {
Obx( Obx(
() => DropdownButtonFormField<CompanyType>( () => DropdownButtonFormField<CompanyType>(
initialValue: controller.selectedType.value, initialValue: controller.selectedType.value,
validator: (value) {
if (value == null) {
return '请选择企业类型';
}
return null;
},
hint: Text( hint: Text(
'请选择企业类型', '请选择企业类型',
style: TextStyle(color: Colors.grey[400], fontSize: 14.sp), style: TextStyle(color: Colors.grey[400], fontSize: 14.sp),
@ -302,21 +322,29 @@ class EnterpriseFormPage extends GetView<EnterpriseFormController> {
), ),
SizedBox(width: 16.w), SizedBox(width: 16.w),
Expanded( Expanded(
child: ElevatedButton( child: Obx(() {
onPressed: controller.submitForm, return ElevatedButton(
style: ElevatedButton.styleFrom( onPressed: controller.isSubmitting.value
backgroundColor: const Color(0xFF2B8CFF), ? null
padding: EdgeInsets.symmetric(vertical: 12.h), : controller.submitForm,
elevation: 0, style: ElevatedButton.styleFrom(
shape: RoundedRectangleBorder( backgroundColor: const Color(0xFF2B8CFF),
borderRadius: BorderRadius.circular(8.r), padding: EdgeInsets.symmetric(vertical: 12.h),
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.r),
),
), ),
), child: controller.isSubmitting.value
child: Text( ? const SizedBox(
'确定', child: CircularProgressIndicator(color: Colors.white),
style: TextStyle(fontSize: 16.sp, color: Colors.white), )
), : Text(
), '确定',
style: TextStyle(fontSize: 16.sp, color: Colors.white),
),
);
}),
), ),
], ],
), ),

237
lib/app/features/enterprise/presentation/pages/enterprise_list_page.dart

@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:problem_check_system/app/core/extensions/datetime_extension.dart';
import 'package:problem_check_system/app/core/models/company_enum.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/widgets/enterprise_card.dart'; import 'package:problem_check_system/app/features/enterprise/presentation/widgets/enterprise_card.dart';
import '../controllers/enterprise_list_controller.dart'; import '../controllers/enterprise_list_controller.dart';
@ -39,50 +41,21 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
controller.navigateToAddForm(); controller.navigateToAddForm();
}, },
), ),
IconButton( // IconButton(
icon: Icon(Icons.upload, color: Colors.pink[300]), // 使 .sp // icon: Icon(Icons.upload, color: Colors.pink[300]), // 使 .sp
onPressed: () { // onPressed: () {
controller.navigateToUploadPage(); // controller.navigateToUploadPage();
}, // },
), // ),
], ],
), ),
body: Stack( body: Stack(
children: [ children: [
Column( Column(
children: [ children: [
_buildFilterBar(), _buildFilterSection(),
// 使 Obx Widget const Divider(height: 1, thickness: .1),
Expanded( Expanded(child: _buildEnterpriseList()),
child: Obx(() {
if (controller.enterpriseList.isEmpty) {
return const Center(child: CircularProgressIndicator());
}
return ListView.builder(
padding: EdgeInsets.symmetric(
horizontal: 16.w, // 使 .w
vertical: 8.h, // 使 .h
),
itemCount: controller.enterpriseList.length,
itemBuilder: (context, index) {
final enterprise = controller.enterpriseList[index];
return Padding(
padding: EdgeInsets.only(bottom: 12.h), // 使 .h
// child: _EnterpriseCard(enterprise: enterprise),
child: EnterpriseCard(
enterprise: enterprise,
onEdit: () {
controller.navigateToEditForm(enterprise);
},
onViewProblems: () {
controller.navigateToEnterpriseInfoPage();
},
),
);
},
);
}),
),
], ],
), ),
], ],
@ -90,43 +63,167 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
); );
} }
Widget _buildFilterBar() { /// []
return Container( Widget _buildFilterSection() {
padding: EdgeInsets.fromLTRB(16.w, 12.h, 16.w, 12.h), // 使 .w .h return ExpansionTile(
color: Colors.white, title: const Text('筛选查询'),
child: Row( leading: const Icon(Icons.filter_alt_outlined),
mainAxisAlignment: MainAxisAlignment.spaceBetween, initiallyExpanded: false, //
children: [ children: [
Expanded( Padding(
child: Row( padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 1.h),
children: [ child: Column(
const Text('企业名称', style: TextStyle(color: Colors.black54)), children: [
SizedBox(width: 4.w), // 使 .w // 1.
Icon( TextFormField(
Icons.search, controller: controller.nameController,
size: 20.sp, decoration: InputDecoration(
color: Colors.black54, labelText: '企业名称',
), // 使 .sp hintText: '请输入关键词',
], prefixIcon: const Icon(Icons.business_center),
), border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.r),
),
isDense: true,
),
),
SizedBox(height: 12.h),
// 2.
Obx(
() => DropdownButtonFormField<CompanyType>(
initialValue: controller.selectedType.value,
decoration: InputDecoration(
labelText: '企业类型',
prefixIcon: const Icon(Icons.category),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.r),
),
isDense: true,
),
hint: const Text('请选择企业类型'),
isExpanded: true,
items: CompanyType.values.map((type) {
return DropdownMenuItem(
value: type,
child: Text(type.displayText),
);
}).toList(),
onChanged: (value) {
controller.selectedType.value = value;
},
),
),
SizedBox(height: 12.h),
// 3.
Row(
children: [
Expanded(
child: _buildDatePickerField('开始日期', controller.startDate),
),
SizedBox(width: 12.w),
Expanded(
child: _buildDatePickerField('结束日期', controller.endDate),
),
],
),
SizedBox(height: 16.h),
// 4.
Row(
children: [
Expanded(
child: OutlinedButton.icon(
onPressed: controller.clearFilters,
icon: const Icon(Icons.refresh),
label: const Text('重置'),
style: OutlinedButton.styleFrom(
padding: EdgeInsets.symmetric(vertical: 12.h),
),
),
),
SizedBox(width: 16.w),
Expanded(
child: ElevatedButton.icon(
onPressed: controller.search,
icon: const Icon(Icons.search),
label: const Text('查询'),
style: ElevatedButton.styleFrom(
padding: EdgeInsets.symmetric(vertical: 12.h),
),
),
),
],
),
],
), ),
_buildDropdown('选择日期'), ),
_buildDropdown('近一周'), ],
_buildDropdown('类型'),
],
),
); );
} }
Widget _buildDropdown(String text) { /// []
return Padding( Widget _buildDatePickerField(String label, Rx<DateTime?> date) {
padding: EdgeInsets.symmetric(horizontal: 8.w), // 使 .w return InkWell(
child: Row( onTap: () async {
children: [ final pickedDate = await showDatePicker(
Text(text, style: const TextStyle(color: Colors.black54)), context: Get.context!,
const Icon(Icons.arrow_drop_down, color: Colors.black54), initialDate: date.value ?? DateTime.now(),
], firstDate: DateTime(2020),
lastDate: DateTime(2101),
);
if (pickedDate != null) {
date.value = pickedDate;
}
},
child: InputDecorator(
decoration: InputDecoration(
labelText: label,
prefixIcon: const Icon(Icons.calendar_today),
border: OutlineInputBorder(borderRadius: BorderRadius.circular(8.r)),
isDense: true,
),
child: Obx(
() => Text(
date.value == null ? '请选择日期' : date.value!.toDateTimeString(),
style: TextStyle(
color: date.value == null ? Colors.grey[600] : Colors.black87,
),
),
),
), ),
); );
} }
Widget _buildEnterpriseList() {
return Obx(() {
if (controller.isLoading.value) {
return const Center(child: CircularProgressIndicator());
}
return ListView.builder(
padding: EdgeInsets.symmetric(
horizontal: 16.w, // 使 .w
vertical: 8.h, // 使 .h
),
itemCount: controller.enterpriseList.length,
itemBuilder: (context, index) {
final item = controller.enterpriseList[index];
return Padding(
padding: EdgeInsets.only(bottom: 12.h), // 使 .h
// child: _EnterpriseCard(enterprise: enterprise),
child: EnterpriseCard(
enterpriseListItem: item,
onEdit: () {
controller.navigateToEditForm(item.enterprise);
},
onViewProblems: () {
controller.navigateToEnterpriseInfoPage();
},
),
);
},
);
});
}
} }

25
lib/app/features/enterprise/presentation/widgets/enterprise_card.dart

@ -1,16 +1,19 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart'; import 'package:intl/intl.dart';
import 'package:problem_check_system/app/core/extensions/datetime_extension.dart';
import 'package:problem_check_system/app/core/models/sync_status.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise_list_item.dart';
// //
class EnterpriseCard extends StatelessWidget { class EnterpriseCard extends StatelessWidget {
final Enterprise enterprise; final EnterpriseListItem enterpriseListItem;
final VoidCallback onEdit; final VoidCallback onEdit;
final VoidCallback onViewProblems; final VoidCallback onViewProblems;
const EnterpriseCard({ const EnterpriseCard({
super.key, super.key,
required this.enterprise, required this.enterpriseListItem,
required this.onEdit, required this.onEdit,
required this.onViewProblems, required this.onViewProblems,
}); });
@ -133,7 +136,7 @@ class EnterpriseCard extends StatelessWidget {
), ),
SizedBox(height: 4.h), // .h SizedBox(height: 4.h), // .h
Text( Text(
enterprise.name, enterpriseListItem.enterprise.name,
style: TextStyle( style: TextStyle(
fontSize: 12.5.sp, fontSize: 12.5.sp,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
@ -153,7 +156,7 @@ class EnterpriseCard extends StatelessWidget {
), ),
SizedBox(height: 4.h), SizedBox(height: 4.h),
Text( Text(
enterprise.type, enterpriseListItem.enterprise.type,
style: TextStyle( style: TextStyle(
fontSize: 12.5.sp, fontSize: 12.5.sp,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
@ -171,7 +174,9 @@ class EnterpriseCard extends StatelessWidget {
border: Border.all(color: Colors.red.shade400, width: 1.w), border: Border.all(color: Colors.red.shade400, width: 1.w),
), ),
child: Text( child: Text(
'信息未上传', enterpriseListItem.enterprise.syncStatus == SyncStatus.synced
? '信息已上传'
: '信息未上传',
style: TextStyle(fontSize: 7.sp, color: Colors.red.shade400), style: TextStyle(fontSize: 7.sp, color: Colors.red.shade400),
), ),
), ),
@ -194,7 +199,7 @@ class EnterpriseCard extends StatelessWidget {
style: TextStyle(fontSize: 12.sp, color: Colors.grey), style: TextStyle(fontSize: 12.sp, color: Colors.grey),
), ),
Text( Text(
"111", // enterprise.totalIssues.toString(), enterpriseListItem.totalProblems.toString(),
style: TextStyle( style: TextStyle(
fontSize: 12.5.sp, fontSize: 12.5.sp,
color: Colors.black87, color: Colors.black87,
@ -208,7 +213,7 @@ class EnterpriseCard extends StatelessWidget {
children: [ children: [
Icon(Icons.access_time, color: Colors.grey, size: 16.sp), Icon(Icons.access_time, color: Colors.grey, size: 16.sp),
Text( Text(
'创建时间: ${enterprise.creationTime}', '创建时间: ${enterpriseListItem.enterprise.creationTime.toDateTimeString()}',
style: TextStyle(fontSize: 12.sp, color: Colors.grey), style: TextStyle(fontSize: 12.sp, color: Colors.grey),
), ),
], ],
@ -222,13 +227,13 @@ class EnterpriseCard extends StatelessWidget {
return Row( return Row(
children: [ children: [
_buildTag( _buildTag(
text: '已上传 ${enterprise.id}', text: '已上传 ${enterpriseListItem.uploadedProblems}',
textColor: Colors.blue.shade700, textColor: Colors.blue.shade700,
backgroundColor: Colors.blue.shade50, backgroundColor: Colors.blue.shade50,
), ),
SizedBox(width: 8.w), SizedBox(width: 8.w),
_buildTag( _buildTag(
text: '未上传 ${enterprise.id}', text: '未上传 ${enterpriseListItem.pendingProblems}',
textColor: Colors.red.shade600, textColor: Colors.red.shade600,
backgroundColor: Colors.red.shade50, backgroundColor: Colors.red.shade50,
), ),

3
lib/app/features/home/bindings/home_binding.dart

@ -2,7 +2,6 @@ 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_sync_status.dart';
import 'package:problem_check_system/app/core/repositories/auth_repository.dart'; import 'package:problem_check_system/app/core/repositories/auth_repository.dart';
import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart'; import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart';
import 'package:problem_check_system/app/features/home/controllers/home_controller.dart'; import 'package:problem_check_system/app/features/home/controllers/home_controller.dart';
import 'package:problem_check_system/app/features/my/controllers/my_controller.dart'; import 'package:problem_check_system/app/features/my/controllers/my_controller.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_controller.dart'; import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_controller.dart';
@ -13,7 +12,7 @@ class HomeBinding implements Bindings {
/// ///
Get.lazyPut<HomeController>(() => HomeController()); Get.lazyPut<HomeController>(() => HomeController());
Get.put(ProblemStateManager(uuid: Get.find(), authRepository: Get.find())); Get.put(ProblemStateManager(uuid: Get.find(), authRepository: Get.find()));
Get.lazyPut<EnterpriseListController>(() => EnterpriseListController()); // Get.lazyPut<EnterpriseListController>(() => EnterpriseListController());
/// ///
Get.lazyPut<ProblemController>( Get.lazyPut<ProblemController>(

28
lib/app/features/navigation/presentation/bindings/navigation_binding.dart

@ -1,7 +1,13 @@
import 'package:get/get.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_sync_status.dart';
import 'package:problem_check_system/app/core/repositories/auth_repository.dart'; import 'package:problem_check_system/app/core/repositories/auth_repository.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/network_status_service.dart';
import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_local_data_source.dart';
import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_remote_data_source.dart';
import 'package:problem_check_system/app/features/enterprise/data/repositories_impl/enterprise_repository_impl.dart';
import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart';
import 'package:problem_check_system/app/features/enterprise/domain/usecases/get_enterprise_list_usecase.dart';
import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart'; import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart'; import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart';
import 'package:problem_check_system/app/features/navigation/presentation/controllers/navigation_controller.dart'; import 'package:problem_check_system/app/features/navigation/presentation/controllers/navigation_controller.dart';
@ -17,8 +23,28 @@ class NavigationBinding extends Bindings {
networkStatusService: Get.find<NetworkStatusService>(), networkStatusService: Get.find<NetworkStatusService>(),
), ),
); );
Get.put<EnterpriseLocalDataSource>(
EnterpriseLocalDataSourceImpl(
databaseService: Get.find<DatabaseService>(),
),
);
Get.put<EnterpriseRemoteDataSource>(EnterpriseRemoteDataSourceImpl());
Get.put<EnterpriseRepository>(
EnterpriseRepositoryImpl(
localDataSource: Get.find<EnterpriseLocalDataSource>(),
remoteDataSource: Get.find<EnterpriseRemoteDataSource>(),
),
);
Get.put<GetEnterpriseListUsecase>(
GetEnterpriseListUsecase(repository: Get.find<EnterpriseRepository>()),
);
Get.lazyPut<EnterpriseListController>(
() => EnterpriseListController(
getEnterpriseListUsecase: Get.find<GetEnterpriseListUsecase>(),
),
);
Get.put(ProblemStateManager(uuid: Get.find(), authRepository: Get.find())); Get.put(ProblemStateManager(uuid: Get.find(), authRepository: Get.find()));
Get.lazyPut<EnterpriseListController>(() => EnterpriseListController());
/// ///
Get.lazyPut<ProblemController>( Get.lazyPut<ProblemController>(

1
lib/app/features/navigation/presentation/pages/navigation_page.dart

@ -47,6 +47,7 @@ class NavigationPage extends GetView<NavigationController> {
}, },
child: FloatingActionButton( child: FloatingActionButton(
heroTag: "btn_upload", heroTag: "btn_upload",
shape: const CircleBorder(),
onPressed: isOnline onPressed: isOnline
? () => controller.handleFabUploadTap() ? () => controller.handleFabUploadTap()
: null, : null,

Loading…
Cancel
Save