From 3f09b3e3daafdea24d38d99e5e8dd4da96c7a854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=8C=AF=E5=8D=87?= <359059686@qq.com> Date: Fri, 7 Nov 2025 15:38:57 +0800 Subject: [PATCH] =?UTF-8?q?feat=20:=20=E6=A0=B9=E6=8D=AE=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E7=B2=BE=E7=A1=AE=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/core/routes/app_pages.dart | 43 ++++++------ .../bindings/enterprise_info_binding.dart | 9 +++ .../enterprise_form_controller.dart | 4 ++ .../enterprise_info_controller.dart | 6 ++ .../pages/enterprise_info_page.dart | 9 ++- .../problem_local_data_source.dart | 14 ++-- .../entities/problem_filter_params.dart | 6 +- .../bindings/problem_form_binding.dart | 4 +- .../bindings/problem_list_binding.dart | 5 ++ .../controllers/problem_list_controller.dart | 45 +++++++++++-- .../presentation/pages/problem_list_page.dart | 67 ++++++++++++++----- 11 files changed, 154 insertions(+), 58 deletions(-) diff --git a/lib/app/core/routes/app_pages.dart b/lib/app/core/routes/app_pages.dart index 80454e2..61a7509 100644 --- a/lib/app/core/routes/app_pages.dart +++ b/lib/app/core/routes/app_pages.dart @@ -29,6 +29,12 @@ import 'app_routes.dart'; abstract class AppPages { // 所有路由的 GetPage 列表 static final routes = [ + // 登录页 + 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(), diff --git a/lib/app/features/enterprise/presentation/bindings/enterprise_info_binding.dart b/lib/app/features/enterprise/presentation/bindings/enterprise_info_binding.dart index a4921c0..e0cab4e 100644 --- a/lib/app/features/enterprise/presentation/bindings/enterprise_info_binding.dart +++ b/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()); + // 3. 注入 EnterpriseInfoController,并传入 EnterpriseFormController 实例。 + Get.lazyPut( + () => EnterpriseInfoController( + enterpriseFormController: Get.find(), + ), + ); + final problemListController = Get.find(); + problemListController.test(); } } diff --git a/lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart b/lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart index e7c9286..3b76674 100644 --- a/lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart +++ b/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'); + } } diff --git a/lib/app/features/enterprise/presentation/controllers/enterprise_info_controller.dart b/lib/app/features/enterprise/presentation/controllers/enterprise_info_controller.dart index 4906def..b17ea78 100644 --- a/lib/app/features/enterprise/presentation/controllers/enterprise_info_controller.dart +++ b/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'); + } } diff --git a/lib/app/features/enterprise/presentation/pages/enterprise_info_page.dart b/lib/app/features/enterprise/presentation/pages/enterprise_info_page.dart index 628121b..0afd46d 100644 --- a/lib/app/features/enterprise/presentation/pages/enterprise_info_page.dart +++ b/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 { 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()], ), ), ); diff --git a/lib/app/features/problem/data/datasources/problem_local_data_source.dart b/lib/app/features/problem/data/datasources/problem_local_data_source.dart index 6efd9b1..05c6cda 100644 --- a/lib/app/features/problem/data/datasources/problem_local_data_source.dart +++ b/lib/app/features/problem/data/datasources/problem_local_data_source.dart @@ -85,10 +85,10 @@ class ProblemLocalDataSourceImpl implements ProblemLocalDataSource { List whereClauses = []; List 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(''); } } diff --git a/lib/app/features/problem/domain/entities/problem_filter_params.dart b/lib/app/features/problem/domain/entities/problem_filter_params.dart index 2decbfc..58d9ed6 100644 --- a/lib/app/features/problem/domain/entities/problem_filter_params.dart +++ b/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, 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 3872c84..ea3d88d 100644 --- a/lib/app/features/problem/presentation/bindings/problem_form_binding.dart +++ b/lib/app/features/problem/presentation/bindings/problem_form_binding.dart @@ -43,8 +43,8 @@ class ProblemFormBinding extends BaseBindings { @override void register4Usecases() { - Get.put( - GetEnterprisesUsecase(repository: Get.find()), + Get.lazyPut( + () => GetEnterprisesUsecase(repository: Get.find()), ); Get.lazyPut( () => AddProblemUsecase( diff --git a/lib/app/features/problem/presentation/bindings/problem_list_binding.dart b/lib/app/features/problem/presentation/bindings/problem_list_binding.dart index 2c177ac..c401c36 100644 --- a/lib/app/features/problem/presentation/bindings/problem_list_binding.dart +++ b/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(repository: Get.find()), + ); Get.lazyPut( () => GetAllProblemsUsecase(problemRepository: Get.find()), ); @@ -57,6 +61,7 @@ class ProblemListBinding extends BaseBindings { getAllProblemsUsecase: Get.find(), syncProblemsUsecase: Get.find(), problemResolveConflictUsecase: Get.find(), + getEnterprisesUsecase: Get.find(), ), ); } diff --git a/lib/app/features/problem/presentation/controllers/problem_list_controller.dart b/lib/app/features/problem/presentation/controllers/problem_list_controller.dart index fdccafe..0c531b5 100644 --- a/lib/app/features/problem/presentation/controllers/problem_list_controller.dart +++ b/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 = [].obs; final isLoading = false.obs; + final error = ''.obs; // 用于显示错误信息 final isSyncing = false.obs; - final nameController = TextEditingController(); + // 显示或隐藏 AppBar 和筛选区域的状态 + final showAppBar = true; + final showFilterSection = true; + + final enterpriseList = [].obs; + // 筛选条件 + final selectedEnterprise = Rx(null); final selectedStatus = Rx(null); final selectedBound = Rx(null); final startDate = Rx(null); @@ -49,20 +60,34 @@ class ProblemListController extends GetxController { } @override - void onInit() { + Future onInit() async { // 页面初始化时,启动完整的“同步-再加载”流程 // loadAndSyncEnterprises(); + await _fetchEnterprises(); search(); super.onInit(); } @override void onClose() { - nameController.dispose(); expansibleController.dispose(); super.onClose(); } + // 4. 私有方法: 获取数据的核心逻辑 + Future _fetchEnterprises() async { + try { + isLoading(true); + error(''); // 重置错误信息 + final result = await getEnterprisesUsecase(); // 调用UseCase + enterpriseList.assignAll(result); // 更新列表 + } catch (e) { + error.value = '加载企业列表失败: $e'; // 捕获并设置错误信息 + } finally { + isLoading(false); // 无论成功或失败,最后都停止加载 + } + } + // --- 实现基类中定义的方法 --- // 核心流程方法 Future 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; diff --git a/lib/app/features/problem/presentation/pages/problem_list_page.dart b/lib/app/features/problem/presentation/pages/problem_list_page.dart index efa7d17..451d651 100644 --- a/lib/app/features/problem/presentation/pages/problem_list_page.dart +++ b/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 { @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 { 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( + 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(