Browse Source

Merge branch 'dev' of http://git.wmzhubo.com/guadoutech/YYHome into dev

glglove 4 months ago
parent
commit
898b658dde
34 changed files with 1391 additions and 475 deletions
  1. 17 17
      packages/cpt_facility/lib/modules/book_confirm/book_confirm_page.dart
  2. 0 3
      packages/cpt_facility/lib/modules/book_confirm/book_confirm_state.dart
  3. 0 29
      packages/cpt_facility/lib/modules/book_confirm/book_confirm_view_model.dart
  4. 0 27
      packages/cpt_facility/lib/modules/book_confirm/book_confirm_view_model.g.dart
  5. 54 33
      packages/cpt_facility/lib/modules/booking/facility_booking_page.dart
  6. 24 4
      packages/cpt_facility/lib/modules/booking/facility_booking_state.dart
  7. 111 15
      packages/cpt_facility/lib/modules/booking/facility_booking_view_model.dart
  8. 1 1
      packages/cpt_facility/lib/modules/booking/facility_booking_view_model.g.dart
  9. 1 1
      packages/cpt_facility/lib/modules/facility/active/facility_active_screen.dart
  10. 3 2
      packages/cpt_facility/lib/modules/facility/active/facility_active_state.dart
  11. 48 70
      packages/cpt_facility/lib/modules/facility/active/facility_active_view_model.dart
  12. 8 7
      packages/cpt_facility/lib/modules/facility/active/item_facility_active.dart
  13. 6 3
      packages/cpt_facility/lib/modules/facility/book/facility_book_screen.dart
  14. 3 2
      packages/cpt_facility/lib/modules/facility/book/facility_book_state.dart
  15. 30 78
      packages/cpt_facility/lib/modules/facility/book/facility_book_view_model.dart
  16. 1 1
      packages/cpt_facility/lib/modules/facility/book/facility_book_view_model.g.dart
  17. 6 4
      packages/cpt_facility/lib/modules/facility/book/item_facility_book.dart
  18. 4 3
      packages/cpt_facility/lib/modules/facility/deposit/facility_deposit_screen.dart
  19. 8 2
      packages/cpt_facility/lib/modules/facility/deposit/facility_deposit_state.dart
  20. 46 68
      packages/cpt_facility/lib/modules/facility/deposit/facility_deposit_view_model.dart
  21. 4 3
      packages/cpt_facility/lib/modules/facility/deposit/item_facility_deposit.dart
  22. 11 0
      packages/cpt_facility/lib/modules/facility/facility_page.dart
  23. 3 2
      packages/cpt_facility/lib/modules/facility/history/facility_history_state.dart
  24. 46 68
      packages/cpt_facility/lib/modules/facility/history/facility_history_view_model.dart
  25. 18 17
      packages/cpt_facility/lib/modules/facility/history/item_facility_history.dart
  26. 40 5
      packages/cpt_facility/lib/router/page/facility_page_router.gr.dart
  27. 1 0
      packages/cpt_form/lib/modules/form/approve/form_approve_screen.dart
  28. 7 1
      packages/cpt_form/lib/modules/form/approve/form_approve_view_model.dart
  29. 86 0
      packages/cs_domain/lib/entity/facility_book_entity.dart
  30. 139 0
      packages/cs_domain/lib/entity/facility_page_entity.dart
  31. 46 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  32. 191 0
      packages/cs_domain/lib/generated/json/facility_book_entity.g.dart
  33. 290 0
      packages/cs_domain/lib/generated/json/facility_page_entity.g.dart
  34. 138 9
      packages/cs_domain/lib/repository/facility_repository.dart

+ 17 - 17
packages/cpt_facility/lib/modules/book_confirm/book_confirm_page.dart

@@ -1,17 +1,19 @@
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/facility_book_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/date_time_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_button.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 import '../../router/page/facility_page_router.dart';
-import 'book_confirm_view_model.dart';
+import '../booking/facility_booking_view_model.dart';
 
 @RoutePage()
 class BookConfirmPage extends HookConsumerWidget {
@@ -28,13 +30,13 @@ class BookConfirmPage extends HookConsumerWidget {
 
   @override
   Widget build(BuildContext context, WidgetRef ref) {
-    final viewModel = ref.watch(bookConfirmViewModelProvider.notifier);
-    final state = ref.watch(bookConfirmViewModelProvider);
+    final viewModel = ref.watch(facilityBookingViewModelProvider.notifier);
+    final state = ref.watch(facilityBookingViewModelProvider);
 
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
-        "Function Room",
+        state.facilityName ?? "",
         showBackButton: true,
         backgroundColor: context.appColors.backgroundWhite,
       ),
@@ -59,9 +61,9 @@ class BookConfirmPage extends HookConsumerWidget {
                     Assets.facilityConfirmDateIcon,
                     28.5,
                     29,
-                    "Tue,24 Oct 2023",
+                    "${DateTimeUtils.getWeekday(state.selectedDate, languageCode: 'en', short: true)}, ${DateTimeUtils.formatDate(state.selectedDate, format: 'dd MMM yyyy')}",
                     null,
-                    "05:00 PM-10:00 PM",
+                    "${state.data?.facilities?[state.index].periods?[state.innerIndex].start}-${state.data?.facilities?[state.index].periods?[state.innerIndex].end}",
                     null,
                   ),
 
@@ -73,9 +75,9 @@ class BookConfirmPage extends HookConsumerWidget {
                     Assets.facilityConfirmFacilityIcon,
                     25.0,
                     30.5,
-                    "Kids party room",
+                    state.facilityName ?? "",
                     null,
-                    "Blue room",
+                    state.data?.facilities?[state.index].name ?? "",
                     null,
                   ),
 
@@ -88,9 +90,9 @@ class BookConfirmPage extends HookConsumerWidget {
                     27.0,
                     22.0,
                     S.current.booking_fee,
-                    "10.80",
+                    state.data?.facilities?[state.index].periods?[state.innerIndex].price,
                     S.current.total,
-                    "\$10.80",
+                    "\$${state.data?.facilities?[state.index].periods?[state.innerIndex].price}",
                   ),
 
                   // 押金
@@ -102,25 +104,24 @@ class BookConfirmPage extends HookConsumerWidget {
                     28.0,
                     26.5,
                     S.current.deposit_hold,
-                    "\$100.00",
+                    "\$${state.data?.facilities?[state.index].periods?[state.innerIndex].deposit}",
                     null,
                     null,
                   ),
 
                   // 添加间隔
                   const SizedBox(height: 7.5),
-
                 ],
               ),
             ),
           ),
 
           // 显示支付信息
-          _paymentInfo(context,ref),
+          _paymentInfo(context, ref),
 
           // 底部按钮
           MyButton(
-            onPressed:viewModel.doPayment,
+            onPressed: viewModel.doPayment,
             text: S.current.proceed_with_payment,
             textColor: Colors.white,
             backgroundColor: context.appColors.btnBgDefault,
@@ -135,7 +136,6 @@ class BookConfirmPage extends HookConsumerWidget {
     );
   }
 
-
   //展示的Item
   Widget _buildConfirmItem(
     BuildContext context,
@@ -235,8 +235,8 @@ class BookConfirmPage extends HookConsumerWidget {
   }
 
   //底部的支付信息
-  Widget _paymentInfo(BuildContext context,WidgetRef ref) {
-    final viewModel = ref.watch(bookConfirmViewModelProvider.notifier);
+  Widget _paymentInfo(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(facilityBookingViewModelProvider.notifier);
 
     return Container(
       padding: const EdgeInsets.symmetric(vertical: 17.5, horizontal: 23),

+ 0 - 3
packages/cpt_facility/lib/modules/book_confirm/book_confirm_state.dart

@@ -1,3 +0,0 @@
-class BookConfirmState{
-
-}

+ 0 - 29
packages/cpt_facility/lib/modules/book_confirm/book_confirm_view_model.dart

@@ -1,29 +0,0 @@
-import 'package:cpt_facility/modules/detail/facility_detail_page.dart';
-import 'package:riverpod_annotation/riverpod_annotation.dart';
-import 'package:router/componentRouter/component_service_manager.dart';
-
-import 'book_confirm_state.dart';
-import 'package:plugin_platform/engine/toast/toast_engine.dart';
-
-part 'book_confirm_view_model.g.dart';
-
-@riverpod
-class BookConfirmViewModel extends _$BookConfirmViewModel {
-  @override
-  BookConfirmState build() {
-    return BookConfirmState();
-  }
-
-  //执行支付
-  void doPayment() {
-    ToastEngine.show("点击了确定");
-
-    FacilityDetailPage.startWithPop2Main();
-  }
-
-  //选择银行卡页面
-  void gotoChooseCardPage() {
-    ComponentServiceManager().paymentService.startChooseCardPage();
-  }
-
-}

+ 0 - 27
packages/cpt_facility/lib/modules/book_confirm/book_confirm_view_model.g.dart

@@ -1,27 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'book_confirm_view_model.dart';
-
-// **************************************************************************
-// RiverpodGenerator
-// **************************************************************************
-
-String _$bookConfirmViewModelHash() =>
-    r'fdd3f7fffe200110bd14f0d3b2ce2d83c1d6a74a';
-
-/// See also [BookConfirmViewModel].
-@ProviderFor(BookConfirmViewModel)
-final bookConfirmViewModelProvider = AutoDisposeNotifierProvider<
-    BookConfirmViewModel, BookConfirmState>.internal(
-  BookConfirmViewModel.new,
-  name: r'bookConfirmViewModelProvider',
-  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
-      ? null
-      : _$bookConfirmViewModelHash,
-  dependencies: null,
-  allTransitiveDependencies: null,
-);
-
-typedef _$BookConfirmViewModel = AutoDisposeNotifier<BookConfirmState>;
-// ignore_for_file: type=lint
-// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

+ 54 - 33
packages/cpt_facility/lib/modules/booking/facility_booking_page.dart

@@ -4,6 +4,7 @@ import 'package:cpt_facility/modules/location/facility_location_page.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/facility_book_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
@@ -25,14 +26,17 @@ import 'facility_booking_view_model.dart';
 
 @RoutePage()
 class FacilityBookingPage extends HookConsumerWidget {
-  const FacilityBookingPage({Key? key}) : super(key: key);
+  final String facilityId;
+  final String facilityName;
+
+  const FacilityBookingPage({Key? key, required this.facilityId, required this.facilityName}) : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({BuildContext? context, required String facilityId, required String facilityName}) {
     if (context != null) {
-      context.router.push(const FacilityBookingPageRoute());
+      context.router.push(FacilityBookingPageRoute(facilityId: facilityId, facilityName: facilityName));
     } else {
-      appRouter.push(const FacilityBookingPageRoute());
+      appRouter.push(FacilityBookingPageRoute(facilityId: facilityId, facilityName: facilityName));
     }
   }
 
@@ -43,27 +47,35 @@ class FacilityBookingPage extends HookConsumerWidget {
 
     useEffect(() {
       // 组件挂载时执行 - 执行接口请求
-      Future.microtask(() => viewModel.fetchListByDate());
+      Future.microtask(() {
+        viewModel.setFacilityId(facilityId, facilityName);
+        viewModel.fetchListByDate();
+      });
       return () {
         // 组件卸载时执行
       };
     }, []);
 
     return Scaffold(
-      appBar: MyAppBar.appBar(context, "Kids party room", backgroundColor: context.appColors.backgroundWhite, actions: [
-        //去设施小区的定位图片
-        const MyAssetImage(
-          Assets.facilityTitleLocationIcon,
-          width: 44,
-          height: 44,
-        ).marginOnly(right: 3).onTap(() {
-          FacilityLocationPage.startInstance(context: context, imageUrls: [
-            "https://mz.eastday.com/63074197.jpeg",
-            "https://t10.baidu.com/it/u=3562774827,189123978&fm=30&app=106&f=PNG?w=640&h=479&s=DFBA6EC80A72B7CC02FC011F0300D0C2",
-            "https://img1.baidu.com/it/u=4090167392,148087489&fm=253&fmt=auto&app=138&f=JPEG?w=484&h=300"
-          ]);
-        }),
-      ]),
+      appBar: MyAppBar.appBar(
+        context,
+        facilityName,
+        backgroundColor: context.appColors.backgroundWhite,
+        actions: [
+          //去设施小区的定位图片
+          const MyAssetImage(
+            Assets.facilityTitleLocationIcon,
+            width: 44,
+            height: 44,
+          ).marginOnly(right: 3).onTap(() {
+            FacilityLocationPage.startInstance(context: context, imageUrls: [
+              "https://mz.eastday.com/63074197.jpeg",
+              "https://t10.baidu.com/it/u=3562774827,189123978&fm=30&app=106&f=PNG?w=640&h=479&s=DFBA6EC80A72B7CC02FC011F0300D0C2",
+              "https://img1.baidu.com/it/u=4090167392,148087489&fm=253&fmt=auto&app=138&f=JPEG?w=484&h=300"
+            ]);
+          }),
+        ],
+      ),
       backgroundColor: context.appColors.backgroundDark,
       body: Column(
         mainAxisSize: MainAxisSize.max,
@@ -93,7 +105,6 @@ class FacilityBookingPage extends HookConsumerWidget {
           WeeklyCalendar(
             selectedDate: state.selectedDate,
             onChangedSelectedDate: (dateTime) {
-              Log.d("onChangedSelectedDate选中 - ${dateTime}}");
               viewModel.changeSelectedDate(dateTime);
             },
           ),
@@ -108,7 +119,7 @@ class FacilityBookingPage extends HookConsumerWidget {
             successSliverWidget: [
               SliverToBoxAdapter(
                 child: MyTextView(
-                  S.current.quota_left_msg(1, DateTimeUtils.formatDate(state.selectedDate, format: 'dd MMM yyyy')),
+                  S.current.quota_left_msg(state.data?.remainQuota ?? 0, state.data?.quotaResetOn ?? "-"),
                   marginTop: 7,
                   marginBottom: 15,
                   textColor: context.appColors.textBlack,
@@ -119,9 +130,9 @@ class FacilityBookingPage extends HookConsumerWidget {
               SliverList(
                   delegate: SliverChildBuilderDelegate(
                 (context, index) {
-                  return _buildFacilityOption(context, state.datas[index]);
+                  return _buildFacilityOption(context, ref, state.data?.facilities?[index], index);
                 },
-                childCount: state.datas.length,
+                childCount: state.data?.facilities?.length,
               ))
             ],
           ).marginOnly(top: 5).expanded(),
@@ -170,7 +181,8 @@ class FacilityBookingPage extends HookConsumerWidget {
   }
 
   //生产当前设施的选项
-  Widget _buildFacilityOption(BuildContext context, String item) {
+  Widget _buildFacilityOption(BuildContext context, WidgetRef ref, FacilityBookFacilities? item, int index) {
+    final viewModel = ref.watch(facilityBookingViewModelProvider.notifier);
     return Column(
       children: [
         Container(
@@ -179,7 +191,7 @@ class FacilityBookingPage extends HookConsumerWidget {
           color: context.appColors.btnBgDefault,
           child: Center(
             child: MyTextView(
-              item,
+              item?.name ?? "",
               fontSize: 16,
               textColor: Colors.white,
               textAlign: TextAlign.center,
@@ -196,11 +208,15 @@ class FacilityBookingPage extends HookConsumerWidget {
             mainAxisSpacing: 6.5,
             crossAxisSpacing: 6.5,
           ),
-          itemCount: 4,
-          itemBuilder: (context, index) {
+          itemCount: item?.periods?.length,
+          itemBuilder: (context, innerIndex) {
             return Container(
               decoration: BoxDecoration(
-                color: context.appColors.whiteBG,
+                color: item?.periods?[innerIndex].selected == true
+                    ? context.appColors.orangeBG
+                    : item?.periods?[innerIndex].enable == true
+                        ? context.appColors.whiteBG
+                        : context.appColors.disEnableGray,
                 borderRadius: BorderRadius.circular(5.0),
               ),
               child: Column(
@@ -208,20 +224,25 @@ class FacilityBookingPage extends HookConsumerWidget {
                 mainAxisAlignment: MainAxisAlignment.center, // 垂直居中
                 children: [
                   MyTextView(
-                    "10.00 AM",
+                    item?.periods?[innerIndex].start ?? "",
                     fontSize: 12,
-                    textColor: context.appColors.textBlack,
+                    textColor: item?.periods?[innerIndex].selected == true ? context.appColors.textWhite : context.appColors.textBlack,
                     isFontMedium: true,
                   ),
                   MyTextView(
-                    "04.00 PM",
+                    item?.periods?[innerIndex].end ?? "",
                     fontSize: 12,
-                    textColor: context.appColors.textBlack,
+                    textColor: item?.periods?[innerIndex].selected == true ? context.appColors.textWhite : context.appColors.textBlack,
                     isFontMedium: true,
                   ),
                 ],
               ),
-            );
+            ).onTap(() {
+              //点击选中,可用并且未选中的情况下点击选中
+              if (item?.periods?[innerIndex].enable == true && item?.periods?[innerIndex].selected == false) {
+                viewModel.selectPeriods(index, innerIndex);
+              }
+            });
           },
         ).marginSymmetric(horizontal: 10, vertical: 17),
       ],

+ 24 - 4
packages/cpt_facility/lib/modules/booking/facility_booking_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/facility_book_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class FacilityBookingState {
@@ -8,28 +9,47 @@ class FacilityBookingState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<String> datas;
+  //网络请求数据
+  FacilityBookEntity? data;
+
+  String? facilityId;
+  String? facilityName;
+
+  int index;
+  int innerIndex;
 
   // ===================================  Begin  ↓  ===================================
 
   FacilityBookingState({
     required this.selectedDate,
     this.loadingState = LoadState.State_Loading,
-    required this.datas,
+    this.data,
     this.errorMessage,
+    this.facilityId,
+    this.facilityName,
+    this.index = 0,
+    this.innerIndex = 0,
   });
 
   FacilityBookingState copyWith({
     DateTime? selectedDate,
     LoadState? loadingState,
     String? errorMessage,
-    List<String>? datas,
+    String? facilityId,
+    String? facilityName,
+    FacilityBookEntity? data,
+    int? index,
+    int? innerIndex,
   }) {
     return FacilityBookingState(
       selectedDate: selectedDate ?? this.selectedDate,
       loadingState: loadingState ?? this.loadingState,
       errorMessage: errorMessage ?? this.errorMessage,
-      datas: datas ?? this.datas,
+      data: data,
+      facilityId: facilityId ?? this.facilityId,
+      facilityName: facilityName ?? this.facilityName,
+      index: index ?? this.index,
+      innerIndex: innerIndex ?? this.innerIndex,
     );
   }
 }

+ 111 - 15
packages/cpt_facility/lib/modules/booking/facility_booking_view_model.dart

@@ -1,29 +1,41 @@
-import 'package:cs_resources/generated/l10n.dart';
+import 'package:domain/entity/facility_book_entity.dart';
+import 'package:domain/repository/facility_repository.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
 import 'package:shared/utils/log_utils.dart';
-import 'package:shared/utils/util.dart';
 import 'package:widgets/load_state_layout.dart';
 import '../book_confirm/book_confirm_page.dart';
+import '../detail/facility_detail_page.dart';
 import 'facility_booking_state.dart';
 
 part 'facility_booking_view_model.g.dart';
 
 @riverpod
-class FacilityBookingViewModel extends _$FacilityBookingViewModel {
+class FacilityBookingViewModel extends _$FacilityBookingViewModel with DioCancelableMixin {
+  late final FacilityRepository _facilityRepository;
+
   @override
   FacilityBookingState build() {
+    _facilityRepository = ref.read(facilityRepositoryProvider);
+
     final state = FacilityBookingState(
       selectedDate: DateTime.now(),
-      datas: [],
     );
     initListener(state);
-    ref.onDispose(() {
+    registerCancellation(callback: () {
       onDispose(state);
     });
 
     return state;
   }
 
+  //设置设施的ID
+  void setFacilityId(String facilityId, String facilityName) {
+    state = state.copyWith(facilityId: facilityId, facilityName: facilityName);
+  }
+
   //修改选中的时间
   void changeSelectedDate(DateTime dateTime) {
     state = state.copyWith(selectedDate: dateTime);
@@ -40,20 +52,30 @@ class FacilityBookingViewModel extends _$FacilityBookingViewModel {
   Future fetchListByDate() async {
     state = state.copyWith(loadingState: LoadState.State_Loading);
 
-    await Future.delayed(const Duration(milliseconds: 1500));
-
-    List<String> list = ["Orange Room", "Purple Room", "Red Room"];
+    // 获取列表
+    var result = await _facilityRepository.fetchFacilityDateDetail(
+      id: state.facilityId,
+      date: state.selectedDate,
+      cancelToken: cancelToken,
+    );
 
-    if (list.isNotEmpty) {
-      //加载成功
-      state = state.copyWith(datas: list, loadingState: LoadState.State_Success);
+    // 处理数据
+    if (result.isSuccess) {
+      if (result.data != null) {
+        //有数据
+        state = state.copyWith(data: result.data, loadingState: LoadState.State_Success);
+      } else {
+        //展示无数据的布局
+        state = state.copyWith(data: null, loadingState: LoadState.State_Empty, errorMessage: null);
+      }
     } else {
-      //无数据
-      state = state.copyWith(datas: [], loadingState: LoadState.State_Empty);
+      state = state.copyWith(data: null, loadingState: LoadState.State_Error, errorMessage: result.errorMsg);
     }
   }
 
-  void initListener(FacilityBookingState state) {}
+  void initListener(FacilityBookingState state) {
+    Log.d("FacilityBookingViewModel - initListener");
+  }
 
   void onDispose(FacilityBookingState state) {
     Log.d("FacilityBookingViewModel - onDispose");
@@ -61,6 +83,80 @@ class FacilityBookingViewModel extends _$FacilityBookingViewModel {
 
   //去付款确认页面
   void gotoConfirmPage() {
-    BookConfirmPage.startInstance();
+    if (state.data == null) return;
+
+    //找到数据中的已选中数据
+    final selectedPeriods = <FacilityBookFacilitiesPeriods>[];
+    for (var facility in state.data!.facilities!) {
+      final periods = facility.periods ?? [];
+
+      // 筛选出已选中的 periods,并添加到结果列表
+      selectedPeriods.addAll(
+        periods.where((period) => period.selected).toList(),
+      );
+    }
+
+    if (selectedPeriods.isEmpty) {
+      ToastEngine.show("Select Facility And Date");
+    } else {
+      BookConfirmPage.startInstance();
+    }
+  }
+
+  //选中指定的Task
+  void selectPeriods(int index, int innerIndex) {
+    // 创建新的 periods 列表来更新状态
+    final updatedFacilities = state.data!.facilities!.map((facility) {
+      // 创建新的 periods 列表
+      final updatedPeriods = facility.periods!.map((period) {
+        return FacilityBookFacilitiesPeriods()
+          ..id = period.id
+          ..start = period.start
+          ..end = period.end
+          ..price = period.price
+          ..deposit = period.deposit
+          ..enable = period.enable
+          ..selected = false; // 设置默认未选中
+      }).toList();
+
+      return FacilityBookFacilities()
+        ..id = facility.id
+        ..name = facility.name
+        ..periods = updatedPeriods;
+    }).toList();
+
+    // 设置指定索引的 selected 为 true
+    updatedFacilities[index].periods?[innerIndex].selected = true;
+
+    // 更新 FacilityBookEntity 的状态
+    state = state.copyWith(
+      data: FacilityBookEntity()
+        ..remainQuota = state.data!.remainQuota
+        ..quotaResetOn = state.data!.quotaResetOn
+        ..facilityType = state.data!.facilityType
+        ..facilities = updatedFacilities, //只更新了facilities对象
+      index: index,
+      innerIndex: innerIndex,
+    );
+  }
+
+  //确认页面执行支付
+  void doPayment() async {
+    final result = await _facilityRepository.submitBooking(
+      periodId: state.data?.facilities?[state.index].periods?[state.innerIndex].id,
+      date: state.selectedDate,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      FacilityDetailPage.startWithPop2Main();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "UnKnow Error");
+    }
+  }
+
+  //确认页面选择银行卡页面
+  void gotoChooseCardPage() {
+    ComponentServiceManager().paymentService.startChooseCardPage();
   }
 }

+ 1 - 1
packages/cpt_facility/lib/modules/booking/facility_booking_view_model.g.dart

@@ -7,7 +7,7 @@ part of 'facility_booking_view_model.dart';
 // **************************************************************************
 
 String _$facilityBookingViewModelHash() =>
-    r'c9a681e01791881d17dc58b3a8e45153e6fe62ad';
+    r'5bfb55d67994d66800bb220385e48954d6aec449';
 
 /// See also [FacilityBookingViewModel].
 @ProviderFor(FacilityBookingViewModel)

+ 1 - 1
packages/cpt_facility/lib/modules/facility/active/facility_active_screen.dart

@@ -44,7 +44,7 @@ class FacilityActiveScreen extends HookConsumerWidget {
                 delegate: SliverChildBuilderDelegate(
                       (context, index) {
                     return FacilityActiveItem(index: index, item: state.datas[index]).onTap((){
-                      FacilityDetailPage.startInstance(context: context);
+                      // FacilityDetailPage.startInstance(context: context);
                     });
                   },
                   childCount: state.datas.length,

+ 3 - 2
packages/cpt_facility/lib/modules/facility/active/facility_active_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/facility_page_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class FacilityActiveState {
@@ -6,7 +7,7 @@ class FacilityActiveState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<String> datas; //页面列表数据
+  List<FacilityPageList> datas; //页面列表数据
 
   // ===================================  Begin  ↓  ===================================
 
@@ -20,7 +21,7 @@ class FacilityActiveState {
     LoadState? loadingState,
     String? errorMessage,
     bool? needShowPlaceholder,
-    List<String>? datas,
+    List<FacilityPageList>? datas,
   }) {
     return FacilityActiveState(
       errorMessage: errorMessage ?? this.errorMessage,

+ 48 - 70
packages/cpt_facility/lib/modules/facility/active/facility_active_view_model.dart

@@ -1,3 +1,6 @@
+import 'package:domain/entity/facility_page_entity.dart';
+import 'package:domain/repository/facility_repository.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
@@ -8,19 +11,23 @@ import 'facility_active_state.dart';
 part 'facility_active_view_model.g.dart';
 
 @riverpod
-class FacilityActiveViewModel extends _$FacilityActiveViewModel {
+class FacilityActiveViewModel extends _$FacilityActiveViewModel with DioCancelableMixin {
+  late final FacilityRepository _facilityRepository;
   var _curPage = 1; //请求参数当前的页面
   var _needShowPlaceholder = true; //是否展示LoadingView
 
   // Refresh 控制器
   final EasyRefreshController refreshController = EasyRefreshController(
-    controlFinishRefresh: true,  //允许刷新
-    controlFinishLoad: true,   //允许加载
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
   );
 
   @override
   FacilityActiveState build() {
-    return FacilityActiveState(datas: []);
+    _facilityRepository = ref.read(facilityRepositoryProvider);
+    final state = FacilityActiveState(datas: []);
+    registerCancellation();
+    return state;
   }
 
   //刷新页面状态
@@ -53,78 +60,49 @@ class FacilityActiveViewModel extends _$FacilityActiveViewModel {
       changeLoadingState(LoadState.State_Loading, null);
     }
 
-    // 获取 Applied 列表
-    // var listResult = await _jobRepository.fetchJobAppliedList(
-    //   state.jobId,
-    //   state.selectedStatusId,
-    //   state.keyword,
-    //   curPage: _curPage,
-    //   cancelToken: cancelToken,
-    // );
-    //
-    // // 处理数据
-    // if (listResult.isSuccess) {
-    //   handleList(listResult.data?.rows);
-    // } else {
-    //   errorMessage = listResult.errorMsg;
-    //   changeLoadingState(LoadState.State_Error);
-    // }
+    // 获取列表
+    var listResult = await _facilityRepository.fetchFacilityActiveList(
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
 
-
-    await Future.delayed(const Duration(milliseconds: 1500));
-
-    final List<String> list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
-
-    if (_curPage == 1) {
-      //刷新的方式
-      state = state.copyWith(datas: list);
-      refreshController.finishRefresh();
-
-      //更新展示的状态
-      changeLoadingState(LoadState.State_Success, null);
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.list);
     } else {
-      //加载更多
-      final allList = state.datas;
-      allList.addAll(list);
-      state.datas.addAll(list);
-
-      refreshController.finishLoad();
-
-      state = state.copyWith(datas: allList);
+      changeLoadingState(LoadState.State_Error, listResult.errorMsg);
     }
 
     // 最后赋值
     _needShowPlaceholder = false;
   }
 
-// 处理数据与展示的逻辑
-// void handleList(List<JobAppliedListSGRows>? list) {
-//   if (list != null && list.isNotEmpty) {
-//     //有数据,判断是刷新还是加载更多的数据
-//     if (_curPage == 1) {
-//       //刷新的方式
-//       state.datas.clear();
-//       state.datas.addAll(list);
-//       refreshController.finishRefresh();
-//
-//       //更新展示的状态
-//       changeLoadingState(LoadState.State_Success);
-//     } else {
-//       //加载更多
-//       state.datas.addAll(list);
-//       refreshController.finishLoad();
-//       update();
-//     }
-//   } else {
-//     if (_curPage == 1) {
-//       //展示无数据的布局
-//       state.datas.clear();
-//       changeLoadingState(LoadState.State_Empty);
-//       refreshController.finishRefresh();
-//     } else {
-//       //展示加载完成,没有更多数据了
-//       refreshController.finishLoad(IndicatorResult.noMore);
-//     }
-//   }
-// }
+  // 处理数据与展示的逻辑
+  void handleList(List<FacilityPageList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state = state.copyWith(datas: list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        state.datas.addAll(List<FacilityPageList>.from(state.datas)..addAll(list));
+        refreshController.finishLoad();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state = state.copyWith(datas: []);
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
 }

+ 8 - 7
packages/cpt_facility/lib/modules/facility/active/item_facility_active.dart

@@ -1,6 +1,7 @@
 import 'package:cpt_facility/modules/facility/active/facility_active_screen.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/facility_page_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_text_view.dart';
@@ -8,7 +9,7 @@ import 'package:widgets/my_text_view.dart';
 ///  设施的Active的Item
 class FacilityActiveItem extends StatelessWidget {
   final int index;
-  final String item;
+  final FacilityPageList item;
 
   const FacilityActiveItem({
     required this.index,
@@ -34,7 +35,7 @@ class FacilityActiveItem extends StatelessWidget {
             children: [
               //设施
               MyTextView(
-                "Kids party room",
+                item.facility?.type?.name ?? "",
                 fontSize: 16,
                 maxLines: 3,
                 textColor: context.appColors.textBlack,
@@ -43,7 +44,7 @@ class FacilityActiveItem extends StatelessWidget {
 
               //分类
               MyTextView(
-                "Blue room",
+                item.facility?.name ?? "",
                 fontSize: 14,
                 marginTop: 3,
                 textColor: context.appColors.textBlack,
@@ -52,7 +53,7 @@ class FacilityActiveItem extends StatelessWidget {
 
               //预订人
               MyTextView(
-                S.current.booked_by_someone("Wu Bing Bing"),
+                S.current.booked_by_someone(item.account?.name ?? ""),
                 fontSize: 14,
                 marginTop: 3,
                 textColor: context.appColors.textBlack,
@@ -61,7 +62,7 @@ class FacilityActiveItem extends StatelessWidget {
 
               //日期
               MyTextView(
-                "Tue,24 Oct 2023",
+                item.booking?.date ?? "",
                 fontSize: 14,
                 marginTop: 16,
                 textColor: context.appColors.textBlack,
@@ -70,7 +71,7 @@ class FacilityActiveItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                "05:00 PM-10:00 PM",
+                "${item.booking?.start ?? ""}-${item.booking?.end ?? ""}",
                 fontSize: 14,
                 marginBottom: 7,
                 marginTop: 3,
@@ -113,7 +114,7 @@ class FacilityActiveItem extends StatelessWidget {
           ).expanded(),
           Column(
             mainAxisSize: MainAxisSize.min,
-            mainAxisAlignment:MainAxisAlignment.start,
+            mainAxisAlignment: MainAxisAlignment.start,
             crossAxisAlignment: CrossAxisAlignment.start,
             children: [
               //查看按钮

+ 6 - 3
packages/cpt_facility/lib/modules/facility/book/facility_book_screen.dart

@@ -25,13 +25,12 @@ class FacilityBookScreen extends HookConsumerWidget {
       };
     }, []);
 
-    return Container(
+    return SizedBox(
       width: double.infinity,
       height: double.infinity,
       child: EasyRefresh(
         controller: viewModel.refreshController,
         onRefresh: viewModel.onRefresh,
-        onLoad: viewModel.loadMore,
         child: LoadStateLayout(
           state: state.loadingState,
           errorMessage: state.errorMessage,
@@ -43,7 +42,11 @@ class FacilityBookScreen extends HookConsumerWidget {
                 delegate: SliverChildBuilderDelegate(
               (context, index) {
                 return FacilityBookItem(index: index, item: state.datas[index]).onTap(() {
-                  FacilityBookingPage.startInstance(context: context);
+                  FacilityBookingPage.startInstance(
+                    context: context,
+                    facilityId: state.datas[index].id ?? "",
+                    facilityName: state.datas[index].name ?? "",
+                  );
                 });
               },
               childCount: state.datas.length,

+ 3 - 2
packages/cpt_facility/lib/modules/facility/book/facility_book_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/id_name_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class FacilityBookState {
@@ -6,7 +7,7 @@ class FacilityBookState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<String> datas; //页面列表数据
+  List<IdNameEntity> datas; //页面列表数据
 
   // ===================================  Begin  ↓  ===================================
 
@@ -20,7 +21,7 @@ class FacilityBookState {
     LoadState? loadingState,
     String? errorMessage,
     bool? needShowPlaceholder,
-    List<String>? datas,
+    List<IdNameEntity>? datas,
   }) {
     return FacilityBookState(
       errorMessage: errorMessage ?? this.errorMessage,

+ 30 - 78
packages/cpt_facility/lib/modules/facility/book/facility_book_view_model.dart

@@ -1,3 +1,6 @@
+import 'package:domain/entity/id_name_entity.dart';
+import 'package:domain/repository/facility_repository.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
@@ -8,19 +11,22 @@ import 'facility_book_state.dart';
 part 'facility_book_view_model.g.dart';
 
 @riverpod
-class FacilityBookViewModel extends _$FacilityBookViewModel {
-  var _curPage = 1; //请求参数当前的页面
+class FacilityBookViewModel extends _$FacilityBookViewModel with DioCancelableMixin{
+  late final FacilityRepository _facilityRepository;
   var _needShowPlaceholder = true; //是否展示LoadingView
 
   // Refresh 控制器
   final EasyRefreshController refreshController = EasyRefreshController(
     controlFinishRefresh: true,  //允许刷新
-    controlFinishLoad: true,   //允许加载
+    controlFinishLoad: false,   //允许加载
   );
 
   @override
   FacilityBookState build() {
-    return FacilityBookState(datas: []);
+    _facilityRepository = ref.read(facilityRepositoryProvider);
+   final state = FacilityBookState(datas: []);
+   registerCancellation();
+    return state;
   }
 
   //刷新页面状态
@@ -30,19 +36,11 @@ class FacilityBookViewModel extends _$FacilityBookViewModel {
 
   // Refresh 刷新事件
   Future onRefresh() async {
-    _curPage = 1;
-    fetchList();
-  }
-
-  // Refresh 加载事件
-  Future loadMore() async {
-    _curPage++;
     fetchList();
   }
 
   // 重试请求
   Future retryRequest() async {
-    _curPage = 1;
     _needShowPlaceholder = true;
     fetchList();
   }
@@ -53,78 +51,32 @@ class FacilityBookViewModel extends _$FacilityBookViewModel {
       changeLoadingState(LoadState.State_Loading, null);
     }
 
-    // 获取 Applied 列表
-    // var listResult = await _jobRepository.fetchJobAppliedList(
-    //   state.jobId,
-    //   state.selectedStatusId,
-    //   state.keyword,
-    //   curPage: _curPage,
-    //   cancelToken: cancelToken,
-    // );
-    //
-    // // 处理数据
-    // if (listResult.isSuccess) {
-    //   handleList(listResult.data?.rows);
-    // } else {
-    //   errorMessage = listResult.errorMsg;
-    //   changeLoadingState(LoadState.State_Error);
-    // }
-
-
-    await Future.delayed(const Duration(milliseconds: 1500));
-
-    final List<String> list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
-
-    if (_curPage == 1) {
-      //刷新的方式
-      state = state.copyWith(datas: list);
-      refreshController.finishRefresh();
+    // 获取列表
+    var result = await _facilityRepository.fetchFacilityList(
+      cancelToken: cancelToken,
+    );
 
-      //更新展示的状态
-      changeLoadingState(LoadState.State_Success, null);
+    // 处理数据
+    if (result.isSuccess) {
+      handleList(result.list);
     } else {
-      //加载更多
-      final allList = state.datas;
-      allList.addAll(list);
-      state.datas.addAll(list);
-
-      refreshController.finishLoad();
-
-      state = state.copyWith(datas: allList);
+      changeLoadingState(LoadState.State_Error, result.errorMsg);
     }
 
     // 最后赋值
     _needShowPlaceholder = false;
   }
 
-// 处理数据与展示的逻辑
-// void handleList(List<JobAppliedListSGRows>? list) {
-//   if (list != null && list.isNotEmpty) {
-//     //有数据,判断是刷新还是加载更多的数据
-//     if (_curPage == 1) {
-//       //刷新的方式
-//       state.datas.clear();
-//       state.datas.addAll(list);
-//       refreshController.finishRefresh();
-//
-//       //更新展示的状态
-//       changeLoadingState(LoadState.State_Success);
-//     } else {
-//       //加载更多
-//       state.datas.addAll(list);
-//       refreshController.finishLoad();
-//       update();
-//     }
-//   } else {
-//     if (_curPage == 1) {
-//       //展示无数据的布局
-//       state.datas.clear();
-//       changeLoadingState(LoadState.State_Empty);
-//       refreshController.finishRefresh();
-//     } else {
-//       //展示加载完成,没有更多数据了
-//       refreshController.finishLoad(IndicatorResult.noMore);
-//     }
-//   }
-// }
+  // 处理数据与展示的逻辑
+  void handleList(List<IdNameEntity>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据
+      state = state.copyWith(datas: list, loadingState: LoadState.State_Success);
+    } else {
+      //展示无数据的布局
+      state = state.copyWith(datas: [], loadingState: LoadState.State_Empty, errorMessage: null);
+    }
+
+    refreshController.finishRefresh();
+  }
 }

+ 1 - 1
packages/cpt_facility/lib/modules/facility/book/facility_book_view_model.g.dart

@@ -7,7 +7,7 @@ part of 'facility_book_view_model.dart';
 // **************************************************************************
 
 String _$facilityBookViewModelHash() =>
-    r'a2eda52600285b2e37b66f90bff7c2402bb40cdc';
+    r'a1ae4da61a6245c401083faabca3a6c94b971a4d';
 
 /// See also [FacilityBookViewModel].
 @ProviderFor(FacilityBookViewModel)

+ 6 - 4
packages/cpt_facility/lib/modules/facility/book/item_facility_book.dart

@@ -1,13 +1,16 @@
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/id_name_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 
+import '../facility_types.dart';
+
 ///  设施的Book的Item
 class FacilityBookItem extends StatelessWidget {
   final int index;
-  final String item;
+  final IdNameEntity item;
 
   const FacilityBookItem({
     required this.index,
@@ -33,11 +36,10 @@ class FacilityBookItem extends StatelessWidget {
             "https://img0.baidu.com/it/u=2679587808,2501833998&fm=253&fmt=auto&app=120&f=JPEG?w=372&h=400",
             width: 38.5,
           ),
-
           MyTextView(
-            "Function Room",
+            item.name ?? "-",
             marginLeft: 17,
-            fontSize: 15,
+            fontSize: 15.5,
             textColor: context.appColors.textBlack,
             isFontMedium: true,
           ).expanded(),

+ 4 - 3
packages/cpt_facility/lib/modules/facility/deposit/facility_deposit_screen.dart

@@ -48,7 +48,7 @@ class FacilityDepositScreen extends HookConsumerWidget {
             SliverList(
                 delegate: SliverChildBuilderDelegate(
               (context, index) {
-                return FacilityDepositItem(index: index, item: state.datas[index]).onTap((){
+                return FacilityDepositItem(index: index, item: state.datas[index]).onTap(() {
                   FacilityDetailPage.startInstance(context: context);
                 });
               },
@@ -65,6 +65,7 @@ class FacilityDepositScreen extends HookConsumerWidget {
 
   //头布局
   _buildHeaderWidget(BuildContext context, WidgetRef ref) {
+    final state = ref.watch(facilityDepositViewModelProvider);
     return SliverToBoxAdapter(
       child: Container(
         width: double.infinity,
@@ -94,7 +95,7 @@ class FacilityDepositScreen extends HookConsumerWidget {
             Container(
               width: double.infinity,
               padding: const EdgeInsets.all(26),
-              decoration:  BoxDecoration(
+              decoration: BoxDecoration(
                 color: context.appColors.whiteSecondBG,
                 borderRadius: const BorderRadius.only(
                   bottomLeft: Radius.circular(5),
@@ -102,7 +103,7 @@ class FacilityDepositScreen extends HookConsumerWidget {
                 ),
               ),
               child: MyTextView(
-                "\$ 200.00",
+                "\$ ${state.totalDeposit ?? "-"}",
                 fontSize: 29,
                 fontWeight: FontWeight.w600,
                 textAlign: TextAlign.center,

+ 8 - 2
packages/cpt_facility/lib/modules/facility/deposit/facility_deposit_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/facility_page_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class FacilityDepositState {
@@ -6,13 +7,16 @@ class FacilityDepositState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<String> datas; //页面列表数据
+  String? totalDeposit;  //总金额
+
+  List<FacilityPageList> datas; //页面列表数据
 
   // ===================================  Begin  ↓  ===================================
 
   FacilityDepositState({
     this.loadingState = LoadState.State_Loading,
     this.errorMessage,
+    this.totalDeposit,
     required this.datas,
   });
 
@@ -20,12 +24,14 @@ class FacilityDepositState {
     LoadState? loadingState,
     String? errorMessage,
     bool? needShowPlaceholder,
-    List<String>? datas,
+    List<FacilityPageList>? datas,
+    String? totalDeposit,
   }) {
     return FacilityDepositState(
       errorMessage: errorMessage ?? this.errorMessage,
       loadingState: loadingState ?? this.loadingState,
       datas: datas ?? this.datas,
+      totalDeposit: totalDeposit ?? this.totalDeposit,
     );
   }
 }

+ 46 - 68
packages/cpt_facility/lib/modules/facility/deposit/facility_deposit_view_model.dart

@@ -1,5 +1,7 @@
+import 'package:domain/entity/facility_page_entity.dart';
+import 'package:domain/repository/facility_repository.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
-import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 
@@ -8,7 +10,8 @@ import 'facility_deposit_state.dart';
 part 'facility_deposit_view_model.g.dart';
 
 @riverpod
-class FacilityDepositViewModel extends _$FacilityDepositViewModel {
+class FacilityDepositViewModel extends _$FacilityDepositViewModel with DioCancelableMixin{
+  late final FacilityRepository _facilityRepository;
   var _curPage = 1; //请求参数当前的页面
   var _needShowPlaceholder = true; //是否展示LoadingView
 
@@ -20,7 +23,9 @@ class FacilityDepositViewModel extends _$FacilityDepositViewModel {
 
   @override
   FacilityDepositState build() {
+    _facilityRepository = ref.read(facilityRepositoryProvider);
     final state = FacilityDepositState(datas: []);
+    registerCancellation();
     return state;
   }
 
@@ -48,78 +53,51 @@ class FacilityDepositViewModel extends _$FacilityDepositViewModel {
       changeLoadingState(LoadState.State_Loading, null);
     }
 
-    // 获取 Applied 列表
-    // var listResult = await _jobRepository.fetchJobAppliedList(
-    //   state.jobId,
-    //   state.selectedStatusId,
-    //   state.keyword,
-    //   curPage: _curPage,
-    //   cancelToken: cancelToken,
-    // );
-    //
-    // // 处理数据
-    // if (listResult.isSuccess) {
-    //   handleList(listResult.data?.rows);
-    // } else {
-    //   errorMessage = listResult.errorMsg;
-    //   changeLoadingState(LoadState.State_Error);
-    // }
+    // 获取列表
+    final result = await _facilityRepository.fetchFacilityDepositList(
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
 
-
-    await Future.delayed(const Duration(milliseconds: 1500));
-
-    final List<String> list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
-
-    if (_curPage == 1) {
-      //刷新的方式
-      state = state.copyWith(datas: list);
-      refreshController.finishRefresh();
-
-      //更新展示的状态
-      changeLoadingState(LoadState.State_Success, null);
+    // 处理数据
+    if (result.isSuccess) {
+      state = state.copyWith(totalDeposit: result.data?.totalDeposit);
+      handleList(result.data?.list);
     } else {
-      //加载更多
-      final allList = state.datas;
-      allList.addAll(list);
-      state.datas.addAll(list);
-
-      refreshController.finishLoad();
-
-      state = state.copyWith(datas: allList);
+      changeLoadingState(LoadState.State_Error, result.errorMsg);
     }
 
     // 最后赋值
     _needShowPlaceholder = false;
   }
 
-// 处理数据与展示的逻辑
-// void handleList(List<JobAppliedListSGRows>? list) {
-//   if (list != null && list.isNotEmpty) {
-//     //有数据,判断是刷新还是加载更多的数据
-//     if (_curPage == 1) {
-//       //刷新的方式
-//       state.datas.clear();
-//       state.datas.addAll(list);
-//       refreshController.finishRefresh();
-//
-//       //更新展示的状态
-//       changeLoadingState(LoadState.State_Success);
-//     } else {
-//       //加载更多
-//       state.datas.addAll(list);
-//       refreshController.finishLoad();
-//       update();
-//     }
-//   } else {
-//     if (_curPage == 1) {
-//       //展示无数据的布局
-//       state.datas.clear();
-//       changeLoadingState(LoadState.State_Empty);
-//       refreshController.finishRefresh();
-//     } else {
-//       //展示加载完成,没有更多数据了
-//       refreshController.finishLoad(IndicatorResult.noMore);
-//     }
-//   }
-// }
+  // 处理数据与展示的逻辑
+  void handleList(List<FacilityPageList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state = state.copyWith(datas: list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        state.datas.addAll(List<FacilityPageList>.from(state.datas)..addAll(list));
+        refreshController.finishLoad();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state = state.copyWith(datas: []);
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
 }

+ 4 - 3
packages/cpt_facility/lib/modules/facility/deposit/item_facility_deposit.dart

@@ -1,5 +1,6 @@
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/facility_page_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_load_image.dart';
@@ -8,7 +9,7 @@ import 'package:widgets/my_text_view.dart';
 ///  设施的Deposit的Item
 class FacilityDepositItem extends StatelessWidget {
   final int index;
-  final String item;
+  final FacilityPageList item;
 
   const FacilityDepositItem({
     required this.index,
@@ -26,7 +27,7 @@ class FacilityDepositItem extends StatelessWidget {
         crossAxisAlignment: CrossAxisAlignment.start,
         children: [
           MyTextView(
-            "Function Room Orange Room",
+            "${item.facility?.type?.name ?? ""} ${item.facility?.name ?? ""}",
             fontSize: 16,
             textColor: context.appColors.textPrimary,
             isFontMedium: true,
@@ -41,7 +42,7 @@ class FacilityDepositItem extends StatelessWidget {
               ),
               const Spacer(),
               MyTextView(
-                "\$100.00",
+                "\$${item.booking?.depositPaid??""}",
                 fontSize: 14.5,
                 textColor: context.appColors.textBlack,
                 isFontMedium: true,

+ 11 - 0
packages/cpt_facility/lib/modules/facility/facility_page.dart

@@ -4,6 +4,7 @@ import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_appbar.dart';
@@ -35,6 +36,16 @@ class FacilityPage extends HookConsumerWidget {
         context,
         S.current.facility,
         backgroundColor: context.appColors.backgroundWhite,
+        actions: [
+          //去设施小区的定位图片
+          const MyAssetImage(
+            Assets.facilityQuestionIcon,
+            width: 44,
+            height: 44,
+          ).marginOnly(right: 3).onTap(() {
+           ToastEngine.show("Question");
+          }),
+        ],
       ),
       backgroundColor: context.appColors.backgroundDark,
       body: AutoTabsRouter.pageView(

+ 3 - 2
packages/cpt_facility/lib/modules/facility/history/facility_history_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/facility_page_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class FacilityHistoryState {
@@ -6,7 +7,7 @@ class FacilityHistoryState {
   LoadState loadingState;
   String? errorMessage;
 
-  List<String> datas; //页面列表数据
+  List<FacilityPageList> datas; //页面列表数据
 
   // ===================================  Begin  ↓  ===================================
 
@@ -20,7 +21,7 @@ class FacilityHistoryState {
     LoadState? loadingState,
     String? errorMessage,
     bool? needShowPlaceholder,
-    List<String>? datas,
+    List<FacilityPageList>? datas,
   }) {
     return FacilityHistoryState(
       errorMessage: errorMessage ?? this.errorMessage,

+ 46 - 68
packages/cpt_facility/lib/modules/facility/history/facility_history_view_model.dart

@@ -1,3 +1,6 @@
+import 'package:domain/entity/facility_page_entity.dart';
+import 'package:domain/repository/facility_repository.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
@@ -8,7 +11,8 @@ import 'facility_history_state.dart';
 part 'facility_history_view_model.g.dart';
 
 @riverpod
-class FacilityHistoryViewModel extends _$FacilityHistoryViewModel {
+class FacilityHistoryViewModel extends _$FacilityHistoryViewModel with DioCancelableMixin {
+  late final FacilityRepository _facilityRepository;
   var _curPage = 1; //请求参数当前的页面
   var _needShowPlaceholder = true; //是否展示LoadingView
 
@@ -20,7 +24,10 @@ class FacilityHistoryViewModel extends _$FacilityHistoryViewModel {
 
   @override
   FacilityHistoryState build() {
-    return FacilityHistoryState(datas: []);
+    _facilityRepository = ref.read(facilityRepositoryProvider);
+    final state = FacilityHistoryState(datas: []);
+    registerCancellation();
+    return state;
   }
 
   //刷新页面状态
@@ -53,78 +60,49 @@ class FacilityHistoryViewModel extends _$FacilityHistoryViewModel {
       changeLoadingState(LoadState.State_Loading, null);
     }
 
-    // 获取 Applied 列表
-    // var listResult = await _jobRepository.fetchJobAppliedList(
-    //   state.jobId,
-    //   state.selectedStatusId,
-    //   state.keyword,
-    //   curPage: _curPage,
-    //   cancelToken: cancelToken,
-    // );
-    //
-    // // 处理数据
-    // if (listResult.isSuccess) {
-    //   handleList(listResult.data?.rows);
-    // } else {
-    //   errorMessage = listResult.errorMsg;
-    //   changeLoadingState(LoadState.State_Error);
-    // }
+    // 获取列表
+    var listResult = await _facilityRepository.fetchFacilityHistoryList(
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
 
-
-    await Future.delayed(const Duration(milliseconds: 1500));
-
-    final List<String> list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
-
-    if (_curPage == 1) {
-      //刷新的方式
-      state = state.copyWith(datas: list);
-      refreshController.finishRefresh();
-
-      //更新展示的状态
-      changeLoadingState(LoadState.State_Success, null);
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.list);
     } else {
-      //加载更多
-      final allList = state.datas;
-      allList.addAll(list);
-      state.datas.addAll(list);
-
-      refreshController.finishLoad();
-
-      state = state.copyWith(datas: allList);
+      changeLoadingState(LoadState.State_Error, listResult.errorMsg);
     }
 
     // 最后赋值
     _needShowPlaceholder = false;
   }
 
-// 处理数据与展示的逻辑
-// void handleList(List<JobAppliedListSGRows>? list) {
-//   if (list != null && list.isNotEmpty) {
-//     //有数据,判断是刷新还是加载更多的数据
-//     if (_curPage == 1) {
-//       //刷新的方式
-//       state.datas.clear();
-//       state.datas.addAll(list);
-//       refreshController.finishRefresh();
-//
-//       //更新展示的状态
-//       changeLoadingState(LoadState.State_Success);
-//     } else {
-//       //加载更多
-//       state.datas.addAll(list);
-//       refreshController.finishLoad();
-//       update();
-//     }
-//   } else {
-//     if (_curPage == 1) {
-//       //展示无数据的布局
-//       state.datas.clear();
-//       changeLoadingState(LoadState.State_Empty);
-//       refreshController.finishRefresh();
-//     } else {
-//       //展示加载完成,没有更多数据了
-//       refreshController.finishLoad(IndicatorResult.noMore);
-//     }
-//   }
-// }
+  // 处理数据与展示的逻辑
+  void handleList(List<FacilityPageList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state = state.copyWith(datas: list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        state.datas.addAll(List<FacilityPageList>.from(state.datas)..addAll(list));
+        refreshController.finishLoad();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state = state.copyWith(datas: []);
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
 }

+ 18 - 17
packages/cpt_facility/lib/modules/facility/history/item_facility_history.dart

@@ -1,6 +1,7 @@
 import 'package:cpt_facility/modules/facility/active/facility_active_screen.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/facility_page_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_text_view.dart';
@@ -8,7 +9,7 @@ import 'package:widgets/my_text_view.dart';
 ///  设施的History的Item
 class FacilityHistoryItem extends StatelessWidget {
   final int index;
-  final String item;
+  final FacilityPageList item;
 
   const FacilityHistoryItem({
     required this.index,
@@ -34,7 +35,7 @@ class FacilityHistoryItem extends StatelessWidget {
             children: [
               //设施
               MyTextView(
-                "Kids party room",
+                item.facility?.type?.name ?? "",
                 fontSize: 16,
                 maxLines: 3,
                 textColor: context.appColors.textBlack,
@@ -43,7 +44,7 @@ class FacilityHistoryItem extends StatelessWidget {
 
               //分类
               MyTextView(
-                "Blue room",
+                item.facility?.name ?? "",
                 fontSize: 14,
                 marginTop: 3,
                 textColor: context.appColors.textBlack,
@@ -52,7 +53,7 @@ class FacilityHistoryItem extends StatelessWidget {
 
               //预订人
               MyTextView(
-                S.current.booked_by_someone("Wu Bing Bing"),
+                S.current.booked_by_someone(item.account?.name ?? ""),
                 fontSize: 14,
                 marginTop: 3,
                 textColor: context.appColors.textBlack,
@@ -61,7 +62,7 @@ class FacilityHistoryItem extends StatelessWidget {
 
               //日期
               MyTextView(
-                "Tue,24 Oct 2023",
+                item.booking?.date ?? "",
                 fontSize: 14,
                 marginTop: 16,
                 textColor: context.appColors.textBlack,
@@ -70,7 +71,7 @@ class FacilityHistoryItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                "05:00 PM-10:00 PM",
+                "${item.booking?.start ?? ""}-${item.booking?.end ?? ""}",
                 fontSize: 14,
                 marginBottom: 7,
                 marginTop: 3,
@@ -128,17 +129,17 @@ class FacilityHistoryItem extends StatelessWidget {
                 boxWidth: 60,
               ),
 
-              MyTextView(
-                S.current.delete,
-                textColor: Colors.white,
-                backgroundColor: context.appColors.orangeBG,
-                cornerRadius: 7,
-                paddingTop: 9,
-                marginTop: 15,
-                paddingBottom: 9,
-                textAlign: TextAlign.center,
-                boxWidth: 60,
-              )
+              // MyTextView(
+              //   S.current.delete,
+              //   textColor: Colors.white,
+              //   backgroundColor: context.appColors.orangeBG,
+              //   cornerRadius: 7,
+              //   paddingTop: 9,
+              //   marginTop: 15,
+              //   paddingBottom: 9,
+              //   textAlign: TextAlign.center,
+              //   boxWidth: 60,
+              // )
             ],
           )
         ],

+ 40 - 5
packages/cpt_facility/lib/router/page/facility_page_router.gr.dart

@@ -34,9 +34,14 @@ abstract class _$FacilityPageRouter extends RootStackRouter {
       );
     },
     FacilityBookingPageRoute.name: (routeData) {
+      final args = routeData.argsAs<FacilityBookingPageRouteArgs>();
       return AutoRoutePage<dynamic>(
         routeData: routeData,
-        child: const FacilityBookingPage(),
+        child: FacilityBookingPage(
+          key: args.key,
+          facilityId: args.facilityId,
+          facilityName: args.facilityName,
+        ),
       );
     },
     FacilityDepositPageRoute.name: (routeData) {
@@ -120,16 +125,46 @@ class FacilityBookPageRoute extends PageRouteInfo<void> {
 
 /// generated route for
 /// [FacilityBookingPage]
-class FacilityBookingPageRoute extends PageRouteInfo<void> {
-  const FacilityBookingPageRoute({List<PageRouteInfo>? children})
-      : super(
+class FacilityBookingPageRoute
+    extends PageRouteInfo<FacilityBookingPageRouteArgs> {
+  FacilityBookingPageRoute({
+    Key? key,
+    required String facilityId,
+    required String facilityName,
+    List<PageRouteInfo>? children,
+  }) : super(
           FacilityBookingPageRoute.name,
+          args: FacilityBookingPageRouteArgs(
+            key: key,
+            facilityId: facilityId,
+            facilityName: facilityName,
+          ),
           initialChildren: children,
         );
 
   static const String name = 'FacilityBookingPageRoute';
 
-  static const PageInfo<void> page = PageInfo<void>(name);
+  static const PageInfo<FacilityBookingPageRouteArgs> page =
+      PageInfo<FacilityBookingPageRouteArgs>(name);
+}
+
+class FacilityBookingPageRouteArgs {
+  const FacilityBookingPageRouteArgs({
+    this.key,
+    required this.facilityId,
+    required this.facilityName,
+  });
+
+  final Key? key;
+
+  final String facilityId;
+
+  final String facilityName;
+
+  @override
+  String toString() {
+    return 'FacilityBookingPageRouteArgs{key: $key, facilityId: $facilityId, facilityName: $facilityName}';
+  }
 }
 
 /// generated route for

+ 1 - 0
packages/cpt_form/lib/modules/form/approve/form_approve_screen.dart

@@ -34,6 +34,7 @@ class FormApproveScreen extends HookConsumerWidget {
       child: EasyRefresh(
         controller: viewModel.refreshController,
         onRefresh: viewModel.onRefresh,
+        onLoad: viewModel.loadMore,
         child: LoadStateLayout(
           state: state.loadingState,
           errorMessage: state.errorMessage,

+ 7 - 1
packages/cpt_form/lib/modules/form/approve/form_approve_view_model.dart

@@ -19,7 +19,7 @@ class FormApproveViewModel extends _$FormApproveViewModel with DioCancelableMixi
   // Refresh 控制器
   final EasyRefreshController refreshController = EasyRefreshController(
     controlFinishRefresh: true,  //允许刷新
-    controlFinishLoad: false,   //不允许加载
+    controlFinishLoad: true,   //不允许加载
   );
 
   @override
@@ -41,6 +41,12 @@ class FormApproveViewModel extends _$FormApproveViewModel with DioCancelableMixi
     fetchList();
   }
 
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchList();
+  }
+
   // 重试请求
   Future retryRequest() async {
     _curPage = 1;

+ 86 - 0
packages/cs_domain/lib/entity/facility_book_entity.dart

@@ -0,0 +1,86 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/facility_book_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/facility_book_entity.g.dart';
+
+@JsonSerializable()
+class FacilityBookEntity {
+	@JSONField(name: "remain_quota")
+	int remainQuota = 0;
+	@JSONField(name: "quota_reset_on")
+	String? quotaResetOn;
+	@JSONField(name: "facility_type")
+	FacilityBookFacilityType? facilityType;
+	List<FacilityBookFacilities>? facilities = [];
+
+	FacilityBookEntity();
+
+	factory FacilityBookEntity.fromJson(Map<String, dynamic> json) => $FacilityBookEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityBookEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class FacilityBookFacilityType {
+	@JSONField(name: "book_advance_days")
+	int bookAdvanceDays = 0;
+	int quota = 0;
+	@JSONField(name: "quota_reset_type")
+	String? quotaResetType;
+
+	FacilityBookFacilityType();
+
+	factory FacilityBookFacilityType.fromJson(Map<String, dynamic> json) => $FacilityBookFacilityTypeFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityBookFacilityTypeToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class FacilityBookFacilities {
+	String? id;
+	String? name;
+	List<FacilityBookFacilitiesPeriods>? periods = [];
+
+	FacilityBookFacilities();
+
+	factory FacilityBookFacilities.fromJson(Map<String, dynamic> json) => $FacilityBookFacilitiesFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityBookFacilitiesToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class FacilityBookFacilitiesPeriods {
+	String? id;
+	String? start;
+	String? end;
+	String? price;
+	String? deposit;
+	bool enable = true;
+	bool selected = false;
+
+	FacilityBookFacilitiesPeriods();
+
+	factory FacilityBookFacilitiesPeriods.fromJson(Map<String, dynamic> json) => $FacilityBookFacilitiesPeriodsFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityBookFacilitiesPeriodsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 139 - 0
packages/cs_domain/lib/entity/facility_page_entity.dart

@@ -0,0 +1,139 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/facility_page_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/facility_page_entity.g.dart';
+
+@JsonSerializable()
+class FacilityPageEntity {
+	int count = 0;
+	int page = 0;
+	int limit = 0;
+	@JSONField(name: "count_page")
+	int countPage = 0;
+	@JSONField(name: "total_deposit")
+	String? totalDeposit;
+
+	List<FacilityPageList>? list = [];
+
+	FacilityPageEntity();
+
+	factory FacilityPageEntity.fromJson(Map<String, dynamic> json) => $FacilityPageEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityPageEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class FacilityPageList {
+	FacilityPageListBooking? booking;
+	FacilityPageListFacility? facility;
+	@JSONField(name: "time_period")
+	FacilityPageListTimePeriod? timePeriod;
+	FacilityPageListAccount? account;
+
+	FacilityPageList();
+
+	factory FacilityPageList.fromJson(Map<String, dynamic> json) => $FacilityPageListFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityPageListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class FacilityPageListBooking {
+	String? date;
+	String? start;
+	String? end;
+	@JSONField(name: "deposit_paid")
+	String? depositPaid;
+	@JSONField(name: "deposit_refund")
+	String? depositRefund;
+
+	FacilityPageListBooking();
+
+	factory FacilityPageListBooking.fromJson(Map<String, dynamic> json) => $FacilityPageListBookingFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityPageListBookingToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class FacilityPageListFacility {
+	String? id;
+	String? name;
+	FacilityPageListFacilityType? type;
+
+	FacilityPageListFacility();
+
+	factory FacilityPageListFacility.fromJson(Map<String, dynamic> json) => $FacilityPageListFacilityFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityPageListFacilityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class FacilityPageListFacilityType {
+	String? id;
+	String? name;
+
+	FacilityPageListFacilityType();
+
+	factory FacilityPageListFacilityType.fromJson(Map<String, dynamic> json) => $FacilityPageListFacilityTypeFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityPageListFacilityTypeToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class FacilityPageListTimePeriod {
+	String? price;
+	String? deposit;
+
+	FacilityPageListTimePeriod();
+
+	factory FacilityPageListTimePeriod.fromJson(Map<String, dynamic> json) => $FacilityPageListTimePeriodFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityPageListTimePeriodToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class FacilityPageListAccount {
+	String? id;
+	String? name;
+
+	FacilityPageListAccount();
+
+	factory FacilityPageListAccount.fromJson(Map<String, dynamic> json) => $FacilityPageListAccountFromJson(json);
+
+	Map<String, dynamic> toJson() => $FacilityPageListAccountToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 46 - 0
packages/cs_domain/lib/generated/json/base/json_convert_content.dart

@@ -6,6 +6,8 @@
 import 'package:flutter/material.dart' show debugPrint;
 import 'package:domain/entity/auth_login_entity.dart';
 import 'package:domain/entity/captcha_img_entity.dart';
+import 'package:domain/entity/facility_book_entity.dart';
+import 'package:domain/entity/facility_page_entity.dart';
 import 'package:domain/entity/feedback_detail_entity.dart';
 import 'package:domain/entity/feedback_list_entity.dart';
 import 'package:domain/entity/form_content_entity.dart';
@@ -173,6 +175,39 @@ class JsonConvert {
       return data.map<CaptchaImgEntity>((Map<String, dynamic> e) =>
           CaptchaImgEntity.fromJson(e)).toList() as M;
     }
+    if (<FacilityBookEntity>[] is M) {
+      return data.map<FacilityBookEntity>((Map<String, dynamic> e) => FacilityBookEntity.fromJson(e)).toList() as M;
+    }
+    if (<FacilityBookFacilityType>[] is M) {
+      return data.map<FacilityBookFacilityType>((Map<String, dynamic> e) => FacilityBookFacilityType.fromJson(e)).toList() as M;
+    }
+    if (<FacilityBookFacilities>[] is M) {
+      return data.map<FacilityBookFacilities>((Map<String, dynamic> e) => FacilityBookFacilities.fromJson(e)).toList() as M;
+    }
+    if (<FacilityBookFacilitiesPeriods>[] is M) {
+      return data.map<FacilityBookFacilitiesPeriods>((Map<String, dynamic> e) => FacilityBookFacilitiesPeriods.fromJson(e)).toList() as M;
+    }
+    if (<FacilityPageEntity>[] is M) {
+      return data.map<FacilityPageEntity>((Map<String, dynamic> e) => FacilityPageEntity.fromJson(e)).toList() as M;
+    }
+    if (<FacilityPageList>[] is M) {
+      return data.map<FacilityPageList>((Map<String, dynamic> e) => FacilityPageList.fromJson(e)).toList() as M;
+    }
+    if (<FacilityPageListBooking>[] is M) {
+      return data.map<FacilityPageListBooking>((Map<String, dynamic> e) => FacilityPageListBooking.fromJson(e)).toList() as M;
+    }
+    if (<FacilityPageListFacility>[] is M) {
+      return data.map<FacilityPageListFacility>((Map<String, dynamic> e) => FacilityPageListFacility.fromJson(e)).toList() as M;
+    }
+    if (<FacilityPageListFacilityType>[] is M) {
+      return data.map<FacilityPageListFacilityType>((Map<String, dynamic> e) => FacilityPageListFacilityType.fromJson(e)).toList() as M;
+    }
+    if (<FacilityPageListTimePeriod>[] is M) {
+      return data.map<FacilityPageListTimePeriod>((Map<String, dynamic> e) => FacilityPageListTimePeriod.fromJson(e)).toList() as M;
+    }
+    if (<FacilityPageListAccount>[] is M) {
+      return data.map<FacilityPageListAccount>((Map<String, dynamic> e) => FacilityPageListAccount.fromJson(e)).toList() as M;
+    }
     if (<FeedbackDetailEntity>[] is M) {
       return data.map<FeedbackDetailEntity>((Map<String, dynamic> e) =>
           FeedbackDetailEntity.fromJson(e)).toList() as M;
@@ -377,6 +412,17 @@ class JsonConvertClassCollection {
   Map<String, JsonConvertFunction> convertFuncMap = {
     (AuthLoginEntity).toString(): AuthLoginEntity.fromJson,
     (CaptchaImgEntity).toString(): CaptchaImgEntity.fromJson,
+    (FacilityBookEntity).toString(): FacilityBookEntity.fromJson,
+    (FacilityBookFacilityType).toString(): FacilityBookFacilityType.fromJson,
+    (FacilityBookFacilities).toString(): FacilityBookFacilities.fromJson,
+    (FacilityBookFacilitiesPeriods).toString(): FacilityBookFacilitiesPeriods.fromJson,
+    (FacilityPageEntity).toString(): FacilityPageEntity.fromJson,
+    (FacilityPageList).toString(): FacilityPageList.fromJson,
+    (FacilityPageListBooking).toString(): FacilityPageListBooking.fromJson,
+    (FacilityPageListFacility).toString(): FacilityPageListFacility.fromJson,
+    (FacilityPageListFacilityType).toString(): FacilityPageListFacilityType.fromJson,
+    (FacilityPageListTimePeriod).toString(): FacilityPageListTimePeriod.fromJson,
+    (FacilityPageListAccount).toString(): FacilityPageListAccount.fromJson,
     (FeedbackDetailEntity).toString(): FeedbackDetailEntity.fromJson,
     (FeedbackDetailReplies).toString(): FeedbackDetailReplies.fromJson,
     (FeedbackListEntity).toString(): FeedbackListEntity.fromJson,

+ 191 - 0
packages/cs_domain/lib/generated/json/facility_book_entity.g.dart

@@ -0,0 +1,191 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/facility_book_entity.dart';
+
+FacilityBookEntity $FacilityBookEntityFromJson(Map<String, dynamic> json) {
+  final FacilityBookEntity facilityBookEntity = FacilityBookEntity();
+  final int? remainQuota = jsonConvert.convert<int>(json['remain_quota']);
+  if (remainQuota != null) {
+    facilityBookEntity.remainQuota = remainQuota;
+  }
+  final String? quotaResetOn = jsonConvert.convert<String>(json['quota_reset_on']);
+  if (quotaResetOn != null) {
+    facilityBookEntity.quotaResetOn = quotaResetOn;
+  }
+  final FacilityBookFacilityType? facilityType = jsonConvert.convert<FacilityBookFacilityType>(json['facility_type']);
+  if (facilityType != null) {
+    facilityBookEntity.facilityType = facilityType;
+  }
+  final List<FacilityBookFacilities>? facilities = (json['facilities'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<FacilityBookFacilities>(e) as FacilityBookFacilities).toList();
+  if (facilities != null) {
+    facilityBookEntity.facilities = facilities;
+  }
+  return facilityBookEntity;
+}
+
+Map<String, dynamic> $FacilityBookEntityToJson(FacilityBookEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['remain_quota'] = entity.remainQuota;
+  data['quota_reset_on'] = entity.quotaResetOn;
+  data['facility_type'] = entity.facilityType?.toJson();
+  data['facilities'] = entity.facilities?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension FacilityBookEntityExtension on FacilityBookEntity {
+  FacilityBookEntity copyWith({
+    int? remainQuota,
+    String? quotaResetOn,
+    FacilityBookFacilityType? facilityType,
+    List<FacilityBookFacilities>? facilities,
+  }) {
+    return FacilityBookEntity()
+      ..remainQuota = remainQuota ?? this.remainQuota
+      ..quotaResetOn = quotaResetOn ?? this.quotaResetOn
+      ..facilityType = facilityType ?? this.facilityType
+      ..facilities = facilities ?? this.facilities;
+  }
+}
+
+FacilityBookFacilityType $FacilityBookFacilityTypeFromJson(Map<String, dynamic> json) {
+  final FacilityBookFacilityType facilityBookFacilityType = FacilityBookFacilityType();
+  final int? bookAdvanceDays = jsonConvert.convert<int>(json['book_advance_days']);
+  if (bookAdvanceDays != null) {
+    facilityBookFacilityType.bookAdvanceDays = bookAdvanceDays;
+  }
+  final int? quota = jsonConvert.convert<int>(json['quota']);
+  if (quota != null) {
+    facilityBookFacilityType.quota = quota;
+  }
+  final String? quotaResetType = jsonConvert.convert<String>(json['quota_reset_type']);
+  if (quotaResetType != null) {
+    facilityBookFacilityType.quotaResetType = quotaResetType;
+  }
+  return facilityBookFacilityType;
+}
+
+Map<String, dynamic> $FacilityBookFacilityTypeToJson(FacilityBookFacilityType entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['book_advance_days'] = entity.bookAdvanceDays;
+  data['quota'] = entity.quota;
+  data['quota_reset_type'] = entity.quotaResetType;
+  return data;
+}
+
+extension FacilityBookFacilityTypeExtension on FacilityBookFacilityType {
+  FacilityBookFacilityType copyWith({
+    int? bookAdvanceDays,
+    int? quota,
+    String? quotaResetType,
+  }) {
+    return FacilityBookFacilityType()
+      ..bookAdvanceDays = bookAdvanceDays ?? this.bookAdvanceDays
+      ..quota = quota ?? this.quota
+      ..quotaResetType = quotaResetType ?? this.quotaResetType;
+  }
+}
+
+FacilityBookFacilities $FacilityBookFacilitiesFromJson(Map<String, dynamic> json) {
+  final FacilityBookFacilities facilityBookFacilities = FacilityBookFacilities();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    facilityBookFacilities.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    facilityBookFacilities.name = name;
+  }
+  final List<FacilityBookFacilitiesPeriods>? periods = (json['periods'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<FacilityBookFacilitiesPeriods>(e) as FacilityBookFacilitiesPeriods).toList();
+  if (periods != null) {
+    facilityBookFacilities.periods = periods;
+  }
+  return facilityBookFacilities;
+}
+
+Map<String, dynamic> $FacilityBookFacilitiesToJson(FacilityBookFacilities entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  data['periods'] = entity.periods?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension FacilityBookFacilitiesExtension on FacilityBookFacilities {
+  FacilityBookFacilities copyWith({
+    String? id,
+    String? name,
+    List<FacilityBookFacilitiesPeriods>? periods,
+  }) {
+    return FacilityBookFacilities()
+      ..id = id ?? this.id
+      ..name = name ?? this.name
+      ..periods = periods ?? this.periods;
+  }
+}
+
+FacilityBookFacilitiesPeriods $FacilityBookFacilitiesPeriodsFromJson(Map<String, dynamic> json) {
+  final FacilityBookFacilitiesPeriods facilityBookFacilitiesPeriods = FacilityBookFacilitiesPeriods();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    facilityBookFacilitiesPeriods.id = id;
+  }
+  final String? start = jsonConvert.convert<String>(json['start']);
+  if (start != null) {
+    facilityBookFacilitiesPeriods.start = start;
+  }
+  final String? end = jsonConvert.convert<String>(json['end']);
+  if (end != null) {
+    facilityBookFacilitiesPeriods.end = end;
+  }
+  final String? price = jsonConvert.convert<String>(json['price']);
+  if (price != null) {
+    facilityBookFacilitiesPeriods.price = price;
+  }
+  final String? deposit = jsonConvert.convert<String>(json['deposit']);
+  if (deposit != null) {
+    facilityBookFacilitiesPeriods.deposit = deposit;
+  }
+  final bool? enable = jsonConvert.convert<bool>(json['enable']);
+  if (enable != null) {
+    facilityBookFacilitiesPeriods.enable = enable;
+  }
+  final bool? selected = jsonConvert.convert<bool>(json['selected']);
+  if (selected != null) {
+    facilityBookFacilitiesPeriods.selected = selected;
+  }
+  return facilityBookFacilitiesPeriods;
+}
+
+Map<String, dynamic> $FacilityBookFacilitiesPeriodsToJson(FacilityBookFacilitiesPeriods entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['start'] = entity.start;
+  data['end'] = entity.end;
+  data['price'] = entity.price;
+  data['deposit'] = entity.deposit;
+  data['enable'] = entity.enable;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension FacilityBookFacilitiesPeriodsExtension on FacilityBookFacilitiesPeriods {
+  FacilityBookFacilitiesPeriods copyWith({
+    String? id,
+    String? start,
+    String? end,
+    String? price,
+    String? deposit,
+    bool? enable,
+    bool? selected,
+  }) {
+    return FacilityBookFacilitiesPeriods()
+      ..id = id ?? this.id
+      ..start = start ?? this.start
+      ..end = end ?? this.end
+      ..price = price ?? this.price
+      ..deposit = deposit ?? this.deposit
+      ..enable = enable ?? this.enable
+      ..selected = selected ?? this.selected;
+  }
+}

+ 290 - 0
packages/cs_domain/lib/generated/json/facility_page_entity.g.dart

@@ -0,0 +1,290 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/facility_page_entity.dart';
+
+FacilityPageEntity $FacilityPageEntityFromJson(Map<String, dynamic> json) {
+  final FacilityPageEntity facilityPageEntity = FacilityPageEntity();
+  final int? count = jsonConvert.convert<int>(json['count']);
+  if (count != null) {
+    facilityPageEntity.count = count;
+  }
+  final int? page = jsonConvert.convert<int>(json['page']);
+  if (page != null) {
+    facilityPageEntity.page = page;
+  }
+  final int? limit = jsonConvert.convert<int>(json['limit']);
+  if (limit != null) {
+    facilityPageEntity.limit = limit;
+  }
+  final int? countPage = jsonConvert.convert<int>(json['count_page']);
+  if (countPage != null) {
+    facilityPageEntity.countPage = countPage;
+  }
+  final String? totalDeposit = jsonConvert.convert<String>(json['total_deposit']);
+  if (totalDeposit != null) {
+    facilityPageEntity.totalDeposit = totalDeposit;
+  }
+  final List<FacilityPageList>? list = (json['list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<FacilityPageList>(e) as FacilityPageList).toList();
+  if (list != null) {
+    facilityPageEntity.list = list;
+  }
+  return facilityPageEntity;
+}
+
+Map<String, dynamic> $FacilityPageEntityToJson(FacilityPageEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['count'] = entity.count;
+  data['page'] = entity.page;
+  data['limit'] = entity.limit;
+  data['count_page'] = entity.countPage;
+  data['total_deposit'] = entity.totalDeposit;
+  data['list'] = entity.list?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension FacilityPageEntityExtension on FacilityPageEntity {
+  FacilityPageEntity copyWith({
+    int? count,
+    int? page,
+    int? limit,
+    int? countPage,
+    String? totalDeposit,
+    List<FacilityPageList>? list,
+  }) {
+    return FacilityPageEntity()
+      ..count = count ?? this.count
+      ..page = page ?? this.page
+      ..limit = limit ?? this.limit
+      ..countPage = countPage ?? this.countPage
+      ..totalDeposit = totalDeposit ?? this.totalDeposit
+      ..list = list ?? this.list;
+  }
+}
+
+FacilityPageList $FacilityPageListFromJson(Map<String, dynamic> json) {
+  final FacilityPageList facilityPageList = FacilityPageList();
+  final FacilityPageListBooking? booking = jsonConvert.convert<FacilityPageListBooking>(json['booking']);
+  if (booking != null) {
+    facilityPageList.booking = booking;
+  }
+  final FacilityPageListFacility? facility = jsonConvert.convert<FacilityPageListFacility>(json['facility']);
+  if (facility != null) {
+    facilityPageList.facility = facility;
+  }
+  final FacilityPageListTimePeriod? timePeriod = jsonConvert.convert<FacilityPageListTimePeriod>(json['time_period']);
+  if (timePeriod != null) {
+    facilityPageList.timePeriod = timePeriod;
+  }
+  final FacilityPageListAccount? account = jsonConvert.convert<FacilityPageListAccount>(json['account']);
+  if (account != null) {
+    facilityPageList.account = account;
+  }
+  return facilityPageList;
+}
+
+Map<String, dynamic> $FacilityPageListToJson(FacilityPageList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['booking'] = entity.booking?.toJson();
+  data['facility'] = entity.facility?.toJson();
+  data['time_period'] = entity.timePeriod?.toJson();
+  data['account'] = entity.account?.toJson();
+  return data;
+}
+
+extension FacilityPageListExtension on FacilityPageList {
+  FacilityPageList copyWith({
+    FacilityPageListBooking? booking,
+    FacilityPageListFacility? facility,
+    FacilityPageListTimePeriod? timePeriod,
+    FacilityPageListAccount? account,
+  }) {
+    return FacilityPageList()
+      ..booking = booking ?? this.booking
+      ..facility = facility ?? this.facility
+      ..timePeriod = timePeriod ?? this.timePeriod
+      ..account = account ?? this.account;
+  }
+}
+
+FacilityPageListBooking $FacilityPageListBookingFromJson(Map<String, dynamic> json) {
+  final FacilityPageListBooking facilityPageListBooking = FacilityPageListBooking();
+  final String? date = jsonConvert.convert<String>(json['date']);
+  if (date != null) {
+    facilityPageListBooking.date = date;
+  }
+  final String? start = jsonConvert.convert<String>(json['start']);
+  if (start != null) {
+    facilityPageListBooking.start = start;
+  }
+  final String? end = jsonConvert.convert<String>(json['end']);
+  if (end != null) {
+    facilityPageListBooking.end = end;
+  }
+  final String? depositPaid = jsonConvert.convert<String>(json['deposit_paid']);
+  if (depositPaid != null) {
+    facilityPageListBooking.depositPaid = depositPaid;
+  }
+  final String? depositRefund = jsonConvert.convert<String>(json['deposit_refund']);
+  if (depositRefund != null) {
+    facilityPageListBooking.depositRefund = depositRefund;
+  }
+  return facilityPageListBooking;
+}
+
+Map<String, dynamic> $FacilityPageListBookingToJson(FacilityPageListBooking entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['date'] = entity.date;
+  data['start'] = entity.start;
+  data['end'] = entity.end;
+  data['deposit_paid'] = entity.depositPaid;
+  data['deposit_refund'] = entity.depositRefund;
+  return data;
+}
+
+extension FacilityPageListBookingExtension on FacilityPageListBooking {
+  FacilityPageListBooking copyWith({
+    String? date,
+    String? start,
+    String? end,
+    String? depositPaid,
+    String? depositRefund,
+  }) {
+    return FacilityPageListBooking()
+      ..date = date ?? this.date
+      ..start = start ?? this.start
+      ..end = end ?? this.end
+      ..depositPaid = depositPaid ?? this.depositPaid
+      ..depositRefund = depositRefund ?? this.depositRefund;
+  }
+}
+
+FacilityPageListFacility $FacilityPageListFacilityFromJson(Map<String, dynamic> json) {
+  final FacilityPageListFacility facilityPageListFacility = FacilityPageListFacility();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    facilityPageListFacility.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    facilityPageListFacility.name = name;
+  }
+  final FacilityPageListFacilityType? type = jsonConvert.convert<FacilityPageListFacilityType>(json['type']);
+  if (type != null) {
+    facilityPageListFacility.type = type;
+  }
+  return facilityPageListFacility;
+}
+
+Map<String, dynamic> $FacilityPageListFacilityToJson(FacilityPageListFacility entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  data['type'] = entity.type?.toJson();
+  return data;
+}
+
+extension FacilityPageListFacilityExtension on FacilityPageListFacility {
+  FacilityPageListFacility copyWith({
+    String? id,
+    String? name,
+    FacilityPageListFacilityType? type,
+  }) {
+    return FacilityPageListFacility()
+      ..id = id ?? this.id
+      ..name = name ?? this.name
+      ..type = type ?? this.type;
+  }
+}
+
+FacilityPageListFacilityType $FacilityPageListFacilityTypeFromJson(Map<String, dynamic> json) {
+  final FacilityPageListFacilityType facilityPageListFacilityType = FacilityPageListFacilityType();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    facilityPageListFacilityType.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    facilityPageListFacilityType.name = name;
+  }
+  return facilityPageListFacilityType;
+}
+
+Map<String, dynamic> $FacilityPageListFacilityTypeToJson(FacilityPageListFacilityType entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  return data;
+}
+
+extension FacilityPageListFacilityTypeExtension on FacilityPageListFacilityType {
+  FacilityPageListFacilityType copyWith({
+    String? id,
+    String? name,
+  }) {
+    return FacilityPageListFacilityType()
+      ..id = id ?? this.id
+      ..name = name ?? this.name;
+  }
+}
+
+FacilityPageListTimePeriod $FacilityPageListTimePeriodFromJson(Map<String, dynamic> json) {
+  final FacilityPageListTimePeriod facilityPageListTimePeriod = FacilityPageListTimePeriod();
+  final String? price = jsonConvert.convert<String>(json['price']);
+  if (price != null) {
+    facilityPageListTimePeriod.price = price;
+  }
+  final String? deposit = jsonConvert.convert<String>(json['deposit']);
+  if (deposit != null) {
+    facilityPageListTimePeriod.deposit = deposit;
+  }
+  return facilityPageListTimePeriod;
+}
+
+Map<String, dynamic> $FacilityPageListTimePeriodToJson(FacilityPageListTimePeriod entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['price'] = entity.price;
+  data['deposit'] = entity.deposit;
+  return data;
+}
+
+extension FacilityPageListTimePeriodExtension on FacilityPageListTimePeriod {
+  FacilityPageListTimePeriod copyWith({
+    String? price,
+    String? deposit,
+  }) {
+    return FacilityPageListTimePeriod()
+      ..price = price ?? this.price
+      ..deposit = deposit ?? this.deposit;
+  }
+}
+
+FacilityPageListAccount $FacilityPageListAccountFromJson(Map<String, dynamic> json) {
+  final FacilityPageListAccount facilityPageListAccount = FacilityPageListAccount();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    facilityPageListAccount.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    facilityPageListAccount.name = name;
+  }
+  return facilityPageListAccount;
+}
+
+Map<String, dynamic> $FacilityPageListAccountToJson(FacilityPageListAccount entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  return data;
+}
+
+extension FacilityPageListAccountExtension on FacilityPageListAccount {
+  FacilityPageListAccount copyWith({
+    String? id,
+    String? name,
+  }) {
+    return FacilityPageListAccount()
+      ..id = id ?? this.id
+      ..name = name ?? this.name;
+  }
+}

+ 138 - 9
packages/cs_domain/lib/repository/facility_repository.dart

@@ -2,16 +2,20 @@ import 'dart:typed_data';
 
 import 'package:domain/entity/feedback_detail_entity.dart';
 import 'package:domain/entity/form_option_entity.dart';
+import 'package:plugin_basic/constants/app_constant.dart';
 import 'package:plugin_platform/platform_export.dart';
 import 'package:plugin_platform/http/dio_engine.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/date_time_utils.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import '../constants/api_constants.dart';
 import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:plugin_basic/provider/http_provider/http_provider.dart';
+import '../entity/facility_book_entity.dart';
+import '../entity/facility_page_entity.dart';
 import '../entity/form_content_entity.dart';
 import '../entity/form_detail_entity.dart';
 import '../entity/form_list_entity.dart';
@@ -34,12 +38,12 @@ class FacilityRepository {
 
   FacilityRepository({required this.dioEngine});
 
-
-  Future<HttpResult<IdNameEntity>> fetchFormApplyList({
+  /// 获取设施可申请的列表
+  Future<HttpResult<IdNameEntity>> fetchFacilityList({
     CancelToken? cancelToken,
   }) async {
     final result = await dioEngine.requestNetResult(
-      ApiConstants.apiFormList,
+      ApiConstants.apiFacilityList,
       method: HttpMethod.GET,
       cancelToken: cancelToken,
     );
@@ -50,12 +54,12 @@ class FacilityRepository {
       //获取List数据 需要转换一次
       var list = jsonList
           ?.map((value) {
-        if (value is Map<String, dynamic>) {
-          return IdNameEntity.fromJson(value);
-        } else {
-          return null;
-        }
-      })
+            if (value is Map<String, dynamic>) {
+              return IdNameEntity.fromJson(value);
+            } else {
+              return null;
+            }
+          })
           .where((item) => item != null)
           .cast<IdNameEntity>()
           .toList();
@@ -65,4 +69,129 @@ class FacilityRepository {
     return result.convert<IdNameEntity>();
   }
 
+  /// 获取设施的指定日期的表
+  Future<HttpResult<FacilityBookEntity>> fetchFacilityDateDetail({
+    required String? id,
+    required DateTime? date,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, String> params = {};
+    params['type_id'] = id ?? "";
+    if (date != null) {
+      params['date'] = DateTimeUtils.formatDate(date, format: 'yyyy-MM-dd');
+    }
+
+    final result = await dioEngine.requestNetResult(
+      ApiConstants.apiFacilityDate,
+      params: params,
+      method: HttpMethod.GET,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = FacilityBookEntity.fromJson(json!);
+      return result.convert<FacilityBookEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 预约设施
+  Future<HttpResult> submitBooking({
+    required String? periodId,
+    required DateTime date,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, String> params = {};
+
+    params["period_id"] = periodId ?? "";
+    params["date"] = DateTimeUtils.formatDate(date, format: 'yyyy-MM-dd');
+
+    final result = await dioEngine.requestNetResult(
+      ApiConstants.apiFacilityBook,
+      params: params,
+      method: HttpMethod.POST,
+      isShowLoadingDialog: true,
+      networkDebounce: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 获取已经申请的设施可用列表
+  Future<HttpResult<FacilityPageEntity>> fetchFacilityActiveList({
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, String> params = {};
+    params['page'] = curPage.toString();
+    params['limit'] = "10";
+
+    final result = await dioEngine.requestNetResult(
+      ApiConstants.apiFacilityActiveList,
+      params: params,
+      method: HttpMethod.GET,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = FacilityPageEntity.fromJson(json!);
+      return result.convert<FacilityPageEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取已经申请的设施押金列表
+  Future<HttpResult<FacilityPageEntity>> fetchFacilityDepositList({
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, String> params = {};
+    params['page'] = curPage.toString();
+    params['limit'] = "10";
+
+    final result = await dioEngine.requestNetResult(
+      ApiConstants.apiFacilityDepositList,
+      params: params,
+      method: HttpMethod.GET,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = FacilityPageEntity.fromJson(json!);
+      return result.convert<FacilityPageEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取已经申请的设施历史列表
+  Future<HttpResult<FacilityPageEntity>> fetchFacilityHistoryList({
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, String> params = {};
+    params['page'] = curPage.toString();
+    params['limit'] = "10";
+
+    final result = await dioEngine.requestNetResult(
+      ApiConstants.apiFacilityHistoryList,
+      params: params,
+      method: HttpMethod.GET,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = FacilityPageEntity.fromJson(json!);
+      return result.convert<FacilityPageEntity>(data: data);
+    }
+    return result.convert();
+  }
+
 }