Browse Source

feat : 根据企业精确查询

dev
徐振升 2 months ago
parent
commit
3f09b3e3da
  1. 43
      lib/app/core/routes/app_pages.dart
  2. 9
      lib/app/features/enterprise/presentation/bindings/enterprise_info_binding.dart
  3. 4
      lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart
  4. 6
      lib/app/features/enterprise/presentation/controllers/enterprise_info_controller.dart
  5. 9
      lib/app/features/enterprise/presentation/pages/enterprise_info_page.dart
  6. 14
      lib/app/features/problem/data/datasources/problem_local_data_source.dart
  7. 6
      lib/app/features/problem/domain/entities/problem_filter_params.dart
  8. 4
      lib/app/features/problem/presentation/bindings/problem_form_binding.dart
  9. 5
      lib/app/features/problem/presentation/bindings/problem_list_binding.dart
  10. 45
      lib/app/features/problem/presentation/controllers/problem_list_controller.dart
  11. 67
      lib/app/features/problem/presentation/pages/problem_list_page.dart

43
lib/app/core/routes/app_pages.dart

@ -29,6 +29,12 @@ import 'app_routes.dart';
abstract class AppPages {
// GetPage
static final routes = <GetPage>[
//
GetPage(
name: AppRoutes.login,
page: () => const LoginPage(),
binding: LoginBinding(),
),
GetPage(
name: AppRoutes.navigation,
page: () => const NavigationPage(),
@ -39,27 +45,22 @@ abstract class AppPages {
ProfileBinding().dependencies();
}),
),
GetPage(
name: AppRoutes.home,
page: () => const HomePage(),
binding: HomeBinding(),
),
//
GetPage(
name: AppRoutes.login,
page: () => const LoginPage(),
binding: LoginBinding(),
),
// GetPage(
// name: AppRoutes.home,
// page: () => const HomePage(),
// binding: HomeBinding(),
// ),
GetPage(
name: AppRoutes.changePassword,
page: () => const ChangePasswordPage(),
binding: ChangePasswordBinding(),
),
GetPage(
name: AppRoutes.problem,
page: () => const ProblemListPage(),
binding: ProblemListBinding(),
),
// GetPage(
// name: AppRoutes.problem,
// page: () => const ProblemListPage(),
// binding: ProblemListBinding(),
// ),
GetPage(
name: AppRoutes.my,
page: () => const MyPage(),
@ -75,11 +76,11 @@ abstract class AppPages {
page: () => const ProblemFormPage(),
binding: ProblemFormBinding(),
),
GetPage(
name: AppRoutes.enterpriseList,
page: () => const EnterpriseListPage(),
binding: EnterpriseListBinding(),
),
// GetPage(
// name: AppRoutes.enterpriseList,
// page: () => const EnterpriseListPage(),
// binding: EnterpriseListBinding(),
// ),
GetPage(
name: AppRoutes.enterpriseInfo,
page: () => const EnterpriseInfoPage(),

9
lib/app/features/enterprise/presentation/bindings/enterprise_info_binding.dart

@ -1,10 +1,19 @@
import 'package:get/get.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_info_controller.dart';
class EnterpriseInfoBinding extends Bindings {
@override
void dependencies() {
// 2. null Controller
Get.lazyPut<EnterpriseFormController>(() => EnterpriseFormController());
// 3. EnterpriseInfoController EnterpriseFormController
Get.lazyPut<EnterpriseInfoController>(
() => EnterpriseInfoController(
enterpriseFormController: Get.find<EnterpriseFormController>(),
),
);
final problemListController = Get.find<EnterpriseFormController>();
problemListController.test();
}
}

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

@ -178,4 +178,8 @@ class EnterpriseFormController extends GetxController {
hazardSourceController.dispose();
super.onClose();
}
void test() {
Get.log('EnterpriseFormController test method called');
}
}

6
lib/app/features/enterprise/presentation/controllers/enterprise_info_controller.dart

@ -5,4 +5,10 @@ class EnterpriseInfoController extends GetxController {
EnterpriseInfoController({required this.enterpriseFormController});
final EnterpriseFormController enterpriseFormController;
@override
void onInit() {
super.onInit();
Get.log('EnterpriseInfoController initialized');
}
}

9
lib/app/features/enterprise/presentation/pages/enterprise_info_page.dart

@ -2,10 +2,12 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_info_controller.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/pages/widgets/enterprise_form_view.dart';
import 'package:problem_check_system/app/features/problem/presentation/pages/problem_list_page.dart';
//
class EnterpriseInfoPage extends StatelessWidget {
class EnterpriseInfoPage extends GetView<EnterpriseInfoController> {
const EnterpriseInfoPage({super.key});
@override
@ -20,10 +22,7 @@ class EnterpriseInfoPage extends StatelessWidget {
appBar: _buildAlipayAppBar(context),
// TabBarView Tab
body: const TabBarView(
children: [
Center(child: Text('企业问题列表')),
EnterpriseFormView(),
],
children: [ProblemListPage(), EnterpriseFormView()],
),
),
);

14
lib/app/features/problem/data/datasources/problem_local_data_source.dart

@ -85,10 +85,10 @@ class ProblemLocalDataSourceImpl implements ProblemLocalDataSource {
List<String> whereClauses = [];
List<dynamic> arguments = [];
// 1. ()
if (filter.enterpriseName != null && filter.enterpriseName!.isNotEmpty) {
whereClauses.add('c.name LIKE ?');
arguments.add('%${filter.enterpriseName}%');
// 1.
if (filter.enterpriseId != null && filter.enterpriseId!.isNotEmpty) {
whereClauses.add('p.enterpriseId = ?');
arguments.add(filter.enterpriseId);
}
// 2.
@ -115,9 +115,11 @@ class ProblemLocalDataSourceImpl implements ProblemLocalDataSource {
// 5.
if (filter.isBound != null) {
if (filter.isBound!) {
whereClauses.add('p.bindData IS NOT NULL AND p.bindData != ""');
whereClauses.add('p.bindData IS NOT NULL AND p.bindData != ?');
arguments.add('');
} else {
whereClauses.add('p.bindData IS NULL OR p.bindData = ""');
whereClauses.add('(p.bindData IS NULL OR p.bindData = ?)');
arguments.add('');
}
}

6
lib/app/features/problem/domain/entities/problem_filter_params.dart

@ -1,7 +1,7 @@
///
class ProblemFilterParams {
/// ()
final String? enterpriseName;
/// id
final String? enterpriseId;
/// -
final DateTime? startTime;
@ -16,7 +16,7 @@ class ProblemFilterParams {
final bool? isBound;
ProblemFilterParams({
this.enterpriseName,
this.enterpriseId,
this.startTime,
this.endTime,
this.isUploaded,

4
lib/app/features/problem/presentation/bindings/problem_form_binding.dart

@ -43,8 +43,8 @@ class ProblemFormBinding extends BaseBindings {
@override
void register4Usecases() {
Get.put<GetEnterprisesUsecase>(
GetEnterprisesUsecase(repository: Get.find<EnterpriseRepository>()),
Get.lazyPut<GetEnterprisesUsecase>(
() => GetEnterprisesUsecase(repository: Get.find()),
);
Get.lazyPut(
() => AddProblemUsecase(

5
lib/app/features/problem/presentation/bindings/problem_list_binding.dart

@ -1,6 +1,7 @@
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/bindings/base_bindings.dart';
import 'package:problem_check_system/app/core/services/database_service.dart';
import 'package:problem_check_system/app/features/enterprise/domain/usecases/get_enterprises_usecase.dart';
import 'package:problem_check_system/app/features/problem/data/datasources/problem_local_data_source.dart';
import 'package:problem_check_system/app/features/problem/data/datasources/problem_remote_data_source.dart';
import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository_impl.dart';
@ -39,6 +40,9 @@ class ProblemListBinding extends BaseBindings {
@override
void register4Usecases() {
Get.lazyPut<GetEnterprisesUsecase>(
() => GetEnterprisesUsecase(repository: Get.find()),
);
Get.lazyPut<GetAllProblemsUsecase>(
() => GetAllProblemsUsecase(problemRepository: Get.find()),
);
@ -57,6 +61,7 @@ class ProblemListBinding extends BaseBindings {
getAllProblemsUsecase: Get.find(),
syncProblemsUsecase: Get.find(),
problemResolveConflictUsecase: Get.find(),
getEnterprisesUsecase: Get.find(),
),
);
}

45
lib/app/features/problem/presentation/controllers/problem_list_controller.dart

@ -3,6 +3,8 @@ import 'package:get/get.dart';
import 'package:problem_check_system/app/core/extensions/datetime_extension.dart';
import 'package:problem_check_system/app/core/models/form_mode.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/usecases/get_enterprises_usecase.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_bind_status.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_entity.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_filter_params.dart';
@ -15,6 +17,7 @@ import 'package:problem_check_system/app/features/problem/domain/usecases/sync_p
class ProblemListController extends GetxController {
final GetAllProblemsUsecase getAllProblemsUsecase;
final GetEnterprisesUsecase getEnterprisesUsecase;
final SyncProblemsUsecase syncProblemsUsecase;
final ProblemResolveConflictUsecase problemResolveConflictUsecase;
@ -22,13 +25,21 @@ class ProblemListController extends GetxController {
required this.getAllProblemsUsecase,
required this.syncProblemsUsecase,
required this.problemResolveConflictUsecase,
required this.getEnterprisesUsecase,
});
final problemList = <ProblemListItemEntity>[].obs;
final isLoading = false.obs;
final error = ''.obs; //
final isSyncing = false.obs;
final nameController = TextEditingController();
// AppBar
final showAppBar = true;
final showFilterSection = true;
final enterpriseList = <Enterprise>[].obs;
//
final selectedEnterprise = Rx<Enterprise?>(null);
final selectedStatus = Rx<ProblemUploadStatus?>(null);
final selectedBound = Rx<ProblemBindStatus?>(null);
final startDate = Rx<DateTime?>(null);
@ -49,20 +60,34 @@ class ProblemListController extends GetxController {
}
@override
void onInit() {
Future<void> onInit() async {
// -
// loadAndSyncEnterprises();
await _fetchEnterprises();
search();
super.onInit();
}
@override
void onClose() {
nameController.dispose();
expansibleController.dispose();
super.onClose();
}
// 4. :
Future<void> _fetchEnterprises() async {
try {
isLoading(true);
error(''); //
final result = await getEnterprisesUsecase(); // UseCase
enterpriseList.assignAll(result); //
} catch (e) {
error.value = '加载企业列表失败: $e'; //
} finally {
isLoading(false); //
}
}
// --- ---
//
Future<void> loadAndSyncProblems() async {
@ -178,7 +203,7 @@ class ProblemListController extends GetxController {
isLoading.value = true;
try {
final ProblemFilterParams params = ProblemFilterParams(
enterpriseName: nameController.value.text,
enterpriseId: selectedEnterprise.value?.id,
startTime: startDate.value,
endTime: endDate.value,
isUploaded: isUploaded,
@ -193,8 +218,18 @@ class ProblemListController extends GetxController {
}
}
//
void setFilters(Enterprise enterprise) {
selectedEnterprise.value = enterprise;
selectedBound.value = null;
selectedStatus.value = null;
startDate.value = null;
endDate.value = null;
}
//
void clearFilters() {
nameController.clear();
selectedEnterprise.value = null;
selectedBound.value = null;
selectedStatus.value = null;
startDate.value = null;

67
lib/app/features/problem/presentation/pages/problem_list_page.dart

@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/extensions/datetime_extension.dart';
import 'package:problem_check_system/app/core/pages/widgets/custom_app_bar.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_bind_status.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_upload_status.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_list_controller.dart';
@ -14,15 +15,17 @@ class ProblemListPage extends GetView<ProblemListController> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
titleName: '问题列表',
actionsVisible: true,
onAddPressed: () => controller.navigateToAddForm(),
),
appBar: controller.showAppBar
? CustomAppBar(
titleName: '问题列表',
actionsVisible: true,
onAddPressed: () => controller.navigateToAddForm(),
)
: null,
body: Column(
children: [
//
_buildFilterSection(),
if (controller.showFilterSection) _buildFilterSection(),
const Divider(height: 1, thickness: 1),
//
@ -51,19 +54,51 @@ class ProblemListPage extends GetView<ProblemListController> {
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 4.h),
child: Column(
children: [
// 1.
TextFormField(
controller: controller.nameController,
decoration: InputDecoration(
labelText: '企业名称',
hintText: '请输入关键词',
prefixIcon: const Icon(Icons.business_center),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.r),
Obx(
() => DropdownButtonFormField<Enterprise>(
initialValue: controller.selectedEnterprise.value,
decoration: InputDecoration(
labelText: '企业名称',
prefixIcon: const Icon(Icons.business_center),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.r),
),
isDense: true,
),
hint: Text(
'请选择企业名称',
style: TextStyle(
fontSize: 14.sp,
color: controller.selectedEnterprise.value == null
? Colors.grey[700]
: Colors.black87,
),
),
isDense: true,
isExpanded: true,
items: controller.enterpriseList.map((enterprise) {
return DropdownMenuItem(
value: enterprise,
child: Text(enterprise.name),
);
}).toList(),
onChanged: (value) {
controller.selectedEnterprise.value = value;
},
),
),
// // 1.
// TextFormField(
// controller: controller.nameController,
// decoration: InputDecoration(
// labelText: '企业名称',
// hintText: '请输入关键词',
// prefixIcon: const Icon(Icons.business_center),
// border: OutlineInputBorder(
// borderRadius: BorderRadius.circular(8.r),
// ),
// isDense: true,
// ),
// ),
SizedBox(height: 12.h),
Row(

Loading…
Cancel
Save