From dca5b93924447cdccc296a479b8d827b70c954b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=8C=AF=E5=8D=87?= <359059686@qq.com> Date: Tue, 2 Sep 2025 11:59:53 +0800 Subject: [PATCH] =?UTF-8?q?feat=20:=20=E5=BD=93=E5=89=8D=E4=B8=8E=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E9=97=AE=E9=A2=98=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/problem_controller.dart | 81 ++++++++++++------- lib/modules/problem/views/problem_page.dart | 25 +++--- .../widgets/custom_data_range_dropdown.dart | 5 ++ 3 files changed, 70 insertions(+), 41 deletions(-) diff --git a/lib/modules/problem/controllers/problem_controller.dart b/lib/modules/problem/controllers/problem_controller.dart index eb26ce5..781f52c 100644 --- a/lib/modules/problem/controllers/problem_controller.dart +++ b/lib/modules/problem/controllers/problem_controller.dart @@ -5,6 +5,7 @@ import 'package:dio/dio.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart' hide MultipartFile, FormData; import 'package:flutter/material.dart'; +import 'package:problem_check_system/app/routes/app_routes.dart'; import 'package:problem_check_system/data/repositories/problem_repository.dart'; import 'package:problem_check_system/modules/problem/views/widgets/custom_data_range_dropdown.dart'; import 'package:problem_check_system/data/models/problem_model.dart'; @@ -35,10 +36,16 @@ class ProblemController extends GetxController return unUploadedProblems.where((problem) => problem.isChecked).toList(); } - /// 筛选条件 - final Rx selectedDateRange = DateRange.oneWeek.obs; - final RxString selectedUploadStatus = '全部'.obs; - final RxString selectedBindingStatus = '全部'.obs; + /// 问题列表筛选条件 + final Rx currentDateRange = DateRange.oneWeek.obs; + final RxString currentUploadFilter = '全部'.obs; + final RxString currentBindFilter = '全部'.obs; + + // 历史问题列表筛选条件 + final Rx historyStartTime = DateTime.now().obs; + final Rx historyEndTime = DateTime.now().obs; + final RxString historyUploadFilter = '全部'.obs; + final RxString historyBindFilter = '全部'.obs; /// 是否加载中 final RxBool isLoading = false.obs; @@ -237,9 +244,6 @@ class ProblemController extends GetxController // #region ta按钮 void _onTabChanged() { if (!tabController.indexIsChanging) { - selectedDateRange.value = DateRange.oneWeek; - selectedUploadStatus.value = '全部'; - selectedBindingStatus.value = '全部'; loadProblems(); } } @@ -253,18 +257,20 @@ class ProblemController extends GetxController final bool isProblemListTab = tabController.index == 0; final DateTime startDate = isProblemListTab - ? selectedDateRange.value.startDate - : DateTime(2000); // 历史列表从很早的日期开始 + ? currentDateRange.value.startDate + : historyStartTime.value; - final DateTime endDate = DateTime.now(); + final DateTime endDate = isProblemListTab + ? currentDateRange.value.endDate + : historyEndTime.value; final String uploadStatus = isProblemListTab - ? selectedUploadStatus.value - : '全部'; + ? currentUploadFilter.value + : historyUploadFilter.value; final String bindStatus = isProblemListTab - ? selectedBindingStatus.value - : '全部'; + ? currentBindFilter.value + : historyBindFilter.value; // 只执行一次数据库查询 final loadedProblems = await problemRepository.getProblems( @@ -287,28 +293,44 @@ class ProblemController extends GetxController } } - // todo 查询问题:起始时间,结束时间,是否上传,是否绑定,重载查询 - void search({ + /// + void updateCurrentFilters({ DateRange? newDateRange, String? newUploadStatus, String? newBindingStatus, - }) {} + }) { + if (newDateRange != null && currentDateRange.value != newDateRange) { + currentDateRange.value = newDateRange; + } + if (newUploadStatus != null && + currentUploadFilter.value != newUploadStatus) { + currentUploadFilter.value = newUploadStatus; + } + if (newBindingStatus != null && + currentBindFilter.value != newBindingStatus) { + currentBindFilter.value = newBindingStatus; + } - /// - /// - void updateFiltersAndLoadProblems({ - DateRange? newDateRange, + // 只要调用此方法,就重新加载数据 + loadProblems(); + } + + void updateHistoryFilters({ + DateTime? newStartTime, + DateTime? newEndTime, String? newUploadStatus, String? newBindingStatus, }) { - if (newDateRange != null) { - selectedDateRange.value = newDateRange; + if (newStartTime != null && historyStartTime.value != newStartTime) { + historyStartTime.value = newStartTime; } - if (newUploadStatus != null) { - selectedUploadStatus.value = newUploadStatus; + if (newUploadStatus != null && + historyUploadFilter.value != newUploadStatus) { + historyUploadFilter.value = newUploadStatus; } - if (newBindingStatus != null) { - selectedBindingStatus.value = newBindingStatus; + if (newBindingStatus != null && + historyBindFilter.value != newBindingStatus) { + historyBindFilter.value = newBindingStatus; } // 只要调用此方法,就重新加载数据 @@ -396,4 +418,9 @@ class ProblemController extends GetxController log('选择的日期范围是: ${picked.start} 到 ${picked.end}'); } } + + Future toProblemFormPageAndRefresh() async { + await Get.toNamed(AppRoutes.problemForm); + loadProblems(); + } } diff --git a/lib/modules/problem/views/problem_page.dart b/lib/modules/problem/views/problem_page.dart index 01c27ad..9aaad69 100644 --- a/lib/modules/problem/views/problem_page.dart +++ b/lib/modules/problem/views/problem_page.dart @@ -4,7 +4,6 @@ import 'package:get/get.dart'; import 'package:problem_check_system/app/routes/app_routes.dart'; import 'package:problem_check_system/modules/problem/controllers/problem_controller.dart'; import 'package:problem_check_system/modules/problem/views/problem_list_page.dart'; // 导入修正后的 ProblemListPage -import 'package:problem_check_system/modules/problem/views/problem_form_page.dart'; import 'package:problem_check_system/modules/problem/views/widgets/custom_data_range_dropdown.dart'; import 'package:problem_check_system/modules/problem/views/widgets/custom_string_dropdown.dart'; import 'package:problem_check_system/modules/problem/views/widgets/problem_card.dart'; // 导入自定义下拉菜单 @@ -74,29 +73,29 @@ class ProblemPage extends GetView { child: Row( children: [ CustomDateRangeDropdown( - selectedRange: controller.selectedDateRange, + selectedRange: controller.currentDateRange, onChanged: (rangeValue) { - controller.updateFiltersAndLoadProblems( + controller.updateCurrentFilters( newDateRange: rangeValue, ); }, ), CustomStringDropdown( - selectedValue: controller.selectedUploadStatus, + selectedValue: controller.currentUploadFilter, items: const ['全部', '未上传', '已上传'], onChanged: (uploadValue) { - controller.updateFiltersAndLoadProblems( + controller.updateCurrentFilters( newUploadStatus: uploadValue, ); }, ), CustomStringDropdown( - selectedValue: controller.selectedBindingStatus, + selectedValue: controller.currentBindFilter, items: const ['全部', '未绑定', '已绑定'], onChanged: (bindingValue) { - controller.updateFiltersAndLoadProblems( + controller.updateCurrentFilters( newBindingStatus: bindingValue, ); }, @@ -131,20 +130,20 @@ class ProblemPage extends GetView { child: const Text('选择日期范围'), ), CustomStringDropdown( - selectedValue: controller.selectedUploadStatus, + selectedValue: controller.historyUploadFilter, items: const ['全部', '未上传', '已上传'], onChanged: (uploadValue) { - controller.updateFiltersAndLoadProblems( + controller.updateHistoryFilters( newUploadStatus: uploadValue, ); }, ), CustomStringDropdown( - selectedValue: controller.selectedBindingStatus, + selectedValue: controller.historyBindFilter, items: const ['全部', '未绑定', '已绑定'], onChanged: (bindingValue) { - controller.updateFiltersAndLoadProblems( + controller.updateHistoryFilters( newBindingStatus: bindingValue, ); }, @@ -181,9 +180,7 @@ class ProblemPage extends GetView { padding: EdgeInsets.only(bottom: 24.h), // 底部间距 child: FloatingActionButton( heroTag: "btn_add", - onPressed: () { - Get.toNamed(AppRoutes.problemForm); - }, + onPressed: controller.toProblemFormPageAndRefresh, shape: const CircleBorder(), backgroundColor: Colors.blue[300], foregroundColor: Colors.white, diff --git a/lib/modules/problem/views/widgets/custom_data_range_dropdown.dart b/lib/modules/problem/views/widgets/custom_data_range_dropdown.dart index 153e55c..fec470f 100644 --- a/lib/modules/problem/views/widgets/custom_data_range_dropdown.dart +++ b/lib/modules/problem/views/widgets/custom_data_range_dropdown.dart @@ -31,6 +31,11 @@ extension DateRangeExtension on DateRange { return now.subtract(const Duration(days: 30)); // 近一月通常按30天计算 } } + + // + DateTime get endDate { + return DateTime.now(); + } } class CustomDateRangeDropdown extends StatelessWidget {