“shanwenxin” месяцев назад: 2
Родитель
Сommit
f09a7f296a
100 измененных файлов с 3163 добавлено и 2057 удалено
  1. 8 9
      packages/cpt_notice_board/lib/modules/announ/page/announ_page.dart
  2. 0 1
      packages/cpt_notice_board/lib/modules/announ/repository/announ_repository.dart
  3. 2 4
      packages/cpt_notice_board/lib/modules/announ/vm/announ_vm.dart
  4. 107 80
      packages/cpt_notice_board/lib/modules/announcement_detail/page/announcement_detail_page.dart
  5. 34 35
      packages/cpt_notice_board/lib/modules/announcement_detail/page/announcement_detail_state.dart
  6. 12 14
      packages/cpt_notice_board/lib/modules/announcement_detail/repository/announcement_detail_repository.dart
  7. 46 48
      packages/cpt_notice_board/lib/modules/announcement_detail/vm/announcement_detail_vm.dart
  8. 24 15
      packages/cpt_notice_board/lib/modules/documents/page/documents_page.dart
  9. 24 6
      packages/cpt_notice_board/lib/modules/documents/vm/documents_vm.dart
  10. 65 37
      packages/cpt_notice_board/lib/modules/documents_list/page/documents_list_page.dart
  11. 44 32
      packages/cpt_notice_board/lib/modules/documents_list/page/documents_list_state.dart
  12. 12 17
      packages/cpt_notice_board/lib/modules/documents_list/repository/documents_list_repository.dart
  13. 115 49
      packages/cpt_notice_board/lib/modules/documents_list/vm/documents_list_vm.dart
  14. 6 12
      packages/cpt_notice_board/lib/modules/event/page/event_page.dart
  15. 2 4
      packages/cpt_notice_board/lib/modules/event/vm/event_vm.dart
  16. 88 61
      packages/cpt_notice_board/lib/modules/event_detail/page/event_detail_page.dart
  17. 34 38
      packages/cpt_notice_board/lib/modules/event_detail/page/event_detail_state.dart
  18. 12 15
      packages/cpt_notice_board/lib/modules/event_detail/repository/event_detail_repository.dart
  19. 48 50
      packages/cpt_notice_board/lib/modules/event_detail/vm/event_detail_vm.dart
  20. 1 1
      packages/cpt_notice_board/lib/modules/notice_board/page/notice_board_page.dart
  21. 121 15
      packages/cpt_notice_board/lib/router/page/notice_board_page_router.gr.dart
  22. 6 4
      packages/cpt_notice_board/pubspec.yaml
  23. 114 163
      packages/cpt_rewards/lib/modules/rewards/rewards_page.dart
  24. 1 1
      packages/cpt_rewards/lib/modules/rewards/rewards_repository.g.dart
  25. 2 2
      packages/cpt_rewards/lib/modules/rewards/rewards_state.dart
  26. 3 1
      packages/cpt_rewards/lib/modules/rewards/rewards_vm.dart
  27. 1 1
      packages/cpt_rewards/lib/modules/rewards/rewards_vm.g.dart
  28. 4 2
      packages/cpt_rewards/lib/modules/rewards_address/rewards_address_repository.g.dart
  29. 4 3
      packages/cpt_rewards/lib/modules/rewards_address/rewards_address_vm.g.dart
  30. 9 5
      packages/cpt_rewards/lib/modules/rewards_code/rewards_code_page.dart
  31. 2 1
      packages/cpt_rewards/lib/modules/rewards_code/rewards_code_repository.g.dart
  32. 4 3
      packages/cpt_rewards/lib/modules/rewards_code/rewards_code_vm.g.dart
  33. 9 29
      packages/cpt_rewards/lib/modules/rewards_confirm/dialog/account_deactivation_dialog.dart
  34. 118 95
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_page.dart
  35. 59 15
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_repository.dart
  36. 4 2
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_repository.g.dart
  37. 45 35
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_state.dart
  38. 83 44
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_vm.dart
  39. 5 4
      packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_vm.g.dart
  40. 113 154
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_page.dart
  41. 3 2
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_repository.dart
  42. 4 2
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_repository.g.dart
  43. 14 7
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_state.dart
  44. 11 10
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_vm.dart
  45. 4 3
      packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_vm.g.dart
  46. 29 33
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_page.dart
  47. 6 3
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_repository.g.dart
  48. 2 2
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_vm.dart
  49. 9 6
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_vm.g.dart
  50. 24 31
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_page.dart
  51. 6 3
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_repository.g.dart
  52. 2 2
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_vm.dart
  53. 7 5
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_vm.g.dart
  54. 6 5
      packages/cpt_rewards/lib/modules/rewards_history/rewards_history_vm.g.dart
  55. 26 16
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_page.dart
  56. 42 0
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_repository.dart
  57. 2 1
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_repository.g.dart
  58. 7 0
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_state.dart
  59. 32 18
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_vm.dart
  60. 4 3
      packages/cpt_rewards/lib/modules/rewards_home/rewards_home_vm.g.dart
  61. 470 76
      packages/cpt_rewards/lib/modules/rewards_list/rewards_list_page.dart
  62. 4 2
      packages/cpt_rewards/lib/modules/rewards_list/rewards_list_repository.dart
  63. 2 1
      packages/cpt_rewards/lib/modules/rewards_list/rewards_list_repository.g.dart
  64. 7 7
      packages/cpt_rewards/lib/modules/rewards_list/rewards_list_vm.dart
  65. 4 3
      packages/cpt_rewards/lib/modules/rewards_list/rewards_list_vm.g.dart
  66. 52 36
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_active/rewards_my_active_page.dart
  67. 3 2
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_active/rewards_my_active_repository.dart
  68. 4 2
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_active/rewards_my_active_repository.g.dart
  69. 4 4
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_active/rewards_my_active_vm.dart
  70. 6 5
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_active/rewards_my_active_vm.g.dart
  71. 49 47
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_expired/rewards_my_expired_page.dart
  72. 3 2
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_expired/rewards_my_expired_repository.dart
  73. 4 2
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_expired/rewards_my_expired_repository.g.dart
  74. 4 3
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_expired/rewards_my_expired_vm.dart
  75. 7 5
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_expired/rewards_my_expired_vm.g.dart
  76. 52 48
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_used/rewards_my_used_page.dart
  77. 3 2
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_used/rewards_my_used_repository.dart
  78. 4 2
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_used/rewards_my_used_repository.g.dart
  79. 4 3
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_used/rewards_my_used_vm.dart
  80. 4 3
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_used/rewards_my_used_vm.g.dart
  81. 1 1
      packages/cpt_rewards/lib/modules/rewards_my/rewards_my_vm.g.dart
  82. 82 44
      packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_page.dart
  83. 14 13
      packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_repository.dart
  84. 4 2
      packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_repository.g.dart
  85. 34 36
      packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_state.dart
  86. 45 51
      packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_vm.dart
  87. 5 4
      packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_vm.g.dart
  88. 211 108
      packages/cpt_rewards/lib/modules/rewards_search/rewards_search_page.dart
  89. 49 13
      packages/cpt_rewards/lib/modules/rewards_search/rewards_search_repository.dart
  90. 4 2
      packages/cpt_rewards/lib/modules/rewards_search/rewards_search_repository.g.dart
  91. 48 32
      packages/cpt_rewards/lib/modules/rewards_search/rewards_search_state.dart
  92. 113 51
      packages/cpt_rewards/lib/modules/rewards_search/rewards_search_vm.dart
  93. 4 3
      packages/cpt_rewards/lib/modules/rewards_search/rewards_search_vm.g.dart
  94. 76 59
      packages/cpt_rewards/lib/modules/rewards_successful/rewards_successful_page.dart
  95. 6 3
      packages/cpt_rewards/lib/modules/rewards_successful/rewards_successful_repository.g.dart
  96. 8 6
      packages/cpt_rewards/lib/modules/rewards_successful/rewards_successful_vm.g.dart
  97. 119 99
      packages/cpt_rewards/lib/modules/rewards_transaction/rewards_transaction_page.dart
  98. 13 13
      packages/cpt_rewards/lib/modules/rewards_transaction/rewards_transaction_repository.dart
  99. 6 3
      packages/cpt_rewards/lib/modules/rewards_transaction/rewards_transaction_repository.g.dart
  100. 0 0
      packages/cpt_rewards/lib/modules/rewards_transaction/rewards_transaction_state.dart

+ 8 - 9
packages/cpt_notice_board/lib/modules/announ/page/announ_page.dart

@@ -30,7 +30,7 @@ class AnnounPage extends HookConsumerWidget {
     }
   }
 
-  Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, vm) { 
+  Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, vm) {
     return Container(
       // color: Colors.blue,
       child: Text(
@@ -89,20 +89,19 @@ class AnnounPage extends HookConsumerWidget {
         ],
       ).onTap(() {
         // 去详情
-        AnnouncementDetailPage.startInstance(context: context);
+        // AnnouncementDetailPage.startInstance(context: context);
+        AnnouncementDetailPage.startInstance(id: item['id']);
       }),
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, vm) {
-    List itemsList = vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], vm);
-      },
-    );
+    final state = ref.watch(announVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], vm);
+    }, childCount: state.list!.length));
   }
 
   @override

+ 0 - 1
packages/cpt_notice_board/lib/modules/announ/repository/announ_repository.dart

@@ -63,5 +63,4 @@ class AnnounRepository {
     }
     return result.convert();
   }
-
 }

+ 2 - 4
packages/cpt_notice_board/lib/modules/announ/vm/announ_vm.dart

@@ -100,9 +100,7 @@ class AnnounVm extends _$AnnounVm {
       final result = await announRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.data as NoticeBoardAnnounEntity)
-            .list
-            .cast<NoticeBoardAnnounEntity>());
+        handlerResultList((result.data as NoticeBoardAnnounEntity).list);
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -113,7 +111,7 @@ class AnnounVm extends _$AnnounVm {
     }
   }
 
-  void handlerResultList(List<NoticeBoardAnnounEntity>? list) {
+  void handlerResultList(List<NoticeBoardAnnounList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 107 - 80
packages/cpt_notice_board/lib/modules/announcement_detail/page/announcement_detail_page.dart

@@ -1,70 +1,78 @@
 import 'package:cpt_notice_board/modules/notice_board/page/notice_board_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/notice_board_announ_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:cs_resources/generated/assets.dart';
-
+import 'package:flutter_html/flutter_html.dart';
 import '../../../router/page/notice_board_page_router.dart';
 import '../vm/announcement_detail_vm.dart';
 
 @RoutePage()
 class AnnouncementDetailPage extends HookConsumerWidget {
-  const AnnouncementDetailPage({Key? key}) : super(key: key);
+  final int? id;
+  const AnnouncementDetailPage({Key? key, @PathParam('id') required this.id})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? id,
+  }) {
     if (context != null) {
-      context.router.push(const AnnouncementDetailPageRoute());
+      context.router.push(AnnouncementDetailPageRoute(id: id));
     } else {
-      appRouter.push(const AnnouncementDetailPageRoute());
+      appRouter.push(AnnouncementDetailPageRoute(id: id));
     }
   }
 
-  Widget _buildDetailTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();
+  Widget _buildDetailTop(BuildContext context, WidgetRef ref, _vm, item) {
+    List? resources = item!.resources ?? [];
     return Column(
       children: [
         Column(children: [
-          const Text(
-            'STANDARD OPERATING PROCEDURE FOR REPLACEMENT VEHICLES AND OVERNICHT PARKING VEHICLES(REMINDER)',
-            style: TextStyle(
+          Text(
+            item.title,
+            style: const TextStyle(
                 fontSize: 18.0,
                 color: Colors.black,
                 fontWeight: FontWeight.w700), // 设置字体大小
           ),
-          Row(
-            mainAxisAlignment: MainAxisAlignment.start,
-            crossAxisAlignment: CrossAxisAlignment.center,
-            children: [
-              const MyAssetImage(
-                Assets.noticeBoardAnnouncementDetailOur,
-                width: 15,
-                height: 15,
-              ).marginOnly(right: 8),
-              const Text(
-                'Our ref: ',
-                style: TextStyle(
-                    fontSize: 15.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w700), // 设置字体大小
-              ),
-              const Text(
-                '2024/CORR/CIR/112.V5',
-                style: TextStyle(
-                    fontSize: 15.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w400), // 设置字体大小
-              ),
-            ],
-          ).marginOnly(top: 15),
+          // Row(
+          //   mainAxisAlignment: MainAxisAlignment.start,
+          //   crossAxisAlignment: CrossAxisAlignment.center,
+          //   children: [
+          //     const MyAssetImage(
+          //       Assets.noticeBoardAnnouncementDetailOur,
+          //       width: 15,
+          //       height: 15,
+          //     ).marginOnly(right: 8),
+          //     const Text(
+          //       'Our ref: ',
+          //       style: TextStyle(
+          //           fontSize: 15.0,
+          //           color: Colors.black,
+          //           fontWeight: FontWeight.w700), // 设置字体大小
+          //     ),
+          //     const Text(
+          //       '2024/CORR/CIR/112.V5',
+          //       style: TextStyle(
+          //           fontSize: 15.0,
+          //           color: Colors.black,
+          //           fontWeight: FontWeight.w400), // 设置字体大小
+          //     ),
+          //   ],
+          // ).marginOnly(top: 15),
           Row(
             mainAxisAlignment: MainAxisAlignment.start,
             crossAxisAlignment: CrossAxisAlignment.center,
@@ -81,40 +89,40 @@ class AnnouncementDetailPage extends HookConsumerWidget {
                     color: Colors.black,
                     fontWeight: FontWeight.w700), // 设置字体大小
               ),
-              const Text(
-                '31 July 2024',
-                style: TextStyle(
-                    fontSize: 15.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w400), // 设置字体大小
-              ),
-            ],
-          ).marginOnly(top: 15),
-          Row(
-            mainAxisAlignment: MainAxisAlignment.start,
-            crossAxisAlignment: CrossAxisAlignment.center,
-            children: [
-              const MyAssetImage(
-                Assets.noticeBoardAnnouncementDetailTo,
-                width: 15,
-                height: 15,
-              ).marginOnly(right: 8),
-              const Text(
-                'To: ',
-                style: TextStyle(
-                    fontSize: 15.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w700), // 设置字体大小
-              ),
-              const Text(
-                'All Residents',
-                style: TextStyle(
+              Text(
+                item.createdAt,
+                style: const TextStyle(
                     fontSize: 15.0,
                     color: Colors.black,
                     fontWeight: FontWeight.w400), // 设置字体大小
               ),
             ],
           ).marginOnly(top: 15),
+          // Row(
+          //   mainAxisAlignment: MainAxisAlignment.start,
+          //   crossAxisAlignment: CrossAxisAlignment.center,
+          //   children: [
+          //     const MyAssetImage(
+          //       Assets.noticeBoardAnnouncementDetailTo,
+          //       width: 15,
+          //       height: 15,
+          //     ).marginOnly(right: 8),
+          //     const Text(
+          //       'To: ',
+          //       style: TextStyle(
+          //           fontSize: 15.0,
+          //           color: Colors.black,
+          //           fontWeight: FontWeight.w700), // 设置字体大小
+          //     ),
+          //     const Text(
+          //       'All Residents',
+          //       style: TextStyle(
+          //           fontSize: 15.0,
+          //           color: Colors.black,
+          //           fontWeight: FontWeight.w400), // 设置字体大小
+          //     ),
+          //   ],
+          // ).marginOnly(top: 15),
         ])
             .paddingOnly(bottom: 25)
             .border(bottom: 1, color: ColorUtils.string2Color('#F2F3F6')),
@@ -133,12 +141,15 @@ class AnnouncementDetailPage extends HookConsumerWidget {
                 )
               ],
             ).marginOnly(bottom: 25),
-            const Text(
-              'Dear Residents,STANDARD OPERATING PROCEDURE FORREPLACEMENT VEHICLES ANDOVERNICHT PARKING VEHICLES',
-              style: TextStyle(
-                  fontSize: 15.0,
-                  color: Colors.black,
-                  fontWeight: FontWeight.w400), // 设置字体大小
+            resources!.length > 0
+                ? MyLoadImage(
+                    resources[0] ?? '',
+                    width: MediaQuery.of(context).size.width,
+                    height: 150,
+                  ).marginOnly(bottom: 15)
+                : Container(),
+            Html(
+              data: item.content,
             ),
           ],
         ).paddingOnly(top: 25, bottom: 50),
@@ -149,23 +160,39 @@ class AnnouncementDetailPage extends HookConsumerWidget {
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(announcementDetailVmProvider.notifier);
-
+    final state = ref.watch(announcementDetailVmProvider);
+    NoticeBoardAnnounDetailEntity? detailInfo = state.detailInfo;
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => _vm.initPageData(id: id));
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
         "Lift Padding",
         backgroundColor: context.appColors.backgroundWhite,
       ),
-      body: Container(
-          child: EasyRefresh(
-        child: SingleChildScrollView(
-            scrollDirection: Axis.vertical,
-            physics: const BouncingScrollPhysics(),
-            clipBehavior: Clip.none,
-            child: Padding(
-                padding: const EdgeInsets.only(left: 15, right: 15, top: 15),
-                child: _buildDetailTop(context, ref, _vm))),
-      )),
+      body: LoadStateLayout(
+          state: state.loadingState,
+          errorMessage: state.errorMessage,
+          errorRetry: () {
+            _vm.retryRequest(id: id);
+          },
+          successWidget: Container(
+              child: EasyRefresh(
+            child: SingleChildScrollView(
+                scrollDirection: Axis.vertical,
+                physics: const BouncingScrollPhysics(),
+                clipBehavior: Clip.none,
+                child: Padding(
+                    padding:
+                        const EdgeInsets.only(left: 15, right: 15, top: 15),
+                    child: _buildDetailTop(context, ref, _vm, detailInfo))),
+          ))),
     );
   }
 }

+ 34 - 35
packages/cpt_notice_board/lib/modules/announcement_detail/page/announcement_detail_state.dart

@@ -2,48 +2,47 @@
 
 import 'dart:convert';
 
-AnnouncementDetailState announcementDetailStateFromJson(String str) => AnnouncementDetailState.fromJson(json.decode(str));
 
-String announcementDetailStateToJson(AnnouncementDetailState data) => json.encode(data.toJson());
+import 'package:domain/entity/notice_board_announ_detail_entity.dart';
+import 'package:widgets/load_state_layout.dart';
 
 class AnnouncementDetailState {
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+  NoticeBoardAnnounDetailEntity? detailInfo;
+
   AnnouncementDetailState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
-
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory AnnouncementDetailState.fromJson(Map<dynamic, dynamic> json) => AnnouncementDetailState(
-    curPage: json["curPage"],
-    pageSize: json["pageSize"],
-    list: List<Map<String, dynamic>>.from(json["list"].map((x) => x)),
-    filterCount: json["filterCount"],
-  );
-
-  Map<dynamic, dynamic> toJson() => {
-    "curPage": curPage,
-    "pageSize": pageSize,
-    "list": List<dynamic>.from(list.map((x) => x)),
-    "filterCount": filterCount,
-  };
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    NoticeBoardAnnounDetailEntity? detailInfo,
+  }) : detailInfo = detailInfo ?? NoticeBoardAnnounDetailEntity();
 
   AnnouncementDetailState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
+    LoadState? loadingState,
+    String? errorMessage,
+    NoticeBoardAnnounDetailEntity? detailInfo,
   }) {
     return AnnouncementDetailState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      detailInfo: detailInfo ?? this.detailInfo,
+    );
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'loadingState': this.loadingState,
+      'errorMessage': this.errorMessage,
+      'detailInfo': this.detailInfo,
+    };
+  }
+
+  factory AnnouncementDetailState.fromMap(Map<String, dynamic> map) {
+    return AnnouncementDetailState(
+      loadingState: map['loadingState'] as LoadState,
+      errorMessage: map['errorMessage'] as String,
+      detailInfo: map['detailInfo'] as NoticeBoardAnnounDetailEntity,
     );
   }
-}
+}

+ 12 - 14
packages/cpt_notice_board/lib/modules/announcement_detail/repository/announcement_detail_repository.dart

@@ -1,9 +1,11 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/notice_board_announ_detail_entity.dart';
 import 'package:domain/entity/server_time.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -27,18 +29,13 @@ class AnnouncementDetailRepository {
   AnnouncementDetailRepository({required this.dioEngine});
 
   Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
     Map<String, dynamic> params = {};
 
-    // if (!Utils.isEmpty(type)) {
-    //   params["type"] = type!;
-    // }
-
     params = data!;
 
-
     Map<String, String> headers = {};
 
     headers["Content-Type"] = "application/x-www-form-urlencoded";
@@ -46,25 +43,26 @@ class AnnouncementDetailRepository {
 
     final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/notice/announcement/detail', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
+    Log.d("------请求返回的result--$result--------");
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = AnnouncementDetailState.fromJson(json!);
+      var data = NoticeBoardAnnounDetailEntity.fromJson(json!);
+      // Log.d("------data--$data--------");
       //重新赋值data或list
-      return result.convert<AnnouncementDetailState>(data: data);
+      return result.convert<NoticeBoardAnnounDetailEntity>(data: data);
     }
     return result.convert();
   }
 
-
 }

+ 46 - 48
packages/cpt_notice_board/lib/modules/announcement_detail/vm/announcement_detail_vm.dart

@@ -1,7 +1,10 @@
+import 'package:domain/entity/notice_board_announ_detail_entity.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
 import '../page/announcement_detail_state.dart';
 import '../repository/announcement_detail_repository.dart';
 part 'announcement_detail_vm.g.dart';
@@ -9,31 +12,22 @@ part 'announcement_detail_vm.g.dart';
 @riverpod
 class AnnouncementDetailVm extends _$AnnouncementDetailVm {
   late AnnouncementDetailRepository announcementDetailRepository;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
   AnnouncementDetailState initState() {
-    return AnnouncementDetailState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title":
-              "The community will hold the activity of making Zongzi on the Loong Boat ……",
-          "price": "Monday 14 0ct 2024, 15:00 PM~18:00PM",
-        },
-        {
-          "id": 2,
-          "title": "Community basketball competition activities",
-          "price": "Monday 14 Oct 2024, 10:19 AM",
-        },
-      ],
-      filterCount: 2,
-    );
+    return AnnouncementDetailState();
   }
 
   @override
   AnnouncementDetailState build() {
     // 引入数据仓库
-    announcementDetailRepository = ref.read(announcementDetailRepositoryProvider);
+    announcementDetailRepository =
+        ref.read(announcementDetailRepositoryProvider);
     // 初始化状态
     AnnouncementDetailState state = initState();
     // 初始化列表数据
@@ -41,22 +35,14 @@ class AnnouncementDetailVm extends _$AnnouncementDetailVm {
   }
 
   // 初始化页面数据
-  initPageData() {
+  initPageData({int? id}) {
     Log.d("----property_news_vm-----initPageData");
-    refreshListData();
+    getListData(id: id);
   }
 
   // 上拉加载
   Future onLoadData() async {
     Log.d("----property_news_vm-----initListData");
-    // await Future.delayed(const Duration(seconds: 2));
-    // if(state.list.length >= state.filterCount){
-    //   return;
-    // }else {
-    //   int curPage = state.curPage + 1;
-    //   state = state.copyWith(curPage: curPage,);
-    //   getListData();
-    // }
     getListData();
   }
 
@@ -66,40 +52,52 @@ class AnnouncementDetailVm extends _$AnnouncementDetailVm {
     // PropertyPage.startInstance(context: context, item: item);
   }
 
+// 重试请求
+  Future retryRequest({int? id}) async {
+    _needShowPlaceholder = true;
+    getListData(id: id);
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
   // 获取list 列表数据
-  void getListData<T>() async {
+  void getListData<T>({int? id}) async {
     Log.d("加载listData数据---------------start-----");
     try {
       //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
+      Map<String, dynamic> params = {"id": id};
       Log.d("请求参数------$params");
-      final result = await announcementDetailRepository.fetchPropertyNewsList(params);
+      final result =
+          await announcementDetailRepository.fetchPropertyNewsList(params);
       Log.d("请求完成结果------${result.data}");
       //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
+        state = state.copyWith(
+          detailInfo: result.data as NoticeBoardAnnounDetailEntity,
+        );
+        Log.d("123------${state.detailInfo}");
+        changeLoadingState(LoadState.State_Success, null);
       } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
         ToastEngine.show(result.errorMsg ?? "Network Load Error");
       }
     } catch (e) {
       ToastEngine.show("Error: $e");
     }
   }
+  // // 下拉刷新
+  // Future refreshListData() async {
+  //   Log.d("----property_news_vm-----refreshListData ");
 
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
-
-    // await Future.delayed(const Duration(seconds: 2));
+  //   // await Future.delayed(const Duration(seconds: 2));
 
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
-  }
+  //   state = state.copyWith(curPage: 1, pageSize: 10);
+  //   // ref.invalidateSelf();
+  //   // ref.invalidate(propertyNewsVmProvider);
+  //   getListData();
+  // }
 }

+ 24 - 15
packages/cpt_notice_board/lib/modules/documents/page/documents_page.dart

@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
@@ -49,7 +50,10 @@ class DocumentsPage extends HookConsumerWidget {
     return Container(
       color: Colors.white,
       child: TextButton(
-        onPressed: () {},
+        onPressed: () {
+          DocumentsListPage.startInstance(id: item['id']);
+          // DocumentsListPage.startInstance(context: context);
+        },
         style: TextButton.styleFrom(
           foregroundColor: Colors.black,
           backgroundColor: ColorUtils.string2Color('#4161D0'), // 背景颜色
@@ -76,6 +80,7 @@ class DocumentsPage extends HookConsumerWidget {
 
   // listitem
   Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
+    String url = item['url'];
     return Container(
       decoration: const BoxDecoration(
         color: Colors.white,
@@ -97,11 +102,13 @@ class DocumentsPage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.center,
               children: [
                 Expanded(child: _buildItemLeftSection(context, ref, item, _vm)),
-                Container(
-                  width: 120,
-                  child: _buildItemRightSection(context, ref, item, _vm),
-                  // child: TextButton(onPressed: (){}, child: Text("fdsfds")),
-                ),
+                url == ''
+                    ? Container(
+                        width: 120,
+                        child: _buildItemRightSection(context, ref, item, _vm),
+                        // child: TextButton(onPressed: (){}, child: Text("fdsfds")),
+                      )
+                    : Container(),
               ],
             ).paddingOnly(left: 20, right: 20),
           ).constrained(
@@ -110,21 +117,23 @@ class DocumentsPage extends HookConsumerWidget {
         ],
       ).onTap(() {
         // 去详情
-        // _vm.goNewsDetail(item);
-        DocumentsListPage.startInstance(context: context);
+        if (url != '') {
+          // _vm.launchURL(url);
+          GlobalWebPage.startInstance(
+              context: context, title: item['name'], url: url);
+        }
+        // DocumentsListPage.startInstance(context: context);
       }),
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
+    final state = ref.watch(documentsVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override

+ 24 - 6
packages/cpt_notice_board/lib/modules/documents/vm/documents_vm.dart

@@ -1,8 +1,8 @@
 import 'package:domain/entity/notice_board_documents_entity.dart';
-import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:url_launcher/url_launcher.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 import '../page/documents_state.dart';
@@ -96,15 +96,13 @@ class DocumentsVm extends _$DocumentsVm {
       Map<String, dynamic> params = {
         "page": page,
         "limit": limit,
-        "parent_id":0
+        "parent_id": 0
       };
       Log.d("请求参数------$params");
       final result = await documentsRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.data as NoticeBoardDocumentsEntity)
-            .list
-            .cast<NoticeBoardDocumentsEntity>());
+        handlerResultList((result.data as NoticeBoardDocumentsEntity).list);
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -115,7 +113,7 @@ class DocumentsVm extends _$DocumentsVm {
     }
   }
 
-  void handlerResultList(List<NoticeBoardDocumentsEntity>? list) {
+  void handlerResultList(List<NoticeBoardDocumentsList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {
@@ -150,4 +148,24 @@ class DocumentsVm extends _$DocumentsVm {
       }
     }
   }
+
+  // 重试请求
+  void launchURL(url) async {
+    // const url = 'https://flutterchina.club/';
+    if (await canLaunch(url)) {
+      await launch(
+        url,
+        // Add optional `forceWebView` flag for Android to use a WebView
+        forceWebView: true,
+        // Add optional `enableBarColors` flag for iOS to change the color of the bars
+        enableJavaScript: true,
+        // Add optional `chromeCustomTabs` parameter for Android to customize Chrome Custom Tabs
+        enableDomStorage: true,
+        universalLinksOnly: true,
+        forceSafariVC: true,
+      );
+    } else {
+      throw 'Could not launch $url';
+    }
+  }
 }

+ 65 - 37
packages/cpt_notice_board/lib/modules/documents_list/page/documents_list_page.dart

@@ -2,11 +2,14 @@ import 'package:cpt_notice_board/modules/notice_board/page/notice_board_page.dar
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/widget_export.dart';
@@ -17,14 +20,19 @@ import '../vm/documents_list_vm.dart';
 
 @RoutePage()
 class DocumentsListPage extends HookConsumerWidget {
-  const DocumentsListPage({Key? key}) : super(key: key);
+  final int? id;
+  const DocumentsListPage({Key? key, @PathParam('id') required this.id})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? id,
+  }) {
     if (context != null) {
-      context.router.push(const DocumentsListPageRoute());
+      context.router.push(DocumentsListPageRoute(id: id));
     } else {
-      appRouter.push(const DocumentsListPageRoute());
+      appRouter.push(DocumentsListPageRoute(id: id));
     }
   }
 
@@ -32,7 +40,7 @@ class DocumentsListPage extends HookConsumerWidget {
     return Container(
       // color: Colors.blue,
       child: Text(
-        item['title'],
+        item['name'],
         maxLines: 2, // 设置最大行数为2
         overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
         style: const TextStyle(
@@ -63,8 +71,11 @@ class DocumentsListPage extends HookConsumerWidget {
             ), // 边框
           ),
         ),
-        child: const Text('Open Folder',
-          style: const TextStyle(color: Colors.white,),
+        child: const Text(
+          'Open Folder',
+          style: const TextStyle(
+            color: Colors.white,
+          ),
         ),
       ),
     );
@@ -72,6 +83,7 @@ class DocumentsListPage extends HookConsumerWidget {
 
   // listitem
   Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
+    String url = item['url'];
     return Container(
       decoration: const BoxDecoration(
         color: Colors.white,
@@ -94,38 +106,46 @@ class DocumentsListPage extends HookConsumerWidget {
               children: [
                 Expanded(child: _buildItemLeftSection(context, ref, item, _vm)),
                 Container(
-                  // width: 120,
-                  // child: _buildItemRightSection(context, ref, item, _vm),
-                  // child: TextButton(onPressed: (){}, child: Text("fdsfds")),
-                ),
+                    // width: 120,
+                    // child: _buildItemRightSection(context, ref, item, _vm),
+                    // child: TextButton(onPressed: (){}, child: Text("fdsfds")),
+                    ),
               ],
-            ).paddingOnly(left: 20,right: 20),
+            ).paddingOnly(left: 20, right: 20),
           ).constrained(
             minHeight: 70,
           ),
         ],
       ).onTap(() {
         // 去详情
-        _vm.goNewsDetail(item);
+        // _vm.launchURL(url);
+        GlobalWebPage.startInstance(
+            context: context, title: item['name'], url: url);
       }),
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
+    final state = ref.watch(documentsListVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override
   Widget build(BuildContext context, WidgetRef ref) {
-    final _vm = ref.read(documentsListVmProvider.notifier);
-
+    final vm = ref.read(documentsListVmProvider.notifier);
+    final state = ref.watch(documentsListVmProvider);
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => vm.initPageData(id: id));
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
@@ -134,21 +154,29 @@ class DocumentsListPage extends HookConsumerWidget {
       ),
       body: Container(
           child: EasyRefresh(
-        // 上拉加载
-        onLoad: () async {
-          Log.d("----onLoad");
-          _vm.onLoadData();
-        },
-        // 下拉刷新
-        onRefresh: () async {
-          Log.d("----onRefresh");
-          _vm.refreshListData();
-        },
-        child: Container(
-            color: ColorUtils.string2Color('#F2F3F6'),
-            padding: const EdgeInsets.only(top: 15),
-            child: _buildSaleList(context, ref, _vm)),
-      )),
+              controller: vm.refreshController,
+              // 上拉加载
+              onLoad: () async {
+                Log.d("----onLoad");
+                vm.loadMore();
+              },
+              // 下拉刷新
+              onRefresh: () async {
+                Log.d("----onRefresh");
+                vm.onRefresh();
+              },
+              child: Container(
+                color: ColorUtils.string2Color('#F2F3F6'),
+                padding: const EdgeInsets.only(top: 15),
+                child: LoadStateLayout(
+                  state: state.loadingState,
+                  errorMessage: state.errorMessage,
+                  errorRetry: () {
+                    vm.retryRequest();
+                  },
+                  successSliverWidget: [_buildSaleList(context, ref, vm)],
+                ),
+              ))),
     );
   }
 }

+ 44 - 32
packages/cpt_notice_board/lib/modules/documents_list/page/documents_list_state.dart

@@ -2,48 +2,60 @@
 
 import 'dart:convert';
 
-DocumentsListState documentsListStateFromJson(String str) => DocumentsListState.fromJson(json.decode(str));
-
-String documentsListStateToJson(DocumentsListState data) => json.encode(data.toJson());
+import 'package:widgets/load_state_layout.dart';
 
 class DocumentsListState {
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+
+  int? page;
+  int? limit = 10;
+  int? count = 1;
+  List<Map<String, dynamic>>? list;
+
   DocumentsListState({
-    required this.curPage,
-    required this.pageSize,
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    this.page = 1,
+    this.limit = 10,
+    this.count = 1,
     required this.list,
-    required this.filterCount,
   });
 
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory DocumentsListState.fromJson(Map<dynamic, dynamic> json) => DocumentsListState(
-    curPage: json["curPage"],
-    pageSize: json["pageSize"],
-    list: List<Map<String, dynamic>>.from(json["list"].map((x) => x)),
-    filterCount: json["filterCount"],
-  );
-
-  Map<dynamic, dynamic> toJson() => {
-    "curPage": curPage,
-    "pageSize": pageSize,
-    "list": List<dynamic>.from(list.map((x) => x)),
-    "filterCount": filterCount,
-  };
-
   DocumentsListState copyWith({
-    int? curPage,
-    int? pageSize,
+    LoadState? loadingState,
+    String? errorMessage,
+    int? page,
+    int? limit,
+    int? count,
     List<Map<String, dynamic>>? list,
-    int? filterCount,
   }) {
     return DocumentsListState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      page: page ?? this.page,
+      limit: limit ?? this.limit,
+      count: count ?? this.count,
       list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
     );
   }
-}
+
+  Map<String, dynamic> toMap() {
+    return {
+      'page': this.page,
+      'limit': this.limit,
+      'count': this.count,
+      'list': this.list,
+    };
+  }
+
+  factory DocumentsListState.fromMap(Map<String, dynamic> map) {
+    return DocumentsListState(
+      page: map['page'] as int,
+      limit: map['limit'] as int,
+      count: map['count'] as int,
+      list: map['list'] as List<Map<String, dynamic>>,
+    );
+  }
+}

+ 12 - 17
packages/cpt_notice_board/lib/modules/documents_list/repository/documents_list_repository.dart

@@ -1,9 +1,11 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/notice_board_documents_entity.dart';
 import 'package:domain/entity/server_time.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -25,20 +27,14 @@ class DocumentsListRepository {
   DioEngine dioEngine;
 
   DocumentsListRepository({required this.dioEngine});
-
-  Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+Future<HttpResult<Object>> fetchList(
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
     Map<String, dynamic> params = {};
 
-    // if (!Utils.isEmpty(type)) {
-    //   params["type"] = type!;
-    // }
-
     params = data!;
 
-
     Map<String, String> headers = {};
 
     headers["Content-Type"] = "application/x-www-form-urlencoded";
@@ -46,25 +42,24 @@ class DocumentsListRepository {
 
     final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/notice/document/index', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
+    Log.d("------请求返回的result--$result--------");
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = DocumentsListState.fromJson(json!);
+      var data = NoticeBoardDocumentsEntity.fromJson(json!);
       //重新赋值data或list
-      return result.convert<DocumentsListState>(data: data);
+      return result.convert<NoticeBoardDocumentsEntity>(data: data);
     }
     return result.convert();
   }
-
-
 }

+ 115 - 49
packages/cpt_notice_board/lib/modules/documents_list/vm/documents_list_vm.dart

@@ -1,7 +1,11 @@
+import 'package:domain/entity/notice_board_documents_entity.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:url_launcher/url_launcher.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
 import '../page/documents_list_state.dart';
 import '../repository/documents_list_repository.dart';
 part 'documents_list_vm.g.dart';
@@ -9,23 +13,19 @@ part 'documents_list_vm.g.dart';
 @riverpod
 class DocumentsListVm extends _$DocumentsListVm {
   late DocumentsListRepository documentsListRepository;
+  var page = 1;
+  var limit = 10;
+  int listId = 0;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
   DocumentsListState initState() {
     return DocumentsListState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title": "18 Sep 2024 BIK 39#09-XX 1337 psd 1001 sqft 39#09-XX 1337 psd 1001",
-          "price": "\$1.338 M",
-        },  
-        {
-          "id": 2,
-          "title": "18 Sep 2024 BIK 39#09-XX 1337 psd 1001 sqft",
-          "price": "\$1.338 M",
-        },
-      ],
-      filterCount: 2,
+      list: [],
     );
   }
 
@@ -39,48 +39,73 @@ class DocumentsListVm extends _$DocumentsListVm {
     return state;
   }
 
-  // 初始化页面数据
-  initPageData() {
+//刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
+  // 初始化页面数据&0
+  initPageData({int? id}) {
     Log.d("----property_news_vm-----initPageData");
-    refreshListData();
+    listId = id!;
+    onRefresh();
   }
 
-  // 上拉加载
-  Future onLoadData() async {
-    Log.d("----property_news_vm-----initListData");
+  // 上拉加载 更多
+  Future loadMore() async {
+    Log.d("----property_news_vm-----loadMore");
     // await Future.delayed(const Duration(seconds: 2));
-    // if(state.list.length >= state.filterCount){
+    // if(state.list.length >= state.count){
     //   return;
     // }else {
-    //   int curPage = state.curPage + 1;
-    //   state = state.copyWith(curPage: curPage,);
+    //   int page = page + 1;
+    //   state = state.copyWith(page: page,);
     //   getListData();
     // }
+    // 检查 page 是否为 null,并初始化为 1
+    page++;
+
+    getListData();
+  }
+
+  // 下拉刷新
+  Future onRefresh() async {
+    Log.d("----property_news_vm-----onRefresh ");
+
+    // await Future.delayed(const Duration(seconds: 2));
+    page = 1;
     getListData();
   }
-// 去新闻详情页
-  void goNewsDetail(String item) {
-    Log.d(item);
-    // PropertyPage.startInstance(context: context, item: item);
+
+  // 重试请求
+  Future retryRequest() async {
+    page = 1;
+    _needShowPlaceholder = true;
+    getListData();
   }
+
   // 获取list 列表数据
-  void getListData<T>() async {
-    Log.d("加载listData数据---------------start-----");
+  Future getListData<T>() async {
+    // if (_needShowPlaceholder) {
+    //   changeLoadingState(LoadState.State_Loading, null);
+    // }
+
+    Log.d("加载listData数据---------------start--${page}---");
     try {
       //请求网络
-      Map<String, dynamic>  params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
+      Map<String, dynamic> params = {
+        "page": page,
+        "limit": limit,
+        "parent_id": listId
       };
       Log.d("请求参数------$params");
-      final result = await documentsListRepository.fetchPropertyNewsList(params);
-      Log.d("请求完成结果------${result.data}");
+      final result = await documentsListRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
+        handlerResultList((result.data as NoticeBoardDocumentsEntity).list);
       } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
         ToastEngine.show(result.errorMsg ?? "Network Load Error");
       }
     } catch (e) {
@@ -88,18 +113,59 @@ class DocumentsListVm extends _$DocumentsListVm {
     }
   }
 
+  void handlerResultList(List<NoticeBoardDocumentsList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (page == 1) {
+        //刷新的方式
+        state.list!.clear();
+        state.list!.addAll(list.map((item) => item.toJson()).toList());
+        refreshController.finishRefresh();
 
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
-
-    // await Future.delayed(const Duration(seconds: 2));
-
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
-
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        final allList = state.list;
+        state = state.copyWith(list: allList);
+        refreshController.finishLoad();
+        // update();
+      }
+    } else {
+      if (page == 1) {
+        //展示无数据的布局
+        state.list!.clear();
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        if (state.list!.length == 0) {
+          changeLoadingState(LoadState.State_Empty, null);
+        } else {
+          changeLoadingState(LoadState.State_Success, null);
+        }
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
   }
 
+  // 重试请求
+  void launchURL(url) async {
+    // const url = url;
+    if (await canLaunch(url)) {
+      await launch(
+        url,
+        // Add optional `forceWebView` flag for Android to use a WebView
+        forceWebView: true,
+        // Add optional `enableBarColors` flag for iOS to change the color of the bars
+        enableJavaScript: true,
+        // Add optional `chromeCustomTabs` parameter for Android to customize Chrome Custom Tabs
+        enableDomStorage: true,
+        universalLinksOnly: true,
+        forceSafariVC: true,
+      );
+    } else {
+      throw 'Could not launch $url';
+    }
+  }
 }

+ 6 - 12
packages/cpt_notice_board/lib/modules/event/page/event_page.dart

@@ -86,24 +86,18 @@ class EventPage extends HookConsumerWidget {
         ],
       ).onTap(() {
         // 去详情
-        // _vm.goNewsDetail(item['title']);
-        Navigator.push(
-          context,
-          MaterialPageRoute(builder: (context) => const EventDetailPage()),
-        );
+        EventDetailPage.startInstance(id: item['id']);
       }),
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
+    final state = ref.watch(eventVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override

+ 2 - 4
packages/cpt_notice_board/lib/modules/event/vm/event_vm.dart

@@ -101,9 +101,7 @@ class EventVm extends _$EventVm {
       final result = await eventRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.data as NoticeBoardEventEntity)
-            .list
-            .cast<NoticeBoardEventEntity>());
+        handlerResultList((result.data as NoticeBoardEventEntity).list);
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -114,7 +112,7 @@ class EventVm extends _$EventVm {
     }
   }
 
-  void handlerResultList(List<NoticeBoardEventEntity>? list) {
+  void handlerResultList(List<NoticeBoardEventList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 88 - 61
packages/cpt_notice_board/lib/modules/event_detail/page/event_detail_page.dart

@@ -1,12 +1,15 @@
 import 'package:cpt_notice_board/modules/notice_board/page/notice_board_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/notice_board_event_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/widget_export.dart';
@@ -17,25 +20,30 @@ import '../vm/event_detail_vm.dart';
 
 @RoutePage()
 class EventDetailPage extends HookConsumerWidget {
-  const EventDetailPage({Key? key}) : super(key: key);
+  final int? id;
+  const EventDetailPage({Key? key, @PathParam('id') required this.id})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? id,
+  }) {
     if (context != null) {
-      context.router.push(const EventDetailPageRoute());
+      context.router.push(EventDetailPageRoute(id: id));
     } else {
-      appRouter.push(const EventDetailPageRoute());
+      appRouter.push(EventDetailPageRoute(id: id));
     }
   }
 
-  Widget _buildDetailTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();3
+  Widget _buildDetailTop(BuildContext context, WidgetRef ref, _vm, item) {
+    List? resources = item!.resources ?? [];
     return Column(
       children: [
         Column(children: [
-          const Text(
-            'STANDARD OPERATING PROCEDURE FOR REPLACEMENT VEHICLES AND OVERNICHT PARKING VEHICLES(REMINDER)',
-            style: TextStyle(
+          Text(
+            item.title,
+            style: const TextStyle(
                 fontSize: 18.0,
                 color: Colors.black,
                 fontWeight: FontWeight.w700), // 设置字体大小
@@ -44,57 +52,60 @@ class EventDetailPage extends HookConsumerWidget {
             mainAxisAlignment: MainAxisAlignment.start,
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
-              const MyAssetImage(
-                Assets.noticeBoardAnnouncementDetailOur,
-                width: 15,
-                height: 15,
-              ).marginOnly(right: 8),
-              const Text(
-                'Our ref: ',
-                style: TextStyle(
-                    fontSize: 15.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w700), // 设置字体大小
-              ),
-              const Text(
-                '2024/CORR/CIR/112.V5',
-                style: TextStyle(
+              // const MyAssetImage(
+              //   Assets.noticeBoardAnnouncementDetailOur,
+              //   width: 15,
+              //   height: 15,
+              // ).marginOnly(right: 8),
+              // const Text(
+              //   'Our ref: ',
+              //   style: TextStyle(
+              //       fontSize: 15.0,
+              //       color: Colors.black,
+              //       fontWeight: FontWeight.w700), // 设置字体大小
+              // ),
+              Text(
+                item.datetime,
+                style: const TextStyle(
                     fontSize: 15.0,
                     color: Colors.black,
                     fontWeight: FontWeight.w400), // 设置字体大小
               ),
             ],
           ).marginOnly(top: 15),
-          const MyAssetImage(
-            Assets.propertyHomeLoanBg,
-            // width: 15,
-            // height: 15,
-          ).marginOnly(top: 25),
-        ]).paddingOnly(bottom: 25),
+          // const MyAssetImage(
+          //   Assets.propertyHomeLoanBg,
+          //   // width: 15,
+          //   // height: 15,
+          // ).marginOnly(top: 25),
+        ]).paddingOnly(bottom: 20),
         Column(
           children: [
-            const Column(
-              mainAxisAlignment: MainAxisAlignment.center,
-              crossAxisAlignment: CrossAxisAlignment.center,
-              children: [
-                Text(
-                  'IMPORTANT',
-                  style: TextStyle(
-                      fontSize: 18.0,
-                      color: Colors.black,
-                      fontWeight: FontWeight.w700), // 设置字体大小
-                )
-              ],
-            ).marginOnly(bottom: 25),
-            const Text(
-              'Dear Residents,STANDARD OPERATING PROCEDURE FORREPLACEMENT VEHICLES ANDOVERNICHT PARKING VEHICLES',
-              style: TextStyle(
-                  fontSize: 15.0,
-                  color: Colors.black,
-                  fontWeight: FontWeight.w400), // 设置字体大小
+            // const Column(
+            //   mainAxisAlignment: MainAxisAlignment.center,
+            //   crossAxisAlignment: CrossAxisAlignment.center,
+            //   children: [
+            // Text(
+            //   'IMPORTANT',
+            //   style: TextStyle(
+            //       fontSize: 18.0,
+            //       color: Colors.black,
+            //       fontWeight: FontWeight.w700), // 设置字体大小
+            // )
+            // ],
+            // ).marginOnly(bottom: 25),
+            resources!.length > 0
+                ? MyLoadImage(
+                    resources[0] ?? '',
+                    width: MediaQuery.of(context).size.width,
+                    height: 150,
+                  ).marginOnly(bottom: 15)
+                : Container(),
+            Html(
+              data: item.content,
             ),
           ],
-        ).paddingOnly(top: 25, bottom: 50),
+        ).paddingOnly(top: 0, bottom: 50),
       ],
     );
   }
@@ -102,23 +113,39 @@ class EventDetailPage extends HookConsumerWidget {
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(eventDetailVmProvider.notifier);
-
+    final state = ref.watch(eventDetailVmProvider);
+    NoticeBoardEventDetailEntity? detailInfo = state.detailInfo;
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => _vm.initPageData(id: id));
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
         "Lift Padding",
         backgroundColor: context.appColors.backgroundWhite,
       ),
-      body: Container(
-          child: EasyRefresh(
-        child: SingleChildScrollView(
-            scrollDirection: Axis.vertical,
-            physics: const BouncingScrollPhysics(),
-            clipBehavior: Clip.none,
-            child: Padding(
-                padding: const EdgeInsets.only(left: 15, right: 15, top: 15),
-                child: _buildDetailTop(context, ref, _vm))),
-      )),
+      body: LoadStateLayout(
+          state: state.loadingState,
+          errorMessage: state.errorMessage,
+          errorRetry: () {
+            _vm.retryRequest(id: id);
+          },
+          successWidget: Container(
+              child: EasyRefresh(
+            child: SingleChildScrollView(
+                scrollDirection: Axis.vertical,
+                physics: const BouncingScrollPhysics(),
+                clipBehavior: Clip.none,
+                child: Padding(
+                    padding:
+                        const EdgeInsets.only(left: 15, right: 15, top: 15),
+                    child: _buildDetailTop(context, ref, _vm, detailInfo))),
+          ))),
     );
   }
 }

+ 34 - 38
packages/cpt_notice_board/lib/modules/event_detail/page/event_detail_state.dart

@@ -1,49 +1,45 @@
 /// YApi QuickType插件生成,具体参考文档:https://plugins.jetbrains.com/plugin/18847-yapi-quicktype/documentation
 
 import 'dart:convert';
-
-EventDetailState eventDetailStateFromJson(String str) => EventDetailState.fromJson(json.decode(str));
-
-String eventDetailStateToJson(EventDetailState data) => json.encode(data.toJson());
-
+import 'package:domain/entity/notice_board_event_detail_entity.dart';
+import 'package:widgets/load_state_layout.dart';
 class EventDetailState {
-  EventDetailState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+  NoticeBoardEventDetailEntity? detailInfo;
 
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory EventDetailState.fromJson(Map<dynamic, dynamic> json) => EventDetailState(
-    curPage: json["curPage"],
-    pageSize: json["pageSize"],
-    list: List<Map<String, dynamic>>.from(json["list"].map((x) => x)),
-    filterCount: json["filterCount"],
-  );
-
-  Map<dynamic, dynamic> toJson() => {
-    "curPage": curPage,
-    "pageSize": pageSize,
-    "list": List<dynamic>.from(list.map((x) => x)),
-    "filterCount": filterCount,
-  };
+  EventDetailState({
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    NoticeBoardEventDetailEntity? detailInfo,
+  }) : detailInfo = detailInfo ?? NoticeBoardEventDetailEntity();
 
   EventDetailState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
+    LoadState? loadingState,
+    String? errorMessage,
+    NoticeBoardEventDetailEntity? detailInfo,
   }) {
     return EventDetailState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      detailInfo: detailInfo ?? this.detailInfo,
+    );
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'loadingState': this.loadingState,
+      'errorMessage': this.errorMessage,
+      'detailInfo': this.detailInfo,
+    };
+  }
+
+  factory EventDetailState.fromMap(Map<String, dynamic> map) {
+    return EventDetailState(
+      loadingState: map['loadingState'] as LoadState,
+      errorMessage: map['errorMessage'] as String,
+      detailInfo: map['detailInfo'] as NoticeBoardEventDetailEntity,
     );
   }
-}
+}

+ 12 - 15
packages/cpt_notice_board/lib/modules/event_detail/repository/event_detail_repository.dart

@@ -1,9 +1,11 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/notice_board_event_detail_entity.dart';
 import 'package:domain/entity/server_time.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -27,18 +29,13 @@ class EventDetailRepository {
   EventDetailRepository({required this.dioEngine});
 
   Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
     Map<String, dynamic> params = {};
 
-    // if (!Utils.isEmpty(type)) {
-    //   params["type"] = type!;
-    // }
-
     params = data!;
 
-
     Map<String, String> headers = {};
 
     headers["Content-Type"] = "application/x-www-form-urlencoded";
@@ -46,25 +43,25 @@ class EventDetailRepository {
 
     final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/notice/event/detail', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
+    Log.d("------请求返回的result--$result--------");
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = EventDetailState.fromJson(json!);
+      var data = NoticeBoardEventDetailEntity.fromJson(json!);
+      // Log.d("------data--$data--------");
       //重新赋值data或list
-      return result.convert<EventDetailState>(data: data);
+      return result.convert<NoticeBoardEventDetailEntity>(data: data);
     }
     return result.convert();
   }
-
-
 }

+ 48 - 50
packages/cpt_notice_board/lib/modules/event_detail/vm/event_detail_vm.dart

@@ -1,7 +1,10 @@
+import 'package:domain/entity/notice_board_event_detail_entity.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
 import '../page/event_detail_state.dart';
 import '../repository/event_detail_repository.dart';
 part 'event_detail_vm.g.dart';
@@ -9,31 +12,22 @@ part 'event_detail_vm.g.dart';
 @riverpod
 class EventDetailVm extends _$EventDetailVm {
   late EventDetailRepository eventDetailRepository;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
   EventDetailState initState() {
-    return EventDetailState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title":
-              "The community will hold the activity of making Zongzi on the Loong Boat ……",
-          "price": "Monday 14 0ct 2024, 15:00 PM~18:00PM",
-        },
-        {
-          "id": 2,
-          "title": "Community basketball competition activities",
-          "price": "Monday 14 Oct 2024, 10:19 AM",
-        },
-      ],
-      filterCount: 2,
-    );
+    return EventDetailState();
   }
 
   @override
   EventDetailState build() {
     // 引入数据仓库
-    eventDetailRepository = ref.read(eventDetailRepositoryProvider);
+    eventDetailRepository =
+        ref.read(eventDetailRepositoryProvider);
     // 初始化状态
     EventDetailState state = initState();
     // 初始化列表数据
@@ -41,22 +35,14 @@ class EventDetailVm extends _$EventDetailVm {
   }
 
   // 初始化页面数据
-  initPageData() {
+  initPageData({int? id}) {
     Log.d("----property_news_vm-----initPageData");
-    refreshListData();
+    getListData(id: id);
   }
 
   // 上拉加载
   Future onLoadData() async {
     Log.d("----property_news_vm-----initListData");
-    // await Future.delayed(const Duration(seconds: 2));
-    // if(state.list.length >= state.filterCount){
-    //   return;
-    // }else {
-    //   int curPage = state.curPage + 1;
-    //   state = state.copyWith(curPage: curPage,);
-    //   getListData();
-    // }
     getListData();
   }
 
@@ -66,40 +52,52 @@ class EventDetailVm extends _$EventDetailVm {
     // PropertyPage.startInstance(context: context, item: item);
   }
 
+// 重试请求
+  Future retryRequest({int? id}) async {
+    _needShowPlaceholder = true;
+    getListData(id: id);
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
   // 获取list 列表数据
-  void getListData<T>() async {
+  void getListData<T>({int? id}) async {
     Log.d("加载listData数据---------------start-----");
     try {
       //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
+      Map<String, dynamic> params = {"id": id};
       Log.d("请求参数------$params");
-      final result = await eventDetailRepository.fetchPropertyNewsList(params);
+      final result =
+          await eventDetailRepository.fetchPropertyNewsList(params);
       Log.d("请求完成结果------${result.data}");
-      //校验成功失败
+     //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
+        state = state.copyWith(
+          detailInfo: result.data as NoticeBoardEventDetailEntity,
+        );
+        Log.d("123------${state.detailInfo}");
+        changeLoadingState(LoadState.State_Success, null);
       } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
         ToastEngine.show(result.errorMsg ?? "Network Load Error");
       }
     } catch (e) {
       ToastEngine.show("Error: $e");
     }
   }
+  // // 下拉刷新
+  // Future refreshListData() async {
+  //   Log.d("----property_news_vm-----refreshListData ");
 
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
-
-    // await Future.delayed(const Duration(seconds: 2));
+  //   // await Future.delayed(const Duration(seconds: 2));
 
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
-  }
-}
+  //   state = state.copyWith(curPage: 1, pageSize: 10);
+  //   // ref.invalidateSelf();
+  //   // ref.invalidate(propertyNewsVmProvider);
+  //   getListData();
+  // }
+}

+ 1 - 1
packages/cpt_notice_board/lib/modules/notice_board/page/notice_board_page.dart

@@ -103,7 +103,7 @@ class NoticeBoardPage extends HookConsumerWidget {
     return Scaffold(
         appBar: MyAppBar.appBar(
           context,
-          "Property",
+          "Notice Board",
           backgroundColor: context.appColors.backgroundWhite,
         ),
         body: AutoTabsRouter.pageView(

+ 121 - 15
packages/cpt_notice_board/lib/router/page/notice_board_page_router.gr.dart

@@ -22,9 +22,17 @@ abstract class _$NoticeBoardPageRouter extends RootStackRouter {
       );
     },
     AnnouncementDetailPageRoute.name: (routeData) {
+      final pathParams = routeData.inheritedPathParams;
+      final args = routeData.argsAs<AnnouncementDetailPageRouteArgs>(
+          orElse: () => AnnouncementDetailPageRouteArgs(
+                id: pathParams.optInt('id'),
+              ));
       return AutoRoutePage<dynamic>(
         routeData: routeData,
-        child: const AnnouncementDetailPage(),
+        child: AnnouncementDetailPage(
+          key: args.key,
+          id: args.id,
+        ),
       );
     },
     DocumentsPageRoute.name: (routeData) {
@@ -34,15 +42,31 @@ abstract class _$NoticeBoardPageRouter extends RootStackRouter {
       );
     },
     EventDetailPageRoute.name: (routeData) {
+      final pathParams = routeData.inheritedPathParams;
+      final args = routeData.argsAs<EventDetailPageRouteArgs>(
+          orElse: () => EventDetailPageRouteArgs(
+                id: pathParams.optInt('id'),
+              ));
       return AutoRoutePage<dynamic>(
         routeData: routeData,
-        child: const EventDetailPage(),
+        child: EventDetailPage(
+          key: args.key,
+          id: args.id,
+        ),
       );
     },
     DocumentsListPageRoute.name: (routeData) {
+      final pathParams = routeData.inheritedPathParams;
+      final args = routeData.argsAs<DocumentsListPageRouteArgs>(
+          orElse: () => DocumentsListPageRouteArgs(
+                id: pathParams.optInt('id'),
+              ));
       return AutoRoutePage<dynamic>(
         routeData: routeData,
-        child: const DocumentsListPage(),
+        child: DocumentsListPage(
+          key: args.key,
+          id: args.id,
+        ),
       );
     },
     EventPageRoute.name: (routeData) {
@@ -76,16 +100,44 @@ class AnnounPageRoute extends PageRouteInfo<void> {
 
 /// generated route for
 /// [AnnouncementDetailPage]
-class AnnouncementDetailPageRoute extends PageRouteInfo<void> {
-  const AnnouncementDetailPageRoute({List<PageRouteInfo>? children})
-      : super(
+class AnnouncementDetailPageRoute
+    extends PageRouteInfo<AnnouncementDetailPageRouteArgs> {
+  AnnouncementDetailPageRoute({
+    Key? key,
+    required int? id,
+    List<PageRouteInfo>? children,
+  }) : super(
           AnnouncementDetailPageRoute.name,
+          args: AnnouncementDetailPageRouteArgs(
+            key: key,
+            id: id,
+          ),
+          rawPathParams: {
+            'id': id,
+          },
           initialChildren: children,
         );
 
   static const String name = 'AnnouncementDetailPageRoute';
 
-  static const PageInfo<void> page = PageInfo<void>(name);
+  static const PageInfo<AnnouncementDetailPageRouteArgs> page =
+      PageInfo<AnnouncementDetailPageRouteArgs>(name);
+}
+
+class AnnouncementDetailPageRouteArgs {
+  const AnnouncementDetailPageRouteArgs({
+    this.key,
+    required this.id,
+  });
+
+  final Key? key;
+
+  final int? id;
+
+  @override
+  String toString() {
+    return 'AnnouncementDetailPageRouteArgs{key: $key, id: $id}';
+  }
 }
 
 /// generated route for
@@ -104,32 +156,86 @@ class DocumentsPageRoute extends PageRouteInfo<void> {
 
 /// generated route for
 /// [EventDetailPage]
-class EventDetailPageRoute extends PageRouteInfo<void> {
-  const EventDetailPageRoute({List<PageRouteInfo>? children})
-      : super(
+class EventDetailPageRoute extends PageRouteInfo<EventDetailPageRouteArgs> {
+  EventDetailPageRoute({
+    Key? key,
+    required int? id,
+    List<PageRouteInfo>? children,
+  }) : super(
           EventDetailPageRoute.name,
+          args: EventDetailPageRouteArgs(
+            key: key,
+            id: id,
+          ),
+          rawPathParams: {
+            'id': id,
+          },
           initialChildren: children,
         );
 
   static const String name = 'EventDetailPageRoute';
 
-  static const PageInfo<void> page = PageInfo<void>(name);
+  static const PageInfo<EventDetailPageRouteArgs> page =
+      PageInfo<EventDetailPageRouteArgs>(name);
+}
+
+class EventDetailPageRouteArgs {
+  const EventDetailPageRouteArgs({
+    this.key,
+    required this.id,
+  });
+
+  final Key? key;
+
+  final int? id;
+
+  @override
+  String toString() {
+    return 'EventDetailPageRouteArgs{key: $key, id: $id}';
+  }
 }
 
 /// generated route for
 /// [DocumentsListPage]
-class DocumentsListPageRoute extends PageRouteInfo<void> {
-  const DocumentsListPageRoute({List<PageRouteInfo>? children})
-      : super(
+
+class DocumentsListPageRoute extends PageRouteInfo<DocumentsListPageRouteArgs> {
+  DocumentsListPageRoute({
+    Key? key,
+    required int? id,
+    List<PageRouteInfo>? children,
+  }) : super(
           DocumentsListPageRoute.name,
+          args: DocumentsListPageRouteArgs(
+            key: key,
+            id: id,
+          ),
+          rawPathParams: {
+            'id': id,
+          },
           initialChildren: children,
         );
 
   static const String name = 'DocumentsListPageRoute';
 
-  static const PageInfo<void> page = PageInfo<void>(name);
+  static const PageInfo<DocumentsListPageRouteArgs> page =
+      PageInfo<DocumentsListPageRouteArgs>(name);
 }
 
+class DocumentsListPageRouteArgs {
+  const DocumentsListPageRouteArgs({
+    this.key,
+    required this.id,
+  });
+
+  final Key? key;
+
+  final int? id;
+
+  @override
+  String toString() {
+    return 'DocumentsListPageRouteArgs{key: $key, id: $id}';
+  }
+}
 /// generated route for
 /// [EventPage]
 class EventPageRoute extends PageRouteInfo<void> {

+ 6 - 4
packages/cpt_notice_board/pubspec.yaml

@@ -4,10 +4,9 @@ description: 物业系统的公告板模块,用于展示物业发布的各类
 version: 1.0.0
 
 environment:
-  sdk: '>=3.0.2 <4.0.0'
+  sdk: ">=3.0.2 <4.0.0"
 
 dependencies:
-
   flutter_localizations:
     sdk: flutter
 
@@ -48,6 +47,10 @@ dependencies:
   # Hooks 简化 Riverpod 获取
   hooks_riverpod: ^2.5.1
 
+  flutter_html: ^2.1.0
+  cached_network_image: ^3.1.0
+  url_launcher: ^6.1.0
+
 dev_dependencies:
   flutter_test:
     sdk: flutter
@@ -66,6 +69,5 @@ dev_dependencies:
   # AutoRouter 生成代码
   auto_route_generator: ^8.0.0
 
-
 flutter:
-  uses-material-design: true
+  uses-material-design: true

+ 114 - 163
packages/cpt_rewards/lib/modules/rewards/rewards_page.dart

@@ -1,3 +1,5 @@
+import 'dart:ffi';
+
 import 'package:cpt_rewards/modules/rewards_address/rewards_address_page.dart';
 import 'package:cpt_rewards/modules/rewards_code/rewards_code_page.dart';
 import 'package:cpt_rewards/modules/rewards_history/rewards_history_page.dart';
@@ -16,9 +18,12 @@ import 'package:shared/utils/color_utils.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/widget_export.dart';
 
+import 'package:intl/intl.dart';
+
 import '../../../router/page/rewards_page_router.dart';
 import './rewards_vm.dart';
 
@@ -35,8 +40,8 @@ class RewardsPage extends HookConsumerWidget {
     }
   }
 
-  Widget _buildTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();
+  Widget _buildTop(BuildContext context, WidgetRef ref, _vm, list) {
+    int points = list.points ?? 0;
     return Container(
         decoration: BoxDecoration(
           border: Border(
@@ -110,9 +115,9 @@ class RewardsPage extends HookConsumerWidget {
                         width: 23,
                         height: 23,
                       ).marginOnly(right: 5),
-                      const Text(
-                        '1022',
-                        style: TextStyle(
+                      Text(
+                        '$points',
+                        style: const TextStyle(
                             fontSize: 15.0,
                             color: Colors.white,
                             fontWeight: FontWeight.w400), // 设置字体大小
@@ -130,6 +135,23 @@ class RewardsPage extends HookConsumerWidget {
   }
 
   Widget _buildSearch(BuildContext context, WidgetRef ref, _vm, list) {
+    final dateFormat = DateFormat('yyyy-MM-dd');
+    final now = DateFormat('yyyy-MM-dd').format(DateTime.now());
+    // final date = list.continuous.currentWeekCheckin[0] ?? now;
+    final date = now;
+    final date0 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).subtract(const Duration(days: 1)));
+    final date1 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).add(const Duration(days: 1)));
+    final date2 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).add(const Duration(days: 2)));
+    final date3 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).add(const Duration(days: 3)));
+    final date4 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).add(const Duration(days: 4)));
+    final date5 = DateFormat('MM-dd')
+        .format(dateFormat.parse(date).add(const Duration(days: 5)));
+    // final nextDate = date.add(Duration(days: 1));
     return Container(
       width: MediaQuery.of(context).size.width - 30,
       decoration: BoxDecoration(
@@ -168,7 +190,7 @@ class RewardsPage extends HookConsumerWidget {
                     mainAxisAlignment: MainAxisAlignment.center,
                     children: [
                       Text(
-                        '11/01',
+                        '$date0',
                         style: TextStyle(
                             fontSize: 13.0,
                             color: ColorUtils.string2Color('#4161D0'),
@@ -244,7 +266,7 @@ class RewardsPage extends HookConsumerWidget {
                     mainAxisAlignment: MainAxisAlignment.center,
                     children: [
                       Text(
-                        'Today',
+                        '$date1',
                         style: TextStyle(
                             fontSize: 13.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -282,7 +304,7 @@ class RewardsPage extends HookConsumerWidget {
                     mainAxisAlignment: MainAxisAlignment.center,
                     children: [
                       Text(
-                        'Today',
+                        '$date2',
                         style: TextStyle(
                             fontSize: 13.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -324,7 +346,7 @@ class RewardsPage extends HookConsumerWidget {
                     mainAxisAlignment: MainAxisAlignment.center,
                     children: [
                       Text(
-                        'Today',
+                        '$date3',
                         style: TextStyle(
                             fontSize: 13.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -362,7 +384,7 @@ class RewardsPage extends HookConsumerWidget {
                     mainAxisAlignment: MainAxisAlignment.center,
                     children: [
                       Text(
-                        'Today',
+                        '$date4',
                         style: TextStyle(
                             fontSize: 13.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -404,7 +426,7 @@ class RewardsPage extends HookConsumerWidget {
                         // mainAxisAlignment: MainAxisAlignment.center,
                         children: [
                           Text(
-                            'Today',
+                            '$date5',
                             style: TextStyle(
                                 fontSize: 13.0,
                                 color: ColorUtils.string2Color('#000000'),
@@ -435,7 +457,8 @@ class RewardsPage extends HookConsumerWidget {
     );
   }
 
-  Widget _buildSwiper(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildSwiper(BuildContext context, WidgetRef ref, _vm, list) {
+    int points = list.points ?? 0;
     return Container(
       // color: Colors.white,
       height: 55,
@@ -471,7 +494,7 @@ class RewardsPage extends HookConsumerWidget {
                   color: ColorUtils.string2Color('#ffffff'),
                   fontWeight: FontWeight.w400), // 设置字体大小
             ).onTap(() {
-              RewardsHomePage.startInstance();
+              RewardsHomePage.startInstance(points: points);
             }),
           ),
         ],
@@ -479,7 +502,9 @@ class RewardsPage extends HookConsumerWidget {
     ).marginOnly(top: 12, bottom: 12);
   }
 
-  Widget _buildList(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildList(BuildContext context, WidgetRef ref, _vm, list) {
+    bool newsFeed = list.tasks.newsFeedPost;
+    int giveLikes = list.tasks.give10Likes;
     return Container(
       decoration: BoxDecoration(
         color: Colors.white,
@@ -544,7 +569,7 @@ class RewardsPage extends HookConsumerWidget {
                               Assets.rewardsRewardsIconJb,
                               width: 14,
                               height: 14,
-                            )
+                            ).marginOnly(left: 3)
                           ],
                         )
                       ],
@@ -606,7 +631,7 @@ class RewardsPage extends HookConsumerWidget {
                       mainAxisAlignment: MainAxisAlignment.center,
                       children: [
                         Text(
-                          'Daily Login',
+                          'News Feed Post',
                           style: TextStyle(
                               fontSize: 15.0,
                               color: ColorUtils.string2Color('#000000'),
@@ -625,7 +650,7 @@ class RewardsPage extends HookConsumerWidget {
                               Assets.rewardsRewardsIconJb,
                               width: 14,
                               height: 14,
-                            )
+                            ).marginOnly(left: 3)
                           ],
                         )
                       ],
@@ -643,7 +668,7 @@ class RewardsPage extends HookConsumerWidget {
                   ),
                   child: Center(
                     child: Text(
-                      'Check In',
+                      newsFeed == true ? 'Completed' : 'incomplete',
                       style: TextStyle(
                           fontSize: 14.0,
                           color: ColorUtils.string2Color('#4161D0'),
@@ -687,7 +712,7 @@ class RewardsPage extends HookConsumerWidget {
                       mainAxisAlignment: MainAxisAlignment.center,
                       children: [
                         Text(
-                          'Daily Login',
+                          'Give 10 Likes',
                           style: TextStyle(
                               fontSize: 15.0,
                               color: ColorUtils.string2Color('#000000'),
@@ -706,7 +731,7 @@ class RewardsPage extends HookConsumerWidget {
                               Assets.rewardsRewardsIconJb,
                               width: 14,
                               height: 14,
-                            )
+                            ).marginOnly(left: 3)
                           ],
                         )
                       ],
@@ -724,7 +749,7 @@ class RewardsPage extends HookConsumerWidget {
                   ),
                   child: Center(
                     child: Text(
-                      'Check In',
+                      giveLikes == 10 ? 'Completed' : '$giveLikes/10',
                       style: TextStyle(
                           fontSize: 14.0,
                           color: ColorUtils.string2Color('#4161D0'),
@@ -740,7 +765,8 @@ class RewardsPage extends HookConsumerWidget {
     ).marginOnly(bottom: 12);
   }
 
-  Widget _buildHistory(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildHistory(BuildContext context, WidgetRef ref, _vm, list) {
+    List latest = list.latest;
     return Container(
       decoration: BoxDecoration(
         color: Colors.white,
@@ -774,135 +800,55 @@ class RewardsPage extends HookConsumerWidget {
                   RewardsHistoryPage.startInstance();
                 })
               ]).paddingOnly(left: 15, right: 15, top: 15, bottom: 5),
-          Container(
-            padding:
-                const EdgeInsets.only(top: 15, bottom: 15, left: 15, right: 15),
-            decoration: BoxDecoration(
-                border: Border(
-                    bottom: BorderSide(
-              width: 1.0, // 底边边框的宽度
-              color: ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
-            ))),
-            child: Row(
-              crossAxisAlignment: CrossAxisAlignment.center,
-              mainAxisAlignment: MainAxisAlignment.spaceBetween,
-              children: [
-                Column(
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  mainAxisAlignment: MainAxisAlignment.center,
-                  children: [
-                    Text(
-                      'Daily Login',
-                      style: TextStyle(
-                          fontSize: 15.0,
-                          color: ColorUtils.string2Color('#000000'),
-                          fontWeight: FontWeight.w500), // 设置字体大小
-                    ).marginOnly(bottom: 6),
-                    Text(
-                      '14 Oct 2024  10:00PM',
-                      style: TextStyle(
-                          fontSize: 13.0,
-                          color: ColorUtils.string2Color('#808DAF'),
-                          fontWeight: FontWeight.w400), // 设置字体大小
-                    ),
-                  ],
-                ),
-                Text(
-                  '+2',
-                  style: TextStyle(
-                      fontSize: 20.0,
-                      color: ColorUtils.string2Color('#FDB429'),
-                      fontWeight: FontWeight.w500), // 设置字体大小
-                ),
-              ],
-            ),
-          ),
-          Container(
-            padding:
-                const EdgeInsets.only(top: 15, bottom: 15, left: 15, right: 15),
-            decoration: BoxDecoration(
-                border: Border(
-                    bottom: BorderSide(
-              width: 1.0, // 底边边框的宽度
-              color: ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
-            ))),
-            child: Row(
-              crossAxisAlignment: CrossAxisAlignment.center,
-              mainAxisAlignment: MainAxisAlignment.spaceBetween,
-              children: [
-                Column(
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  mainAxisAlignment: MainAxisAlignment.center,
-                  children: [
-                    Text(
-                      'Daily Login',
-                      style: TextStyle(
-                          fontSize: 15.0,
-                          color: ColorUtils.string2Color('#000000'),
-                          fontWeight: FontWeight.w500), // 设置字体大小
-                    ).marginOnly(bottom: 6),
-                    Text(
-                      '14 Oct 2024  10:00PM',
-                      style: TextStyle(
-                          fontSize: 13.0,
-                          color: ColorUtils.string2Color('#808DAF'),
-                          fontWeight: FontWeight.w400), // 设置字体大小
-                    ),
-                  ],
-                ),
-                Text(
-                  '+2',
-                  style: TextStyle(
-                      fontSize: 20.0,
-                      color: ColorUtils.string2Color('#FDB429'),
-                      fontWeight: FontWeight.w500), // 设置字体大小
-                ),
-              ],
-            ),
-          ),
-          Container(
-            padding:
-                const EdgeInsets.only(top: 15, bottom: 15, left: 15, right: 15),
-            decoration: BoxDecoration(
-                border: Border(
-                    bottom: BorderSide(
-              width: 1.0, // 底边边框的宽度
-              color: ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
-            ))),
-            child: Row(
+          Column(
               crossAxisAlignment: CrossAxisAlignment.center,
-              mainAxisAlignment: MainAxisAlignment.spaceBetween,
-              children: [
-                Column(
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  mainAxisAlignment: MainAxisAlignment.center,
-                  children: [
-                    Text(
-                      'Daily Login',
-                      style: TextStyle(
-                          fontSize: 15.0,
-                          color: ColorUtils.string2Color('#000000'),
-                          fontWeight: FontWeight.w500), // 设置字体大小
-                    ).marginOnly(bottom: 6),
-                    Text(
-                      '14 Oct 2024  10:00PM',
-                      style: TextStyle(
-                          fontSize: 13.0,
-                          color: ColorUtils.string2Color('#808DAF'),
-                          fontWeight: FontWeight.w400), // 设置字体大小
-                    ),
-                  ],
-                ),
-                Text(
-                  '+2',
-                  style: TextStyle(
-                      fontSize: 20.0,
-                      color: ColorUtils.string2Color('#FDB429'),
-                      fontWeight: FontWeight.w500), // 设置字体大小
-                ),
-              ],
-            ),
-          ),
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: List.generate(latest.length, (index) {
+                int point = latest[index]['point'];
+                return Container(
+                  padding: const EdgeInsets.only(
+                      top: 15, bottom: 15, left: 15, right: 15),
+                  decoration: BoxDecoration(
+                      border: Border(
+                          bottom: BorderSide(
+                    width: 1.0, // 底边边框的宽度
+                    color: ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
+                  ))),
+                  child: Row(
+                    crossAxisAlignment: CrossAxisAlignment.center,
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    children: [
+                      Column(
+                        crossAxisAlignment: CrossAxisAlignment.start,
+                        mainAxisAlignment: MainAxisAlignment.center,
+                        children: [
+                          Text(
+                            latest[index]['short_description'],
+                            style: TextStyle(
+                                fontSize: 15.0,
+                                color: ColorUtils.string2Color('#000000'),
+                                fontWeight: FontWeight.w500), // 设置字体大小
+                          ).marginOnly(bottom: 6),
+                          Text(
+                            latest[index]['created_at'],
+                            style: TextStyle(
+                                fontSize: 13.0,
+                                color: ColorUtils.string2Color('#808DAF'),
+                                fontWeight: FontWeight.w400), // 设置字体大小
+                          ),
+                        ],
+                      ),
+                      Text(
+                        "$point",
+                        style: TextStyle(
+                            fontSize: 20.0,
+                            color: ColorUtils.string2Color('#FDB429'),
+                            fontWeight: FontWeight.w500), // 设置字体大小
+                      ),
+                    ],
+                  ),
+                );
+              }))
         ],
       ),
     ).marginOnly(bottom: 12);
@@ -922,37 +868,42 @@ class RewardsPage extends HookConsumerWidget {
       };
     }, []);
     return Scaffold(
-      // appBar: AppBar(title: Text("奖励")),
+      // appBar: MyAppBar.appBar(
+      //   context,
+      //   "Daily Login",
+      //   backgroundColor: ColorUtils.string2Color('#4161D0'),
+      // ),
       body: Column(children: [
         Expanded(
-          child: 
-          LoadStateLayout(
+          child: LoadStateLayout(
             state: state.loadingState,
             errorMessage: state.errorMessage,
             errorRetry: () {
               _vm.retryRequest();
             },
             successWidget: SingleChildScrollView(
-            scrollDirection: Axis.vertical,
-            physics: const BouncingScrollPhysics(),
-            clipBehavior: Clip.none,
-            child:  Column(
+                scrollDirection: Axis.vertical,
+                physics: const BouncingScrollPhysics(),
+                clipBehavior: Clip.none,
+                child: Column(
                   children: [
-                    _buildTop(context, ref, _vm),
+                    _buildTop(context, ref, _vm, list)
+                        .paddingOnly(top: MediaQuery.of(context).padding.top),
                     Container(
                       transform: Matrix4.translationValues(0.0, -45.0, 0.0),
                       child: Column(
                         children: [
                           _buildSearch(context, ref, _vm, list),
-                          _buildSwiper(context, ref, _vm),
-                          _buildList(context, ref, _vm),
-                          _buildHistory(context, ref, _vm),
+                          _buildSwiper(context, ref, _vm, list),
+                          list?.points != 0
+                              ? _buildList(context, ref, _vm, list)
+                              : const SizedBox.shrink(),
+                          _buildHistory(context, ref, _vm, list),
                         ],
                       ), // 使用负数margin
                     ).paddingOnly(left: 15, right: 15),
                   ],
-                )
-                ),
+                )),
           ),
         ),
       ]).backgroundColor(ColorUtils.string2Color('#F2F3F6')),

+ 1 - 1
packages/cpt_rewards/lib/modules/rewards/rewards_repository.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsRepositoryHash() => r'4137a1449ba3b67667c7ad0e28a4cd7d5998867b';
 
 /// See also [rewardsRepository].
 @ProviderFor(rewardsRepository)

+ 2 - 2
packages/cpt_rewards/lib/modules/rewards/rewards_state.dart

@@ -14,8 +14,8 @@ class RewardsState {
   RewardsState({
     this.loadingState = LoadState.State_Loading,
     String? errorMessage,
-    required this.list,
-  });
+    RewardsIndexEntity? list
+  }) : list = list ?? RewardsIndexEntity();
 
   RewardsState copyWith({
     LoadState? loadingState,

+ 3 - 1
packages/cpt_rewards/lib/modules/rewards/rewards_vm.dart

@@ -22,7 +22,9 @@ class RewardsVm extends _$RewardsVm {
     controlFinishLoad: true, //允许加载
   );
   RewardsState initState() {
-    return RewardsState(list: null);
+    return RewardsState(
+      list: RewardsIndexEntity()
+    );
   }
 
   @override

+ 1 - 1
packages/cpt_rewards/lib/modules/rewards/rewards_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsVmHash() => r'd6bf1aaec9173a614dd6b87e137b02bb2ff07013';
 
 /// See also [RewardsVm].
 @ProviderFor(RewardsVm)

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_address/rewards_address_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_address_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsAddressRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsAddressRepositoryHash() =>
+    r'ff71a0993e288969034b7d5900f1adc5483378c6';
 
 /// See also [rewardsAddressRepository].
 @ProviderFor(rewardsAddressRepository)
-final rewardsAddressRepositoryProvider = Provider<RewardsAddressRepository>.internal(
+final rewardsAddressRepositoryProvider =
+    Provider<RewardsAddressRepository>.internal(
   rewardsAddressRepository,
   name: r'rewardsAddressRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_address/rewards_address_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_address_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsAddressVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsAddressVmHash() => r'f9ad7b3cb57967ca39bdf30bed5e8c28c19d8249';
 
 /// See also [RewardsAddressVm].
 @ProviderFor(RewardsAddressVm)
@@ -14,8 +14,9 @@ final rewardsAddressVmProvider =
     AutoDisposeNotifierProvider<RewardsAddressVm, RewardsAddressState>.internal(
   RewardsAddressVm.new,
   name: r'rewardsAddressVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsAddressVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsAddressVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 9 - 5
packages/cpt_rewards/lib/modules/rewards_code/rewards_code_page.dart

@@ -18,18 +18,22 @@ import './rewards_code_vm.dart';
 
 @RoutePage()
 class RewardsCodePage extends HookConsumerWidget {
-  const RewardsCodePage({Key? key}) : super(key: key);
+  final int? code;
+  const RewardsCodePage({Key? key, @PathParam('code') required this.code}) : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({BuildContext? context,
+    int? code,
+  }) {
     if (context != null) {
-      context.router.push(const RewardsCodePageRoute());
+      context.router.push(RewardsCodePageRoute(code: code));
     } else {
-      appRouter.push(const RewardsCodePageRoute());
+      appRouter.push(RewardsCodePageRoute(code: code));
     }
   }
 
   Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, _vm) {
+    int? codes = code ?? 0;
     return Column(
       children: [
         Column(
@@ -54,7 +58,7 @@ class RewardsCodePage extends HookConsumerWidget {
                   fontWeight: FontWeight.w500),
             ).marginOnly(top: 35, bottom: 20),
             Text(
-              '778890',
+              '$codes',
               style: TextStyle(
                   fontSize: 36.0,
                   color: ColorUtils.string2Color('#4161D0'),

+ 2 - 1
packages/cpt_rewards/lib/modules/rewards_code/rewards_code_repository.g.dart

@@ -6,7 +6,8 @@ part of 'rewards_code_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsCodeRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsCodeRepositoryHash() =>
+    r'0349a3b039d854a21f52694bd1ab72207bf18736';
 
 /// See also [rewardsCodeRepository].
 @ProviderFor(rewardsCodeRepository)

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_code/rewards_code_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_code_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsCodeVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsCodeVmHash() => r'66d75ea9d41db0c16581beb6efa01a4809e92993';
 
 /// See also [RewardsCodeVm].
 @ProviderFor(RewardsCodeVm)
@@ -14,8 +14,9 @@ final rewardsCodeVmProvider =
     AutoDisposeNotifierProvider<RewardsCodeVm, RewardsCodeState>.internal(
   RewardsCodeVm.new,
   name: r'rewardsCodeVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsCodeVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsCodeVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 9 - 29
packages/cpt_rewards/lib/modules/rewards_confirm/dialog/account_deactivation_dialog.dart

@@ -17,35 +17,17 @@ class AccountDeactivationDialog extends HookConsumerWidget {
     required this.confirmAction,
   });
 
-  Widget CheckboxList(BuildContext context) {
-    // final List<String> items = ['苹果', '香蕉', '橙子'];
-    // final List<bool> selections = [false, false, false];
-    // return Expanded(child:ListView.builder(
-    //   itemCount: items.length,
-    //   itemBuilder: (context, index) {
-    //     return Container(
-    //       padding: EdgeInsets.symmetric(vertical: 5.0),
-    //       child: CheckboxListTile(
-    //         value: selections[index],
-    //         onChanged: (bool? val) {
-    //           print('Option 1 is now ${val ?? false}');
-    //           selections[index] = val!;
-    //         },
-    //         title: Text(items[index]),
-    //       ),
-    //     );
-    //   },
-    // )
-    // );
-    var _rangeValues = RangeValues(20.0, 80.0);
+  Widget CheckboxList(BuildContext context, ref) {
+    final state = ref.watch(rewardsConfirmVmProvider);
+    int amount = state.amount ?? 0;
     return Column(
       mainAxisAlignment: MainAxisAlignment.center,
       crossAxisAlignment: CrossAxisAlignment.center,
       children: [
-        const Text(
+        Text(
           textAlign: TextAlign.center,
-          'Are you sure to spend 600 points to redeem goods?',
-          style: TextStyle(
+          'Are you sure to spend $amount points to redeem goods?',
+          style: const TextStyle(
               fontSize: 19.0, color: Colors.black, fontWeight: FontWeight.w500),
         ).paddingOnly(left: 40, right: 40)
       ],
@@ -55,8 +37,6 @@ class AccountDeactivationDialog extends HookConsumerWidget {
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(rewardsConfirmVmProvider.notifier);
-    final state = ref.watch(rewardsConfirmVmProvider);
-    List itemsList = _vm.state.list.toList();
     return Column(
       crossAxisAlignment: CrossAxisAlignment.center,
       mainAxisAlignment: MainAxisAlignment.center,
@@ -103,7 +83,7 @@ class AccountDeactivationDialog extends HookConsumerWidget {
           ),
           child: Column(
             children: [
-              Container(height: 150, child: CheckboxList(context)),
+              Container(height: 150, child: CheckboxList(context, ref)),
               Row(
                 children: [
                   const SizedBox(width: 18),
@@ -112,8 +92,8 @@ class AccountDeactivationDialog extends HookConsumerWidget {
                       child: InkWell(
                         onTap: () async {
                           onCancel();
-                          RewardsSuccessfulPage.startInstance();
-                          // confirmAction();
+                          // RewardsSuccessfulPage.startInstance();
+                          _vm.rewardBuy();
                         },
                         child: MyTextView(
                           'Pay Now',

+ 118 - 95
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_page.dart

@@ -1,12 +1,15 @@
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
@@ -19,19 +22,26 @@ import './rewards_confirm_vm.dart';
 
 @RoutePage()
 class RewardsConfirmPage extends HookConsumerWidget {
-  const RewardsConfirmPage({Key? key}) : super(key: key);
+  final int? id;
+  const RewardsConfirmPage({Key? key, @PathParam('id') required this.id})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? id,
+  }) {
     if (context != null) {
-      context.router.push(const RewardsConfirmPageRoute());
+      context.router.push(RewardsConfirmPageRoute(id: id));
     } else {
-      appRouter.push(const RewardsConfirmPageRoute());
+      appRouter.push(RewardsConfirmPageRoute(id: id));
     }
   }
 
   // listitem
-  Widget _buildSaleItem(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildSaleItem(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    String title = detailInfo!.title ?? "";
+    List? resources = detailInfo!.resources ?? [];
     return Column(
       children: [
         Container(
@@ -50,20 +60,22 @@ class RewardsConfirmPage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.start,
               mainAxisAlignment: MainAxisAlignment.start,
               children: [
-                const MyAssetImage(
-                  Assets.rewardsRewardsIndex1,
-                  // width: 110,
-                  height: 150,
-                ),
-                const Column(
+                resources!.length > 0
+                    ? MyLoadImage(
+                        resources[0] ?? '',
+                        width: MediaQuery.of(context).size.width,
+                        height: 150,
+                      )
+                    : Container(),
+                Column(
                   crossAxisAlignment: CrossAxisAlignment.start,
                   mainAxisAlignment: MainAxisAlignment.start,
                   children: [
                     Text(
                       maxLines: 1, // 设置最大行数为2
                       overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-                      'Cute children multifunctional umbrella',
-                      style: TextStyle(
+                      title,
+                      style: const TextStyle(
                           fontSize: 17.0,
                           color: Colors.black,
                           fontWeight: FontWeight.w500),
@@ -111,36 +123,20 @@ class RewardsConfirmPage extends HookConsumerWidget {
                   )
                 ],
               ),
-              Row(
+              Column(
                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
                 crossAxisAlignment: CrossAxisAlignment.center,
                 children: [
                   Text(
-                    'Also redeemable in 1 more location',
+                    '60 paya lebar rd, #09-13/17 paya lebar square, singapore 409051',
+                    maxLines: 2, // 设置最大行数为2
+                    overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
                     style: TextStyle(
                         fontSize: 15.0,
                         color: ColorUtils.string2Color('#54638C'),
                         fontWeight: FontWeight.w400),
                   ),
                 ],
-              ).marginOnly(top: 10, bottom: 15),
-              Container(
-                height: 40,
-                decoration: BoxDecoration(
-                  color: Colors.white,
-                  borderRadius: const BorderRadius.all(Radius.circular(6.0)),
-                  border: Border.all(
-                      color: ColorUtils.string2Color('#4161D0'), width: 1.0),
-                ),
-                child: Center(
-                  child: Text(
-                    'See More Locations',
-                    style: TextStyle(
-                        fontSize: 15.0,
-                        color: ColorUtils.string2Color('#4161D0'),
-                        fontWeight: FontWeight.w500),
-                  ),
-                ),
               ),
             ],
           ).paddingOnly(left: 15, right: 15, top: 12, bottom: 20),
@@ -149,7 +145,10 @@ class RewardsConfirmPage extends HookConsumerWidget {
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
-  Widget _buildPackage(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildPackage(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    String redeemedStart = detailInfo.redeemedStart ?? "";
+    String redeemedEnd = detailInfo.redeemedEnd ?? "";
+    String redeemedDate = '$redeemedStart-$redeemedEnd';
     return Column(
       children: [
         Container(
@@ -188,7 +187,7 @@ class RewardsConfirmPage extends HookConsumerWidget {
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
                   Text(
-                    '17 Mar 2020 until 15 Jul 2020',
+                    redeemedDate,
                     style: TextStyle(
                         fontSize: 15.0,
                         color: ColorUtils.string2Color('#54638C'),
@@ -203,7 +202,12 @@ class RewardsConfirmPage extends HookConsumerWidget {
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
-  Widget _buildNotice(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildNotice(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    final state = ref.watch(rewardsConfirmVmProvider);
+    int number = state.number ?? 0;
+    int amount = state.amount ?? 0;
+    int point = detailInfo.point ?? 0;
+    int originalPoint = detailInfo.originalPoint ?? 0;
     return Column(
       children: [
         Container(
@@ -236,9 +240,11 @@ class RewardsConfirmPage extends HookConsumerWidget {
                         Assets.rewardsRewardsJian,
                         width: 21,
                         height: 21,
-                      ),
+                      ).onTap(() {
+                        _vm.numberDec();
+                      }),
                       Text(
-                        '2',
+                        '$number',
                         style: TextStyle(
                             fontSize: 19.0,
                             color: ColorUtils.string2Color('#333333'),
@@ -248,7 +254,9 @@ class RewardsConfirmPage extends HookConsumerWidget {
                         Assets.rewardsRewardsJia,
                         width: 21,
                         height: 21,
-                      ),
+                      ).onTap(() {
+                        _vm.numberAdd();
+                      }),
                     ],
                   ),
                 ],
@@ -267,7 +275,7 @@ class RewardsConfirmPage extends HookConsumerWidget {
                   Row(
                     children: [
                       Text(
-                        '350',
+                        '$originalPoint',
                         style: TextStyle(
                             decoration: TextDecoration.lineThrough,
                             decorationColor: ColorUtils.string2Color('#54638C'),
@@ -277,7 +285,7 @@ class RewardsConfirmPage extends HookConsumerWidget {
                             fontWeight: FontWeight.w400),
                       ),
                       Text(
-                        '300',
+                        '$point',
                         style: TextStyle(
                             fontSize: 19.0,
                             color: ColorUtils.string2Color('#333333'),
@@ -301,7 +309,7 @@ class RewardsConfirmPage extends HookConsumerWidget {
                   Row(
                     children: [
                       Text(
-                        '600',
+                        '$amount',
                         style: TextStyle(
                             fontSize: 19.0,
                             color: ColorUtils.string2Color('#4161D0'),
@@ -322,67 +330,82 @@ class RewardsConfirmPage extends HookConsumerWidget {
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(rewardsConfirmVmProvider.notifier);
     final state = ref.watch(rewardsConfirmVmProvider);
+    RewardsDetailEntity? detailInfo = state.detailInfo;
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => _vm.initPageData(id: id));
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
-        "Verification Confirm",
+        "Confirm Details",
         backgroundColor: context.appColors.whiteBG,
       ),
-      body: Column(
-        children: [
-          Expanded(
-              child: SingleChildScrollView(
-                  scrollDirection: Axis.vertical,
-                  physics: const BouncingScrollPhysics(),
-                  clipBehavior: Clip.none,
-                  child: Column(
-                    children: [
-                      Container(
-                          color: ColorUtils.string2Color('#F2F3F6'),
-                          padding: const EdgeInsets.only(top: 15),
-                          child: Column(
-                            children: [
-                              _buildSaleItem(context, ref, _vm),
-                              _buildDeal(context, ref, _vm),
-                              _buildPackage(context, ref, _vm),
-                              _buildNotice(context, ref, _vm),
-                            ],
-                          )),
-                    ],
-                  ))),
-          Container(
-            height: 50,
-            color: ColorUtils.string2Color('#4161D0'),
-            child: Flex(
-              direction: Axis.horizontal,
-              children: [
-                Expanded(
-                  flex: 1,
-                  child: Container(
-                    color: ColorUtils.string2Color('#4161D0'),
-                    height: 100,
-                    child: Row(
-                      mainAxisAlignment: MainAxisAlignment.center,
-                      crossAxisAlignment: CrossAxisAlignment.center,
-                      children: [
-                        MyTextView(
-                          "Redeem",
-                          fontSize: 16,
-                          textColor: Colors.white,
-                          isFontMedium: true,
+      body: LoadStateLayout(
+          state: state.loadingState,
+          errorMessage: state.errorMessage,
+          errorRetry: () {
+            _vm.retryRequest(id: id);
+          },
+          successWidget: Column(
+            children: [
+              Expanded(
+                  child: SingleChildScrollView(
+                      scrollDirection: Axis.vertical,
+                      physics: const BouncingScrollPhysics(),
+                      clipBehavior: Clip.none,
+                      child: Column(
+                        children: [
+                          Container(
+                              color: ColorUtils.string2Color('#F2F3F6'),
+                              padding: const EdgeInsets.only(top: 15),
+                              child: Column(
+                                children: [
+                                  _buildSaleItem(context, ref, _vm, detailInfo),
+                                  _buildDeal(context, ref, _vm),
+                                  _buildPackage(context, ref, _vm, detailInfo),
+                                  _buildNotice(context, ref, _vm, detailInfo),
+                                ],
+                              )),
+                        ],
+                      ))),
+              Container(
+                height: 50,
+                color: ColorUtils.string2Color('#4161D0'),
+                child: Flex(
+                  direction: Axis.horizontal,
+                  children: [
+                    Expanded(
+                      flex: 1,
+                      child: Container(
+                        color: ColorUtils.string2Color('#4161D0'),
+                        height: 100,
+                        child: Row(
+                          mainAxisAlignment: MainAxisAlignment.center,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          children: [
+                            MyTextView(
+                              "Redeem",
+                              fontSize: 16,
+                              textColor: Colors.white,
+                              isFontMedium: true,
+                            ),
+                          ],
                         ),
-                      ],
+                      ).onTap(() {
+                        // 去详情
+                        _vm.doDeleteAccount();
+                      }),
                     ),
-                  ).onTap(() {
-                    // 去详情
-                    _vm.doDeleteAccount();
-                  }),
+                  ],
                 ),
-              ],
-            ),
-          )
-        ],
-      ),
+              )
+            ],
+          )),
     );
   }
 }

+ 59 - 15
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_repository.dart

@@ -1,9 +1,12 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/rewards_buy_entity.dart';
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:domain/entity/server_time.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -24,47 +27,88 @@ RewardsConfirmRepository rewardsConfirmRepository(Ref ref) {
 class RewardsConfirmRepository {
   DioEngine dioEngine;
 
-RewardsConfirmRepository({required this.dioEngine});
+  RewardsConfirmRepository({required this.dioEngine});
 
   Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
     Map<String, dynamic> params = {};
 
-    // if (!Utils.isEmpty(type)) {
-    //   params["type"] = type!;
-    // }
-
     params = data!;
 
-
     Map<String, String> headers = {};
 
     headers["Content-Type"] = "application/x-www-form-urlencoded";
     headers["Accept"] = "application/x.yyjobs-api.v1+json";
 
-      final result = await dioEngine.requestNetResult(
+    final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/reward/reward/detail', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
+    Log.d("------请求返回的result--$result--------");
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = RewardsConfirmState.fromJson(json!);
+      var data = RewardsDetailEntity.fromJson(json!);
+      // Log.d("------data--$data--------");
       //重新赋值data或list
-      return result.convert<RewardsConfirmState>(data: data);
+      return result.convert<RewardsDetailEntity>(data: data);
     }
     return result.convert();
   }
 
+  Future<HttpResult<Object>> rewardBuy(
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, dynamic> params = {};
+
+    params = data!;
+
+    Map<String, String> headers = {};
+
+    headers["Content-Type"] = "application/x-www-form-urlencoded";
+    headers["Accept"] = "application/x.yyjobs-api.v1+json";
+
+    final result = await dioEngine.requestNetResult(
+      // ApiConstants.apiServerTime, // api 地址
+      '/api/v1/user/reward/sale/buy', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.POST,
+      isShowLoadingDialog: true, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
 
+    Log.d("------请求返回的result--$result--------");
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      // final json = result.getDataJson();
+      // var data = RewardsBuyEntity.fromJson(json!);
+      // // Log.d("------data--$data--------");
+      // //重新赋值data或list
+      // return result.convert<RewardsBuyEntity>(data: data);
+      //重新赋值data或list
+      final json = result.getListJson();
+      Log.d("------json--$json--------");
+      List<RewardsBuyEntity> data =
+          json?.map((item) => RewardsBuyEntity.fromJson(item)).toList() ?? [];
+      // var data = RewardsHomeTesEntity.fromJson(json);
+      Log.d("------data--$data--------");
+      //重新赋值data或list
+      return result.convert(list: data);
+    }
+    return result.convert();
+  }
 }

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_confirm_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsConfirmRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsConfirmRepositoryHash() =>
+    r'cb6b785b321394bd5e94c6b6ad5b6fd13478992f';
 
 /// See also [rewardsConfirmRepository].
 @ProviderFor(rewardsConfirmRepository)
-final rewardsConfirmRepositoryProvider = Provider<RewardsConfirmRepository>.internal(
+final rewardsConfirmRepositoryProvider =
+    Provider<RewardsConfirmRepository>.internal(
   rewardsConfirmRepository,
   name: r'rewardsConfirmRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 45 - 35
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_state.dart

@@ -2,48 +2,58 @@
 
 import 'dart:convert';
 
-RewardsConfirmState rewardsConfirmStateFromJson(String str) => RewardsConfirmState.fromJson(json.decode(str));
-
-String rewardsConfirmStateToJson(RewardsConfirmState data) => json.encode(data.toJson());
+import 'package:domain/entity/rewards_detail_entity.dart';
+import 'package:widgets/load_state_layout.dart';
 
 class RewardsConfirmState {
-  RewardsConfirmState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
-
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+  RewardsDetailEntity? detailInfo;
+  int? number=1;
+  int? amount=0;
 
-  factory RewardsConfirmState.fromJson(Map<dynamic, dynamic> json) => RewardsConfirmState(
-    curPage: json["curPage"],
-    pageSize: json["pageSize"],
-    list: List<Map<String, dynamic>>.from(json["list"].map((x) => x)),
-    filterCount: json["filterCount"],
-  );
-
-  Map<dynamic, dynamic> toJson() => {
-    "curPage": curPage,
-    "pageSize": pageSize,
-    "list": List<dynamic>.from(list.map((x) => x)),
-    "filterCount": filterCount,
-  };
+  RewardsConfirmState({
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    this.number = 1,
+    this.amount = 0,
+    RewardsDetailEntity? detailInfo,
+  }) : detailInfo = detailInfo ?? RewardsDetailEntity();
 
   RewardsConfirmState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
+    LoadState? loadingState,
+    String? errorMessage,
+    int? number,
+    int? amount,
+    RewardsDetailEntity? detailInfo,
   }) {
     return RewardsConfirmState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      number: number ?? this.number,
+      amount: amount ?? this.amount,
+      detailInfo: detailInfo ?? this.detailInfo,
+    );
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'loadingState': this.loadingState,
+      'errorMessage': this.errorMessage,
+      'number': this.number,
+      'amount': this.amount,
+      'detailInfo': this.detailInfo,
+    };
+  }
+
+  factory RewardsConfirmState.fromMap(Map<String, dynamic> map) {
+    return RewardsConfirmState(
+      loadingState: map['loadingState'] as LoadState,
+      errorMessage: map['errorMessage'] as String,
+      number: map['number'] as int,
+      amount: map['amount'] as int,
+      detailInfo: map['detailInfo'] as RewardsDetailEntity,
     );
   }
 }

+ 83 - 44
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_vm.dart

@@ -1,11 +1,16 @@
 import 'package:cpt_rewards/modules/rewards_confirm/dialog/account_deactivation_dialog.dart';
+import 'package:cpt_rewards/modules/rewards_successful/rewards_successful_page.dart';
+import 'package:domain/entity/rewards_buy_entity.dart';
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/picker/option_pick_util.dart';
+import 'package:widgets/widget_export.dart';
 import './rewards_confirm_state.dart';
 import './rewards_confirm_repository.dart';
 part 'rewards_confirm_vm.g.dart';
@@ -13,25 +18,15 @@ part 'rewards_confirm_vm.g.dart';
 @riverpod
 class RewardsConfirmVm extends _$RewardsConfirmVm {
   late RewardsConfirmRepository rewardsConfirmRepository;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+  late int detailId;
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
   RewardsConfirmState initState() {
-    return RewardsConfirmState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title":
-              "The community will hold the activity of making Zongzi on the Loong Boat ……",
-          "price": "Monday 14 0ct 2024, 15:00 PM~18:00PM",
-        },
-        {
-          "id": 2,
-          "title": "Community basketball competition activities",
-          "price": "Monday 14 Oct 2024, 10:19 AM",
-        },
-      ],
-      filterCount: 2,
-    );
+    return RewardsConfirmState();
   }
 
   @override
@@ -45,50 +40,58 @@ class RewardsConfirmVm extends _$RewardsConfirmVm {
   }
 
   // 初始化页面数据
-  initPageData() {
+  initPageData({int? id}) {
     Log.d("----property_news_vm-----initPageData");
-    refreshListData();
+    detailId = id!;
+    getListData();
   }
 
   // 上拉加载
   Future onLoadData() async {
     Log.d("----property_news_vm-----initListData");
-    // await Future.delayed(const Duration(seconds: 2));
-    // if(state.list.length >= state.filterCount){
-    //   return;
-    // }else {
-    //   int curPage = state.curPage + 1;
-    //   state = state.copyWith(curPage: curPage,);
-    //   getListData();
-    // }
     getListData();
   }
 
 // 去新闻详情页
-  void goNewsConfirm(String item) {
+  void goNewsDetail(String item) {
     Log.d(item);
     // PropertyPage.startInstance(context: context, item: item);
   }
 
+// 重试请求
+  Future retryRequest({int? id}) async {
+    _needShowPlaceholder = true;
+    getListData();
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
   // 获取list 列表数据
   void getListData<T>() async {
     Log.d("加载listData数据---------------start-----");
     try {
       //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
+      Map<String, dynamic> params = {"id": detailId};
       Log.d("请求参数------$params");
       final result =
           await rewardsConfirmRepository.fetchPropertyNewsList(params);
       Log.d("请求完成结果------${result.data}");
       //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
+        state = state.copyWith(
+          detailInfo: result.data as RewardsDetailEntity,
+        );
+        state = state.copyWith(
+          amount: state.detailInfo?.point,
+        );
+        Log.d("123------${state.detailInfo}");
+        changeLoadingState(LoadState.State_Success, null);
       } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
         ToastEngine.show(result.errorMsg ?? "Network Load Error");
       }
     } catch (e) {
@@ -96,16 +99,52 @@ class RewardsConfirmVm extends _$RewardsConfirmVm {
     }
   }
 
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
+  void numberAdd() {
+    int numNew = state.number! + 1;
+    int amountNew = numNew * state.detailInfo!.point;
+    state = state.copyWith(amount: amountNew, number: numNew);
+  }
 
-    // await Future.delayed(const Duration(seconds: 2));
+  void numberDec() {
+    if (state.number! > 1) {
+      int numNew = state.number! - 1;
+      int amountNew = numNew * state.detailInfo!.point;
+      state = state.copyWith(amount: amountNew, number: numNew);
+    }
+  }
 
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
+  void rewardBuy<T>() async {
+    Log.d("加载listData数据---------------start-----");
+    try {
+      //请求网络
+      Map<String, dynamic> params = {"id": detailId, "number": state.number};
+      Log.d("请求参数------$params");
+      final result = await rewardsConfirmRepository.rewardBuy(params);
+      Log.d("请求完成结果------${result.data}");
+      //校验成功失败
+      if (result.isSuccess) {
+        Log.d("123------${result.list}");
+        final data = result.list as List<RewardsBuyEntity>;
+        Log.d("123------$data");
+        // RewardsSuccessfulPage.startInstance(data: data);
+        String title = data[0].reward.title;
+        String resources = data[0].reward.resources[0];
+        String redeemedStart = data[0].reward.redeemedStart;
+        String redeemedEnd = data[0].reward.redeemedEnd;
+        String redeemedDate = '$redeemedStart until $redeemedEnd';
+        String createdAt = data[0].createdAt;
+        RewardsSuccessfulPage.startInstance(
+            amount: state.amount,
+            title: title,
+            resources: resources,
+            redeemedDate: redeemedDate,
+            createdAt: createdAt);
+      } else {
+        ToastEngine.show(result.errorMsg ?? "Network Load Error");
+      }
+    } catch (e) {
+      ToastEngine.show("Error: $e");
+    }
   }
 
   void doDeleteAccount() {

+ 5 - 4
packages/cpt_rewards/lib/modules/rewards_confirm/rewards_confirm_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_confirm_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsConfirmVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsConfirmVmHash() => r'1d7a4a6df997b7fe9df48171f87d5a951dd0e5d3';
 
 /// See also [RewardsConfirmVm].
 @ProviderFor(RewardsConfirmVm)
@@ -14,12 +14,13 @@ final rewardsConfirmVmProvider =
     AutoDisposeNotifierProvider<RewardsConfirmVm, RewardsConfirmState>.internal(
   RewardsConfirmVm.new,
   name: r'rewardsConfirmVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsConfirmVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsConfirmVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );
 
 typedef _$RewardsConfirmVm = AutoDisposeNotifier<RewardsConfirmState>;
 // 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
+// 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

Разница между файлами не показана из-за своего большого размера
+ 113 - 154
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_page.dart


+ 3 - 2
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_repository.dart

@@ -1,4 +1,5 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:domain/entity/server_time.dart';
 import 'package:plugin_platform/platform_export.dart';
 import 'package:plugin_platform/http/dio_engine.dart';
@@ -56,10 +57,10 @@ class RewardsDetailRepository {
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      // var data = RewardsIndexEntity.fromJson(json!);
+      var data = RewardsDetailEntity.fromJson(json!);
       // Log.d("------data--$data--------");
       //重新赋值data或list
-      // return result.convert<RewardsIndexEntity>(data: data);
+      return result.convert<RewardsDetailEntity>(data: data);
     }
     return result.convert();
   }

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_detail_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsDetailRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsDetailRepositoryHash() =>
+    r'0fe06d8758e7ae97d436d7b6bcbdd2a677c6d2de';
 
 /// See also [rewardsDetailRepository].
 @ProviderFor(rewardsDetailRepository)
-final rewardsDetailRepositoryProvider = Provider<RewardsDetailRepository>.internal(
+final rewardsDetailRepositoryProvider =
+    Provider<RewardsDetailRepository>.internal(
   rewardsDetailRepository,
   name: r'rewardsDetailRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 14 - 7
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_state.dart

@@ -2,39 +2,46 @@
 
 import 'dart:convert';
 
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:widgets/load_state_layout.dart';
 
 class RewardsDetailState {
   //页面 LoadView 状态的展示
   LoadState loadingState;
   String? errorMessage;
-  List<Map<String, dynamic>>? list;
+  RewardsDetailEntity? detailInfo;
 
   RewardsDetailState({
     this.loadingState = LoadState.State_Loading,
     String? errorMessage,
-    required this.list,
-  });
+    RewardsDetailEntity? detailInfo,
+  }) : detailInfo = detailInfo ?? RewardsDetailEntity();
 
   RewardsDetailState copyWith({
     LoadState? loadingState,
     String? errorMessage,
-    List<Map<String, dynamic>>? list,
+    RewardsDetailEntity? detailInfo,
   }) {
     return RewardsDetailState(
       loadingState: loadingState ?? this.loadingState,
       errorMessage: errorMessage ?? this.errorMessage,
-      list: list ?? this.list,
+      detailInfo: detailInfo ?? this.detailInfo,
     );
   }
 
   Map<String, dynamic> toMap() {
     return {
-      'list': this.list,
+      'loadingState': this.loadingState,
+      'errorMessage': this.errorMessage,
+      'detailInfo': this.detailInfo,
     };
   }
 
   factory RewardsDetailState.fromMap(Map<String, dynamic> map) {
-    return RewardsDetailState(list: map['list'] as List<Map<String, dynamic>>);
+    return RewardsDetailState(
+      loadingState: map['loadingState'] as LoadState,
+      errorMessage: map['errorMessage'] as String,
+      detailInfo: map['detailInfo'] as RewardsDetailEntity,
+    );
   }
 }

+ 11 - 10
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_vm.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
@@ -21,7 +22,7 @@ class RewardsDetailVm extends _$RewardsDetailVm {
     controlFinishLoad: true, //允许加载
   );
   RewardsDetailState initState() {
-    return RewardsDetailState(list: [],);
+    return RewardsDetailState();
   }
 
   @override
@@ -31,6 +32,7 @@ class RewardsDetailVm extends _$RewardsDetailVm {
     // 初始化状态
     RewardsDetailState state = initState();
     // 初始化列表数据
+    Log.d("state.list------${state.detailInfo}");
     return state;
   }
 
@@ -55,7 +57,7 @@ class RewardsDetailVm extends _$RewardsDetailVm {
 // 重试请求
   Future retryRequest({int? id}) async {
     _needShowPlaceholder = true;
-    getListData(id:id);
+    getListData(id: id);
   }
 
   //刷新页面状态
@@ -68,18 +70,17 @@ class RewardsDetailVm extends _$RewardsDetailVm {
     Log.d("加载listData数据---------------start-----");
     try {
       //请求网络
-      Map<String, dynamic> params = {
-        "id": id
-      };
+      Map<String, dynamic> params = {"id": id};
       Log.d("请求参数------$params");
-      final result = await rewardsDetailRepository.fetchPropertyNewsList(params);
+      final result =
+          await rewardsDetailRepository.fetchPropertyNewsList(params);
       Log.d("请求完成结果------${result.data}");
       //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(
-        //   list: result.data as RewardsIndexEntity,
-        // );
-        ToastEngine.show("获取数据成功");
+        state = state.copyWith(
+          detailInfo: result.data as RewardsDetailEntity,
+        );
+        Log.d("123------${state.detailInfo}");
         changeLoadingState(LoadState.State_Success, null);
       } else {
         String errorMessage = result.errorMsg!;

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_detail/rewards_detail_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_detail_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsDetailVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsDetailVmHash() => r'796f0fb5cee8d1f89e2e3ca380e6496878361ab2';
 
 /// See also [RewardsDetailVm].
 @ProviderFor(RewardsDetailVm)
@@ -14,8 +14,9 @@ final rewardsDetailVmProvider =
     AutoDisposeNotifierProvider<RewardsDetailVm, RewardsDetailState>.internal(
   RewardsDetailVm.new,
   name: r'rewardsDetailVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsDetailVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsDetailVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 29 - 33
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_page.dart

@@ -31,6 +31,9 @@ class RewardsHistoryEarnedPage extends HookConsumerWidget {
 
   // listitem
   Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
+    String shortDescription = item['short_description'] ?? '';
+    String createdAt = item['created_at'] ?? '';
+    int point = item['point'] ?? 0;
     return Container(
       padding: const EdgeInsets.only(top: 15, bottom: 15, left: 18, right: 18),
       decoration: BoxDecoration(
@@ -48,14 +51,14 @@ class RewardsHistoryEarnedPage extends HookConsumerWidget {
             mainAxisAlignment: MainAxisAlignment.center,
             children: [
               Text(
-                'Daily Login',
+                shortDescription,
                 style: TextStyle(
                     fontSize: 15.0,
                     color: ColorUtils.string2Color('#000000'),
                     fontWeight: FontWeight.w500), // 设置字体大小
               ).marginOnly(bottom: 6),
               Text(
-                '14 Oct 2024  10:00PM',
+                createdAt,
                 style: TextStyle(
                     fontSize: 13.0,
                     color: ColorUtils.string2Color('#808DAF'),
@@ -64,7 +67,7 @@ class RewardsHistoryEarnedPage extends HookConsumerWidget {
             ],
           ),
           Text(
-            '+2',
+            '$point',
             style: TextStyle(
                 fontSize: 20.0,
                 color: ColorUtils.string2Color('#FDB429'),
@@ -77,28 +80,11 @@ class RewardsHistoryEarnedPage extends HookConsumerWidget {
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return Container(
-        decoration: BoxDecoration(
-          color: Colors.white,
-          borderRadius: BorderRadius.circular(10),
-          boxShadow: const [
-            BoxShadow(color: Color.fromRGBO(184, 191, 217, 0.3), blurRadius: 6)
-          ],
-        ),
-        child:
-            // Column(
-            //     crossAxisAlignment: CrossAxisAlignment.center,
-            //     mainAxisAlignment: MainAxisAlignment.center,
-            //     children: [
-            ListView.builder(
-          itemCount: itemsList.length,
-          itemBuilder: (context, index) {
-            return _buildSaleItem(context, ref, itemsList[index], _vm);
-          },
-        )
-        // ])
-        );
+    final state = ref.watch(rewardsHistoryEarnedVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override
@@ -133,14 +119,24 @@ class RewardsHistoryEarnedPage extends HookConsumerWidget {
               child: Container(
                 color: ColorUtils.string2Color('#F2F3F6'),
                 padding: const EdgeInsets.only(top: 15),
-                child: LoadStateLayout(
-                  state: state.loadingState,
-                  errorMessage: state.errorMessage,
-                  errorRetry: () {
-                    vm.retryRequest();
-                  },
-                  successSliverWidget: [_buildSaleList(context, ref, vm)],
-                ),
+                child: Container(
+                    decoration: BoxDecoration(
+                      color: Colors.white,
+                      borderRadius: BorderRadius.circular(10),
+                      boxShadow: const [
+                        BoxShadow(
+                            color: Color.fromRGBO(184, 191, 217, 0.3),
+                            blurRadius: 6)
+                      ],
+                    ),
+                    child: LoadStateLayout(
+                      state: state.loadingState,
+                      errorMessage: state.errorMessage,
+                      errorRetry: () {
+                        vm.retryRequest();
+                      },
+                      successSliverWidget: [_buildSaleList(context, ref, vm)],
+                    )),
               ))),
     );
   }

+ 6 - 3
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_history_earned_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHistoryEarnedRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsHistoryEarnedRepositoryHash() =>
+    r'ba04d36d7a0dd5e0b0e430c5704219c0a9fc46d3';
 
 /// See also [rewardsHistoryEarnedRepository].
 @ProviderFor(rewardsHistoryEarnedRepository)
-final rewardsHistoryEarnedRepositoryProvider = Provider<RewardsHistoryEarnedRepository>.internal(
+final rewardsHistoryEarnedRepositoryProvider =
+    Provider<RewardsHistoryEarnedRepository>.internal(
   rewardsHistoryEarnedRepository,
   name: r'rewardsHistoryEarnedRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
@@ -22,6 +24,7 @@ final rewardsHistoryEarnedRepositoryProvider = Provider<RewardsHistoryEarnedRepo
 
 @Deprecated('Will be removed in 3.0. Use Ref instead')
 // ignore: unused_element
-typedef RewardsHistoryEarnedRepositoryRef = ProviderRef<RewardsHistoryEarnedRepository>;
+typedef RewardsHistoryEarnedRepositoryRef
+    = ProviderRef<RewardsHistoryEarnedRepository>;
 // 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

+ 2 - 2
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_vm.dart

@@ -105,7 +105,7 @@ class RewardsHistoryEarnedVm extends _$RewardsHistoryEarnedVm {
       if (result.isSuccess) {
         handlerResultList((result.data as RewardsHistoryEarnedEntity)
             .list
-            .cast<RewardsHistoryEarnedEntity>());
+            .cast<RewardsHistoryEarnedList>());
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -116,7 +116,7 @@ class RewardsHistoryEarnedVm extends _$RewardsHistoryEarnedVm {
     }
   }
 
-  void handlerResultList(List<RewardsHistoryEarnedEntity>? list) {
+  void handlerResultList(List<RewardsHistoryEarnedList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 9 - 6
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_earned/rewards_history_earned_vm.g.dart

@@ -6,20 +6,23 @@ part of 'rewards_history_earned_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHistoryEarnedVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsHistoryEarnedVmHash() =>
+    r'e9700821c483af4713a6bc2d6902fdca2327602e';
 
 /// See also [RewardsHistoryEarnedVm].
 @ProviderFor(RewardsHistoryEarnedVm)
-final rewardsHistoryEarnedVmProvider =
-    AutoDisposeNotifierProvider<RewardsHistoryEarnedVm, RewardsHistoryEarnedState>.internal(
+final rewardsHistoryEarnedVmProvider = AutoDisposeNotifierProvider<
+    RewardsHistoryEarnedVm, RewardsHistoryEarnedState>.internal(
   RewardsHistoryEarnedVm.new,
   name: r'rewardsHistoryEarnedVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsHistoryEarnedVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsHistoryEarnedVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );
 
-typedef _$RewardsHistoryEarnedVm = AutoDisposeNotifier<RewardsHistoryEarnedState>;
+typedef _$RewardsHistoryEarnedVm
+    = AutoDisposeNotifier<RewardsHistoryEarnedState>;
 // 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

+ 24 - 31
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_page.dart

@@ -76,32 +76,15 @@ class RewardsHistorySpentPage extends HookConsumerWidget {
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return Container(
-        decoration: BoxDecoration(
-          color: Colors.white,
-          borderRadius: BorderRadius.circular(10),
-          boxShadow: const [
-            BoxShadow(color: Color.fromRGBO(184, 191, 217, 0.3), blurRadius: 6)
-          ],
-        ),
-        child:
-            // Column(
-            //     crossAxisAlignment: CrossAxisAlignment.center,
-            //     mainAxisAlignment: MainAxisAlignment.center,
-            //     children: [
-            ListView.builder(
-          itemCount: itemsList.length,
-          itemBuilder: (context, index) {
-            return _buildSaleItem(context, ref, itemsList[index], _vm);
-          },
-        )
-        // ])
-        );
+    final state = ref.watch(rewardsHistorySpentVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override
-   Widget build(BuildContext context, WidgetRef ref) {
+  Widget build(BuildContext context, WidgetRef ref) {
     final vm = ref.read(rewardsHistorySpentVmProvider.notifier);
     final state = ref.watch(rewardsHistorySpentVmProvider);
     useEffect(() {
@@ -132,14 +115,24 @@ class RewardsHistorySpentPage extends HookConsumerWidget {
               child: Container(
                 color: ColorUtils.string2Color('#F2F3F6'),
                 padding: const EdgeInsets.only(top: 15),
-                child: LoadStateLayout(
-                  state: state.loadingState,
-                  errorMessage: state.errorMessage,
-                  errorRetry: () {
-                    vm.retryRequest();
-                  },
-                  successSliverWidget: [_buildSaleList(context, ref, vm)],
-                ),
+                child: Container(
+                    decoration: BoxDecoration(
+                      color: Colors.white,
+                      borderRadius: BorderRadius.circular(10),
+                      boxShadow: const [
+                        BoxShadow(
+                            color: Color.fromRGBO(184, 191, 217, 0.3),
+                            blurRadius: 6)
+                      ],
+                    ),
+                    child: LoadStateLayout(
+                      state: state.loadingState,
+                      errorMessage: state.errorMessage,
+                      errorRetry: () {
+                        vm.retryRequest();
+                      },
+                      successSliverWidget: [_buildSaleList(context, ref, vm)],
+                    )),
               ))),
     );
   }

+ 6 - 3
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_history_spent_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHistorySpentRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsHistorySpentRepositoryHash() =>
+    r'79fa9a68c9f3630929226b702b8c3676c1711a6c';
 
 /// See also [rewardsHistorySpentRepository].
 @ProviderFor(rewardsHistorySpentRepository)
-final rewardsHistorySpentRepositoryProvider = Provider<RewardsHistorySpentRepository>.internal(
+final rewardsHistorySpentRepositoryProvider =
+    Provider<RewardsHistorySpentRepository>.internal(
   rewardsHistorySpentRepository,
   name: r'rewardsHistorySpentRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
@@ -22,6 +24,7 @@ final rewardsHistorySpentRepositoryProvider = Provider<RewardsHistorySpentReposi
 
 @Deprecated('Will be removed in 3.0. Use Ref instead')
 // ignore: unused_element
-typedef RewardsHistorySpentRepositoryRef = ProviderRef<RewardsHistorySpentRepository>;
+typedef RewardsHistorySpentRepositoryRef
+    = ProviderRef<RewardsHistorySpentRepository>;
 // 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

+ 2 - 2
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_vm.dart

@@ -105,7 +105,7 @@ class RewardsHistorySpentVm extends _$RewardsHistorySpentVm {
       if (result.isSuccess) {
         handlerResultList((result.data as RewardsHistoryEarnedEntity)
             .list
-            .cast<RewardsHistoryEarnedEntity>());
+            .cast<RewardsHistoryEarnedList>());
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -116,7 +116,7 @@ class RewardsHistorySpentVm extends _$RewardsHistorySpentVm {
     }
   }
 
-  void handlerResultList(List<RewardsHistoryEarnedEntity>? list) {
+  void handlerResultList(List<RewardsHistoryEarnedList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 7 - 5
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_spent/rewards_history_spent_vm.g.dart

@@ -6,16 +6,18 @@ part of 'rewards_history_spent_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHistorySpentVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsHistorySpentVmHash() =>
+    r'7e0e58a3be1ccd92b61275c86223a3beadde72b2';
 
 /// See also [RewardsHistorySpentVm].
 @ProviderFor(RewardsHistorySpentVm)
-final rewardsHistorySpentVmProvider =
-    AutoDisposeNotifierProvider<RewardsHistorySpentVm, RewardsHistorySpentState>.internal(
+final rewardsHistorySpentVmProvider = AutoDisposeNotifierProvider<
+    RewardsHistorySpentVm, RewardsHistorySpentState>.internal(
   RewardsHistorySpentVm.new,
   name: r'rewardsHistorySpentVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsHistorySpentVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsHistorySpentVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 6 - 5
packages/cpt_rewards/lib/modules/rewards_history/rewards_history_vm.g.dart

@@ -6,16 +6,17 @@ part of 'rewards_history_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHistoryVmHash() => r'9b08b5e83d2b45f67b653daf60bb66bacb9c47ed';
+String _$rewardsHistoryVmHash() => r'79d4a3d09ec45ac0c123ce56d962b03ff13d742c';
 
 /// See also [RewardsHistoryVm].
 @ProviderFor(RewardsHistoryVm)
-final rewardsHistoryVmProvider =
-    AutoDisposeNotifierProvider<RewardsHistoryVm, RewardsHistoryVmState>.internal(
+final rewardsHistoryVmProvider = AutoDisposeNotifierProvider<RewardsHistoryVm,
+    RewardsHistoryVmState>.internal(
   RewardsHistoryVm.new,
   name: r'rewardsHistoryVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsHistoryVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsHistoryVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 26 - 16
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_page.dart

@@ -5,6 +5,7 @@ import 'package:cpt_rewards/modules/rewards_list/rewards_list_page.dart';
 import 'package:cpt_rewards/modules/rewards_my/rewards_my_page.dart';
 import 'package:cpt_rewards/modules/rewards_search/rewards_search_page.dart';
 import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/rewards_category_entity.dart';
 import 'package:domain/entity/rewards_home_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
@@ -23,19 +24,25 @@ import './rewards_home_vm.dart';
 
 @RoutePage()
 class RewardsHomePage extends HookConsumerWidget {
-  const RewardsHomePage({Key? key}) : super(key: key);
+  final int? points;
+  const RewardsHomePage({Key? key, @PathParam('points') required this.points})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? points,
+  }) {
     if (context != null) {
-      context.router.push(const RewardsHomePageRoute());
+      context.router.push(RewardsHomePageRoute(points: points));
     } else {
-      appRouter.push(const RewardsHomePageRoute()); 
+      appRouter.push(RewardsHomePageRoute(points: points));
     }
   }
 
   Widget _buildTop(BuildContext context, WidgetRef ref, _vm) {
-    // List itemsList = _vm.state.list.toList();
+    int? point = points ?? 0;
+    // String available = '$point'
     return Container(
         decoration: BoxDecoration(
           border: Border(
@@ -65,9 +72,9 @@ class RewardsHomePage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.center,
               mainAxisAlignment: MainAxisAlignment.center,
               children: [
-                const Text(
-                  '1526 Available Points',
-                  style: TextStyle(
+                Text(
+                  '$point Available Points',
+                  style: const TextStyle(
                       fontSize: 18.0,
                       color: Colors.white,
                       fontWeight: FontWeight.w500), // 设置字体大小
@@ -162,7 +169,9 @@ class RewardsHomePage extends HookConsumerWidget {
   }
 
   Widget _buildSwiper(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.lists.toList();
+    // List itemsList = _vm.state.lists.toList();
+    final state = ref.watch(rewardsHomeVmProvider);
+    List<Map<String, dynamic>>? itemsList = state.categoryList;
     return Container(
       transform: Matrix4.translationValues(0.0, -10.0, 0.0),
       // color: Colors.white,
@@ -187,19 +196,19 @@ class RewardsHomePage extends HookConsumerWidget {
         child: Row(
           crossAxisAlignment: CrossAxisAlignment.center,
           mainAxisAlignment: MainAxisAlignment.center,
-          children: List.generate(itemsList.length, (index) {
+          children: List.generate(itemsList!.length, (index) {
             final item = itemsList[index];
             return Column(
               crossAxisAlignment: CrossAxisAlignment.center,
               mainAxisAlignment: MainAxisAlignment.center,
               children: [
-                MyAssetImage(
-                  item['icon'],
+                MyLoadImage(
+                  item['icon'] ?? '',
                   width: 70,
                   height: 70,
                 ),
                 Text(
-                  item['title']!,
+                  item['name']!,
                   style: TextStyle(
                       fontSize: 14.0,
                       color: ColorUtils.string2Color('#000001'),
@@ -409,7 +418,7 @@ class RewardsHomePage extends HookConsumerWidget {
                 Row(
                     crossAxisAlignment: CrossAxisAlignment.center,
                     mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                    children: List.generate(2, (index) {
+                    children: List.generate(list['rewards'].length, (index) {
                       double hg = 70;
                       return Container(
                           width: MediaQuery.of(context).size.width / 2 - 25,
@@ -461,7 +470,7 @@ class RewardsHomePage extends HookConsumerWidget {
                 Column(
                     crossAxisAlignment: CrossAxisAlignment.center,
                     mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                    children: List.generate(2, (index) {
+                    children: List.generate(list['rewards'].length, (index) {
                       double hg = 140;
                       return Container(
                               // width: MediaQuery.of(context).size.width / 2 - 25,
@@ -515,7 +524,8 @@ class RewardsHomePage extends HookConsumerWidget {
               child: state.list.length > 0
                   ? Column(
                       children: [
-                        _buildTop(context, ref, _vm),
+                        _buildTop(context, ref, _vm).paddingOnly(
+                            top: MediaQuery.of(context).padding.top),
                         Container(
                           transform: Matrix4.translationValues(0.0, -25.0, 0.0),
                           child: _buildSearch(context, ref, _vm), // 使用负数margin

+ 42 - 0
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_repository.dart

@@ -1,4 +1,5 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/rewards_category_entity.dart';
 import 'package:domain/entity/rewards_home_entity.dart';
 import 'package:domain/entity/rewards_home_tes_entity.dart';
 import 'package:domain/entity/rewards_home_test_entity.dart';
@@ -73,4 +74,45 @@ class RewardsHomeRepository {
     }
     return result.convert();
   }
+
+  Future<HttpResult<Object>> fetchCategory(
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, dynamic> params = {};
+
+    params = data!;
+
+    Map<String, String> headers = {};
+
+    headers["Content-Type"] = "application/x-www-form-urlencoded";
+    headers["Accept"] = "application/x.yyjobs-api.v1+json";
+
+    final result = await dioEngine.requestNetResult(
+      // ApiConstants.apiServerTime, // api 地址
+      '/api/v1/user/reward/category/index', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.GET,
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
+
+    Log.d("------请求返回的result--$result--------");
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getListJson();
+      Log.d("------json--$json--------");
+      List<RewardsCategoryEntity> data =
+          json?.map((item) => RewardsCategoryEntity.fromJson(item)).toList() ??
+              [];
+      // var data = RewardsHomeTesEntity.fromJson(json);
+      Log.d("------data--$data--------");
+      //重新赋值data或list
+      return result.convert(list: data);
+    }
+    return result.convert();
+  }
 }

+ 2 - 1
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_repository.g.dart

@@ -6,7 +6,8 @@ part of 'rewards_home_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHomeRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsHomeRepositoryHash() =>
+    r'514daf688c4c2a26677843f4650633094b2cc16c';
 
 /// See also [rewardsHomeRepository].
 @ProviderFor(rewardsHomeRepository)

+ 7 - 0
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_state.dart

@@ -17,16 +17,19 @@ class RewardsHomeState {
   String? errorMessage;
   List<Map<String, dynamic>> list;
   List<Map<String, dynamic>> lists;
+  List<Map<String, dynamic>>? categoryList;
   RewardsHomeState({
     this.loadingState = LoadState.State_Loading,
     String? errorMessage,
     required this.list,
     required this.lists,
+    required this.categoryList,
   });
 
   RewardsHomeState copyWith(
       {LoadState? loadingState,
       String? errorMessage,
+      List<Map<String, dynamic>>? categoryList,
       List<Map<String, dynamic>>? list,
       List<Map<String, dynamic>>? lists}) {
     return RewardsHomeState(
@@ -34,6 +37,7 @@ class RewardsHomeState {
       errorMessage: errorMessage ?? this.errorMessage,
       list: list ?? this.list,
       lists: lists ?? this.lists,
+      categoryList: list ?? this.categoryList,
     );
   }
 
@@ -41,6 +45,7 @@ class RewardsHomeState {
     return {
       'list': List<dynamic>.from(lists.map((x) => x)),
       "lists": List<dynamic>.from(lists.map((x) => x)),
+      'categoryList': this.categoryList,
     };
   }
 
@@ -51,11 +56,13 @@ class RewardsHomeState {
       RewardsHomeState(
         lists: List<Map<String, dynamic>>.from(json["lists"].map((x) => x)),
         list: List<Map<String, dynamic>>.from(json["lists"].map((x) => x)),
+        categoryList: map['categoryList'] as List<Map<String, dynamic>>,
       );
   factory RewardsHomeState.fromMap(Map<String, dynamic> map, dynamic json) {
     return RewardsHomeState(
       list: List<Map<String, dynamic>>.from(json["lists"].map((x) => x)),
       lists: List<Map<String, dynamic>>.from(json["lists"].map((x) => x)),
+      categoryList: map['categoryList'] as List<Map<String, dynamic>>,
     );
   }
 }

+ 32 - 18
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_vm.dart

@@ -1,7 +1,7 @@
 import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/rewards_category_entity.dart';
 import 'package:domain/entity/rewards_home_entity.dart';
 import 'package:domain/entity/rewards_home_tx_entity.dart';
-import 'package:domain/entity/rewards_list_entity.dart';
 import 'package:domain/entity/text_kon_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_platform/http/http_result.dart';
@@ -28,6 +28,7 @@ class RewardsHomeVm extends _$RewardsHomeVm {
   RewardsHomeState initState() {
     return RewardsHomeState(
       list: [],
+      categoryList: [],
       lists: [
         {'title': 'YY', 'icon': Assets.rewardsRewardsIndex1},
         {'title': 'F&B', 'icon': Assets.rewardsRewardsIndex2},
@@ -53,8 +54,9 @@ class RewardsHomeVm extends _$RewardsHomeVm {
   }
 
   // 初始化页面数据
-  initPageData() {
+  initPageData() async {
     Log.d("----property_news_vm-----initPageData");
+    await getCategoryData();
     getListData();
   }
 
@@ -96,12 +98,7 @@ class RewardsHomeVm extends _$RewardsHomeVm {
       Log.d("请求完成结果------${result.list}");
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.list as List<RewardsListEntity>));
-        // state.list.addAll(result.list?.toList());
-        // final lis = result.getListJson();
-        // state =
-        // state.copyWith(list: result.list);
-        ToastEngine.show("获取数据成功");
+        handlerResultList((result.list as List<RewardsHomeTxEntity>));
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -112,7 +109,7 @@ class RewardsHomeVm extends _$RewardsHomeVm {
     }
   }
 
-  void handlerResultList(List<RewardsListEntity>? list) {
+  void handlerResultList(List<RewardsHomeTxEntity>? list) {
     if (list != null) {
       //有数据,判断是刷新还是加载更多的数据
       //刷新的方式
@@ -122,15 +119,32 @@ class RewardsHomeVm extends _$RewardsHomeVm {
       changeLoadingState(LoadState.State_Success, null);
     }
   }
-  // // 下拉刷新
-  // Future refreshListData() async {
-  //   Log.d("----property_news_vm-----refreshListData ");
 
-  //   // await Future.delayed(const Duration(seconds: 2));
+  // 获取Category数据
+  Future getCategoryData<T>() async {
+    try {
+      //请求网络
+      Map<String, dynamic> params = {};
+      Log.d("请求参数------$params");
+      final result = await rewardsHomeRepository.fetchCategory(params);
+      //校验成功失败
+      if (result.isSuccess) {
+        handlerCategory((result.list as List<RewardsCategoryEntity>));
+      } else {
+        ToastEngine.show(result.errorMsg ?? "Network Load Error");
+      }
+    } catch (e) {
+      ToastEngine.show("Error: $e");
+    }
+  }
 
-  //   state = state.copyWith(curPage: 1, pageSize: 10);
-  //   // ref.invalidateSelf();
-  //   // ref.invalidate(propertyNewsVmProvider);
-  //   getListData();
-  // }
+  void handlerCategory(List<RewardsCategoryEntity>? list) {
+    if (list != null) {
+      //有数据,判断是刷新还是加载更多的数据
+      //刷新的方式
+      state.categoryList?.clear();
+      state.categoryList?.addAll(list.map((item) => item.toJson()).toList());
+      Log.d("请categoryList------${state.categoryList}");
+    }
+  }
 }

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_home/rewards_home_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_home_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsHomeVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsHomeVmHash() => r'2efaf800d3b6eb5195282364ad59fce1e008c686';
 
 /// See also [RewardsHomeVm].
 @ProviderFor(RewardsHomeVm)
@@ -14,8 +14,9 @@ final rewardsHomeVmProvider =
     AutoDisposeNotifierProvider<RewardsHomeVm, RewardsHomeState>.internal(
   RewardsHomeVm.new,
   name: r'rewardsHomeVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsHomeVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsHomeVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 470 - 76
packages/cpt_rewards/lib/modules/rewards_list/rewards_list_page.dart

@@ -12,6 +12,7 @@ import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
 import 'package:widgets/shatter/picker_container.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:cs_resources/generated/assets.dart';
@@ -33,45 +34,39 @@ class RewardsListPage extends HookConsumerWidget {
   }
 
   Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, _vm) {
+    int point = item['point'] ?? 0;
+    int originalPoint = item['original_point'] ?? 0;
+    int id = item['id'];
     return Column(
       children: [
         Column(
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
-            const MyAssetImage(
-              Assets.rewardsRewardsIndex1,
-              // width: 110,
+            MyLoadImage(
+              item?['resources']?[0] ?? '',
+              width: MediaQuery.of(context).size.width,
               height: 150,
             ),
-            const Text(
+            Text(
               maxLines: 1, // 设置最大行数为2
               overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-              'Cute children multifunctional ……',
-              style: TextStyle(
+              item?['name'] ?? '',
+              style: const TextStyle(
                   fontSize: 16.0,
                   color: Colors.black,
                   fontWeight: FontWeight.w500),
-            ),
-            Text(
-              maxLines: 1, // 设置最大行数为2
-              overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-              'Hong Ye Group Co., Ltd',
-              style: TextStyle(
-                  fontSize: 13.0,
-                  color: ColorUtils.string2Color('#808DAF'),
-                  fontWeight: FontWeight.w400),
-            ).marginOnly(bottom: 5),
+            ).marginOnly(bottom: 5, top: 10),
             Row(
               children: [
-                const Text(
-                  '300',
-                  style: TextStyle(
+                Text(
+                  '$point',
+                  style: const TextStyle(
                       fontSize: 19.0,
                       color: Colors.black,
                       fontWeight: FontWeight.w500),
                 ),
                 Text(
-                  '350',
+                  '$originalPoint',
                   style: TextStyle(
                       decoration: TextDecoration.lineThrough,
                       decorationColor: ColorUtils.string2Color('#000000'),
@@ -91,26 +86,12 @@ class RewardsListPage extends HookConsumerWidget {
             ),
           ],
         ).onTap(() {
-          RewardsDetailPage.startInstance();
+          RewardsDetailPage.startInstance(id: id);
         }),
       ],
     ).paddingOnly(top: 0);
   }
 
-  Widget _buildItemRightSection(
-      BuildContext context, WidgetRef ref, item, _vm) {
-    return Container(
-      // color: Colors.green,
-      child: Text(
-        item['price'],
-        style: const TextStyle(
-            fontSize: 14.0,
-            color: Colors.black,
-            fontWeight: FontWeight.w400), // 设置字体大小
-      ),
-    );
-  }
-
   // listitem
   Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
     return Container(
@@ -133,7 +114,6 @@ class RewardsListPage extends HookConsumerWidget {
               children: [
                 _buildItemLeftSection(context, ref, item, _vm)
                 // .marginOnly(bottom: 5),
-                // _buildItemRightSection(context, ref, item, _vm),
               ],
             ).paddingOnly(left: 20, right: 20),
           ).constrained(
@@ -146,13 +126,11 @@ class RewardsListPage extends HookConsumerWidget {
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
+    final state = ref.watch(rewardsListVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   Widget _buildTop(BuildContext context, WidgetRef ref, _vm) {
@@ -200,7 +178,8 @@ class RewardsListPage extends HookConsumerWidget {
                   ),
                 ],
               ).onTap(() {
-                _vm.doDeleteAccountAll(context);
+                // _vm.doDeleteAccountAll(context);
+                _showMyModalBottomSheet(context, ref, _vm);
               })).paddingOnly(left: 15, right: 15),
           SizedBox(
               width: MediaQuery.of(context).size.width / 2 - 40,
@@ -235,7 +214,8 @@ class RewardsListPage extends HookConsumerWidget {
                 ],
               ).onTap(() {
                 // 去详情
-                _vm.doDeleteAccount(context);
+                // _vm.doDeleteAccount(context);
+                _showMyModalBottom(context, ref, _vm);
               })).paddingOnly(left: 15, right: 15)
         ],
       ),
@@ -262,40 +242,454 @@ class RewardsListPage extends HookConsumerWidget {
         "Recommend",
         backgroundColor: context.appColors.whiteBG,
       ),
-      body: Container(
-        child: Column(
-          children: [
-            _buildTop(context, ref, vm),
-            Expanded(
-              child: EasyRefresh(
-                controller: vm.refreshController,
-                // 上拉加载
-                onLoad: () async {
-                  Log.d("----onLoad");
-                  vm.loadMore();
-                },
-                // 下拉刷新
-                onRefresh: () async {
-                  Log.d("----onRefresh");
-                  vm.onRefresh();
-                },
-                child: Container(
-                  color: ColorUtils.string2Color('#F2F3F6'),
-                  padding: const EdgeInsets.only(top: 15),
-                  child: LoadStateLayout(
-                    state: state.loadingState,
-                    errorMessage: state.errorMessage,
-                    errorRetry: () {
-                      vm.retryRequest();
-                    },
-                    successSliverWidget: [_buildSaleList(context, ref, vm)],
-                  ),
+      body: Column(
+        children: [
+          _buildTop(context, ref, vm),
+          Expanded(
+            child: EasyRefresh(
+              controller: vm.refreshController,
+              // 上拉加载
+              onLoad: () async {
+                Log.d("----onLoad");
+                vm.loadMore();
+              },
+              // 下拉刷新
+              onRefresh: () async {
+                Log.d("----onRefresh");
+                vm.onRefresh();
+              },
+              child: Container(
+                color: ColorUtils.string2Color('#F2F3F6'),
+                padding: const EdgeInsets.only(top: 15),
+                child: LoadStateLayout(
+                  state: state.loadingState,
+                  errorMessage: state.errorMessage,
+                  errorRetry: () {
+                    vm.retryRequest();
+                  },
+                  successSliverWidget: [_buildSaleList(context, ref, vm)],
                 ),
               ),
-            )
-          ],
-        ),
+            ),
+          )
+        ],
       ),
     );
   }
+
+  // showModalBottomSheet(模态底部弹出框)
+  Future<void> _showMyModalBottomSheet(BuildContext context, ref, _vm) async {
+    final state = ref.watch(rewardsListVmProvider);
+    List itemsList = state.categoryList;
+    return showModalBottomSheet<void>(
+      context: context,
+      backgroundColor: Colors.white,
+      shape: const RoundedRectangleBorder(
+        borderRadius: BorderRadius.vertical(top: Radius.circular(25.0)),
+      ),
+      isScrollControlled: true,
+      builder: (BuildContext context) {
+        return SizedBox(
+          height: 500,
+          child: Column(
+              children: List.generate(
+            itemsList.length,
+            (index) {
+              return Container(
+                  height: 45,
+                  decoration: BoxDecoration(
+                      border: Border(
+                          bottom: BorderSide(
+                    width: 1.0, // 底边边框的宽度
+                    color: ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
+                  ))),
+                  child: Row(
+                    crossAxisAlignment: CrossAxisAlignment.center,
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    children: [
+                      Row(
+                        children: [
+                          Text(
+                            itemsList[index]['name'],
+                            style: TextStyle(
+                                fontSize: 16.0,
+                                color:
+                                    itemsList[index]['id'] == state.category_id
+                                        ? ColorUtils.string2Color('#FF5E75')
+                                        : ColorUtils.string2Color('#000000'),
+                                fontWeight: FontWeight.w400),
+                          ),
+                        ],
+                      ),
+                      itemsList[index]['id'] == state.category_id
+                          ? const MyAssetImage(
+                              Assets.rewardsRewardListChoose,
+                              width: 17,
+                              height: 17,
+                            )
+                          : Container()
+                    ],
+                  )).onTap(() {
+                _vm.categoryClick(itemsList[index]);
+                Navigator.of(context).pop();
+              });
+            },
+          )).paddingOnly(left: 15, right: 15, top: 15),
+        );
+      },
+    );
+  }
+
+  Future<void> _showMyModalBottom(BuildContext context, ref, _vm) async {
+    final _vm = ref.read(rewardsListVmProvider.notifier);
+    final state = ref.watch(rewardsListVmProvider);
+    return showModalBottomSheet<void>(
+        context: context,
+        backgroundColor: Colors.white,
+        shape: const RoundedRectangleBorder(
+          borderRadius: BorderRadius.vertical(top: Radius.circular(25.0)),
+        ),
+        isScrollControlled: true,
+        builder: (BuildContext context) {
+          var isSelected = true;
+          var sortBy = state.sort_by;
+          var sort = state.sort;
+          int point_min = state.point_min;
+          int point_max = state.point_max;
+          return StatefulBuilder(builder: (context, setState) {
+            return SizedBox(
+              height: 550,
+              child: Column(
+                children: [
+                  Container(
+                    height: 40,
+                    color: ColorUtils.string2Color('#F1F1F1'),
+                    child: Row(
+                      crossAxisAlignment: CrossAxisAlignment.center,
+                      mainAxisAlignment: MainAxisAlignment.start,
+                      children: [
+                        Text(
+                          textAlign: TextAlign.center,
+                          'Sort by',
+                          style: TextStyle(
+                              fontSize: 16.0,
+                              color: ColorUtils.string2Color('#767676'),
+                              fontWeight: FontWeight.w500),
+                        ),
+                      ],
+                    ).paddingOnly(left: 15, right: 15),
+                  ),
+                  Column(
+                    children: [
+                      Container(
+                          height: 45,
+                          decoration: BoxDecoration(
+                              border: Border(
+                                  bottom: BorderSide(
+                            width: 1.0, // 底边边框的宽度
+                            color:
+                                ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
+                          ))),
+                          child: Row(
+                            crossAxisAlignment: CrossAxisAlignment.center,
+                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                            children: [
+                              Row(
+                                children: [
+                                  const MyAssetImage(
+                                    Assets.rewardsRewardListNew,
+                                    width: 16,
+                                    height: 13,
+                                  ).marginOnly(right: 15),
+                                  Text(
+                                    'Latest',
+                                    style: TextStyle(
+                                        fontSize: 16.0,
+                                        color: sortBy == "created_at"
+                                            ? ColorUtils.string2Color('#FF5E75')
+                                            : ColorUtils.string2Color(
+                                                '#000000'),
+                                        fontWeight: FontWeight.w400),
+                                  ),
+                                ],
+                              ),
+                              sortBy == "created_at"
+                                  ? const MyAssetImage(
+                                      Assets.rewardsRewardListChoose,
+                                      width: 17,
+                                      height: 17,
+                                    )
+                                  : Container()
+                            ],
+                          )).onTap(() {
+                        setState(() {
+                          sortBy = "created_at";
+                          _vm.sortByClick('created_at');
+                        });
+                      }),
+                      Container(
+                          height: 45,
+                          decoration: BoxDecoration(
+                              border: Border(
+                                  bottom: BorderSide(
+                            width: 1.0, // 底边边框的宽度
+                            color:
+                                ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
+                          ))),
+                          child: Row(
+                            crossAxisAlignment: CrossAxisAlignment.center,
+                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                            children: [
+                              Row(
+                                children: [
+                                  const MyAssetImage(
+                                    Assets.rewardsRewardListHot,
+                                    width: 13,
+                                    height: 17,
+                                  ).marginOnly(right: 15),
+                                  Text(
+                                    'Popularity',
+                                    style: TextStyle(
+                                        fontSize: 16.0,
+                                        color: sortBy == "clicks_count"
+                                            ? ColorUtils.string2Color('#FF5E75')
+                                            : ColorUtils.string2Color(
+                                                '#000000'),
+                                        fontWeight: FontWeight.w400),
+                                  ),
+                                ],
+                              ),
+                              sortBy == "clicks_count"
+                                  ? const MyAssetImage(
+                                      Assets.rewardsRewardListChoose,
+                                      width: 17,
+                                      height: 17,
+                                    )
+                                  : Container()
+                            ],
+                          )).onTap(() {
+                        setState(() {
+                          sortBy = "clicks_count";
+                          _vm.sortByClick('clicks_count');
+                        });
+                      }),
+                      Container(
+                          height: 45,
+                          decoration: BoxDecoration(
+                              border: Border(
+                                  bottom: BorderSide(
+                            width: 1.0, // 底边边框的宽度
+                            color:
+                                ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
+                          ))),
+                          child: Row(
+                            crossAxisAlignment: CrossAxisAlignment.center,
+                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                            children: [
+                              Row(
+                                children: [
+                                  const MyAssetImage(
+                                    Assets.rewardsRewardListLow,
+                                    width: 14,
+                                    height: 17,
+                                  ).marginOnly(right: 15),
+                                  Text(
+                                    'Low to High Points',
+                                    style: TextStyle(
+                                        fontSize: 16.0,
+                                        color: sort == "asc"
+                                            ? ColorUtils.string2Color('#FF5E75')
+                                            : ColorUtils.string2Color(
+                                                '#000000'),
+                                        fontWeight: FontWeight.w400),
+                                  ),
+                                ],
+                              ),
+                              sort == "asc"
+                                  ? const MyAssetImage(
+                                      Assets.rewardsRewardListChoose,
+                                      width: 17,
+                                      height: 17,
+                                    )
+                                  : Container()
+                            ],
+                          )).onTap(() {
+                        setState(() {
+                          sort = "asc";
+                          _vm.sortClick('asc');
+                        });
+                      }),
+                      Container(
+                          height: 45,
+                          decoration: BoxDecoration(
+                              border: Border(
+                                  bottom: BorderSide(
+                            width: 1.0, // 底边边框的宽度
+                            color:
+                                ColorUtils.string2Color('#F2F3F6'), // 底边边框的颜色
+                          ))),
+                          child: Row(
+                            crossAxisAlignment: CrossAxisAlignment.center,
+                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                            children: [
+                              Row(
+                                children: [
+                                  const MyAssetImage(
+                                    Assets.rewardsRewardListHigh,
+                                    width: 13,
+                                    height: 16,
+                                  ).marginOnly(right: 15),
+                                  Text(
+                                    'High to Low Points',
+                                    style: TextStyle(
+                                        fontSize: 16.0,
+                                        color: sort == "desc"
+                                            ? ColorUtils.string2Color('#FF5E75')
+                                            : ColorUtils.string2Color(
+                                                '#000000'),
+                                        fontWeight: FontWeight.w400),
+                                  ),
+                                ],
+                              ),
+                              sort == "desc"
+                                  ? const MyAssetImage(
+                                      Assets.rewardsRewardListChoose,
+                                      width: 17,
+                                      height: 17,
+                                    )
+                                  : Container()
+                            ],
+                          )).onTap(() {
+                        setState(() {
+                          sort = "desc";
+                          _vm.sortClick('desc');
+                        });
+                      }),
+                    ],
+                  ).paddingOnly(left: 15, right: 15),
+                  Container(
+                    height: 40,
+                    color: ColorUtils.string2Color('#F1F1F1'),
+                    child: Row(
+                      crossAxisAlignment: CrossAxisAlignment.center,
+                      mainAxisAlignment: MainAxisAlignment.start,
+                      children: [
+                        Text(
+                          textAlign: TextAlign.center,
+                          'Filter By',
+                          style: TextStyle(
+                              fontSize: 16.0,
+                              color: ColorUtils.string2Color('#767676'),
+                              fontWeight: FontWeight.w500),
+                        ),
+                      ],
+                    ).paddingOnly(left: 15, right: 15),
+                  ),
+                  Row(
+                    crossAxisAlignment: CrossAxisAlignment.center,
+                    mainAxisAlignment: MainAxisAlignment.start,
+                    children: [
+                      Text(
+                        '$point_min',
+                        style: TextStyle(
+                            fontSize: 16.0,
+                            color: ColorUtils.string2Color('#000000'),
+                            fontWeight: FontWeight.w400),
+                      ).marginOnly(right: 3),
+                      Text(
+                        'points',
+                        style: TextStyle(
+                            fontSize: 16.0,
+                            color: ColorUtils.string2Color('#000000'),
+                            fontWeight: FontWeight.w400),
+                      ).marginOnly(right: 3),
+                      Text(
+                        '-',
+                        style: TextStyle(
+                            fontSize: 16.0,
+                            color: ColorUtils.string2Color('#000000'),
+                            fontWeight: FontWeight.w400),
+                      ).marginOnly(right: 3),
+                      Text(
+                        '$point_max',
+                        style: TextStyle(
+                            fontSize: 16.0,
+                            color: ColorUtils.string2Color('#000000'),
+                            fontWeight: FontWeight.w400),
+                      ).marginOnly(right: 3),
+                      Text(
+                        'points',
+                        style: TextStyle(
+                            fontSize: 16.0,
+                            color: ColorUtils.string2Color('#000000'),
+                            fontWeight: FontWeight.w400),
+                      ).marginOnly(right: 3),
+                    ],
+                  ).paddingOnly(left: 15, right: 15, top: 20),
+                  RangeSlider(
+                    values: RangeValues(
+                        point_min.toDouble(), point_max.toDouble()), // 初始化范围
+                    min: 0, // 最小值
+                    max: 100, // 最大值
+                    onChanged: (RangeValues values) {
+                      setState(() {
+                        point_min = values.start.toInt();
+                        point_max = values.end.toInt();
+                        _vm.rangeSliderChanged(values);
+                        // 处理范围改变事件
+                        print(
+                            'Selected range: ${values.start} to ${values.end}');
+                      });
+                    },
+                  ).marginOnly(top: 5),
+                  CheckboxListTile(
+                    title: Container(
+                      transform: Matrix4.translationValues(-20.0, 0.0, 0.0),
+                      child: Text(
+                        'Only show rewards I can redeem',
+                        style: TextStyle(
+                            fontSize: 14.0,
+                            color: ColorUtils.string2Color('#767676'),
+                            fontWeight: FontWeight.w400),
+                      ),
+                    ),
+                    controlAffinity: ListTileControlAffinity.leading,
+                    value: isSelected,
+                    onChanged: (value) {
+                      setState(() {
+                        isSelected = value!;
+                      });
+                    },
+                  ),
+                  Row(
+                    children: [
+                      const SizedBox(width: 18),
+                      Expanded(
+                          flex: 1,
+                          child: InkWell(
+                            onTap: () async {
+                              Navigator.of(context).pop();
+                              _vm.applyClick();
+                            },
+                            child: MyTextView(
+                              'Apply',
+                              fontSize: 16,
+                              paddingTop: 13,
+                              paddingBottom: 13,
+                              isFontMedium: true,
+                              textAlign: TextAlign.center,
+                              textColor: Colors.white,
+                              backgroundColor: context.appColors.btnBgDefault,
+                              cornerRadius: 7,
+                            ),
+                          )),
+                      const SizedBox(width: 18),
+                    ],
+                  ).marginOnly(bottom: 30, top: 28),
+                ],
+              ),
+            );
+          });
+        });
+  }
 }

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_list/rewards_list_repository.dart

@@ -1,5 +1,7 @@
 import 'package:domain/constants/api_constants.dart';
 import 'package:domain/entity/rewards_category_entity.dart';
+import 'package:domain/entity/rewards_history_earned_entity.dart';
+import 'package:domain/entity/rewards_list_entity.dart';
 import 'package:domain/entity/server_time.dart';
 import 'package:plugin_platform/platform_export.dart';
 import 'package:plugin_platform/http/dio_engine.dart';
@@ -57,9 +59,9 @@ class RewardsListRepository {
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      // var data = RewardsHistoryEarnedEntity.fromJson(json!);
+      var data = RewardsListEntity.fromJson(json!);
       //重新赋值data或list
-      // return result.convert<RewardsHistoryEarnedEntity>(data: data);
+      return result.convert<RewardsListEntity>(data: data);
     }
     return result.convert();
   }

+ 2 - 1
packages/cpt_rewards/lib/modules/rewards_list/rewards_list_repository.g.dart

@@ -6,7 +6,8 @@ part of 'rewards_list_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsListRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsListRepositoryHash() =>
+    r'13038626775a583e7d07df4bf8c96f27fb2d9524';
 
 /// See also [rewardsListRepository].
 @ProviderFor(rewardsListRepository)

+ 7 - 7
packages/cpt_rewards/lib/modules/rewards_list/rewards_list_vm.dart

@@ -1,6 +1,7 @@
 import 'package:cpt_rewards/modules/rewards_list/dialog/reward_listfilter_all_dialog.dart';
 import 'package:domain/entity/rewards_category_entity.dart';
 import 'package:domain/entity/rewards_history_earned_entity.dart';
+import 'package:domain/entity/rewards_list_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:cpt_rewards/modules/rewards_list/dialog/reward_listfilter_dialog.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
@@ -51,9 +52,9 @@ class RewardsListVm extends _$RewardsListVm {
   }
 
   // 初始化页面数据&0
-  initPageData() {
+  initPageData() async {
     Log.d("----property_news_vm-----initPageData");
-    getCategoryData();
+    await getCategoryData();
     onRefresh();
   }
 
@@ -137,7 +138,7 @@ class RewardsListVm extends _$RewardsListVm {
         "limit": limit,
         "category_id": state.category_id == 0 ? '' : state.category_id,
         "point_min": state.point_min,
-        "point_max": state.point_max,
+        "point_max": state.point_max == 0 ? 100000 : state.point_max,
         "sort_by": state.sort_by,
         "sort": state.sort,
       };
@@ -145,9 +146,7 @@ class RewardsListVm extends _$RewardsListVm {
       final result = await rewardsListRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.data as RewardsHistoryEarnedEntity)
-            .list
-            .cast<RewardsHistoryEarnedEntity>());
+        handlerResultList((result.data as RewardsListEntity).list);
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -158,7 +157,7 @@ class RewardsListVm extends _$RewardsListVm {
     }
   }
 
-  void handlerResultList(List<RewardsHistoryEarnedEntity>? list) {
+  void handlerResultList(List<RewardsListList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {
@@ -193,6 +192,7 @@ class RewardsListVm extends _$RewardsListVm {
       }
     }
   }
+
   void applyClick() {
     onRefresh();
   }

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_list/rewards_list_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_list_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsListVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsListVmHash() => r'624a514fb02a630e3f4a9733d35f09686d11b9a4';
 
 /// See also [RewardsListVm].
 @ProviderFor(RewardsListVm)
@@ -14,8 +14,9 @@ final rewardsListVmProvider =
     AutoDisposeNotifierProvider<RewardsListVm, RewardsListState>.internal(
   RewardsListVm.new,
   name: r'rewardsListVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsListVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsListVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 52 - 36
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_active/rewards_my_active_page.dart

@@ -30,31 +30,40 @@ class RewardsMyActivePage extends HookConsumerWidget {
   }
 
   Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, _vm) {
+    int point = item['reward']['point'] ?? 0;
+    int originalPoint = item['reward']['original_point'] ?? 0;
+    String title = item['reward']['title'] ?? '';
+    String img = item['reward']['resources'][0] ?? '';
+    int id = item['id'];
+    String redeemedStart = item['reward']['redeemed_start'] ?? "";
+    String redeemedEnd = item['reward']['redeemed_end'] ?? "";
+    String redeemedDate = '$redeemedStart-$redeemedEnd';
+    int code = item['redemption_code'];
     return Column(
       children: [
         Column(
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
-            const Text(
+            Text(
               maxLines: 1, // 设置最大行数为2
               overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-              'Cute children multifunctional ……',
-              style: TextStyle(
+              title,
+              style: const TextStyle(
                   fontSize: 16.0,
                   color: Colors.black,
                   fontWeight: FontWeight.w500),
             ),
             Row(
               children: [
-                const Text(
-                  '300',
-                  style: TextStyle(
+                Text(
+                  '$point',
+                  style: const TextStyle(
                       fontSize: 19.0,
                       color: Colors.black,
                       fontWeight: FontWeight.w500),
                 ),
                 Text(
-                  '350',
+                  '$originalPoint',
                   style: TextStyle(
                       decoration: TextDecoration.lineThrough,
                       decorationColor: ColorUtils.string2Color('#000000'),
@@ -72,22 +81,34 @@ class RewardsMyActivePage extends HookConsumerWidget {
                 ),
               ],
             ),
-            Row(
+            Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               children: [
-                const MyAssetImage(
-                  Assets.rewardsRewardsIconDatd,
-                  width: 15,
-                  height: 15,
+                Row(
+                  children: [
+                    const MyAssetImage(
+                      Assets.rewardsRewardsIconDatd,
+                      width: 15,
+                      height: 15,
+                    ),
+                    const Text(
+                      'Redeem From:',
+                      style: TextStyle(
+                          fontSize: 13.0,
+                          color: Colors.black,
+                          fontWeight: FontWeight.w400),
+                    ).marginOnly(left: 6)
+                  ],
                 ),
-                const Text(
-                  'Redeem From: 17 Mar 2024 until 15 Jul 2024',
-                  style: TextStyle(
+                Text(
+                  '$redeemedDate',
+                  style: const TextStyle(
                       fontSize: 13.0,
                       color: Colors.black,
                       fontWeight: FontWeight.w400),
-                ).marginOnly(left: 6)
+                )
               ],
-            ).paddingOnly(left: 6),
+            ),
             Container(
                 height: 43,
                 decoration: BoxDecoration(
@@ -103,22 +124,19 @@ class RewardsMyActivePage extends HookConsumerWidget {
                               fontSize: 15.0,
                               color: ColorUtils.string2Color('#FFFFFF'),
                               fontWeight: FontWeight.w500),
-                        )))).marginOnly(top: 10, bottom: 5),
+                        )))).marginOnly(top: 10, bottom: 10).onTap(() {
+              RewardsCodePage.startInstance(code: code);
+            }),
           ],
         ),
-        const MyAssetImage(
-          Assets.rewardsRewardsIndex1,
-          // width: 110,
+        MyLoadImage(
+          img,
+          width: MediaQuery.of(context).size.width,
           height: 133,
         ),
       ],
     ).paddingOnly(top: 20).onTap(() {
-      bool isd = true;
-      if (isd) {
-        RewardsRedeemPage.startInstance();
-      } else {
-        RewardsCodePage.startInstance();
-      }
+      RewardsRedeemPage.startInstance(id: id);
     });
   }
 
@@ -150,7 +168,7 @@ class RewardsMyActivePage extends HookConsumerWidget {
         children: [
           SizedBox(
             width: MediaQuery.of(context).size.width - 30,
-            height: 302,
+            height: 320,
             // margin: const EdgeInsets.only(left: 15, right: 15, top: 12.5),
             child: Column(
               crossAxisAlignment: CrossAxisAlignment.start,
@@ -162,7 +180,7 @@ class RewardsMyActivePage extends HookConsumerWidget {
               ],
             ).paddingOnly(left: 20, right: 20),
           ).constrained(
-            minHeight: 300.5,
+            minHeight: 320,
           ),
         ],
       ),
@@ -171,13 +189,11 @@ class RewardsMyActivePage extends HookConsumerWidget {
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
+    final state = ref.watch(rewardsMyActiveVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override

+ 3 - 2
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_active/rewards_my_active_repository.dart

@@ -1,5 +1,6 @@
 import 'package:domain/constants/api_constants.dart';
 import 'package:domain/entity/rewards_history_earned_entity.dart';
+import 'package:domain/entity/rewards_my_entity.dart';
 import 'package:domain/entity/server_time.dart';
 import 'package:plugin_platform/platform_export.dart';
 import 'package:plugin_platform/http/dio_engine.dart';
@@ -57,9 +58,9 @@ class RewardsMyActiveRepository {
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = RewardsHistoryEarnedEntity.fromJson(json!);
+      var data = RewardsMyEntity.fromJson(json!);
       //重新赋值data或list
-      return result.convert<RewardsHistoryEarnedEntity>(data: data);
+      return result.convert<RewardsMyEntity>(data: data);
     }
     return result.convert();
   }

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_active/rewards_my_active_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_my_active_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsMyActiveRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsMyActiveRepositoryHash() =>
+    r'8f9a3eb2118c9d5ce8cdef7c68d45a541a0cd507';
 
 /// See also [rewardsMyActiveRepository].
 @ProviderFor(rewardsMyActiveRepository)
-final rewardsMyActiveRepositoryProvider = Provider<RewardsMyActiveRepository>.internal(
+final rewardsMyActiveRepositoryProvider =
+    Provider<RewardsMyActiveRepository>.internal(
   rewardsMyActiveRepository,
   name: r'rewardsMyActiveRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 4 - 4
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_active/rewards_my_active_vm.dart

@@ -1,4 +1,5 @@
 import 'package:domain/entity/rewards_history_earned_entity.dart';
+import 'package:domain/entity/rewards_my_entity.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
@@ -100,9 +101,8 @@ class RewardsMyActiveVm extends _$RewardsMyActiveVm {
       final result = await rewardsMyActiveRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.data as RewardsHistoryEarnedEntity)
-            .list
-            .cast<RewardsHistoryEarnedEntity>());
+        handlerResultList(
+            (result.data as RewardsMyEntity).list.cast<RewardsMyList>());
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -113,7 +113,7 @@ class RewardsMyActiveVm extends _$RewardsMyActiveVm {
     }
   }
 
-  void handlerResultList(List<RewardsHistoryEarnedEntity>? list) {
+  void handlerResultList(List<RewardsMyList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 6 - 5
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_active/rewards_my_active_vm.g.dart

@@ -6,16 +6,17 @@ part of 'rewards_my_active_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsMyActiveVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsMyActiveVmHash() => r'cfaa19aa56bcbd475eec546d8910e36a80891ccf';
 
 /// See also [RewardsMyActiveVm].
 @ProviderFor(RewardsMyActiveVm)
-final rewardsMyActiveVmProvider =
-    AutoDisposeNotifierProvider<RewardsMyActiveVm, RewardsMyActiveState>.internal(
+final rewardsMyActiveVmProvider = AutoDisposeNotifierProvider<RewardsMyActiveVm,
+    RewardsMyActiveState>.internal(
   RewardsMyActiveVm.new,
   name: r'rewardsMyActiveVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsMyActiveVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsMyActiveVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 49 - 47
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_expired/rewards_my_expired_page.dart

@@ -29,31 +29,39 @@ class RewardsMyExpiredPage extends HookConsumerWidget {
   }
 
   Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, _vm) {
+    int point = item['reward']['point'] ?? 0;
+    int originalPoint = item['reward']['original_point'] ?? 0;
+    String title = item['reward']['title'] ?? '';
+    String img = item['reward']['resources'][0] ?? '';
+    int id = item['id'];
+    String redeemedStart = item['reward']['redeemed_start'] ?? "";
+    String redeemedEnd = item['reward']['redeemed_end'] ?? "";
+    String redeemedDate = '$redeemedStart-$redeemedEnd';
     return Column(
       children: [
         Column(
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
-            const Text(
+            Text(
               maxLines: 1, // 设置最大行数为2
               overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-              'Cute children multifunctional ……',
-              style: TextStyle(
+              title,
+              style: const TextStyle(
                   fontSize: 16.0,
                   color: Colors.black,
                   fontWeight: FontWeight.w500),
             ),
             Row(
               children: [
-                const Text(
-                  '300',
-                  style: TextStyle(
+                Text(
+                  '$point',
+                  style: const TextStyle(
                       fontSize: 19.0,
                       color: Colors.black,
                       fontWeight: FontWeight.w500),
                 ),
                 Text(
-                  '350',
+                  '$originalPoint',
                   style: TextStyle(
                       decoration: TextDecoration.lineThrough,
                       decorationColor: ColorUtils.string2Color('#000000'),
@@ -71,50 +79,48 @@ class RewardsMyExpiredPage extends HookConsumerWidget {
                 ),
               ],
             ),
-            Row(
+            Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               children: [
-                const MyAssetImage(
-                  Assets.rewardsRewardsIconDatd,
-                  width: 15,
-                  height: 15,
+                Row(
+                  children: [
+                    const MyAssetImage(
+                      Assets.rewardsRewardsIconDatd,
+                      width: 15,
+                      height: 15,
+                    ),
+                    const Text(
+                      'Redeem From:',
+                      style: TextStyle(
+                          fontSize: 13.0,
+                          color: Colors.black,
+                          fontWeight: FontWeight.w400),
+                    ).marginOnly(left: 6)
+                  ],
                 ),
-                const Text(
-                  'Redeem From: 17 Mar 2024 until 15 Jul 2024',
-                  style: TextStyle(
+                Text(
+                  '$redeemedDate',
+                  style: const TextStyle(
                       fontSize: 13.0,
                       color: Colors.black,
                       fontWeight: FontWeight.w400),
-                ).marginOnly(left: 6)
+                )
               ],
-            ).paddingOnly(left: 6),
+            ),
           ],
         ),
-        const MyAssetImage(
-          Assets.rewardsRewardsIndex1,
-          // width: 110,
+        MyLoadImage(
+          img,
+          width: MediaQuery.of(context).size.width,
           height: 133,
-        ),
+        ).marginOnly(top: 15),
       ],
     ).paddingOnly(top: 20).onTap(() {
       // 去详情
-      RewardsTransactionPage.startInstance();
+      RewardsTransactionPage.startInstance(id: id, type: 'expired');
     });
   }
 
-  Widget _buildItemRightSection(
-      BuildContext context, WidgetRef ref, item, _vm) {
-    return Container(
-      // color: Colors.green,
-      child: Text(
-        item['price'],
-        style: const TextStyle(
-            fontSize: 14.0,
-            color: Colors.black,
-            fontWeight: FontWeight.w400), // 设置字体大小
-      ),
-    );
-  }
-
   // listitem
   Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
     return Container(
@@ -129,7 +135,7 @@ class RewardsMyExpiredPage extends HookConsumerWidget {
         children: [
           SizedBox(
             width: MediaQuery.of(context).size.width - 30,
-            height: 302,
+            height: 270,
             // margin: const EdgeInsets.only(left: 15, right: 15, top: 12.5),
             child: Column(
               crossAxisAlignment: CrossAxisAlignment.start,
@@ -137,11 +143,10 @@ class RewardsMyExpiredPage extends HookConsumerWidget {
               children: [
                 _buildItemLeftSection(context, ref, item, _vm)
                 // .marginOnly(bottom: 5),
-                // _buildItemRightSection(context, ref, item, _vm),
               ],
             ).paddingOnly(left: 20, right: 20),
           ).constrained(
-            minHeight: 300.5,
+            minHeight: 270,
           ),
         ],
       ),
@@ -150,13 +155,11 @@ class RewardsMyExpiredPage extends HookConsumerWidget {
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
+    final state = ref.watch(rewardsMyExpiredVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override
@@ -203,4 +206,3 @@ class RewardsMyExpiredPage extends HookConsumerWidget {
     );
   }
 }
-

+ 3 - 2
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_expired/rewards_my_expired_repository.dart

@@ -1,5 +1,6 @@
 import 'package:domain/constants/api_constants.dart';
 import 'package:domain/entity/rewards_history_earned_entity.dart';
+import 'package:domain/entity/rewards_my_entity.dart';
 import 'package:domain/entity/server_time.dart';
 import 'package:plugin_platform/platform_export.dart';
 import 'package:plugin_platform/http/dio_engine.dart';
@@ -56,9 +57,9 @@ class RewardsMyExpiredRepository {
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = RewardsHistoryEarnedEntity.fromJson(json!);
+      var data = RewardsMyEntity.fromJson(json!);
       //重新赋值data或list
-      return result.convert<RewardsHistoryEarnedEntity>(data: data);
+      return result.convert<RewardsMyEntity>(data: data);
     }
     return result.convert();
   }

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_expired/rewards_my_expired_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_my_expired_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsMyExpiredRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsMyExpiredRepositoryHash() =>
+    r'641de39dff3e933275587a5005f5ab08da06cf82';
 
 /// See also [rewardsMyExpiredRepository].
 @ProviderFor(rewardsMyExpiredRepository)
-final rewardsMyExpiredRepositoryProvider = Provider<RewardsMyExpiredRepository>.internal(
+final rewardsMyExpiredRepositoryProvider =
+    Provider<RewardsMyExpiredRepository>.internal(
   rewardsMyExpiredRepository,
   name: r'rewardsMyExpiredRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_expired/rewards_my_expired_vm.dart

@@ -1,4 +1,5 @@
 import 'package:domain/entity/rewards_history_earned_entity.dart';
+import 'package:domain/entity/rewards_my_entity.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
@@ -100,9 +101,9 @@ class RewardsMyExpiredVm extends _$RewardsMyExpiredVm {
       final result = await rewardsMyExpiredRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.data as RewardsHistoryEarnedEntity)
+        handlerResultList((result.data as RewardsMyEntity)
             .list
-            .cast<RewardsHistoryEarnedEntity>());
+            .cast<RewardsMyList>());
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -113,7 +114,7 @@ class RewardsMyExpiredVm extends _$RewardsMyExpiredVm {
     }
   }
 
-  void handlerResultList(List<RewardsHistoryEarnedEntity>? list) {
+  void handlerResultList(List<RewardsMyList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 7 - 5
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_expired/rewards_my_expired_vm.g.dart

@@ -6,16 +6,18 @@ part of 'rewards_my_expired_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsMyExpiredVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsMyExpiredVmHash() =>
+    r'b8892e5717b75cdc94d27ac1e04b3a4f8f993632';
 
 /// See also [RewardsMyExpiredVm].
 @ProviderFor(RewardsMyExpiredVm)
-final rewardsMyExpiredVmProvider =
-    AutoDisposeNotifierProvider<RewardsMyExpiredVm, RewardsMyExpiredState>.internal(
+final rewardsMyExpiredVmProvider = AutoDisposeNotifierProvider<
+    RewardsMyExpiredVm, RewardsMyExpiredState>.internal(
   RewardsMyExpiredVm.new,
   name: r'rewardsMyExpiredVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsMyExpiredVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsMyExpiredVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 52 - 48
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_used/rewards_my_used_page.dart

@@ -29,31 +29,40 @@ class RewardsMyUsedPage extends HookConsumerWidget {
   }
 
   Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, _vm) {
+    int point = item['reward']['point'] ?? 0;
+    int originalPoint = item['reward']['original_point'] ?? 0;
+    String title = item['reward']['title'] ?? '';
+    String img = item['reward']['resources'][0] ?? '';
+    int id = item['id'];
+    String redeemedStart = item['reward']['redeemed_start'] ?? "";
+    String redeemedEnd = item['reward']['redeemed_end'] ?? "";
+    String redeemedDate = '$redeemedStart-$redeemedEnd';
+    String usedAt = item['used_at'] ?? "";
     return Column(
       children: [
         Column(
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
-            const Text(
+            Text(
               maxLines: 1, // 设置最大行数为2
               overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-              'Cute children multifunctional ……',
-              style: TextStyle(
+              title,
+              style: const TextStyle(
                   fontSize: 16.0,
                   color: Colors.black,
                   fontWeight: FontWeight.w500),
             ),
             Row(
               children: [
-                const Text(
-                  '300',
-                  style: TextStyle(
+                Text(
+                  '$point',
+                  style: const TextStyle(
                       fontSize: 19.0,
                       color: Colors.black,
                       fontWeight: FontWeight.w500),
                 ),
                 Text(
-                  '350',
+                  '$originalPoint',
                   style: TextStyle(
                       decoration: TextDecoration.lineThrough,
                       decorationColor: ColorUtils.string2Color('#000000'),
@@ -71,22 +80,34 @@ class RewardsMyUsedPage extends HookConsumerWidget {
                 ),
               ],
             ),
-            Row(
+            Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               children: [
-                const MyAssetImage(
-                  Assets.rewardsRewardsIconDatd,
-                  width: 15,
-                  height: 15,
+                Row(
+                  children: [
+                    const MyAssetImage(
+                      Assets.rewardsRewardsIconDatd,
+                      width: 15,
+                      height: 15,
+                    ),
+                    const Text(
+                      'Redeem From:',
+                      style: TextStyle(
+                          fontSize: 13.0,
+                          color: Colors.black,
+                          fontWeight: FontWeight.w400),
+                    ).marginOnly(left: 6)
+                  ],
                 ),
-                const Text(
-                  'Redeem From: 17 Mar 2024 until 15 Jul 2024',
-                  style: TextStyle(
+                Text(
+                  '$redeemedDate',
+                  style: const TextStyle(
                       fontSize: 13.0,
                       color: Colors.black,
                       fontWeight: FontWeight.w400),
-                ).marginOnly(left: 6)
+                )
               ],
-            ).paddingOnly(left: 6),
+            ),
             Row(
               children: [
                 const MyAssetImage(
@@ -94,9 +115,9 @@ class RewardsMyUsedPage extends HookConsumerWidget {
                   width: 15,
                   height: 15,
                 ),
-                const Text(
-                  'Redeemed at: 2 July 2014, 17:23',
-                  style: TextStyle(
+                Text(
+                  'Redeemed at: $usedAt',
+                  style: const TextStyle(
                       fontSize: 13.0,
                       color: Colors.black,
                       fontWeight: FontWeight.w400),
@@ -123,32 +144,18 @@ class RewardsMyUsedPage extends HookConsumerWidget {
             }),
           ],
         ),
-        const MyAssetImage(
-          Assets.rewardsRewardsIndex1,
-          // width: 110,
+        MyLoadImage(
+          img,
+          width: MediaQuery.of(context).size.width,
           height: 133,
         ),
       ],
     ).paddingOnly(top: 20).onTap(() {
       // 去详情
-      RewardsTransactionPage.startInstance();
+      RewardsTransactionPage.startInstance(id: id);
     });
   }
 
-  Widget _buildItemRightSection(
-      BuildContext context, WidgetRef ref, item, _vm) {
-    return Container(
-      // color: Colors.green,
-      child: Text(
-        item['price'],
-        style: const TextStyle(
-            fontSize: 14.0,
-            color: Colors.black,
-            fontWeight: FontWeight.w400), // 设置字体大小
-      ),
-    );
-  }
-
   // listitem
   Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
     return Container(
@@ -163,7 +170,7 @@ class RewardsMyUsedPage extends HookConsumerWidget {
         children: [
           SizedBox(
             width: MediaQuery.of(context).size.width - 30,
-            height: 302,
+            height: 320,
             // margin: const EdgeInsets.only(left: 15, right: 15, top: 12.5),
             child: Column(
               crossAxisAlignment: CrossAxisAlignment.start,
@@ -171,11 +178,10 @@ class RewardsMyUsedPage extends HookConsumerWidget {
               children: [
                 _buildItemLeftSection(context, ref, item, _vm)
                 // .marginOnly(bottom: 5),
-                // _buildItemRightSection(context, ref, item, _vm),
               ],
             ).paddingOnly(left: 20, right: 20),
           ).constrained(
-            minHeight: 300.5,
+            minHeight: 320,
           ),
         ],
       ),
@@ -184,13 +190,11 @@ class RewardsMyUsedPage extends HookConsumerWidget {
 
   // list
   Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return ListView.builder(
-      itemCount: itemsList.length,
-      itemBuilder: (context, index) {
-        return _buildSaleItem(context, ref, itemsList[index], _vm);
-      },
-    );
+    final state = ref.watch(rewardsMyUsedVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, state.list![index], _vm);
+    }, childCount: state.list!.length));
   }
 
   @override

+ 3 - 2
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_used/rewards_my_used_repository.dart

@@ -1,5 +1,6 @@
 import 'package:domain/constants/api_constants.dart';
 import 'package:domain/entity/rewards_history_earned_entity.dart';
+import 'package:domain/entity/rewards_my_entity.dart';
 import 'package:domain/entity/server_time.dart';
 import 'package:plugin_platform/platform_export.dart';
 import 'package:plugin_platform/http/dio_engine.dart';
@@ -57,9 +58,9 @@ class RewardsMyUsedRepository {
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = RewardsHistoryEarnedEntity.fromJson(json!);
+      var data = RewardsMyEntity.fromJson(json!);
       //重新赋值data或list
-      return result.convert<RewardsHistoryEarnedEntity>(data: data);
+      return result.convert<RewardsMyEntity>(data: data);
     }
     return result.convert();
   }

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_used/rewards_my_used_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_my_used_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsMyUsedRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsMyUsedRepositoryHash() =>
+    r'b7c677c496fdf2195b1805c2663235f6bf104c25';
 
 /// See also [rewardsMyUsedRepository].
 @ProviderFor(rewardsMyUsedRepository)
-final rewardsMyUsedRepositoryProvider = Provider<RewardsMyUsedRepository>.internal(
+final rewardsMyUsedRepositoryProvider =
+    Provider<RewardsMyUsedRepository>.internal(
   rewardsMyUsedRepository,
   name: r'rewardsMyUsedRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_used/rewards_my_used_vm.dart

@@ -1,4 +1,5 @@
 import 'package:domain/entity/rewards_history_earned_entity.dart';
+import 'package:domain/entity/rewards_my_entity.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
@@ -100,9 +101,9 @@ class RewardsMyUsedVm extends _$RewardsMyUsedVm {
       final result = await rewardsMyUsedRepository.fetchList(params);
       //校验成功失败
       if (result.isSuccess) {
-        handlerResultList((result.data as RewardsHistoryEarnedEntity)
+        handlerResultList((result.data as RewardsMyEntity)
             .list
-            .cast<RewardsHistoryEarnedEntity>());
+            .cast<RewardsMyList>());
       } else {
         String errorMessage = result.errorMsg!;
         changeLoadingState(LoadState.State_Error, errorMessage);
@@ -113,7 +114,7 @@ class RewardsMyUsedVm extends _$RewardsMyUsedVm {
     }
   }
 
-  void handlerResultList(List<RewardsHistoryEarnedEntity>? list) {
+  void handlerResultList(List<RewardsMyList>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (page == 1) {

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_used/rewards_my_used_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_my_used_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsMyUsedVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsMyUsedVmHash() => r'9f7cae587774b131642a3176bff97f871f6a3cfa';
 
 /// See also [RewardsMyUsedVm].
 @ProviderFor(RewardsMyUsedVm)
@@ -14,8 +14,9 @@ final rewardsMyUsedVmProvider =
     AutoDisposeNotifierProvider<RewardsMyUsedVm, RewardsMyUsedState>.internal(
   RewardsMyUsedVm.new,
   name: r'rewardsMyUsedVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsMyUsedVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsMyUsedVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 1 - 1
packages/cpt_rewards/lib/modules/rewards_my/rewards_my_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_my_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsMyVmHash() => r'9b08b5e83d2b45f67b653daf60bb66bacb9c47ed';
+String _$rewardsMyVmHash() => r'e5accee2351d3c40aed5d4bd22bd13a30cae375b';
 
 /// See also [RewardsMyVm].
 @ProviderFor(RewardsMyVm)

+ 82 - 44
packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_page.dart

@@ -1,12 +1,16 @@
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/rewards_active_detail_entity.dart';
+import 'package:domain/entity/rewards_my_detail_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
@@ -19,19 +23,28 @@ import './rewards_redeem_vm.dart';
 
 @RoutePage()
 class RewardsRedeemPage extends HookConsumerWidget {
-  const RewardsRedeemPage({Key? key}) : super(key: key);
+  final int? id;
+  const RewardsRedeemPage({Key? key, @PathParam('id') required this.id})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? id,
+  }) {
     if (context != null) {
-      context.router.push(const RewardsRedeemPageRoute());
+      context.router.push(RewardsRedeemPageRoute(id: id));
     } else {
-      appRouter.push(const RewardsRedeemPageRoute());
+      appRouter.push(RewardsRedeemPageRoute(id: id));
     }
   }
 
   // listitem
-  Widget _buildSaleItem(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildSaleItem(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    String title = detailInfo!.reward.title ?? "";
+    List? resources = detailInfo!.reward.resources ?? [];
+    int point = detailInfo!.reward.point ?? 0;
+    int originalPoint = detailInfo!.reward.originalPoint ?? 0;
     return Column(
       children: [
         Container(
@@ -50,35 +63,37 @@ class RewardsRedeemPage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.start,
               mainAxisAlignment: MainAxisAlignment.start,
               children: [
-                const MyAssetImage(
-                  Assets.rewardsRewardsIndex1,
-                  // width: 110,
-                  height: 150,
-                ),
+                resources!.length > 0
+                    ? MyLoadImage(
+                        resources[0] ?? '',
+                        width: MediaQuery.of(context).size.width,
+                        height: 150,
+                      )
+                    : Container(),
                 Column(
                   crossAxisAlignment: CrossAxisAlignment.start,
                   mainAxisAlignment: MainAxisAlignment.start,
                   children: [
-                    const Text(
+                    Text(
                       maxLines: 1, // 设置最大行数为2
                       overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-                      'Cute children multifunctional umbrella',
-                      style: TextStyle(
+                      title,
+                      style: const TextStyle(
                           fontSize: 17.0,
                           color: Colors.black,
                           fontWeight: FontWeight.w500),
                     ).marginOnly(bottom: 5),
                     Row(
                       children: [
-                        const Text(
-                          '300',
-                          style: TextStyle(
+                        Text(
+                          '$point',
+                          style: const TextStyle(
                               fontSize: 19.0,
                               color: Colors.black,
                               fontWeight: FontWeight.w500),
                         ),
                         Text(
-                          '350',
+                          '$originalPoint',
                           style: TextStyle(
                               decoration: TextDecoration.lineThrough,
                               decorationColor:
@@ -105,7 +120,8 @@ class RewardsRedeemPage extends HookConsumerWidget {
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
-  Widget _buildPackage(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildPackage(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    String createdAt = detailInfo.createdAt ?? "";
     return Column(
       children: [
         Container(
@@ -144,7 +160,7 @@ class RewardsRedeemPage extends HookConsumerWidget {
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
                   Text(
-                    '21 Jun 2024, 20:18',
+                    createdAt,
                     style: TextStyle(
                         fontSize: 15.0,
                         color: ColorUtils.string2Color('#54638C'),
@@ -159,7 +175,10 @@ class RewardsRedeemPage extends HookConsumerWidget {
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
-  Widget _buildFrom(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildFrom(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    String redeemedStart = detailInfo!.reward.redeemedStart ?? "";
+    String redeemedEnd = detailInfo.reward.redeemedEnd ?? "";
+    String redeemedDate = '$redeemedStart until $redeemedEnd';
     return Column(
       children: [
         Container(
@@ -198,7 +217,7 @@ class RewardsRedeemPage extends HookConsumerWidget {
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
                   Text(
-                    '17 Mar 2020 until 15 Jul 2020',
+                    redeemedDate,
                     style: TextStyle(
                         fontSize: 15.0,
                         color: ColorUtils.string2Color('#54638C'),
@@ -286,37 +305,56 @@ class RewardsRedeemPage extends HookConsumerWidget {
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(rewardsRedeemVmProvider.notifier);
     final state = ref.watch(rewardsRedeemVmProvider);
+    RewardsMyDetailEntity? detailInfo = state.detail;
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => _vm.initPageData(id: id));
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
-        "My Rewards Details",
+        "Payment Successful",
         backgroundColor: context.appColors.whiteBG,
       ),
-      body: Column(
-        children: [
-          Expanded(
-              child: SingleChildScrollView(
-                  scrollDirection: Axis.vertical,
-                  physics: const BouncingScrollPhysics(),
-                  clipBehavior: Clip.none,
-                  child: Column(
-                    children: [
-                      _buildTop(context, ref, _vm),
-                      Container(
-                          color: ColorUtils.string2Color('#F2F3F6'),
-                          padding: const EdgeInsets.only(top: 15),
+      body: detailInfo?.createdAt != ''
+          ? LoadStateLayout(
+              state: state.loadingState,
+              errorMessage: state.errorMessage,
+              errorRetry: () {
+                _vm.retryRequest(id: id);
+              },
+              successWidget: Column(
+                children: [
+                  Expanded(
+                      child: SingleChildScrollView(
+                          scrollDirection: Axis.vertical,
+                          physics: const BouncingScrollPhysics(),
+                          clipBehavior: Clip.none,
                           child: Column(
                             children: [
-                              _buildPackage(context, ref, _vm),
-                              _buildRedeemed(context, ref, _vm),
-                              _buildSaleItem(context, ref, _vm),
-                              _buildFrom(context, ref, _vm),
+                              _buildTop(context, ref, _vm),
+                              Container(
+                                  color: ColorUtils.string2Color('#F2F3F6'),
+                                  padding: const EdgeInsets.only(top: 15),
+                                  child: Column(
+                                    children: [
+                                      _buildPackage(
+                                          context, ref, _vm, detailInfo),
+                                      _buildRedeemed(context, ref, _vm),
+                                      _buildSaleItem(
+                                          context, ref, _vm, detailInfo),
+                                      _buildFrom(context, ref, _vm, detailInfo),
+                                    ],
+                                  )),
                             ],
-                          )),
-                    ],
-                  ))),
-        ],
-      ),
+                          ))),
+                ],
+              ))
+          : const SizedBox.shrink(),
     );
   }
 }

+ 14 - 13
packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_repository.dart

@@ -1,9 +1,12 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/rewards_active_detail_entity.dart';
+import 'package:domain/entity/rewards_my_detail_entity.dart';
 import 'package:domain/entity/server_time.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -24,12 +27,12 @@ RewardsRedeemRepository rewardsRedeemRepository(Ref ref) {
 class RewardsRedeemRepository {
   DioEngine dioEngine;
 
-RewardsRedeemRepository({required this.dioEngine});
+  RewardsRedeemRepository({required this.dioEngine});
 
   Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
     Map<String, dynamic> params = {};
 
     // if (!Utils.isEmpty(type)) {
@@ -38,20 +41,19 @@ RewardsRedeemRepository({required this.dioEngine});
 
     params = data!;
 
-
     Map<String, String> headers = {};
 
     headers["Content-Type"] = "application/x-www-form-urlencoded";
     headers["Accept"] = "application/x.yyjobs-api.v1+json";
 
-      final result = await dioEngine.requestNetResult(
+    final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/reward/sale/detail', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: true, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
@@ -59,12 +61,11 @@ RewardsRedeemRepository({required this.dioEngine});
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = RewardsRedeemState.fromJson(json!);
+      var data = RewardsMyDetailEntity.fromJson(json!);
+      Log.d("------data--$data--------");
       //重新赋值data或list
-      return result.convert<RewardsRedeemState>(data: data);
+      return result.convert<RewardsMyDetailEntity>(data: data);
     }
     return result.convert();
   }
-
-
 }

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_redeem_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsRedeemRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsRedeemRepositoryHash() =>
+    r'4c538fdbbe3d4faa352029af4dbccff9d81b1fc6';
 
 /// See also [rewardsRedeemRepository].
 @ProviderFor(rewardsRedeemRepository)
-final rewardsRedeemRepositoryProvider = Provider<RewardsRedeemRepository>.internal(
+final rewardsRedeemRepositoryProvider =
+    Provider<RewardsRedeemRepository>.internal(
   rewardsRedeemRepository,
   name: r'rewardsRedeemRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 34 - 36
packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_state.dart

@@ -1,49 +1,47 @@
 /// YApi QuickType插件生成,具体参考文档:https://plugins.jetbrains.com/plugin/18847-yapi-quicktype/documentation
 
 import 'dart:convert';
-
-RewardsRedeemState rewardsRedeemStateFromJson(String str) => RewardsRedeemState.fromJson(json.decode(str));
-
-String rewardsRedeemStateToJson(RewardsRedeemState data) => json.encode(data.toJson());
+import 'package:domain/entity/rewards_active_detail_entity.dart';
+import 'package:domain/entity/rewards_detail_entity.dart';
+import 'package:domain/entity/rewards_my_detail_entity.dart';
+import 'package:widgets/load_state_layout.dart';
 
 class RewardsRedeemState {
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+  RewardsMyDetailEntity? detail;
   RewardsRedeemState({
-    required this.curPage,
-    required this.pageSize,
-    required this.list,
-    required this.filterCount,
-  });
-
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory RewardsRedeemState.fromJson(Map<dynamic, dynamic> json) => RewardsRedeemState(
-    curPage: json["curPage"],
-    pageSize: json["pageSize"],
-    list: List<Map<String, dynamic>>.from(json["list"].map((x) => x)),
-    filterCount: json["filterCount"],
-  );
-
-  Map<dynamic, dynamic> toJson() => {
-    "curPage": curPage,
-    "pageSize": pageSize,
-    "list": List<dynamic>.from(list.map((x) => x)),
-    "filterCount": filterCount,
-  };
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    RewardsMyDetailEntity? detail,
+  }) : detail = detail ?? RewardsMyDetailEntity();
 
   RewardsRedeemState copyWith({
-    int? curPage,
-    int? pageSize,
-    List<Map<String, dynamic>>? list,
-    int? filterCount,
+    LoadState? loadingState,
+    String? errorMessage,
+    RewardsMyDetailEntity? detail,
   }) {
     return RewardsRedeemState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
-      list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      detail: detail ?? this.detail,
+    );
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'loadingState': this.loadingState,
+      'errorMessage': this.errorMessage,
+      'detail': this.detail,
+    };
+  }
+
+  factory RewardsRedeemState.fromMap(Map<String, dynamic> map) {
+    return RewardsRedeemState(
+      loadingState: map['loadingState'] as LoadState,
+      errorMessage: map['errorMessage'] as String,
+      detail: map['detail'] as RewardsMyDetailEntity,
     );
   }
 }

+ 45 - 51
packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_vm.dart

@@ -1,10 +1,13 @@
-
+import 'package:domain/entity/rewards_active_detail_entity.dart';
+import 'package:domain/entity/rewards_my_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/picker/option_pick_util.dart';
+import 'package:widgets/widget_export.dart';
 import './rewards_redeem_state.dart';
 import './rewards_redeem_repository.dart';
 part 'rewards_redeem_vm.g.dart';
@@ -12,25 +15,15 @@ part 'rewards_redeem_vm.g.dart';
 @riverpod
 class RewardsRedeemVm extends _$RewardsRedeemVm {
   late RewardsRedeemRepository rewardsRedeemRepository;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
   RewardsRedeemState initState() {
-    return RewardsRedeemState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title":
-              "The community will hold the activity of making Zongzi on the Loong Boat ……",
-          "price": "Monday 14 0ct 2024, 15:00 PM~18:00PM",
-        },
-        {
-          "id": 2,
-          "title": "Community basketball competition activities",
-          "price": "Monday 14 Oct 2024, 10:19 AM",
-        },
-      ],
-      filterCount: 2,
-    );
+    return RewardsRedeemState();
   }
 
   @override
@@ -44,67 +37,68 @@ class RewardsRedeemVm extends _$RewardsRedeemVm {
   }
 
   // 初始化页面数据
-  initPageData() {
+  initPageData({int? id}) {
     Log.d("----property_news_vm-----initPageData");
-    refreshListData();
+    getListData(id: id);
   }
 
   // 上拉加载
   Future onLoadData() async {
     Log.d("----property_news_vm-----initListData");
-    // await Future.delayed(const Duration(seconds: 2));
-    // if(state.list.length >= state.filterCount){
-    //   return;
-    // }else {
-    //   int curPage = state.curPage + 1;
-    //   state = state.copyWith(curPage: curPage,);
-    //   getListData();
-    // }
     getListData();
   }
 
 // 去新闻详情页
-  void goNewsRedeem(String item) {
+  void goNewsDetail(String item) {
     Log.d(item);
     // PropertyPage.startInstance(context: context, item: item);
   }
 
+// 重试请求
+  Future retryRequest({int? id}) async {
+    _needShowPlaceholder = true;
+    getListData(id: id);
+  }
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
+  }
+
   // 获取list 列表数据
-  void getListData<T>() async {
+  void getListData<T>({int? id}) async {
     Log.d("加载listData数据---------------start-----");
     try {
       //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
+      Map<String, dynamic> params = {"id": id};
       Log.d("请求参数------$params");
-      final result = await rewardsRedeemRepository.fetchPropertyNewsList(params);
+      final result =
+          await rewardsRedeemRepository.fetchPropertyNewsList(params);
       Log.d("请求完成结果------${result.data}");
       //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
+        state = state.copyWith(
+          detail: result.data as RewardsMyDetailEntity,
+        );
+        changeLoadingState(LoadState.State_Success, null);
       } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
         ToastEngine.show(result.errorMsg ?? "Network Load Error");
       }
     } catch (e) {
       ToastEngine.show("Error: $e");
     }
   }
+  // // 下拉刷新
+  // Future refreshListData() async {
+  //   Log.d("----property_news_vm-----refreshListData ");
 
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
-
-    // await Future.delayed(const Duration(seconds: 2));
-
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
-  }
-
+  //   // await Future.delayed(const Duration(seconds: 2));
 
+  //   state = state.copyWith(curPage: 1, pageSize: 10);
+  //   // ref.invalidateSelf();
+  //   // ref.invalidate(propertyNewsVmProvider);
+  //   getListData();
+  // }
 }

+ 5 - 4
packages/cpt_rewards/lib/modules/rewards_redeem/rewards_redeem_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_redeem_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsRedeemVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsRedeemVmHash() => r'e8f66e1cb6a7eca4853a287254c06f21f8c7430a';
 
 /// See also [RewardsRedeemVm].
 @ProviderFor(RewardsRedeemVm)
@@ -14,12 +14,13 @@ final rewardsRedeemVmProvider =
     AutoDisposeNotifierProvider<RewardsRedeemVm, RewardsRedeemState>.internal(
   RewardsRedeemVm.new,
   name: r'rewardsRedeemVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsRedeemVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsRedeemVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );
 
 typedef _$RewardsRedeemVm = AutoDisposeNotifier<RewardsRedeemState>;
 // 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
+// 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

+ 211 - 108
packages/cpt_rewards/lib/modules/rewards_search/rewards_search_page.dart

@@ -1,13 +1,17 @@
+import 'package:cpt_rewards/modules/rewards_detail/rewards_detail_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:cs_resources/theme/theme_config.dart';
+import 'package:domain/entity/rewards_search_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/shatter/picker_container.dart';
@@ -31,91 +35,121 @@ class RewardsSearchPage extends HookConsumerWidget {
   }
 
   Widget _buildItemLeftSection(BuildContext context, WidgetRef ref, item, _vm) {
+    int point = item!['point'] ?? 0;
+    int originalPoint = item!['original_point'] ?? 0;
+    int id = item!['id'];
     return Column(
       children: [
         Column(
-          crossAxisAlignment: CrossAxisAlignment.center,
-          mainAxisAlignment: MainAxisAlignment.center,
+          crossAxisAlignment: CrossAxisAlignment.start,
           children: [
-            const Center(
-              child: Text(
-                'SHOW THE VERIFICATION CODE TO YOUR MERCHANT',
-                textAlign: TextAlign.center,
-                style: TextStyle(
-                    fontSize: 20.0,
-                    color: Colors.black,
-                    fontWeight: FontWeight.w500),
-              ),
+            MyLoadImage(
+              item?['resources']?[0] ?? '',
+              width: MediaQuery.of(context).size.width,
+              height: 150,
             ),
             Text(
-              'VERIFICATION CODE',
-              style: TextStyle(
-                  fontSize: 18.0,
-                  color: ColorUtils.string2Color('#54638C'),
-                  fontWeight: FontWeight.w500),
-            ).marginOnly(top: 35, bottom: 20),
-            Text(
-              '778890',
-              style: TextStyle(
-                  fontSize: 36.0,
-                  color: ColorUtils.string2Color('#4161D0'),
+              maxLines: 1, // 设置最大行数为2
+              overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
+              item?['name'] ?? '',
+              style: const TextStyle(
+                  fontSize: 16.0,
+                  color: Colors.black,
                   fontWeight: FontWeight.w500),
+            ).marginOnly(bottom: 5, top: 10),
+            Row(
+              children: [
+                Text(
+                  '$point',
+                  style: const TextStyle(
+                      fontSize: 19.0,
+                      color: Colors.black,
+                      fontWeight: FontWeight.w500),
+                ),
+                Text(
+                  '$originalPoint',
+                  style: TextStyle(
+                      decoration: TextDecoration.lineThrough,
+                      decorationColor: ColorUtils.string2Color('#000000'),
+                      decorationStyle: TextDecorationStyle.solid,
+                      fontSize: 12.0,
+                      color: ColorUtils.string2Color('#000000'),
+                      fontWeight: FontWeight.w400),
+                ).marginOnly(left: 5, right: 5),
+                const Text(
+                  'Points',
+                  style: TextStyle(
+                      fontSize: 13.0,
+                      color: Colors.black,
+                      fontWeight: FontWeight.w400),
+                ),
+              ],
             ),
           ],
-        ),
+        ).onTap(() {
+          RewardsDetailPage.startInstance(id: id);
+        }),
       ],
-    );
+    ).paddingOnly(top: 0);
   }
 
   // listitem
-  Widget _buildSaleItem(BuildContext context, WidgetRef ref, item, _vm) {
-    return Column(
-      children: [
-        Container(
-          decoration: const BoxDecoration(
-            color: Colors.white,
-            borderRadius: BorderRadius.all(Radius.circular(6.0)),
-            boxShadow: [
-              BoxShadow(
-                  color: Color.fromRGBO(184, 191, 217, 0.3), blurRadius: 6)
-            ],
+  Widget _buildSaleItem(BuildContext context, WidgetRef ref, _vm, item) {
+    return Container(
+      decoration: const BoxDecoration(
+        color: Colors.white,
+        borderRadius: BorderRadius.all(Radius.circular(6.0)),
+        boxShadow: [
+          BoxShadow(color: Color.fromRGBO(184, 191, 217, 0.3), blurRadius: 6)
+        ],
+      ),
+      child: Column(
+        children: [
+          SizedBox(
+            width: MediaQuery.of(context).size.width - 30,
+            height: 235,
+            // margin: const EdgeInsets.only(left: 15, right: 15, top: 12.5),
+            child: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              mainAxisAlignment: MainAxisAlignment.start,
+              children: [
+                _buildItemLeftSection(context, ref, item, _vm)
+                    .marginOnly(bottom: 5),
+              ],
+            ).paddingOnly(left: 20, right: 20),
+          ).constrained(
+            minHeight: 235,
           ),
-          width: MediaQuery.of(context).size.width - 30,
-          height: 250,
-          // margin: const EdgeInsets.only(left: 15, right: 15, top: 12.5),
-          child: Column(
-            crossAxisAlignment: CrossAxisAlignment.start,
-            mainAxisAlignment: MainAxisAlignment.start,
-            children: [_buildItemLeftSection(context, ref, item, _vm)],
-          ).paddingOnly(left: 26, right: 26, top: 40),
-        ),
-      ],
+        ],
+      ),
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
-  // list
-  Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
-    return _buildSaleItem(context, ref, itemsList[0], _vm);
-  }
-
   // SearchOf
-  Widget _buildSearchOf(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
+  Widget _buildSearchOf(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    List recent = detailInfo.recent;
+    List trending = detailInfo.trending;
+    List<RewardsSearchRewards> rewards = detailInfo.rewards;
     return Column(
       crossAxisAlignment: CrossAxisAlignment.start,
       mainAxisAlignment: MainAxisAlignment.start,
       children: [
-        _buildSearchRecent(context, ref, _vm),
-        _buildSearchTrending(context, ref, _vm),
-        _buildSearchRecently(context, ref, _vm),
+        recent.length > 0
+            ? _buildSearchRecent(context, ref, _vm, recent)
+            : Container(),
+        trending.length > 0
+            ? _buildSearchTrending(context, ref, _vm, trending)
+            : Container(),
+        rewards.length > 0
+            ? _buildSearchRecently(context, ref, _vm, rewards)
+            : Container(),
       ],
     );
   }
 
 // Recent
-  Widget _buildSearchRecent(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
+  Widget _buildSearchRecent(BuildContext context, WidgetRef ref, _vm, recent) {
+    // List itemsList = _vm.state.list.toList();
     return Column(
       crossAxisAlignment: CrossAxisAlignment.start,
       mainAxisAlignment: MainAxisAlignment.start,
@@ -131,14 +165,15 @@ class RewardsSearchPage extends HookConsumerWidget {
             direction: Axis.horizontal, // 水平方向排列
             spacing: 10.0, // 子组件之间的间距
             runSpacing: 15.0, // 子组件行与行之间的间距
-            children: List.generate(4, (index) {
-              return _buildSearchRecentItem(context, ref, _vm);
+            children: List.generate(recent.length, (index) {
+              return _buildSearchRecentItem(context, ref, _vm, recent[index]);
             }))
       ],
     ).marginOnly(bottom: 20);
   }
 
-  Widget _buildSearchRecentItem(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildSearchRecentItem(
+      BuildContext context, WidgetRef ref, _vm, recent) {
     return Container(
       decoration: const BoxDecoration(
         color: Colors.white,
@@ -146,18 +181,21 @@ class RewardsSearchPage extends HookConsumerWidget {
       ),
       padding: const EdgeInsets.all(10),
       child: Text(
-        'Dragon bowl',
+        recent,
         style: TextStyle(
             fontSize: 14.0,
             color: ColorUtils.string2Color('#969696'),
             fontWeight: FontWeight.w400),
       ),
-    );
+    ).onTap(() {
+      _vm.searchIn(recent);
+    });
   }
 
   // Trending
-  Widget _buildSearchTrending(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
+  Widget _buildSearchTrending(
+      BuildContext context, WidgetRef ref, _vm, trending) {
+    // List itemsList = _vm.state.list.toList();
     return Column(
       crossAxisAlignment: CrossAxisAlignment.start,
       mainAxisAlignment: MainAxisAlignment.start,
@@ -173,14 +211,16 @@ class RewardsSearchPage extends HookConsumerWidget {
             direction: Axis.horizontal, // 水平方向排列
             spacing: 10.0, // 子组件之间的间距
             runSpacing: 15.0, // 子组件行与行之间的间距
-            children: List.generate(4, (index) {
-              return _buildSearchTrendingItem(context, ref, _vm);
+            children: List.generate(trending.length, (index) {
+              return _buildSearchTrendingItem(
+                  context, ref, _vm, trending[index]);
             }))
       ],
     ).marginOnly(bottom: 20);
   }
 
-  Widget _buildSearchTrendingItem(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildSearchTrendingItem(
+      BuildContext context, WidgetRef ref, _vm, trending) {
     return Container(
       decoration: const BoxDecoration(
         color: Colors.white,
@@ -196,7 +236,7 @@ class RewardsSearchPage extends HookConsumerWidget {
             height: 14,
           ).marginOnly(right: 5),
           Text(
-            'Dragon bowl',
+            trending,
             style: TextStyle(
                 fontSize: 14.0,
                 color: ColorUtils.string2Color('#969696'),
@@ -204,12 +244,15 @@ class RewardsSearchPage extends HookConsumerWidget {
           ),
         ],
       ),
-    );
+    ).onTap(() {
+      _vm.searchIn(trending);
+    });
   }
 
   // Recently
-  Widget _buildSearchRecently(BuildContext context, WidgetRef ref, _vm) {
-    List itemsList = _vm.state.list.toList();
+  Widget _buildSearchRecently(
+      BuildContext context, WidgetRef ref, _vm, rewards) {
+    // List itemsList = _vm.state.list.toList();
     return Column(
       crossAxisAlignment: CrossAxisAlignment.start,
       mainAxisAlignment: MainAxisAlignment.start,
@@ -224,14 +267,18 @@ class RewardsSearchPage extends HookConsumerWidget {
         Column(
             crossAxisAlignment: CrossAxisAlignment.center,
             mainAxisAlignment: MainAxisAlignment.spaceBetween,
-            children: List.generate(2, (index) {
-              return _buildSearchItem(context, ref, _vm);
+            children: List.generate(rewards.length, (index) {
+              return _buildSearchItem(context, ref, _vm, rewards[index]);
             }))
       ],
     );
   }
 
-  Widget _buildSearchItem(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildSearchItem(BuildContext context, WidgetRef ref, _vm, item) {
+    RewardsSearchRewards itm = item;
+    int point = itm.point ?? 0;
+    int originalPoint = itm.originalPoint ?? 0;
+    int id = itm.id;
     return Container(
         // width: MediaQuery.of(context).size.width / 2 - 25,
         // height: 240,
@@ -245,43 +292,34 @@ class RewardsSearchPage extends HookConsumerWidget {
         ),
         child: Column(
           children: [
-            const MyAssetImage(
-              Assets.rewardsRewardsIndex1,
-              // width: 110,
-              height: 149,
+            MyLoadImage(
+              item.resources?[0] ?? '',
+              width: MediaQuery.of(context).size.width,
+              height: 150,
             ),
             Column(
               crossAxisAlignment: CrossAxisAlignment.start,
               children: [
-                const Text(
+                Text(
                   maxLines: 1, // 设置最大行数为2
                   overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-                  'Cute children multifunctional ……',
-                  style: TextStyle(
+                  item.name ?? '',
+                  style: const TextStyle(
                       fontSize: 15.0,
                       color: Colors.black,
                       fontWeight: FontWeight.w500),
-                ),
-                Text(
-                  maxLines: 1, // 设置最大行数为2
-                  overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-                  'Hong Ye Group Co., Ltd',
-                  style: TextStyle(
-                      fontSize: 13.0,
-                      color: ColorUtils.string2Color('#808DAF'),
-                      fontWeight: FontWeight.w400),
-                ).marginOnly(bottom: 5),
+                ).marginOnly(bottom: 5, top: 10),
                 Row(
                   children: [
-                    const Text(
-                      '300',
-                      style: TextStyle(
+                    Text(
+                      '$point',
+                      style: const TextStyle(
                           fontSize: 18.0,
                           color: Colors.black,
                           fontWeight: FontWeight.w500),
                     ),
                     Text(
-                      '350',
+                      '$originalPoint',
                       style: TextStyle(
                           decoration: TextDecoration.lineThrough,
                           decorationColor: ColorUtils.string2Color('#808DAF'),
@@ -302,28 +340,93 @@ class RewardsSearchPage extends HookConsumerWidget {
               ],
             ).paddingOnly(top: 12, left: 12, right: 12)
           ],
-        )).marginOnly(bottom: 13);
+        )).marginOnly(bottom: 13).onTap(() {
+      RewardsDetailPage.startInstance(id: id);
+    });
+  }
+
+  // list
+  Widget _buildSaleList(BuildContext context, WidgetRef ref, _vm) {
+    final state = ref.watch(rewardsSearchVmProvider);
+    return SliverList(
+        delegate: SliverChildBuilderDelegate((context, index) {
+      return _buildSaleItem(context, ref, _vm, state.list![index]);
+    }, childCount: state.list!.length));
   }
 
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(rewardsSearchVmProvider.notifier);
     final state = ref.watch(rewardsSearchVmProvider);
+    bool searchIs = state.searchIs ?? true;
+    RewardsSearchEntity? detailInfo = state.detailInfo;
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => _vm.initPageData());
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
-      appBar: MyAppBar.searchAppBar(context,
+      appBar: MyAppBar.searchAppBar(context, onSearch: (value) {
+        _vm.searchIn(value);
+      },
+          value: state.keyword,
           backgroundColor: Colors.white,
           systemUiOverlayStyle:
               ThemeConfig.systemUiOverlayStyleLightThemeBlack),
-      body: SingleChildScrollView(
-        scrollDirection: Axis.vertical,
-        physics: const BouncingScrollPhysics(),
-        clipBehavior: Clip.none,
-        child: Container(
-            width: MediaQuery.of(context).size.width,
-            color: ColorUtils.string2Color('#F2F3F6'),
-            padding: const EdgeInsets.only(top: 20, left: 15, right: 15),
-            child: _buildSearchOf(context, ref, _vm)),
-      ),
+      body: searchIs
+          ? LoadStateLayout(
+              state: state.loadingState,
+              errorMessage: state.errorMessage,
+              errorRetry: () {
+                _vm.retryRequest();
+              },
+              successWidget: SingleChildScrollView(
+                scrollDirection: Axis.vertical,
+                physics: const BouncingScrollPhysics(),
+                clipBehavior: Clip.none,
+                child: Container(
+                    width: MediaQuery.of(context).size.width,
+                    color: ColorUtils.string2Color('#F2F3F6'),
+                    padding:
+                        const EdgeInsets.only(top: 20, left: 15, right: 15),
+                    child: _buildSearchOf(context, ref, _vm, detailInfo)),
+              ))
+          : Container(
+              child: Column(
+                children: [
+                  Expanded(
+                    child: EasyRefresh(
+                      controller: _vm.refreshController,
+                      // 上拉加载
+                      onLoad: () async {
+                        Log.d("----onLoad");
+                        _vm.loadMore();
+                      },
+                      // 下拉刷新
+                      onRefresh: () async {
+                        Log.d("----onRefresh");
+                        _vm.onRefresh();
+                      },
+                      child: Container(
+                          color: ColorUtils.string2Color('#F2F3F6'),
+                          padding: const EdgeInsets.only(top: 15),
+                          child: LoadStateLayout(
+                              state: state.loadingState,
+                              errorMessage: state.errorMessage,
+                              errorRetry: () {
+                                _vm.retryRequest();
+                              },
+                              successSliverWidget: [
+                                _buildSaleList(context, ref, _vm)
+                              ])),
+                    ),
+                  )
+                ],
+              ),
+            ),
     );
   }
 }

+ 49 - 13
packages/cpt_rewards/lib/modules/rewards_search/rewards_search_repository.dart

@@ -1,9 +1,12 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/rewards_list_entity.dart';
+import 'package:domain/entity/rewards_search_entity.dart';
 import 'package:domain/entity/server_time.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -27,18 +30,13 @@ class RewardsSearchRepository {
   RewardsSearchRepository({required this.dioEngine});
 
   Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
     Map<String, dynamic> params = {};
 
-    // if (!Utils.isEmpty(type)) {
-    //   params["type"] = type!;
-    // }
-
     params = data!;
 
-
     Map<String, String> headers = {};
 
     headers["Content-Type"] = "application/x-www-form-urlencoded";
@@ -46,25 +44,63 @@ class RewardsSearchRepository {
 
     final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/reward/search/index', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: false, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
+    Log.d("------请求返回的result--$result--------");
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = RewardsSearchState.fromJson(json!);
+      var data = RewardsSearchEntity.fromJson(json!);
+      // Log.d("------data--$data--------");
       //重新赋值data或list
-      return result.convert<RewardsSearchState>(data: data);
+      return result.convert<RewardsSearchEntity>(data: data);
     }
     return result.convert();
   }
 
 
+Future<HttpResult<Object>> fetchList(
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, dynamic> params = {};
+
+    params = data!;
+
+    Map<String, String> headers = {};
+
+    headers["Content-Type"] = "application/x-www-form-urlencoded";
+    headers["Accept"] = "application/x.yyjobs-api.v1+json";
+
+    final result = await dioEngine.requestNetResult(
+      // ApiConstants.apiServerTime, // api 地址
+      '/api/v1/user/reward/reward/index', // api 地址
+      params: params,
+      headers: headers,
+      method: HttpMethod.GET,
+      isShowLoadingDialog: true, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
+      cancelToken: cancelToken,
+    );
+
+    Log.d("------请求返回的result--$result--------");
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = RewardsListEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<RewardsListEntity>(data: data);
+    }
+    return result.convert();
+  }
+
 }

+ 4 - 2
packages/cpt_rewards/lib/modules/rewards_search/rewards_search_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_search_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsSearchRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsSearchRepositoryHash() =>
+    r'a6194b72b04c8a746bb5344ef0922ce14fdbba68';
 
 /// See also [rewardsSearchRepository].
 @ProviderFor(rewardsSearchRepository)
-final rewardsSearchRepositoryProvider = Provider<RewardsSearchRepository>.internal(
+final rewardsSearchRepositoryProvider =
+    Provider<RewardsSearchRepository>.internal(
   rewardsSearchRepository,
   name: r'rewardsSearchRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')

+ 48 - 32
packages/cpt_rewards/lib/modules/rewards_search/rewards_search_state.dart

@@ -2,48 +2,64 @@
 
 import 'dart:convert';
 
-RewardsSearchState rewardsSearchStateFromJson(String str) => RewardsSearchState.fromJson(json.decode(str));
-
-String rewardsSearchStateToJson(RewardsSearchState data) => json.encode(data.toJson());
+import 'package:domain/entity/rewards_search_entity.dart';
+import 'package:widgets/load_state_layout.dart';
 
 class RewardsSearchState {
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+  RewardsSearchEntity? detailInfo;
+  String? keyword = '';
+  bool? searchIs = true;
+  List<Map<String, dynamic>>? list;
+
   RewardsSearchState({
-    required this.curPage,
-    required this.pageSize,
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    RewardsSearchEntity? detailInfo,
+    this.keyword = '',
+    this.searchIs = true,
     required this.list,
-    required this.filterCount,
-  });
-
-  int curPage;
-  int pageSize;
-  List<Map<String, dynamic>> list;
-  int filterCount;
-
-  factory RewardsSearchState.fromJson(Map<dynamic, dynamic> json) => RewardsSearchState(
-    curPage: json["curPage"],
-    pageSize: json["pageSize"],
-    list: List<Map<String, dynamic>>.from(json["list"].map((x) => x)),
-    filterCount: json["filterCount"],
-  );
-
-  Map<dynamic, dynamic> toJson() => {
-    "curPage": curPage,
-    "pageSize": pageSize,
-    "list": List<dynamic>.from(list.map((x) => x)),
-    "filterCount": filterCount,
-  };
+  }) : detailInfo = detailInfo ?? RewardsSearchEntity();
 
   RewardsSearchState copyWith({
-    int? curPage,
-    int? pageSize,
+    LoadState? loadingState,
+    String? errorMessage,
+    String? keyword,
+    bool? searchIs,
+    RewardsSearchEntity? detailInfo,
     List<Map<String, dynamic>>? list,
-    int? filterCount,
   }) {
     return RewardsSearchState(
-      curPage: curPage ?? this.curPage,
-      pageSize: pageSize ?? this.pageSize,
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      detailInfo: detailInfo ?? this.detailInfo,
+      keyword: keyword ?? this.keyword,
+      searchIs: searchIs ?? this.searchIs,
       list: list ?? this.list,
-      filterCount: filterCount ?? this.filterCount,
+    );
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'loadingState': this.loadingState,
+      'errorMessage': this.errorMessage,
+      'keyword': this.keyword,
+      'searchIs': this.searchIs,
+      'detailInfo': this.detailInfo,
+      'list': this.list,
+    };
+  }
+
+  factory RewardsSearchState.fromMap(Map<String, dynamic> map) {
+    return RewardsSearchState(
+      loadingState: map['loadingState'] as LoadState,
+      errorMessage: map['errorMessage'] as String,
+      keyword: map['keyword'] as String,
+      searchIs: map['searchIs'] as bool,
+      detailInfo: map['detailInfo'] as RewardsSearchEntity,
+      list: map['list'] as List<Map<String, dynamic>>,
     );
   }
 }

+ 113 - 51
packages/cpt_rewards/lib/modules/rewards_search/rewards_search_vm.dart

@@ -1,9 +1,13 @@
+import 'package:domain/entity/rewards_list_entity.dart';
+import 'package:domain/entity/rewards_search_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/picker/option_pick_util.dart';
+import 'package:widgets/widget_export.dart';
 import './rewards_search_state.dart';
 import './rewards_search_repository.dart';
 part 'rewards_search_vm.g.dart';
@@ -11,25 +15,16 @@ part 'rewards_search_vm.g.dart';
 @riverpod
 class RewardsSearchVm extends _$RewardsSearchVm {
   late RewardsSearchRepository rewardsSearchRepository;
+  var page = 1;
+  var limit = 10;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: true, //允许加载
+  );
   RewardsSearchState initState() {
-    return RewardsSearchState(
-      curPage: 1,
-      pageSize: 10,
-      list: [
-        {
-          "id": 1,
-          "title":
-              "The community will hold the activity of making Zongzi on the Loong Boat ……",
-          "price": "Monday 14 0ct 2024, 15:00 PM~18:00PM",
-        },
-        {
-          "id": 2,
-          "title": "Community basketball competition activities",
-          "price": "Monday 14 Oct 2024, 10:19 AM",
-        },
-      ],
-      filterCount: 2,
-    );
+    return RewardsSearchState(list: []);
   }
 
   @override
@@ -44,28 +39,18 @@ class RewardsSearchVm extends _$RewardsSearchVm {
 
   // 初始化页面数据
   initPageData() {
-    Log.d("----property_news_vm-----initPageData");
-    refreshListData();
+    getListData();
   }
 
-  // 上拉加载
-  Future onLoadData() async {
-    Log.d("----property_news_vm-----initListData");
-    // await Future.delayed(const Duration(seconds: 2));
-    // if(state.list.length >= state.filterCount){
-    //   return;
-    // }else {
-    //   int curPage = state.curPage + 1;
-    //   state = state.copyWith(curPage: curPage,);
-    //   getListData();
-    // }
+// 重试请求
+  Future retryRequest({int? id}) async {
+    _needShowPlaceholder = true;
     getListData();
   }
 
-// 去新闻详情页
-  void goNewsDetail(String item) {
-    Log.d(item);
-    // PropertyPage.startInstance(context: context, item: item);
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(loadingState: loadState, errorMessage: errorMsg);
   }
 
   // 获取list 列表数据
@@ -73,19 +58,21 @@ class RewardsSearchVm extends _$RewardsSearchVm {
     Log.d("加载listData数据---------------start-----");
     try {
       //请求网络
-      Map<String, dynamic> params = {
-        "curPage": state.curPage,
-        "pageSize": state.pageSize,
-      };
+      Map<String, dynamic> params = {};
       Log.d("请求参数------$params");
-      final result = await rewardsSearchRepository.fetchPropertyNewsList(params);
+      final result =
+          await rewardsSearchRepository.fetchPropertyNewsList(params);
       Log.d("请求完成结果------${result.data}");
       //校验成功失败
       if (result.isSuccess) {
-        // state = state.copyWith(serverTime: result.data);
-        state = state;
-        ToastEngine.show("获取数据成功");
+        state = state.copyWith(
+          detailInfo: result.data as RewardsSearchEntity,
+        );
+        Log.d("123------${state.detailInfo}");
+        changeLoadingState(LoadState.State_Success, null);
       } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
         ToastEngine.show(result.errorMsg ?? "Network Load Error");
       }
     } catch (e) {
@@ -93,17 +80,92 @@ class RewardsSearchVm extends _$RewardsSearchVm {
     }
   }
 
-  // 下拉刷新
-  Future refreshListData() async {
-    Log.d("----property_news_vm-----refreshListData ");
+  void searchIn(value) {
+    ToastEngine.show('$value');
+    state = state.copyWith(
+      keyword: value,
+    );
+    page = 1;
+    getList();
+  }
 
-    // await Future.delayed(const Duration(seconds: 2));
+  // 上拉加载 更多
+  Future loadMore() async {
+    page++;
+    getList();
+  }
 
-    state = state.copyWith(curPage: 1, pageSize: 10);
-    // ref.invalidateSelf();
-    // ref.invalidate(propertyNewsVmProvider);
-    getListData();
+  // 下拉刷新
+  Future onRefresh() async {
+    page = 1;
+    getList();
   }
 
+  // 获取list 列表数据
+  Future getList<T>() async {
+    // if (_needShowPlaceholder) {
+    //   changeLoadingState(LoadState.State_Loading, null);
+    // }
+
+    Log.d("加载listData数据---------------start--${page}---");
+    try {
+      //请求网络
+      Map<String, dynamic> params = {
+        "page": page,
+        "limit": limit,
+        "keyword": state.keyword,
+      };
+      Log.d("请求参数------$params");
+      final result = await rewardsSearchRepository.fetchList(params);
+      //校验成功失败
+      if (result.isSuccess) {
+        handlerResultList((result.data as RewardsListEntity).list);
+        state = state.copyWith(
+          searchIs: false,
+        );
+      } else {
+        String errorMessage = result.errorMsg!;
+        changeLoadingState(LoadState.State_Error, errorMessage);
+        ToastEngine.show(result.errorMsg ?? "Network Load Error");
+      }
+    } catch (e) {
+      ToastEngine.show("Error: $e");
+    }
+  }
 
+  void handlerResultList(List<RewardsListList>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (page == 1) {
+        //刷新的方式
+        state.list!.clear();
+        state.list!.addAll(list.map((item) => item.toJson()).toList());
+        refreshController.finishRefresh();
+        Log.d("state.liststate.liststate.list------${state.list}");
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success, null);
+      } else {
+        //加载更多
+        final allList = state.list;
+        state = state.copyWith(list: allList);
+        refreshController.finishLoad();
+        // update();
+      }
+    } else {
+      if (page == 1) {
+        //展示无数据的布局
+        state.list!.clear();
+        changeLoadingState(LoadState.State_Empty, null);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        if (state.list!.length == 0) {
+          changeLoadingState(LoadState.State_Empty, null);
+        } else {
+          changeLoadingState(LoadState.State_Success, null);
+        }
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
 }

+ 4 - 3
packages/cpt_rewards/lib/modules/rewards_search/rewards_search_vm.g.dart

@@ -6,7 +6,7 @@ part of 'rewards_search_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsSearchVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsSearchVmHash() => r'b367fee65c12b4ea90960894aa7ad4a981e367ce';
 
 /// See also [RewardsSearchVm].
 @ProviderFor(RewardsSearchVm)
@@ -14,8 +14,9 @@ final rewardsSearchVmProvider =
     AutoDisposeNotifierProvider<RewardsSearchVm, RewardsSearchState>.internal(
   RewardsSearchVm.new,
   name: r'rewardsSearchVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsSearchVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsSearchVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );

+ 76 - 59
packages/cpt_rewards/lib/modules/rewards_successful/rewards_successful_page.dart

@@ -1,6 +1,8 @@
 import 'package:cpt_rewards/modules/rewards_address/rewards_address_page.dart';
 import 'package:cpt_rewards/modules/rewards_my/rewards_my_page.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/rewards_buy_entity.dart';
+import 'package:domain/entity/rewards_detail_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
@@ -21,19 +23,50 @@ import './rewards_successful_vm.dart';
 
 @RoutePage()
 class RewardsSuccessfulPage extends HookConsumerWidget {
-  const RewardsSuccessfulPage({Key? key}) : super(key: key);
+  final int? amount;
+  final String? title;
+  final String? resources;
+  final String? redeemedDate;
+  final String? createdAt;
+  const RewardsSuccessfulPage(
+      {Key? key,
+      @PathParam('amount') required this.amount,
+      @PathParam('title') required this.title,
+      @PathParam('resources') required this.resources,
+      @PathParam('redeemedDate') required this.redeemedDate,
+      @PathParam('createdAt') required this.createdAt})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance({
+    BuildContext? context,
+    int? amount,
+    String? title = '',
+    String? resources = '',
+    String? redeemedDate = '',
+    String? createdAt = '',
+  }) {
     if (context != null) {
-      context.router.push(const RewardsSuccessfulPageRoute());
+      context.router.push(RewardsSuccessfulPageRoute(
+          amount: amount,
+          title: title,
+          resources: resources,
+          redeemedDate: redeemedDate,
+          createdAt: createdAt));
     } else {
-      appRouter.push(const RewardsSuccessfulPageRoute());
+      appRouter.push(RewardsSuccessfulPageRoute(
+          amount: amount,
+          title: title,
+          resources: resources,
+          redeemedDate: redeemedDate,
+          createdAt: createdAt));
     }
   }
 
   // listitem
   Widget _buildSaleItem(BuildContext context, WidgetRef ref, _vm) {
+    String? titles = title ?? '';
+    String? resourcess = resources ?? '';
     return Column(
       children: [
         Container(
@@ -52,20 +85,20 @@ class RewardsSuccessfulPage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.start,
               mainAxisAlignment: MainAxisAlignment.start,
               children: [
-                const MyAssetImage(
-                  Assets.rewardsRewardsIndex1,
-                  // width: 110,
+                MyLoadImage(
+                  resourcess,
+                  width: MediaQuery.of(context).size.width,
                   height: 150,
                 ),
-                const Column(
+                Column(
                   crossAxisAlignment: CrossAxisAlignment.start,
                   mainAxisAlignment: MainAxisAlignment.start,
                   children: [
                     Text(
                       maxLines: 1, // 设置最大行数为2
                       overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-                      'Cute children multifunctional umbrella',
-                      style: TextStyle(
+                      titles,
+                      style: const TextStyle(
                           fontSize: 17.0,
                           color: Colors.black,
                           fontWeight: FontWeight.w500),
@@ -113,39 +146,20 @@ class RewardsSuccessfulPage extends HookConsumerWidget {
                   )
                 ],
               ),
-              Row(
+              Column(
                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
                 crossAxisAlignment: CrossAxisAlignment.center,
                 children: [
                   Text(
-                    'Also redeemable in 1 more location',
+                    '60 paya lebar rd, #09-13/17 paya lebar square, singapore 409051',
+                    maxLines: 2, // 设置最大行数为2
+                    overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
                     style: TextStyle(
                         fontSize: 15.0,
                         color: ColorUtils.string2Color('#54638C'),
                         fontWeight: FontWeight.w400),
                   ),
                 ],
-              ).marginOnly(top: 10, bottom: 15),
-              Container(
-                height: 40,
-                decoration: BoxDecoration(
-                  color: Colors.white,
-                  borderRadius: const BorderRadius.all(Radius.circular(6.0)),
-                  border: Border.all(
-                      color: ColorUtils.string2Color('#4161D0'), width: 1.0),
-                ),
-                child: Center(
-                  child: Text(
-                    'See More Locations',
-                    style: TextStyle(
-                        fontSize: 15.0,
-                        color: ColorUtils.string2Color('#4161D0'),
-                        fontWeight: FontWeight.w500),
-                  ),
-                ).onTap(() {
-                  // 去详情
-                  RewardsAddressPage.startInstance();
-                }),
               ),
             ],
           ).paddingOnly(left: 15, right: 15, top: 12, bottom: 20),
@@ -155,6 +169,7 @@ class RewardsSuccessfulPage extends HookConsumerWidget {
   }
 
   Widget _buildPackage(BuildContext context, WidgetRef ref, _vm) {
+    String? redeemedDates = redeemedDate ?? '';
     return Column(
       children: [
         Container(
@@ -193,7 +208,7 @@ class RewardsSuccessfulPage extends HookConsumerWidget {
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
                   Text(
-                    '17 Mar 2020 until 15 Jul 2020',
+                    redeemedDates,
                     style: TextStyle(
                         fontSize: 15.0,
                         color: ColorUtils.string2Color('#54638C'),
@@ -209,6 +224,7 @@ class RewardsSuccessfulPage extends HookConsumerWidget {
   }
 
   Widget _buildNotice(BuildContext context, WidgetRef ref, _vm) {
+    String? createdAts = createdAt ?? '';
     return Column(
       children: [
         Container(
@@ -238,7 +254,7 @@ class RewardsSuccessfulPage extends HookConsumerWidget {
                   Row(
                     children: [
                       Text(
-                        '21 Jun 2021 20:18',
+                        createdAts,
                         style: TextStyle(
                             fontSize: 15.0,
                             color: ColorUtils.string2Color('#54638C'),
@@ -248,30 +264,30 @@ class RewardsSuccessfulPage extends HookConsumerWidget {
                   ),
                 ],
               ),
-              Row(
-                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                crossAxisAlignment: CrossAxisAlignment.center,
-                children: [
-                  Text(
-                    'Transaction ID:',
-                    style: TextStyle(
-                        fontSize: 15.0,
-                        color: ColorUtils.string2Color('#333333'),
-                        fontWeight: FontWeight.w400),
-                  ),
-                  Row(
-                    children: [
-                      Text(
-                        'PR00021837HY',
-                        style: TextStyle(
-                            fontSize: 15.0,
-                            color: ColorUtils.string2Color('#54638C'),
-                            fontWeight: FontWeight.w400),
-                      ),
-                    ],
-                  ),
-                ],
-              ).marginOnly(top: 30, bottom: 10),
+              // Row(
+              //   mainAxisAlignment: MainAxisAlignment.spaceBetween,
+              //   crossAxisAlignment: CrossAxisAlignment.center,
+              //   children: [
+              //     Text(
+              //       'Transaction ID:',
+              //       style: TextStyle(
+              //           fontSize: 15.0,
+              //           color: ColorUtils.string2Color('#333333'),
+              //           fontWeight: FontWeight.w400),
+              //     ),
+              //     Row(
+              //       children: [
+              //         Text(
+              //           'PR00021837HY',
+              //           style: TextStyle(
+              //               fontSize: 15.0,
+              //               color: ColorUtils.string2Color('#54638C'),
+              //               fontWeight: FontWeight.w400),
+              //         ),
+              //       ],
+              //     ),
+              //   ],
+              // ).marginOnly(top: 30, bottom: 10),
             ],
           ).paddingOnly(left: 15, right: 15, top: 30, bottom: 30),
         ),
@@ -315,6 +331,7 @@ class RewardsSuccessfulPage extends HookConsumerWidget {
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(rewardsSuccessfulVmProvider.notifier);
     final state = ref.watch(rewardsSuccessfulVmProvider);
+    // RewardsBuyEntity? datad = data;
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,

+ 6 - 3
packages/cpt_rewards/lib/modules/rewards_successful/rewards_successful_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_successful_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsSuccessfulRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsSuccessfulRepositoryHash() =>
+    r'deccef2972b520015e94f1120b70119948184abd';
 
 /// See also [rewardsSuccessfulRepository].
 @ProviderFor(rewardsSuccessfulRepository)
-final rewardsSuccessfulRepositoryProvider = Provider<RewardsSuccessfulRepository>.internal(
+final rewardsSuccessfulRepositoryProvider =
+    Provider<RewardsSuccessfulRepository>.internal(
   rewardsSuccessfulRepository,
   name: r'rewardsSuccessfulRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
@@ -22,6 +24,7 @@ final rewardsSuccessfulRepositoryProvider = Provider<RewardsSuccessfulRepository
 
 @Deprecated('Will be removed in 3.0. Use Ref instead')
 // ignore: unused_element
-typedef RewardsSuccessfulRepositoryRef = ProviderRef<RewardsSuccessfulRepository>;
+typedef RewardsSuccessfulRepositoryRef
+    = ProviderRef<RewardsSuccessfulRepository>;
 // 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

+ 8 - 6
packages/cpt_rewards/lib/modules/rewards_successful/rewards_successful_vm.g.dart

@@ -6,20 +6,22 @@ part of 'rewards_successful_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsSuccessfulVmHash() => r'e773ac50dffaf8bb4d820118ee89a83aed303a76';
+String _$rewardsSuccessfulVmHash() =>
+    r'7952837095293b8effc4094ce438d6f8ed359b3b';
 
 /// See also [RewardsSuccessfulVm].
 @ProviderFor(RewardsSuccessfulVm)
-final rewardsSuccessfulVmProvider =
-    AutoDisposeNotifierProvider<RewardsSuccessfulVm, RewardsSuccessfulState>.internal(
+final rewardsSuccessfulVmProvider = AutoDisposeNotifierProvider<
+    RewardsSuccessfulVm, RewardsSuccessfulState>.internal(
   RewardsSuccessfulVm.new,
   name: r'rewardsSuccessfulVmProvider',
-  debugGetCreateSourceHash:
-      const bool.fromEnvironment('dart.vm.product') ? null : _$rewardsSuccessfulVmHash,
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$rewardsSuccessfulVmHash,
   dependencies: null,
   allTransitiveDependencies: null,
 );
 
 typedef _$RewardsSuccessfulVm = AutoDisposeNotifier<RewardsSuccessfulState>;
 // 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
+// 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

+ 119 - 99
packages/cpt_rewards/lib/modules/rewards_transaction/rewards_transaction_page.dart

@@ -1,7 +1,10 @@
 import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/rewards_detail_entity.dart';
+import 'package:domain/entity/rewards_my_detail_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
@@ -19,19 +22,31 @@ import './rewards_transaction_vm.dart';
 
 @RoutePage()
 class RewardsTransactionPage extends HookConsumerWidget {
-  const RewardsTransactionPage({Key? key}) : super(key: key);
+  final int? id;
+  final String? type;
+  const RewardsTransactionPage(
+      {Key? key,
+      @PathParam('id') required this.id,
+      @PathParam('type') required this.type})
+      : super(key: key);
 
   //启动当前页面
-  static void startInstance({BuildContext? context}) {
+  static void startInstance(
+      {BuildContext? context, int? id, String? type = ''}) {
     if (context != null) {
-      context.router.push(const RewardsTransactionPageRoute());
+      context.router.push(RewardsTransactionPageRoute(id: id, type: type));
     } else {
-      appRouter.push(const RewardsTransactionPageRoute());
+      appRouter.push(RewardsTransactionPageRoute(id: id, type: type));
     }
   }
 
   // listitem
-  Widget _buildSaleItem(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildSaleItem(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    String title = detailInfo!.reward.title ?? "";
+    List? resources = detailInfo!.reward.resources ?? [];
+    int point = detailInfo.reward.point ?? 0;
+    int originalPoint = detailInfo.reward.originalPoint ?? 0;
+
     return Column(
       children: [
         Container(
@@ -50,35 +65,37 @@ class RewardsTransactionPage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.start,
               mainAxisAlignment: MainAxisAlignment.start,
               children: [
-                const MyAssetImage(
-                  Assets.rewardsRewardsIndex1,
-                  // width: 110,
-                  height: 150,
-                ),
+                resources!.length > 0
+                    ? MyLoadImage(
+                        resources[0] ?? '',
+                        width: MediaQuery.of(context).size.width,
+                        height: 150,
+                      )
+                    : Container(),
                 Column(
                   crossAxisAlignment: CrossAxisAlignment.start,
                   mainAxisAlignment: MainAxisAlignment.start,
                   children: [
-                    const Text(
+                    Text(
                       maxLines: 1, // 设置最大行数为2
                       overflow: TextOverflow.ellipsis, // 超出部分用省略号表示
-                      'Cute children multifunctional umbrella',
-                      style: TextStyle(
+                      title,
+                      style: const TextStyle(
                           fontSize: 17.0,
                           color: Colors.black,
                           fontWeight: FontWeight.w500),
                     ).marginOnly(bottom: 5),
                     Row(
                       children: [
-                        const Text(
-                          '300',
-                          style: TextStyle(
+                        Text(
+                          '$point',
+                          style: const TextStyle(
                               fontSize: 19.0,
                               color: Colors.black,
                               fontWeight: FontWeight.w500),
                         ),
                         Text(
-                          '350',
+                          '$originalPoint',
                           style: TextStyle(
                               decoration: TextDecoration.lineThrough,
                               decorationColor:
@@ -105,7 +122,11 @@ class RewardsTransactionPage extends HookConsumerWidget {
     ).marginOnly(left: 15, bottom: 15, right: 15);
   }
 
-  Widget _buildDeal(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildDeal(BuildContext context, WidgetRef ref, _vm, detailInfo) {
+    String redeemedStart = detailInfo.reward.redeemedStart ?? "";
+    String redeemedEnd = detailInfo.reward.redeemedEnd ?? "";
+    String redeemedDate = '$redeemedStart until $redeemedEnd';
+    int code = detailInfo.redemptionCode ?? 0;
     return Column(
       children: [
         Container(
@@ -132,7 +153,7 @@ class RewardsTransactionPage extends HookConsumerWidget {
                     height: 25,
                   ).marginOnly(right: 15),
                   Text(
-                    '17 Mar 2020 until 15 Jul 2020',
+                    redeemedEnd,
                     style: TextStyle(
                         fontSize: 15.0,
                         color: ColorUtils.string2Color('#000000'),
@@ -162,7 +183,7 @@ class RewardsTransactionPage extends HookConsumerWidget {
                     ],
                   ),
                   Text(
-                    '789654369',
+                    '$code',
                     style: TextStyle(
                         fontSize: 15.0,
                         color: ColorUtils.string2Color('#4161D0'),
@@ -216,7 +237,14 @@ class RewardsTransactionPage extends HookConsumerWidget {
     ).marginOnly(left: 15, bottom: 25, right: 15);
   }
 
-  Widget _buildNotice(BuildContext context, WidgetRef ref, _vm) {
+  Widget _buildNotice(
+      BuildContext context, WidgetRef ref, _vm, types, detailInfo) {
+    int phone = detailInfo.account.phone ?? 0;
+    String createdAt = detailInfo.createdAt ?? "";
+    String usedAt = detailInfo.usedAt ?? "";
+    int point = detailInfo.reward.point ?? 0;
+    int originalPoint = detailInfo.reward.originalPoint ?? 0;
+    int quantity = detailInfo.quantity ?? 0;
     return Column(
       children: [
         Container(
@@ -256,30 +284,6 @@ class RewardsTransactionPage extends HookConsumerWidget {
                 crossAxisAlignment: CrossAxisAlignment.center,
                 children: [
                   Text(
-                    'Promotion ID :',
-                    style: TextStyle(
-                        fontSize: 15.0,
-                        color: ColorUtils.string2Color('#000000'),
-                        fontWeight: FontWeight.w400),
-                  ),
-                  Row(
-                    children: [
-                      Text(
-                        '4260575680',
-                        style: TextStyle(
-                            fontSize: 15.0,
-                            color: ColorUtils.string2Color('#000000'),
-                            fontWeight: FontWeight.w500),
-                      ),
-                    ],
-                  ),
-                ],
-              ).marginOnly(bottom: 25),
-              Row(
-                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                crossAxisAlignment: CrossAxisAlignment.center,
-                children: [
-                  Text(
                     'Purchase Mobile No :',
                     style: TextStyle(
                         fontSize: 15.0,
@@ -289,7 +293,7 @@ class RewardsTransactionPage extends HookConsumerWidget {
                   Row(
                     children: [
                       Text(
-                        '13601515270',
+                        '$phone',
                         style: TextStyle(
                             fontSize: 15.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -313,31 +317,7 @@ class RewardsTransactionPage extends HookConsumerWidget {
                   Row(
                     children: [
                       Text(
-                        '2 July 2020, 17:08',
-                        style: TextStyle(
-                            fontSize: 15.0,
-                            color: ColorUtils.string2Color('#000000'),
-                            fontWeight: FontWeight.w500),
-                      ),
-                    ],
-                  ),
-                ],
-              ).marginOnly(bottom: 25),
-              Row(
-                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                crossAxisAlignment: CrossAxisAlignment.center,
-                children: [
-                  Text(
-                    'Redeemed Date :',
-                    style: TextStyle(
-                        fontSize: 15.0,
-                        color: ColorUtils.string2Color('#000000'),
-                        fontWeight: FontWeight.w400),
-                  ),
-                  Row(
-                    children: [
-                      Text(
-                        '2 July 2020, 17:08',
+                        createdAt,
                         style: TextStyle(
                             fontSize: 15.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -347,6 +327,32 @@ class RewardsTransactionPage extends HookConsumerWidget {
                   ),
                 ],
               ).marginOnly(bottom: 25),
+              types != "expired"
+                  ? Row(
+                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                      crossAxisAlignment: CrossAxisAlignment.center,
+                      children: [
+                        Text(
+                          'Redeemed Date :',
+                          style: TextStyle(
+                              fontSize: 15.0,
+                              color: ColorUtils.string2Color('#000000'),
+                              fontWeight: FontWeight.w400),
+                        ),
+                        Row(
+                          children: [
+                            Text(
+                              usedAt,
+                              style: TextStyle(
+                                  fontSize: 15.0,
+                                  color: ColorUtils.string2Color('#000000'),
+                                  fontWeight: FontWeight.w500),
+                            ),
+                          ],
+                        ),
+                      ],
+                    ).marginOnly(bottom: 25)
+                  : Container(),
               Row(
                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
                 crossAxisAlignment: CrossAxisAlignment.center,
@@ -361,7 +367,7 @@ class RewardsTransactionPage extends HookConsumerWidget {
                   Row(
                     children: [
                       Text(
-                        '1',
+                        '$quantity',
                         style: TextStyle(
                             fontSize: 15.0,
                             color: ColorUtils.string2Color('#000000'),
@@ -385,7 +391,7 @@ class RewardsTransactionPage extends HookConsumerWidget {
                   Row(
                     children: [
                       Text(
-                        '350',
+                        '$originalPoint',
                         style: TextStyle(
                             decoration: TextDecoration.lineThrough,
                             decorationColor: ColorUtils.string2Color('#54638C'),
@@ -395,7 +401,7 @@ class RewardsTransactionPage extends HookConsumerWidget {
                             fontWeight: FontWeight.w400),
                       ),
                       Text(
-                        '300',
+                        '$point',
                         style: TextStyle(
                             fontSize: 19.0,
                             color: ColorUtils.string2Color('#333333'),
@@ -416,36 +422,50 @@ class RewardsTransactionPage extends HookConsumerWidget {
   Widget build(BuildContext context, WidgetRef ref) {
     final _vm = ref.read(rewardsTransactionVmProvider.notifier);
     final state = ref.watch(rewardsTransactionVmProvider);
+    RewardsMyDetailEntity? detailInfo = state.detailInfo;
+    String? types = type;
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => _vm.initPageData(id: id));
+      return () {
+        // 组件卸载时执行
+        Log.d("property_news_page 组件卸载时执行");
+      };
+    }, []);
     return Scaffold(
       appBar: MyAppBar.appBar(
         context,
-        "Verification Transaction",
+        "My Rewards Details",
         backgroundColor: context.appColors.whiteBG,
       ),
-      body: Column(
-        children: [
-          Expanded(
-              child: SingleChildScrollView(
-                  scrollDirection: Axis.vertical,
-                  physics: const BouncingScrollPhysics(),
-                  clipBehavior: Clip.none,
-                  child: Column(
-                    children: [
-                      Container(
-                          color: ColorUtils.string2Color('#F2F3F6'),
-                          padding: const EdgeInsets.only(top: 15),
-                          child: Column(
-                            children: [
-                              _buildSaleItem(context, ref, _vm),
-                              _buildDeal(context, ref, _vm),
-                              _buildNotice(context, ref, _vm),
-                              _buildPackage(context, ref, _vm),
-                            ],
-                          )),
-                    ],
-                  ))),
-        ],
-      ),
+      body: detailInfo?.createdAt != ''
+          ? Column(
+              children: [
+                Expanded(
+                    child: SingleChildScrollView(
+                        scrollDirection: Axis.vertical,
+                        physics: const BouncingScrollPhysics(),
+                        clipBehavior: Clip.none,
+                        child: Column(
+                          children: [
+                            Container(
+                                color: ColorUtils.string2Color('#F2F3F6'),
+                                padding: const EdgeInsets.only(top: 15),
+                                child: Column(
+                                  children: [
+                                    _buildSaleItem(
+                                        context, ref, _vm, detailInfo),
+                                    _buildDeal(context, ref, _vm, detailInfo),
+                                    _buildNotice(
+                                        context, ref, _vm, types, detailInfo),
+                                    _buildPackage(context, ref, _vm),
+                                  ],
+                                )),
+                          ],
+                        ))),
+              ],
+            )
+          : const SizedBox.shrink(),
     );
   }
 }

+ 13 - 13
packages/cpt_rewards/lib/modules/rewards_transaction/rewards_transaction_repository.dart

@@ -1,9 +1,11 @@
 import 'package:domain/constants/api_constants.dart';
+import 'package:domain/entity/rewards_my_detail_entity.dart';
 import 'package:domain/entity/server_time.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -24,12 +26,12 @@ RewardsTransactionRepository rewardsTransactionRepository(Ref ref) {
 class RewardsTransactionRepository {
   DioEngine dioEngine;
 
-RewardsTransactionRepository({required this.dioEngine});
+  RewardsTransactionRepository({required this.dioEngine});
 
   Future<HttpResult<Object>> fetchPropertyNewsList(
-      Map<String, dynamic>? data, {
-        CancelToken? cancelToken,
-      }) async {
+    Map<String, dynamic>? data, {
+    CancelToken? cancelToken,
+  }) async {
     Map<String, dynamic> params = {};
 
     // if (!Utils.isEmpty(type)) {
@@ -38,20 +40,19 @@ RewardsTransactionRepository({required this.dioEngine});
 
     params = data!;
 
-
     Map<String, String> headers = {};
 
     headers["Content-Type"] = "application/x-www-form-urlencoded";
     headers["Accept"] = "application/x.yyjobs-api.v1+json";
 
-      final result = await dioEngine.requestNetResult(
+    final result = await dioEngine.requestNetResult(
       // ApiConstants.apiServerTime, // api 地址
-      '/index.php/api/employee/extra/time', // api 地址
+      '/api/v1/user/reward/sale/detail', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.GET,
-      isShowLoadingDialog: true,  //是否展示默认的Loading弹窗
-      networkDebounce: true,   //是否防抖防止重复请求
+      isShowLoadingDialog: true, //是否展示默认的Loading弹窗
+      networkDebounce: true, //是否防抖防止重复请求
       cancelToken: cancelToken,
     );
 
@@ -59,12 +60,11 @@ RewardsTransactionRepository({required this.dioEngine});
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = RewardsTransactionState.fromJson(json!);
+      var data = RewardsMyDetailEntity.fromJson(json!);
+      Log.d("------data--$data--------");
       //重新赋值data或list
-      return result.convert<RewardsTransactionState>(data: data);
+      return result.convert<RewardsMyDetailEntity>(data: data);
     }
     return result.convert();
   }
-
-
 }

+ 6 - 3
packages/cpt_rewards/lib/modules/rewards_transaction/rewards_transaction_repository.g.dart

@@ -6,11 +6,13 @@ part of 'rewards_transaction_repository.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$rewardsTransactionRepositoryHash() => r'e91b26e60af186a007cb785effb50c16b4967969';
+String _$rewardsTransactionRepositoryHash() =>
+    r'3c5ed8d4259d524794a396c59397bcb68dbf373f';
 
 /// See also [rewardsTransactionRepository].
 @ProviderFor(rewardsTransactionRepository)
-final rewardsTransactionRepositoryProvider = Provider<RewardsTransactionRepository>.internal(
+final rewardsTransactionRepositoryProvider =
+    Provider<RewardsTransactionRepository>.internal(
   rewardsTransactionRepository,
   name: r'rewardsTransactionRepositoryProvider',
   debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
@@ -22,6 +24,7 @@ final rewardsTransactionRepositoryProvider = Provider<RewardsTransactionReposito
 
 @Deprecated('Will be removed in 3.0. Use Ref instead')
 // ignore: unused_element
-typedef RewardsTransactionRepositoryRef = ProviderRef<RewardsTransactionRepository>;
+typedef RewardsTransactionRepositoryRef
+    = ProviderRef<RewardsTransactionRepository>;
 // 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

+ 0 - 0
packages/cpt_rewards/lib/modules/rewards_transaction/rewards_transaction_state.dart


Некоторые файлы не были показаны из-за большого количества измененных файлов