Browse Source

Merge branch 'master' of http://git.ius.plus/Project-Vital/VitalApp

loki.wu 10 months ago
parent
commit
2badb67e2c

+ 39 - 59
lib/pages/controllers/crowd_labels.dart

@@ -40,44 +40,35 @@ class CrowdLabelsController extends FControllerBase {
     result = _updateSpecialCareChecked(code);
   }
 
+  void onItemCheckFilterChanged(String code) {
+    bool result = false;
+    result = _updateAllChecked(code);
+    if (result) return;
+    final item = state.allLabels.firstWhereOrNull((e) => e.code == code);
+    if (item == null) return;
+
+    final arr = state.selectedFilterCodes.toList();
+    if (!arr.contains(code)) {
+      if (arr.contains(code) == false) {
+        arr.add(code);
+      }
+    } else {
+      arr.remove(code);
+    }
+    state.selectedFilterCodes = arr;
+  }
+
   bool _updateAllChecked(String code) {
     if (state.isAllSelect) {
-      if (code != "0") {
-        return false;
-      } else {
-        state.isAllSelect = false;
-        state.selectedNormalCodes = [];
-        state.selectedDiseaseCodes = [];
-        state.selectedSpecialCareCodes = [];
-      }
+      state.isAllSelect = false;
+      state.selectedFilterCodes = [];
     } else {
       if (code != "0") {
         return false;
       } else {
         state.isAllSelect = true;
-        state.selectedNormalCodes = state.normalOptions
-            .where((element) => [
-                  "RQFL_ET",
-                  "RQFL_YF",
-                  "RQFL_LNR",
-                ].contains(element.code))
-            .map((LabelDTO e) => e.code ?? '')
-            .toList();
-
-        state.selectedDiseaseCodes = state.diseaseOptions
-            .where((element) => [
-                  "CJJB_GXY",
-                  "CJJB_TNB",
-                  "CJJB_YZJSBZA",
-                  "CJJB_FJH",
-                ].contains(element.code))
-            .map((LabelDTO e) => e.code ?? '')
-            .toList();
-
-        state.selectedSpecialCareCodes = state.specialCareOptions
-            .where((element) => [].contains(element.code))
-            .map((LabelDTO e) => e.code ?? '')
-            .toList();
+        state.selectedFilterCodes =
+            state.allLabels.map((LabelDTO e) => e.code ?? '').toList();
       }
     }
     return true;
@@ -94,7 +85,6 @@ class CrowdLabelsController extends FControllerBase {
       }
     } else {
       arr.remove(code);
-      state.isAllSelect = false;
     }
     state.selectedNormalCodes = arr;
     return true;
@@ -111,7 +101,6 @@ class CrowdLabelsController extends FControllerBase {
       }
     } else {
       arr.remove(code);
-      state.isAllSelect = false;
     }
     state.selectedDiseaseCodes = arr;
     return true;
@@ -129,7 +118,6 @@ class CrowdLabelsController extends FControllerBase {
       }
     } else {
       arr.remove(code);
-      state.isAllSelect = false;
     }
     state.selectedSpecialCareCodes = arr;
     return true;
@@ -142,32 +130,13 @@ class CrowdLabelsController extends FControllerBase {
     state.diseaseOptions = (await _manager.getDiseaseCrowdLabels())
       ..removeLast();
     // state.diseaseOptions = await _manager.getDiseaseCrowdLabels();
+    var labels = await Get.find<ILabelManager>().getAllLabels();
     state.specialCareOptions = await _manager.getSpecialCareCrowdLabels();
-    if (state.isAllSelect) {
-      state.selectedNormalCodes = state.normalOptions
-          .where((element) => [
-                "RQFL_ET",
-                "RQFL_YF",
-                "RQFL_LNR",
-              ].contains(element.code))
-          .map((LabelDTO e) => e.code ?? '')
-          .toList();
-
-      state.selectedDiseaseCodes = state.diseaseOptions
-          .where((element) => [
-                "CJJB_GXY",
-                "CJJB_TNB",
-                "CJJB_YZJSBZA",
-                "CJJB_FJH",
-              ].contains(element.code))
-          .map((LabelDTO e) => e.code ?? '')
-          .toList();
-
-      state.selectedSpecialCareCodes = state.specialCareOptions
-          .where((element) => [].contains(element.code))
-          .map((LabelDTO e) => e.code ?? '')
-          .toList();
-    }
+    state.allLabels = [
+      LabelDTO(code: 'RQFL_ET', labelName: "儿童"),
+      LabelDTO(code: "RQFL_LNR", labelName: "老年人"),
+      ...labels
+    ];
   }
 }
 
@@ -179,9 +148,20 @@ class CrowdLablesState {
   final RxList<String> _selectedNormalCodes = RxList<String>();
   final RxList<String> _selectedDiseaseCodes = RxList<String>();
   final RxList<String> _selectedSpecialCareCodes = RxList<String>();
+  final RxList<LabelDTO> _allLabels = RxList<LabelDTO>();
+  final RxList<String> _selectedFilterCodes = RxList<String>();
+
+  /// 一般人群分类 已选择Code集合
+  List<String> get selectedFilterCodes =>
+      UnmodifiableListView(_selectedFilterCodes.toList());
+  set selectedFilterCodes(List<String> val) => _selectedFilterCodes.value = val;
 
   bool isAllSelect = true;
 
+  /// 一般人群分类选项集合
+  List<LabelDTO> get allLabels => UnmodifiableListView(_allLabels.toList());
+  set allLabels(List<LabelDTO> val) => _allLabels.value = val;
+
   /// 一般人群分类选项集合
   List<LabelDTO> get normalOptions =>
       UnmodifiableListView(_normalOptions.toList());

+ 7 - 2
lib/pages/patient/list/controller.dart

@@ -9,6 +9,7 @@ import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/components/alert_dialog.dart';
 import 'package:vitalapp/global.dart';
 import 'package:vitalapp/managers/interfaces/device.dart';
+import 'package:vitalapp/managers/interfaces/label.dart';
 import 'package:vitalapp/managers/interfaces/models/device.dart';
 import 'package:vitalapp/managers/interfaces/models/patient_model_dto.dart';
 import 'package:vitalapp/managers/interfaces/patient.dart';
@@ -290,6 +291,8 @@ class PatientListController extends FControllerBase
   /// 加载下一页列表
   Future<void> loadNextPageList({bool isFilter = false}) async {
     busy = true;
+    var allLabels = await Get.find<ILabelManager>().getAllLabels();
+    var labelKeys = allLabels.map((e) => e.code ?? '').toList();
     final request = PatientPageRequest(
       pageIndex: state.pageIndex + 1,
       pageSize: state.pageSize,
@@ -297,8 +300,10 @@ class PatientListController extends FControllerBase
       startTime: state.startTime.value,
       endTime: state.endTime.value?.add(const Duration(days: 1)),
       crowdLabels: crowdLabelsController.state.isAllSelect
-          ? null
-          : crowdLabelsController.state.selectedCodes,
+          ? ["RQFL_ET", "RQFL_LNR", ...labelKeys]
+          : crowdLabelsController.state.selectedFilterCodes.length == 0
+              ? null
+              : crowdLabelsController.state.selectedFilterCodes,
       createdBySelf: state.selectBoxFilterFounder == 0,
       contractState: state.contractStateSelectedItem,
     );

+ 31 - 73
lib/pages/patient/list/view.dart

@@ -191,13 +191,11 @@ class PatientListPage extends GetView<PatientListController> {
                 const SizedBox(
                   height: 20,
                 ),
-                Obx(
-                  () => Row(
-                    children: [
-                      _tabRadio(title: "仅当前医生建档", value: 0),
-                      _tabRadio(title: "当前团队所有居民", value: 1)
-                    ],
-                  ),
+                ScopeEnquiryResidents(
+                  selectRaidoChange: (int value) {
+                    controller.state.selectBoxFilterFounder = value;
+                  },
+                  selectIndex: controller.state.selectBoxFilterFounder,
                 ),
                 const SizedBox(
                   height: 20,
@@ -215,40 +213,33 @@ class PatientListPage extends GetView<PatientListController> {
                 const SizedBox(
                   height: 20,
                 ),
-                Row(
-                  children: [
-                    const Text(
-                      '签约状态:',
-                      style: TextStyle(fontSize: 20),
-                    ),
-                    const SizedBox(
-                      width: 20,
-                    ),
-                    Obx(
-                      () => DropdownButton<ContractStateEnum>(
-                        value: controller.state.contractStateSelectedItem,
-                        onChanged: (value) {
-                          controller.state.contractStateSelectedItem = value;
-                        },
-                        focusColor: Colors.white,
-                        items: [
-                          DropdownMenuItem<ContractStateEnum>(
-                            value: null,
-                            child: Text("全部选择"),
-                          ),
-                          ...ContractStateEnum.values
-                              .map<DropdownMenuItem<ContractStateEnum>>(
-                                  (ContractStateEnum value) {
-                            return DropdownMenuItem<ContractStateEnum>(
-                              value: value,
-                              child: Text(
-                                  controller.ContractStateMap[value.name]!),
-                            );
-                          }).toList()
-                        ],
-                      ),
-                    ),
+                const Text(
+                  '签约状态:',
+                  style: TextStyle(fontSize: 20),
+                ),
+                const SizedBox(
+                  height: 20,
+                ),
+                ContractStateSelectLabelView(
+                  ContractStateEnums: [
+                    ContractStateEnum.Signed,
+                    ContractStateEnum.Cancelled,
+                    ContractStateEnum.Unsigned,
+                    ContractStateEnum.Expired,
+                    ContractStateEnum.Refused,
                   ],
+                  selectContractState:
+                      controller.state.contractStateSelectedItem,
+                  selectRaidoChange: (String value) {
+                    if (value == "0") {
+                      controller.state.contractStateSelectedItem = null;
+                      return;
+                    }
+                    controller.state.contractStateSelectedItem =
+                        ContractStateEnum.values
+                            .where((element) => element.name == value)
+                            .first;
+                  },
                 ),
               ],
             ),
@@ -258,39 +249,6 @@ class PatientListPage extends GetView<PatientListController> {
     );
   }
 
-  Widget _tabRadio({
-    required String title,
-    required dynamic value,
-  }) {
-    return InkWell(
-      onTap: () {
-        controller.changeFilterFounder(value);
-      },
-      child: Container(
-        margin: EdgeInsets.only(right: 15),
-        child: Row(
-          children: [
-            Radio(
-              value: value,
-              groupValue: controller.state.selectBoxFilterFounder,
-              onChanged: (v) {
-                controller.changeFilterFounder(value);
-              },
-            ),
-            Text(
-              title,
-              style: TextStyle(
-                color: controller.state.selectBoxFilterFounder == value
-                    ? const Color(0xff2c77e5)
-                    : const Color(0xff4c4948),
-              ),
-            ),
-          ],
-        ),
-      ),
-    );
-  }
-
   Widget _buildListView() {
     final scrollController = ScrollController();
     scrollController.addListener(

+ 158 - 25
lib/pages/patient/list/widgets/crowd_select_label.dart

@@ -28,25 +28,7 @@ class _CrowdSelectLabelState extends State<CrowdSelectLabelView> {
           runSpacing: 12,
           children: [
             buildItem(LabelDTO(code: "0", labelName: "全选"), context),
-            ...state.normalOptions
-                .where((element) => [
-                      "RQFL_ET",
-                      "RQFL_YF",
-                      "RQFL_LNR",
-                    ].contains(element.code))
-                .map((LabelDTO e) => buildItem(e, context))
-                .toList(),
-            ...state.diseaseOptions
-                .where((element) => [
-                      "CJJB_GXY",
-                      "CJJB_TNB",
-                      "CJJB_YZJSBZA",
-                      "CJJB_FJH",
-                    ].contains(element.code))
-                .map((LabelDTO e) => buildItem(e, context))
-                .toList(),
-            ...state.specialCareOptions
-                .where((element) => [].contains(element.code))
+            ...state.allLabels
                 .map((LabelDTO e) => buildItem(e, context))
                 .toList(),
           ],
@@ -60,10 +42,14 @@ class _CrowdSelectLabelState extends State<CrowdSelectLabelView> {
         label: dto.labelName ?? '',
         isChecked: controller.state.isAllSelect
             ? controller.state.isAllSelect
-            : controller.state.selectedCodes.contains(dto.code),
+            : controller.state.selectedFilterCodes.contains(dto.code),
+        isAllChecked: controller.state.isAllSelect,
         onChanged: (value) {
-          controller.onItemCheckChanged(dto.code!);
-          if (controller.state.selectedCodes.length == 7) {
+          if (controller.state.isAllSelect && dto.code != "0") {
+            return;
+          }
+          controller.onItemCheckFilterChanged(dto.code!);
+          if (controller.state.selectedFilterCodes.length == 7) {
             controller.state.isAllSelect = true;
           }
           setState(() {});
@@ -81,6 +67,9 @@ class VCheckBoxButton extends StatefulWidget {
   /// 是否默认选中
   final bool? isChecked;
 
+  /// 是否默认选中
+  final bool? isAllChecked;
+
   /// 选中状态变更
   final ValueChanged<bool>? onChanged;
 
@@ -89,6 +78,7 @@ class VCheckBoxButton extends StatefulWidget {
     required this.label,
     this.isChecked,
     this.onChanged,
+    this.isAllChecked,
   });
   @override
   State<StatefulWidget> createState() => _VCheckBoxState();
@@ -96,12 +86,16 @@ class VCheckBoxButton extends StatefulWidget {
 
 class _VCheckBoxState extends State<VCheckBoxButton> {
   bool _isChecked = false;
+  bool _isAllChecked = false;
 
   @override
   void initState() {
     if (widget.isChecked != null) {
       _isChecked = widget.isChecked!;
     }
+    if (widget.isAllChecked != null) {
+      _isAllChecked = widget.isAllChecked!;
+    }
     super.initState();
   }
 
@@ -127,9 +121,15 @@ class _VCheckBoxState extends State<VCheckBoxButton> {
               alignment: Alignment.center,
               height: height,
               decoration: BoxDecoration(
-                color: _isChecked ? primaryColor : Colors.white,
+                color: (_isAllChecked && widget.label != "全选")
+                    ? Colors.grey.shade400
+                    : _isChecked
+                        ? primaryColor
+                        : Colors.white,
                 borderRadius: BorderRadius.circular(borderRadius),
-                border: _isChecked ? null : Border.all(color: primaryColor),
+                border: ((_isAllChecked && widget.label != "全选") || _isChecked)
+                    ? null
+                    : Border.all(color: primaryColor),
               ),
               child: Row(
                 mainAxisSize: MainAxisSize.min,
@@ -138,7 +138,11 @@ class _VCheckBoxState extends State<VCheckBoxButton> {
                   Text(
                     widget.label,
                     style: TextStyle(
-                      color: _isChecked ? Colors.white : primaryColor,
+                      color: (_isAllChecked && widget.label != "全选")
+                          ? Colors.white
+                          : _isChecked
+                              ? Colors.white
+                              : primaryColor,
                       fontSize: 16,
                     ),
                   ),
@@ -151,3 +155,132 @@ class _VCheckBoxState extends State<VCheckBoxButton> {
     );
   }
 }
+
+class ContractStateSelectLabelView extends StatefulWidget {
+  final List<ContractStateEnum> ContractStateEnums;
+  final Function selectRaidoChange;
+  final ContractStateEnum? selectContractState;
+
+  const ContractStateSelectLabelView(
+      {super.key,
+      required this.ContractStateEnums,
+      required this.selectRaidoChange,
+      this.selectContractState});
+  @override
+  State<StatefulWidget> createState() => _ContractStateSelectLabelState();
+}
+
+class _ContractStateSelectLabelState
+    extends State<ContractStateSelectLabelView> {
+  late List<ContractStateEnum> ContractStateEnums;
+  String selectContractState = "0";
+
+  final Map<String, String> ContractStateMap = {
+    "Unsigned": "未签约",
+    "Cancelled": "已解约",
+    "Expired": "已过期",
+    "Signed": "已签约",
+    "Voided": "已作废",
+    "Refused": "已拒签",
+  };
+  @override
+  void initState() {
+    super.initState();
+    ContractStateEnums = widget.ContractStateEnums;
+    if (widget.selectContractState != null) {
+      selectContractState = widget.selectContractState!.name;
+    } else {
+      selectContractState = "0";
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Wrap(
+      spacing: 16,
+      runSpacing: 12,
+      children: [
+        buildItem(LabelDTO(code: "0", labelName: "全选"), context),
+        ...ContractStateEnums.map((ContractStateEnum e) => buildItem(
+            LabelDTO(code: e.name, labelName: ContractStateMap[e.name]),
+            context)).toList(),
+      ],
+    );
+  }
+
+  Widget buildItem(LabelDTO dto, BuildContext context) {
+    return InkWell(
+      child: VCheckBoxButton(
+        key: GlobalKey(),
+        label: dto.labelName ?? '',
+        isChecked: selectContractState == dto.code,
+        // isAllChecked: selectContractState == "0",
+        onChanged: (value) {
+          // if (selectContractState == "0" && dto.code != "0") {
+          //   return;
+          // }
+          selectContractState = dto.code ?? '0';
+          widget.selectRaidoChange(dto.code);
+          setState(() {});
+        },
+      ),
+    );
+  }
+}
+
+class ScopeEnquiryResidents extends StatefulWidget {
+  final Function selectRaidoChange;
+  final int? selectIndex;
+
+  const ScopeEnquiryResidents({
+    super.key,
+    required this.selectRaidoChange,
+    this.selectIndex,
+  });
+  @override
+  State<StatefulWidget> createState() => _ScopeEnquiryResidentsState();
+}
+
+class _ScopeEnquiryResidentsState extends State<ScopeEnquiryResidents> {
+  int selectIndex = 0;
+  @override
+  void initState() {
+    super.initState();
+    if (widget.selectIndex != null) {
+      selectIndex = widget.selectIndex!;
+    } else {
+      selectIndex = 0;
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Wrap(
+      spacing: 16,
+      runSpacing: 12,
+      children: [
+        buildItem(LabelDTO(code: "0", labelName: "仅当前医生建档"), context),
+        buildItem(LabelDTO(code: "1", labelName: "当前团队所有居民"), context),
+      ],
+    );
+  }
+
+  Widget buildItem(LabelDTO dto, BuildContext context) {
+    return InkWell(
+      child: VCheckBoxButton(
+        key: GlobalKey(),
+        label: dto.labelName ?? '',
+        isChecked: selectIndex.toString() == dto.code,
+        // isAllChecked: selectContractState == "0",
+        onChanged: (value) {
+          // if (selectContractState == "0" && dto.code != "0") {
+          //   return;
+          // }
+          selectIndex = int.parse(dto.code!);
+          widget.selectRaidoChange(selectIndex);
+          setState(() {});
+        },
+      ),
+    );
+  }
+}