Browse Source

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

glglove 5 months ago
parent
commit
644b704684
53 changed files with 3203 additions and 89 deletions
  1. 1 1
      packages/cpt_facility/lib/modules/book_confirm/book_confirm_view_model.g.dart
  2. 15 1
      packages/cpt_facility/lib/modules/booking/facility_booking_page.dart
  3. 1 1
      packages/cpt_facility/lib/modules/booking/facility_booking_view_model.g.dart
  4. 88 0
      packages/cpt_facility/lib/modules/location/facility_location_page.dart
  5. 2 0
      packages/cpt_facility/lib/router/page/facility_page_router.dart
  6. 49 0
      packages/cpt_facility/lib/router/page/facility_page_router.gr.dart
  7. 94 6
      packages/cpt_form/lib/modules/apply/attachment_page.dart
  8. 284 6
      packages/cpt_form/lib/modules/apply/form_payment_page.dart
  9. 1 0
      packages/cpt_form/lib/modules/apply/form_terms_page.dart
  10. 244 5
      packages/cpt_form/lib/modules/apply/guest_vehicle_page.dart
  11. 126 7
      packages/cpt_form/lib/modules/apply/large_text_box_page.dart
  12. 259 5
      packages/cpt_form/lib/modules/apply/moving_company_page.dart
  13. 121 6
      packages/cpt_form/lib/modules/apply/moving_date_page.dart
  14. 107 5
      packages/cpt_form/lib/modules/apply/note_management_page.dart
  15. 258 5
      packages/cpt_form/lib/modules/apply/renovation_company_page.dart
  16. 142 6
      packages/cpt_form/lib/modules/apply/renovation_date_page.dart
  17. 147 5
      packages/cpt_form/lib/modules/apply/signature_page.dart
  18. 23 3
      packages/cpt_form/lib/modules/apply/type_of_application_page.dart
  19. 237 4
      packages/cpt_form/lib/modules/apply/vehicle_info_page.dart
  20. 7 3
      packages/cpt_form/lib/modules/apply/vm/apply_state.dart
  21. 28 0
      packages/cpt_form/lib/modules/apply/vm/apply_view_model.dart
  22. 1 1
      packages/cpt_form/lib/modules/apply/vm/apply_view_model.g.dart
  23. 156 0
      packages/cpt_form/lib/modules/detail/detail_approved_fragment.dart
  24. 155 0
      packages/cpt_form/lib/modules/detail/detail_not_approved_fragment.dart
  25. 153 0
      packages/cpt_form/lib/modules/detail/detail_processing_fragment.dart
  26. 75 0
      packages/cpt_form/lib/modules/detail/form_detail_page.dart
  27. 31 0
      packages/cpt_form/lib/modules/detail/form_detail_state.dart
  28. 31 0
      packages/cpt_form/lib/modules/detail/form_detail_view_model.dart
  29. 27 0
      packages/cpt_form/lib/modules/detail/form_detail_view_model.g.dart
  30. 3 1
      packages/cpt_form/lib/modules/form/approve/form_approve_screen.dart
  31. 12 0
      packages/cpt_form/lib/modules/form/form_types.dart
  32. 10 8
      packages/cpt_form/lib/modules/form/not_approve/form_not_approve_screen.dart
  33. 3 1
      packages/cpt_form/lib/modules/form/submit/form_submit_screen.dart
  34. 2 0
      packages/cpt_form/lib/router/page/form_page_router.dart
  35. 63 0
      packages/cpt_form/lib/router/page/form_page_router.gr.dart
  36. BIN
      packages/cs_resources/assets/form/detail_processing_img.webp
  37. BIN
      packages/cs_resources/assets/main/home_botice_board_icon.webp
  38. BIN
      packages/cs_resources/assets/main/home_community_icon.webp
  39. BIN
      packages/cs_resources/assets/main/home_facility_icon.webp
  40. BIN
      packages/cs_resources/assets/main/home_forms_icon.webp
  41. BIN
      packages/cs_resources/assets/main/home_property_icon.webp
  42. BIN
      packages/cs_resources/assets/main/home_service_icon.webp
  43. BIN
      packages/cs_resources/assets/payment/card_icon.webp
  44. 2 0
      packages/cs_resources/lib/generated/assets.dart
  45. 26 0
      packages/cs_resources/lib/generated/intl/messages_en.dart
  46. 3 0
      packages/cs_resources/lib/generated/intl/messages_zh_CN.dart
  47. 1 0
      packages/cs_resources/lib/generated/intl/messages_zh_HK.dart
  48. 158 2
      packages/cs_resources/lib/generated/l10n.dart
  49. 16 2
      packages/cs_resources/lib/l10n/intl_en.arb
  50. 16 2
      packages/cs_resources/lib/l10n/intl_zh_CN.arb
  51. 16 2
      packages/cs_resources/lib/l10n/intl_zh_HK.arb
  52. 7 1
      packages/cs_resources/lib/theme/app_colors_theme.dart
  53. 2 0
      packages/cs_router/lib/path/router_path.dart

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

@@ -7,7 +7,7 @@ part of 'book_confirm_view_model.dart';
 // **************************************************************************
 // **************************************************************************
 
 
 String _$bookConfirmViewModelHash() =>
 String _$bookConfirmViewModelHash() =>
-    r'94f61f3b11ea3f6bc8baa1abaccf013230ecf2e4';
+    r'fdd3f7fffe200110bd14f0d3b2ce2d83c1d6a74a';
 
 
 /// See also [BookConfirmViewModel].
 /// See also [BookConfirmViewModel].
 @ProviderFor(BookConfirmViewModel)
 @ProviderFor(BookConfirmViewModel)

+ 15 - 1
packages/cpt_facility/lib/modules/booking/facility_booking_page.dart

@@ -1,5 +1,6 @@
 import 'dart:math';
 import 'dart:math';
 
 
+import 'package:cpt_facility/modules/location/facility_location_page.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
@@ -49,7 +50,20 @@ class FacilityBookingPage extends HookConsumerWidget {
     }, []);
     }, []);
 
 
     return Scaffold(
     return Scaffold(
-      appBar: MyAppBar.appBar(context, "Kids party room", backgroundColor: context.appColors.whiteBG),
+      appBar: MyAppBar.appBar(context, "Kids party room", backgroundColor: context.appColors.whiteBG, actions: [
+        //去设施小区的定位图片
+        const MyAssetImage(
+          Assets.facilityTitleLocationIcon,
+          width: 44,
+          height: 44,
+        ).marginOnly(right: 3).onTap(() {
+          FacilityLocationPage.startInstance(context: context, imageUrls: [
+            "https://mz.eastday.com/63074197.jpeg",
+            "https://t10.baidu.com/it/u=3562774827,189123978&fm=30&app=106&f=PNG?w=640&h=479&s=DFBA6EC80A72B7CC02FC011F0300D0C2",
+            "https://img1.baidu.com/it/u=4090167392,148087489&fm=253&fmt=auto&app=138&f=JPEG?w=484&h=300"
+          ]);
+        }),
+      ]),
       backgroundColor: context.appColors.backgroundDark,
       backgroundColor: context.appColors.backgroundDark,
       body: Column(
       body: Column(
         mainAxisSize: MainAxisSize.max,
         mainAxisSize: MainAxisSize.max,

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

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

+ 88 - 0
packages/cpt_facility/lib/modules/location/facility_location_page.dart

@@ -0,0 +1,88 @@
+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:router/ext/auto_router_extensions.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_load_image.dart';
+
+import '../../router/page/facility_page_router.dart';
+
+@RoutePage()
+class FacilityLocationPage extends HookConsumerWidget {
+  final List<String> imageUrls;
+
+  const FacilityLocationPage({Key? key, required this.imageUrls}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context, required List<String> imageUrls}) {
+    if (context != null) {
+      context.router.push(FacilityLocationPageRoute(imageUrls: imageUrls));
+    } else {
+      appRouter.push(FacilityLocationPageRoute(imageUrls: imageUrls));
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    final currentPage = useState(0); // 记录当前页索引
+    final pageController = usePageController(); // 创建 PageController
+
+    // 监听页面变化
+    useEffect(() {
+      pageController.addListener(() {
+        currentPage.value = pageController.page!.round();
+      });
+      return () => pageController.dispose();
+    }, [pageController]);
+
+    return Scaffold(
+      appBar: MyAppBar.appBar(
+        context,
+        "Kids party room",
+      ),
+      backgroundColor: context.appColors.whiteBG,
+      body: Container(
+        width: double.infinity,
+        height: double.infinity,
+        child: Stack(
+          children: [
+            PageView.builder(
+              controller: pageController,
+              itemCount: imageUrls.length,
+              itemBuilder: (context, index) {
+                return MyLoadImage(
+                  imageUrls[index],
+                  fit: BoxFit.fitWidth,
+                );
+              },
+            ),
+
+            // 底部指示器
+            Positioned(
+              bottom: 36,
+              left: 0,
+              right: 0,
+              child: Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                children: List.generate(imageUrls.length, (index) {
+                  return Container(
+                    margin: const EdgeInsets.symmetric(horizontal: 4),
+                    height: 8,
+                    width: 8,
+                    decoration: BoxDecoration(
+                      shape: BoxShape.circle,
+                      color: currentPage.value == index ? Colors.blue : Colors.grey,
+                    ),
+                  );
+                }),
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 2 - 0
packages/cpt_facility/lib/router/page/facility_page_router.dart

@@ -11,6 +11,7 @@ import '../../modules/facility/history/facility_history_screen.dart';
 import '../../modules/detail/facility_detail_page.dart';
 import '../../modules/detail/facility_detail_page.dart';
 import '../../modules/booking/facility_booking_page.dart';
 import '../../modules/booking/facility_booking_page.dart';
 import '../../modules/book_confirm/book_confirm_page.dart';
 import '../../modules/book_confirm/book_confirm_page.dart';
+import '../../modules/location/facility_location_page.dart';
 
 
 part 'facility_page_router.gr.dart';
 part 'facility_page_router.gr.dart';
 
 
@@ -35,5 +36,6 @@ class FacilityPageRouter extends _$FacilityPageRouter {
         CustomRoute(page: FacilityDetailPageRoute.page, path: RouterPath.facilityDetail, transitionsBuilder: applySlideTransition),
         CustomRoute(page: FacilityDetailPageRoute.page, path: RouterPath.facilityDetail, transitionsBuilder: applySlideTransition),
         CustomRoute(page: FacilityBookingPageRoute.page, path: RouterPath.facilityBook, transitionsBuilder: applySlideTransition),
         CustomRoute(page: FacilityBookingPageRoute.page, path: RouterPath.facilityBook, transitionsBuilder: applySlideTransition),
         CustomRoute(page: BookConfirmPageRoute.page, path: RouterPath.facilityBookConfirm, transitionsBuilder: applySlideTransition),
         CustomRoute(page: BookConfirmPageRoute.page, path: RouterPath.facilityBookConfirm, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: FacilityLocationPageRoute.page, path: RouterPath.facilityLocation, transitionsBuilder: applySlideTransition),
       ];
       ];
 }
 }

+ 49 - 0
packages/cpt_facility/lib/router/page/facility_page_router.gr.dart

@@ -57,6 +57,16 @@ abstract class _$FacilityPageRouter extends RootStackRouter {
         child: FacilityHistoryScreen(),
         child: FacilityHistoryScreen(),
       );
       );
     },
     },
+    FacilityLocationPageRoute.name: (routeData) {
+      final args = routeData.argsAs<FacilityLocationPageRouteArgs>();
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: FacilityLocationPage(
+          key: args.key,
+          imageUrls: args.imageUrls,
+        ),
+      );
+    },
     FacilityPageRoute.name: (routeData) {
     FacilityPageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
       return AutoRoutePage<dynamic>(
         routeData: routeData,
         routeData: routeData,
@@ -165,6 +175,45 @@ class FacilityHistoryPageRoute extends PageRouteInfo<void> {
 }
 }
 
 
 /// generated route for
 /// generated route for
+/// [FacilityLocationPage]
+class FacilityLocationPageRoute
+    extends PageRouteInfo<FacilityLocationPageRouteArgs> {
+  FacilityLocationPageRoute({
+    Key? key,
+    required List<String> imageUrls,
+    List<PageRouteInfo>? children,
+  }) : super(
+          FacilityLocationPageRoute.name,
+          args: FacilityLocationPageRouteArgs(
+            key: key,
+            imageUrls: imageUrls,
+          ),
+          initialChildren: children,
+        );
+
+  static const String name = 'FacilityLocationPageRoute';
+
+  static const PageInfo<FacilityLocationPageRouteArgs> page =
+      PageInfo<FacilityLocationPageRouteArgs>(name);
+}
+
+class FacilityLocationPageRouteArgs {
+  const FacilityLocationPageRouteArgs({
+    this.key,
+    required this.imageUrls,
+  });
+
+  final Key? key;
+
+  final List<String> imageUrls;
+
+  @override
+  String toString() {
+    return 'FacilityLocationPageRouteArgs{key: $key, imageUrls: $imageUrls}';
+  }
+}
+
+/// generated route for
 /// [FacilityPage]
 /// [FacilityPage]
 class FacilityPageRoute extends PageRouteInfo<void> {
 class FacilityPageRoute extends PageRouteInfo<void> {
   const FacilityPageRoute({List<PageRouteInfo>? children})
   const FacilityPageRoute({List<PageRouteInfo>? children})

+ 94 - 6
packages/cpt_form/lib/modules/apply/attachment_page.dart

@@ -1,10 +1,19 @@
 
 
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/image/image_nine_grid.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_view.dart';
 
 
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
+import 'vm/apply_view_model.dart';
 
 
 @RoutePage()
 @RoutePage()
 class AttachmentPage extends HookConsumerWidget {
 class AttachmentPage extends HookConsumerWidget {
@@ -22,11 +31,90 @@ class AttachmentPage extends HookConsumerWidget {
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
 
 
-    return Scaffold(
-      appBar: AppBar(title: Text("NoteManagementPage")),
-      body: Center(
-        child: Text("NoteManagementPage"),
-      ),
-    );
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
+
+    useEffect(() {
+      //赋值State的值
+      Future.microtask(() {});
+      return () {
+        // 组件卸载时执行
+      };
+    }, []);
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
+            body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    margin: const EdgeInsets.symmetric(horizontal: 15),
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        MyTextView(
+                          S.current.attachments,
+                          fontSize: 17,
+                          marginTop: 30,
+                          marginBottom: 13,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //Note to Management 的文本
+                        MyTextView(
+                          state.applyDetail?['detail_data']['attachment_txt'],
+                          fontSize: 15,
+                          marginBottom: 14,
+                          isFontRegular: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //选择图片九宫格
+                        ImageNineGrid(
+                          isSelectEnable: state.enableEdit,
+                          maxImages: 10,
+                          spacing: 10,
+                          aspectRatio: 108 / 80,
+                          initialImages: const [
+                            "https://img1.baidu.com/it/u=2931243091,718249849&fm=253&fmt=auto&app=120&f=JPEG?w=569&h=427",
+                            "https://inews.gtimg.com/om_bt/OVx3YS2XJc1zbndGTkjPKW9J0W7kN8M0SIidT-3K4mb2YAA/641",
+                            "https://inews.gtimg.com/om_bt/OAVMydtx9BsJxf5i_thi4Oll9sR1px-Esmtv6UHSxoisEAA/641"
+                          ],
+                          onImagesChanged: (list) {
+
+                          },
+                        ),
+                      ],
+                    ),
+                  ),
+                ).expanded(),
+
+                //底部按钮
+                MyButton(
+                  onPressed: viewModel.gotoNextPage,
+                  text: S.current.next,
+                  textColor: Colors.white,
+                  backgroundColor: context.appColors.btnBgDefault,
+                  fontWeight: FontWeight.w500,
+                  type: ClickType.throttle,
+                  fontSize: 16,
+                  minHeight: 50,
+                  radius: 0,
+                ),
+              ],
+            )),
+        onWillPop: () async {
+          viewModel.handlePopAction();
+          return true;
+        });
   }
   }
+
 }
 }

+ 284 - 6
packages/cpt_form/lib/modules/apply/form_payment_page.dart

@@ -1,15 +1,22 @@
-
 import 'package:cpt_form/modules/form/apply/form_apply_screen.dart';
 import 'package:cpt_form/modules/form/apply/form_apply_screen.dart';
+import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_button.dart';
 import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
 import 'vm/apply_view_model.dart';
 import 'vm/apply_view_model.dart';
+
 @RoutePage()
 @RoutePage()
 class FormPaymentPage extends HookConsumerWidget {
 class FormPaymentPage extends HookConsumerWidget {
   const FormPaymentPage({Key? key}) : super(key: key);
   const FormPaymentPage({Key? key}) : super(key: key);
@@ -28,17 +35,249 @@ class FormPaymentPage extends HookConsumerWidget {
     final viewModel = ref.watch(applyViewModelProvider.notifier);
     final viewModel = ref.watch(applyViewModelProvider.notifier);
     final state = ref.watch(applyViewModelProvider);
     final state = ref.watch(applyViewModelProvider);
 
 
+    //签名版配置
+    HandSignatureControl handSignatureControl = HandSignatureControl(
+      threshold: 3.0,
+      smoothRatio: 190 / 345,
+      velocityRange: 2.0,
+    );
+
+    useEffect(() {
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 释放控制器资源
+      };
+    }, []);
+
     return WillPopScope(
     return WillPopScope(
         child: Scaffold(
         child: Scaffold(
-            appBar: AppBar(title: Text("FormPaymentPage")),
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
             body: Column(
             body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               children: [
               children: [
-                Text("FormPaymentPage").expanded(),
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        //支付
+                        Row(
+                          children: [
+                            const MyAssetImage(Assets.paymentInfoDetails, width: 27, height: 27),
+                            MyTextView(
+                              S.current.payment,
+                              textColor: context.appColors.textBlack,
+                              fontSize: 17,
+                              marginLeft: 14,
+                              isFontMedium: true,
+                            ).expanded(),
+                          ],
+                        ).marginOnly(top: 15, left: 15, right: 15),
+
+                        //金额
+                        Row(
+                          mainAxisSize: MainAxisSize.max,
+                          children: [
+                            MyTextView(
+                              S.current.fee,
+                              textColor: context.appColors.textBlack,
+                              fontSize: 18,
+                              isFontRegular: true,
+                            ),
+                            const Spacer(),
+                            MyTextView(
+                              "SGD",
+                              textColor: context.appColors.textBlack,
+                              fontSize: 18,
+                              isFontRegular: true,
+                            ),
+                            MyTextView(
+                              "\$21.80",
+                              textColor: context.appColors.textPrimary,
+                              fontSize: 22,
+                              marginLeft: 8,
+                              isFontMedium: true,
+                            ),
+                          ],
+                        ).marginOnly(top: 20, left: 15, right: 15, bottom: 20),
+
+                        //分割线
+                        Divider(
+                          color: context.appColors.dividerDefault,
+                          height: 0.5,
+                        ),
+
+                        //押金
+                        Row(
+                          children: [
+                            const MyAssetImage(Assets.paymentInfoDetails, width: 27, height: 27),
+                            MyTextView(
+                              S.current.deposit,
+                              textColor: context.appColors.textBlack,
+                              fontSize: 17,
+                              marginLeft: 14,
+                              isFontMedium: true,
+                            ).expanded(),
+                          ],
+                        ).marginOnly(top: 15, left: 15, right: 15),
+
+                        //押金金额
+                        Row(
+                          children: [
+                            MyTextView(
+                              S.current.deposit_hold,
+                              textColor: context.appColors.textBlack,
+                              fontSize: 18,
+                              isFontRegular: true,
+                            ),
+                            const Spacer(),
+                            MyTextView(
+                              "SGD",
+                              textColor: context.appColors.textBlack,
+                              fontSize: 18,
+                              isFontRegular: true,
+                            ),
+                            MyTextView(
+                              "\$1000.00",
+                              textColor: context.appColors.textPrimary,
+                              fontSize: 22,
+                              marginLeft: 8,
+                              isFontMedium: true,
+                            ),
+                          ],
+                        ).marginOnly(top: 20, left: 15, right: 15, bottom: 20),
+
+                        //分割线
+                        Divider(
+                          color: context.appColors.dividerDefault,
+                          height: 0.5,
+                        ),
+
+                        //银行卡
+                        Row(
+                          children: [
+                            const MyAssetImage(Assets.paymentCardIcon, width: 27, height: 27),
+                            MyTextView(
+                              S.current.card,
+                              textColor: context.appColors.textBlack,
+                              fontSize: 17,
+                              marginLeft: 14,
+                              isFontMedium: true,
+                            ).expanded(),
+                          ],
+                        ).marginOnly(top: 14, left: 15, right: 15, bottom: 14),
+
+                        //选择支付卡
+                        _paymentInfo(context, ref),
+
+                        //签名
+                        MyTextView(
+                          S.current.signature,
+                          fontSize: 17,
+                          marginTop: 24,
+                          marginLeft: 15,
+                          marginRight: 15,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //签名的说明文本
+                        MyTextView(
+                          state.applyDetail?['detail_data']['signature_txt'],
+                          fontSize: 15,
+                          marginTop: 18,
+                          marginLeft: 15,
+                          marginRight: 15,
+                          marginBottom: 21,
+                          isFontRegular: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //签名框
+                        Center(
+                          child: GestureDetector(  //处理手势冲突,手指在签名版上的时候不滑动父布局
+                              behavior: HitTestBehavior.opaque,
+                              onVerticalDragUpdate: (_) {},
+                              child: Stack(
+                                children: [
+                                  //签名
+                                  Center(
+                                    child: Container(
+                                      width: 345,
+                                      height: 190,
+                                      color: context.appColors.imgGrayBg,
+                                      child: HandSignature(
+                                        control: handSignatureControl,
+                                        color: context.appColors.textBlack,
+                                        width: 1.0,
+                                        maxWidth: 3.5,
+                                        type: SignatureDrawType.shape,
+                                      ),
+                                    ),
+                                  ),
+
+                                  //清除签名
+                                  Align(
+                                    alignment: Alignment.bottomRight,
+                                    child: MyTextView(
+                                      S.current.clean,
+                                      fontSize: 12,
+                                      textColor: Colors.white,
+                                      cornerRadius: 10.37,
+                                      backgroundColor: context.appColors.btnBgDefault,
+                                      paddingTop: 4,
+                                      paddingBottom: 4,
+                                      paddingLeft: 11,
+                                      paddingRight: 11,
+                                      margin: 10,
+                                      onClick: () {
+                                        handSignatureControl.clear();
+                                      },
+                                    ),
+                                  ),
+                                ],
+                              )).constrained(
+                            width: 345,
+                            height: 190,
+                          ),
+                        ),
+
+                        //同意协议富文本
+                        RichText(
+                          text: TextSpan(
+                            style: TextStyle(fontSize: 15, fontWeight: FontWeight.w400, color: context.appColors.textBlack),
+                            children: <TextSpan>[
+                              TextSpan(
+                                text: S.current.signed_and_agreed_by,
+                              ),
+                              TextSpan(
+                                text: " Wu Bing Bing ",
+                                style: TextStyle(color: context.appColors.textPrimary),
+                              ),
+                              TextSpan(
+                                text: " 21 Nov 2024, 03:08 PM",
+                              ),
+                            ],
+                          ),
+                        ).marginOnly(top: 21, bottom: 21, left: 15, right: 15),
+                      ],
+                    ),
+                  ),
+                ).expanded(),
 
 
                 //底部按钮
                 //底部按钮
                 MyButton(
                 MyButton(
-                  onPressed: viewModel.gotoNextPage,
-                  text: S.current.submit,
+                  onPressed: () {
+                    viewModel.gotoNextPage();
+                  },
+                  text: S.current.next,
                   textColor: Colors.white,
                   textColor: Colors.white,
                   backgroundColor: context.appColors.btnBgDefault,
                   backgroundColor: context.appColors.btnBgDefault,
                   fontWeight: FontWeight.w500,
                   fontWeight: FontWeight.w500,
@@ -49,9 +288,48 @@ class FormPaymentPage extends HookConsumerWidget {
                 ),
                 ),
               ],
               ],
             )),
             )),
-        onWillPop: () async{
+        onWillPop: () async {
           viewModel.handlePopAction();
           viewModel.handlePopAction();
           return true;
           return true;
         });
         });
   }
   }
+
+  Widget _paymentInfo(BuildContext context, WidgetRef ref) {
+    return Container(
+        height: 75,
+        padding: const EdgeInsets.symmetric(horizontal: 20),
+        color: context.appColors.backgroundDark,
+        child: Row(
+          children: [
+            const MyAssetImage(
+              Assets.paymentMasterCardIcon,
+              height: 34,
+              width: 56,
+            ),
+            MyTextView(
+              "Ending 9423",
+              marginLeft: 15,
+              marginRight: 15,
+              textColor: context.appColors.textBlack,
+              fontSize: 15,
+              isFontMedium: true,
+            ).expanded(),
+            MyTextView(
+              S.current.change,
+              textColor: Colors.white,
+              backgroundColor: context.appColors.btnBgDefault,
+              paddingRight: 16,
+              paddingLeft: 16,
+              paddingTop: 8,
+              onClick: () {
+                ComponentServiceManager().paymentService.startChooseCardPage();
+              },
+              paddingBottom: 8,
+              cornerRadius: 7,
+              fontSize: 15,
+              isFontMedium: true,
+            )
+          ],
+        ));
+  }
 }
 }

+ 1 - 0
packages/cpt_form/lib/modules/apply/form_terms_page.dart

@@ -8,6 +8,7 @@ import 'package:plugin_basic/widget/webview_page.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
 
 
+//协议页面,也是详情页面的第一个页面入口,内部可以请求详情数据和选项数据
 @RoutePage()
 @RoutePage()
 class FormTermsPage extends HookConsumerWidget {
 class FormTermsPage extends HookConsumerWidget {
   final String type;
   final String type;

+ 244 - 5
packages/cpt_form/lib/modules/apply/guest_vehicle_page.dart

@@ -1,9 +1,22 @@
-
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_field.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/form_require_text.dart';
+import 'package:widgets/shatter/picker_container.dart';
+import 'package:widgets/widget_export.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
+import 'vm/apply_view_model.dart';
+
 @RoutePage()
 @RoutePage()
 class GuestVehiclePage extends HookConsumerWidget {
 class GuestVehiclePage extends HookConsumerWidget {
   const GuestVehiclePage({Key? key}) : super(key: key);
   const GuestVehiclePage({Key? key}) : super(key: key);
@@ -19,11 +32,237 @@ class GuestVehiclePage extends HookConsumerWidget {
 
 
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
+
+    // 使用 useState 来持久化 TextEditingController 和 FocusNode
+    final TextEditingController vehicleNumController = useTextEditingController();
+    final TextEditingController vehicleInfoController = useTextEditingController();
+    final TextEditingController guestNameController = useTextEditingController();
+    final TextEditingController guestPhoneController = useTextEditingController();
+    final FocusNode vehicleNumFocusNode = useFocusNode();
+    final FocusNode vehicleInfoFocusNode = useFocusNode();
+    final FocusNode guestNameFocusNode = useFocusNode();
+    final FocusNode guestPhoneFocusNode = useFocusNode();
+
+    useEffect(() {
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 释放控制器资源
+        vehicleNumController.dispose();
+        vehicleInfoController.dispose();
+        guestNameController.dispose();
+        guestPhoneController.dispose();
+        vehicleNumFocusNode.dispose();
+        vehicleInfoFocusNode.dispose();
+        guestNameFocusNode.dispose();
+        guestPhoneFocusNode.dispose();
+      };
+    }, []);
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
+            body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        //下拉选 - 访问时间
+                        MyTextView(
+                          S.current.date_of_entry,
+                          fontSize: 17,
+                          marginTop: 30,
+                          marginLeft: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        PickerContainer(
+                          hint: S.current.choose_date,
+                          onClick: () {
+                            viewModel.pickDate(null, (date) {
+                              ToastEngine.show("选择的日期:$date");
+                            });
+                          },
+                        ).marginOnly(left: 15, right: 15),
+
+                        //输入框 - 车牌号
+                        FormRequireText(
+                          text: S.current.vehicle_number,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14, bottom: 16, left: 15, right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "vehicle_num",
+                          textInputType: TextInputType.text,
+                          textInputAction: TextInputAction.next,
+                          controller: vehicleNumController,
+                          focusNode: vehicleNumFocusNode,
+                          onSubmit: (formKey, value) {
+                            vehicleNumFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(vehicleInfoFocusNode);
+                          },
+                        ),
+
+                        //输入框 - 车辆信息
+                        FormRequireText(
+                          text: S.current.vehicle_make_model_colour,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14, bottom: 16, left: 15, right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "vehicle_info",
+                          textInputType: TextInputType.text,
+                          textInputAction: TextInputAction.next,
+                          controller: vehicleInfoController,
+                          focusNode: vehicleInfoFocusNode,
+                          onSubmit: (formKey, value) {
+                            vehicleInfoFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(guestNameFocusNode);
+                          },
+                        ),
+
+                        //输入框 - 访客姓名
+                        FormRequireText(
+                          text: S.current.guest_name,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14, bottom: 16, left: 15, right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "guest_name",
+                          textInputType: TextInputType.text,
+                          textInputAction: TextInputAction.next,
+                          controller: guestNameController,
+                          focusNode: guestNameFocusNode,
+                          onSubmit: (formKey, value) {
+                            guestNameFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(guestPhoneFocusNode);
+                          },
+                        ),
+
+                        //输入框 - 访客电话
+                        FormRequireText(
+                          text: S.current.guest_mobile_number,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14, bottom: 16, left: 15, right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "guest_phone",
+                          textInputType: TextInputType.phone,
+                          textInputAction: TextInputAction.done,
+                          controller: guestPhoneController,
+                          focusNode: guestPhoneFocusNode,
+                          onSubmit: (formKey, value) {
+                            guestPhoneFocusNode.unfocus();
+                          },
+                        ),
+
+                      ],
+                    ),
+                  ),
+                ).expanded(),
+
+                //底部按钮
+                MyButton(
+                  onPressed: () {
+                    vehicleNumFocusNode.unfocus();
+                    vehicleInfoFocusNode.unfocus();
+                    guestNameFocusNode.unfocus();
+                    guestPhoneFocusNode.unfocus();
+
+                    viewModel.gotoNextPage();
+                  },
+                  text: S.current.next,
+                  textColor: Colors.white,
+                  backgroundColor: context.appColors.btnBgDefault,
+                  fontWeight: FontWeight.w500,
+                  type: ClickType.throttle,
+                  fontSize: 16,
+                  minHeight: 50,
+                  radius: 0,
+                ),
+              ],
+            )),
+        onWillPop: () async {
+          viewModel.handlePopAction();
+          return true;
+        });
+  }
 
 
-    return Scaffold(
-      appBar: AppBar(title: Text("GuestVehiclePage")),
-      body: Center(
-        child: Text("GuestVehiclePage"),
+  Widget _buildInputLayout(
+    BuildContext context,
+    String key, {
+    double marginTop = 0,
+    bool? showRightIcon = false, //是否展示右侧的布局
+    Widget? rightWidget, //右侧的布局
+    TextInputType textInputType = TextInputType.text,
+    String? errorText,
+    bool obscureText = false,
+    required TextEditingController controller,
+    required FocusNode focusNode,
+    bool enable = true,
+    TextInputAction textInputAction = TextInputAction.done,
+    Function? onSubmit,
+  }) {
+    return IgnoreKeyboardDismiss(
+      child: MyTextField(
+        key,
+        fillBackgroundColor: context.appColors.authFiledBG,
+        "",
+        hintStyle: TextStyle(
+          color: context.appColors.authFiledHint,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        controller: controller,
+        focusNode: focusNode,
+        margin: EdgeInsets.only(top: marginTop, left: 15, right: 15),
+        padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
+        showDivider: false,
+        height: 44,
+        enabled: enable,
+        style: TextStyle(
+          color: context.appColors.authFiledText,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        inputType: textInputType,
+        textInputAction: textInputAction,
+        onSubmit: onSubmit,
+        cursorColor: context.appColors.authFiledText,
+        obscureText: obscureText,
+        errorText: errorText,
+        showLeftIcon: true,
+        showRightIcon: showRightIcon,
+        rightWidget: rightWidget,
       ),
       ),
     );
     );
   }
   }

+ 126 - 7
packages/cpt_form/lib/modules/apply/large_text_box_page.dart

@@ -1,9 +1,18 @@
 
 
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
+import 'vm/apply_view_model.dart';
 @RoutePage()
 @RoutePage()
 class LargeTextBoxPage extends HookConsumerWidget {
 class LargeTextBoxPage extends HookConsumerWidget {
   const LargeTextBoxPage({Key? key}) : super(key: key);
   const LargeTextBoxPage({Key? key}) : super(key: key);
@@ -19,12 +28,122 @@ class LargeTextBoxPage extends HookConsumerWidget {
 
 
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
 
 
-    return Scaffold(
-      appBar: AppBar(title: Text("LargeTextBoxPage")),
-      body: Center(
-        child: Text("LargeTextBoxPage"),
-      ),
-    );
+    // 使用 useState 来持久化 TextEditingController 和 FocusNode
+    final textEditingController = useTextEditingController();
+    final focusNode = useFocusNode();
+
+    useEffect(() {
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 释放控制器资源
+        textEditingController.dispose();
+        focusNode.dispose();
+      };
+    }, []);
+
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
+            body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    margin: const EdgeInsets.symmetric(horizontal: 15),
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        MyTextView(
+                          state.applyDetail?['detail_data']['large_txt'],
+                          fontSize: 17,
+                          marginTop: 30,
+                          marginBottom: 17,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //文本框
+                        IgnoreKeyboardDismiss(
+                          child: Container(
+                            height: 355,
+                            padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                            decoration: BoxDecoration(
+                              color: context.appColors.authFiledBG,
+                              borderRadius: const BorderRadius.all(Radius.circular(5)),
+                            ),
+                            child: TextField(
+                              cursorColor: context.appColors.authFiledText,
+                              cursorWidth: 1.5,
+                              autofocus: false,
+                              enabled: true,
+                              focusNode: focusNode,
+                              controller: textEditingController,
+                              decoration: InputDecoration(
+                                isDense: true,
+                                isCollapsed: true,
+                                border: InputBorder.none,
+                                hintText: S.current.type_here,
+                                hintStyle: TextStyle(
+                                  color: context.appColors.authFiledHint,
+                                  fontSize: 15.0,
+                                  fontWeight: FontWeight.w500,
+                                ),
+                              ),
+                              style: TextStyle(
+                                color: context.appColors.authFiledText,
+                                fontSize: 15.0,
+                                fontWeight: FontWeight.w500,
+                              ),
+                              textInputAction: TextInputAction.done,
+                              onSubmitted: (value) {
+                                FocusScope.of(context).unfocus();
+                              },
+                              maxLines: null,
+                              expands: true,
+                              onChanged: (text) {
+                                // 当文本改变时
+
+                              },
+                            ),
+                          ),
+                        ),
+                      ],
+                    ),
+                  ),
+                ).expanded(),
+
+                //底部按钮
+                MyButton(
+                  onPressed: (){
+                    focusNode.unfocus();
+
+                    viewModel.gotoNextPage();
+                  },
+                  text: S.current.next,
+                  textColor: Colors.white,
+                  backgroundColor: context.appColors.btnBgDefault,
+                  fontWeight: FontWeight.w500,
+                  type: ClickType.throttle,
+                  fontSize: 16,
+                  minHeight: 50,
+                  radius: 0,
+                ),
+              ],
+            )),
+        onWillPop: () async {
+          viewModel.handlePopAction();
+          return true;
+        });
   }
   }
-}
+}

+ 259 - 5
packages/cpt_form/lib/modules/apply/moving_company_page.dart

@@ -1,9 +1,20 @@
-
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_field.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/form_require_text.dart';
+import 'package:widgets/widget_export.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
+import 'vm/apply_view_model.dart';
+
 @RoutePage()
 @RoutePage()
 class MovingCompanyPage extends HookConsumerWidget {
 class MovingCompanyPage extends HookConsumerWidget {
   const MovingCompanyPage({Key? key}) : super(key: key);
   const MovingCompanyPage({Key? key}) : super(key: key);
@@ -19,11 +30,254 @@ class MovingCompanyPage extends HookConsumerWidget {
 
 
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
+
+    // 使用 useState 来持久化 TextEditingController 和 FocusNode
+    final companyController = useTextEditingController();
+    final contactController = useTextEditingController();
+    final phoneController = useTextEditingController();
+    final addressController = useTextEditingController();
+
+    final companyFocusNode = useFocusNode();
+    final contactFocusNode = useFocusNode();
+    final phoneFocusNode = useFocusNode();
+    final addressFocusNode = useFocusNode();
+
+    useEffect(() {
+
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 释放控制器资源
+        companyController.dispose();
+        contactController.dispose();
+        phoneController.dispose();
+        addressController.dispose();
+        companyFocusNode.dispose();
+        contactFocusNode.dispose();
+        phoneFocusNode.dispose();
+        addressFocusNode.dispose();
+      };
+    }, []);
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
+            body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        //输入框 - 搬家公司
+                        FormRequireText(
+                          text: S.current.moving_company,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14, bottom: 16, left: 15, right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "company",
+                          textInputType: TextInputType.text,
+                          textInputAction: TextInputAction.next,
+                          controller: companyController,
+                          focusNode: companyFocusNode,
+                          onSubmit: (formKey, value) {
+                            companyFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(contactFocusNode);
+                          },
+                        ),
+
+                        //输入框 - 联系人
+                        FormRequireText(
+                          text: S.current.person_in_charge,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14, bottom: 16, left: 15, right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "contact",
+                          textInputType: TextInputType.text,
+                          textInputAction: TextInputAction.next,
+                          controller: contactController,
+                          focusNode: contactFocusNode,
+                          onSubmit: (formKey, value) {
+                            contactFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(phoneFocusNode);
+                          },
+                        ),
+
+                        //输入框 - 联系电话
+                        FormRequireText(
+                          text: S.current.mobile_phone,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14, bottom: 16, left: 15, right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "phone",
+                          textInputType: TextInputType.phone,
+                          textInputAction: TextInputAction.next,
+                          controller: phoneController,
+                          focusNode: phoneFocusNode,
+                          onSubmit: (formKey, value) {
+                            phoneFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(addressFocusNode);
+                          },
+                        ),
+
+                        //输入框 - 公司地址
+                        MyTextView(
+                          S.current.company_address,
+                          fontSize: 17,
+                          marginTop: 14,
+                          marginBottom: 16,
+                          marginLeft: 15,
+                          marginRight: 15,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //文本框
+                        IgnoreKeyboardDismiss(
+                          child: Container(
+                            height: 160,
+                            margin: const EdgeInsets.symmetric(horizontal: 15),
+                            padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                            decoration: BoxDecoration(
+                              color: context.appColors.authFiledBG,
+                              borderRadius: const BorderRadius.all(Radius.circular(5)),
+                            ),
+                            child: TextField(
+                              cursorColor: context.appColors.authFiledText,
+                              cursorWidth: 1.5,
+                              autofocus: false,
+                              enabled: true,
+                              focusNode: addressFocusNode,
+                              controller: addressController,
+                              decoration: InputDecoration(
+                                isDense: true,
+                                isCollapsed: true,
+                                border: InputBorder.none,
+                                hintStyle: TextStyle(
+                                  color: context.appColors.authFiledHint,
+                                  fontSize: 16.0,
+                                  fontWeight: FontWeight.w500,
+                                ),
+                              ),
+                              style: TextStyle(
+                                color: context.appColors.authFiledText,
+                                fontSize: 16.0,
+                                fontWeight: FontWeight.w500,
+                              ),
+                              textInputAction: TextInputAction.done,
+                              onSubmitted: (value) {
+                                FocusScope.of(context).unfocus();
+                              },
+                              maxLines: null,
+                              expands: true,
+                              onChanged: (text) {
+                                // 当文本改变时
+                              },
+                            ),
+                          ),
+                        ),
+                      ],
+                    ),
+                  ),
+                ).expanded(),
+
+                //底部按钮
+                MyButton(
+                  onPressed: (){
+                    companyFocusNode.unfocus();
+                    contactFocusNode.unfocus();
+                    phoneFocusNode.unfocus();
+                    addressFocusNode.unfocus();
+
+                    viewModel.gotoNextPage();
+                  },
+                  text: S.current.next,
+                  textColor: Colors.white,
+                  backgroundColor: context.appColors.btnBgDefault,
+                  fontWeight: FontWeight.w500,
+                  type: ClickType.throttle,
+                  fontSize: 16,
+                  minHeight: 50,
+                  radius: 0,
+                ),
+              ],
+            )),
+        onWillPop: () async {
+          viewModel.handlePopAction();
+          return true;
+        });
+  }
 
 
-    return Scaffold(
-      appBar: AppBar(title: Text("MovingCompanyPage")),
-      body: Center(
-        child: Text("MovingCompanyPage"),
+  Widget _buildInputLayout(
+    BuildContext context,
+    String key, {
+    double marginTop = 0,
+    bool? showRightIcon = false, //是否展示右侧的布局
+    Widget? rightWidget, //右侧的布局
+    TextInputType textInputType = TextInputType.text,
+    String? errorText,
+    bool obscureText = false,
+    required TextEditingController controller,
+    required FocusNode focusNode,
+    bool enable = true,
+    TextInputAction textInputAction = TextInputAction.done,
+    Function? onSubmit,
+  }) {
+    return IgnoreKeyboardDismiss(
+      child: MyTextField(
+        key,
+        fillBackgroundColor: context.appColors.authFiledBG,
+        "",
+        hintStyle: TextStyle(
+          color: context.appColors.authFiledHint,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        controller: controller,
+        focusNode: focusNode,
+        margin: EdgeInsets.only(top: marginTop, left: 15, right: 15),
+        padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
+        showDivider: false,
+        height: 44,
+        enabled: enable,
+        style: TextStyle(
+          color: context.appColors.authFiledText,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        inputType: textInputType,
+        textInputAction: textInputAction,
+        onSubmit: onSubmit,
+        cursorColor: context.appColors.authFiledText,
+        obscureText: obscureText,
+        errorText: errorText,
+        showLeftIcon: true,
+        showRightIcon: showRightIcon,
+        rightWidget: rightWidget,
       ),
       ),
     );
     );
   }
   }

+ 121 - 6
packages/cpt_form/lib/modules/apply/moving_date_page.dart

@@ -1,9 +1,19 @@
 
 
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/picker_container.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
+import 'vm/apply_view_model.dart';
 @RoutePage()
 @RoutePage()
 class MovingDatePage extends HookConsumerWidget {
 class MovingDatePage extends HookConsumerWidget {
   const MovingDatePage({Key? key}) : super(key: key);
   const MovingDatePage({Key? key}) : super(key: key);
@@ -19,12 +29,117 @@ class MovingDatePage extends HookConsumerWidget {
 
 
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
 
 
-    return Scaffold(
-      appBar: AppBar(title: Text("MovingDatePage")),
-      body: Center(
-        child: Text("MovingDatePage"),
-      ),
-    );
+    useEffect(() {
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 组件卸载时执行
+      };
+    }, []);
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
+            body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+
+                        //下拉选 - 开始时间
+                        MyTextView(
+                          S.current.start_date_caps,
+                          fontSize: 17,
+                          marginTop: 30,
+                          marginLeft: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        PickerContainer(
+                          hint: S.current.choose_date,
+                          onClick: (){
+                            viewModel.pickDate(null,(date){
+                              ToastEngine.show("选择的日期:$date");
+                            });
+                          },
+                        ).marginOnly(left: 15, right: 15),
+
+                        //下拉选 - 结束时间
+                        MyTextView(
+                          S.current.end_date_caps,
+                          fontSize: 17,
+                          marginTop: 14,
+                          marginLeft: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        PickerContainer(
+                          hint: S.current.choose_date,
+                          onClick: (){
+                            viewModel.pickDate(null,(date){
+                              ToastEngine.show("选择的日期:$date");
+                            });
+                          },
+                        ).marginOnly(left: 15, right: 15),
+
+                        //下拉选 - 到达时间
+                        MyTextView(
+                          S.current.time_of_arrival,
+                          fontSize: 17,
+                          marginTop: 14,
+                          marginLeft: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        PickerContainer(
+                          hint: S.current.choose_date,
+                          onClick: (){
+                            viewModel.pickDate(null,(date){
+                              ToastEngine.show("选择的日期:$date");
+                            });
+                          },
+                        ).marginOnly(left: 15, right: 15),
+
+                      ],
+                    ),
+                  ),
+                ).expanded(),
+
+                //底部按钮
+                MyButton(
+                  onPressed: viewModel.gotoNextPage,
+                  text: S.current.next,
+                  textColor: Colors.white,
+                  backgroundColor: context.appColors.btnBgDefault,
+                  fontWeight: FontWeight.w500,
+                  type: ClickType.throttle,
+                  fontSize: 16,
+                  minHeight: 50,
+                  radius: 0,
+                ),
+              ],
+            )),
+        onWillPop: () async {
+          viewModel.handlePopAction();
+          return true;
+        });
   }
   }
 }
 }

+ 107 - 5
packages/cpt_form/lib/modules/apply/note_management_page.dart

@@ -1,14 +1,18 @@
-
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/generated/l10n.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_button.dart';
 import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
 import 'vm/apply_view_model.dart';
 import 'vm/apply_view_model.dart';
+
 @RoutePage()
 @RoutePage()
 class NoteManagementPage extends HookConsumerWidget {
 class NoteManagementPage extends HookConsumerWidget {
   const NoteManagementPage({Key? key}) : super(key: key);
   const NoteManagementPage({Key? key}) : super(key: key);
@@ -27,16 +31,114 @@ class NoteManagementPage extends HookConsumerWidget {
     final viewModel = ref.watch(applyViewModelProvider.notifier);
     final viewModel = ref.watch(applyViewModelProvider.notifier);
     final state = ref.watch(applyViewModelProvider);
     final state = ref.watch(applyViewModelProvider);
 
 
+    // 使用 useState 来持久化 TextEditingController 和 FocusNode
+    final textEditingController = useTextEditingController();
+    final focusNode = useFocusNode();
+
+    useEffect(() {
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 释放控制器资源
+        textEditingController.dispose();
+        focusNode.dispose();
+      };
+    }, []);
+
+
     return WillPopScope(
     return WillPopScope(
         child: Scaffold(
         child: Scaffold(
-            appBar: AppBar(title: Text("NoteManagementPage")),
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
             body: Column(
             body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               children: [
               children: [
-                Text("NoteManagementPage").expanded(),
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    margin: const EdgeInsets.symmetric(horizontal: 15),
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        MyTextView(
+                          S.current.notes_to_management,
+                          fontSize: 17,
+                          marginTop: 30,
+                          marginBottom: 13,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //Note to Management 的文本
+                        MyTextView(
+                          state.applyDetail?['detail_data']['note_management_txt'],
+                          fontSize: 15,
+                          marginBottom: 18,
+                          isFontRegular: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //文本框
+                        IgnoreKeyboardDismiss(
+                          child: Container(
+                            height: 190,
+                            padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                            decoration: BoxDecoration(
+                              color: context.appColors.authFiledBG,
+                              borderRadius: const BorderRadius.all(Radius.circular(5)),
+                            ),
+                            child: TextField(
+                              cursorColor: context.appColors.authFiledText,
+                              cursorWidth: 1.5,
+                              autofocus: false,
+                              enabled: true,
+                              focusNode: focusNode,
+                              controller: textEditingController,
+                              decoration: InputDecoration(
+                                isDense: true,
+                                isCollapsed: true,
+                                border: InputBorder.none,
+                                hintText: S.current.type_here,
+                                hintStyle: TextStyle(
+                                  color: context.appColors.authFiledHint,
+                                  fontSize: 15.0,
+                                  fontWeight: FontWeight.w500,
+                                ),
+                              ),
+                              style: TextStyle(
+                                color: context.appColors.authFiledText,
+                                fontSize: 15.0,
+                                fontWeight: FontWeight.w500,
+                              ),
+                              textInputAction: TextInputAction.done,
+                              onSubmitted: (value) {
+                                FocusScope.of(context).unfocus();
+                              },
+                              maxLines: null,
+                              expands: true,
+                              onChanged: (text) {
+                                // 当文本改变时
+
+                              },
+                            ),
+                          ),
+                        ),
+                      ],
+                    ),
+                  ),
+                ).expanded(),
 
 
                 //底部按钮
                 //底部按钮
                 MyButton(
                 MyButton(
-                  onPressed: viewModel.gotoNextPage,
+                  onPressed: (){
+                    focusNode.unfocus();
+
+                    viewModel.gotoNextPage();
+                  },
                   text: S.current.next,
                   text: S.current.next,
                   textColor: Colors.white,
                   textColor: Colors.white,
                   backgroundColor: context.appColors.btnBgDefault,
                   backgroundColor: context.appColors.btnBgDefault,
@@ -48,7 +150,7 @@ class NoteManagementPage extends HookConsumerWidget {
                 ),
                 ),
               ],
               ],
             )),
             )),
-        onWillPop: () async{
+        onWillPop: () async {
           viewModel.handlePopAction();
           viewModel.handlePopAction();
           return true;
           return true;
         });
         });

+ 258 - 5
packages/cpt_form/lib/modules/apply/renovation_company_page.dart

@@ -1,9 +1,20 @@
-
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_field.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/form_require_text.dart';
+import 'package:widgets/widget_export.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
+import 'vm/apply_view_model.dart';
+
 @RoutePage()
 @RoutePage()
 class RenovationCompanyPage extends HookConsumerWidget {
 class RenovationCompanyPage extends HookConsumerWidget {
   const RenovationCompanyPage({Key? key}) : super(key: key);
   const RenovationCompanyPage({Key? key}) : super(key: key);
@@ -19,11 +30,253 @@ class RenovationCompanyPage extends HookConsumerWidget {
 
 
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
+
+    // 使用 useState 来持久化 TextEditingController 和 FocusNode
+    final companyController = useTextEditingController();
+    final contactController = useTextEditingController();
+    final phoneController = useTextEditingController();
+    final addressController = useTextEditingController();
+
+    final companyFocusNode = useFocusNode();
+    final contactFocusNode = useFocusNode();
+    final phoneFocusNode = useFocusNode();
+    final addressFocusNode = useFocusNode();
+
+    useEffect(() {
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 释放控制器资源
+        companyController.dispose();
+        contactController.dispose();
+        phoneController.dispose();
+        addressController.dispose();
+        companyFocusNode.dispose();
+        contactFocusNode.dispose();
+        phoneFocusNode.dispose();
+        addressFocusNode.dispose();
+      };
+    }, []);
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
+            body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        //输入框 - 装修公司
+                        FormRequireText(
+                          text: S.current.renovation_company,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14, bottom: 16, left: 15, right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "company",
+                          textInputType: TextInputType.text,
+                          textInputAction: TextInputAction.next,
+                          controller: companyController,
+                          focusNode: companyFocusNode,
+                          onSubmit: (formKey, value) {
+                            companyFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(contactFocusNode);
+                          },
+                        ),
+
+                        //输入框 - 联系人
+                        FormRequireText(
+                          text: S.current.person_in_charge,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14, bottom: 16, left: 15, right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "contact",
+                          textInputType: TextInputType.text,
+                          textInputAction: TextInputAction.next,
+                          controller: contactController,
+                          focusNode: contactFocusNode,
+                          onSubmit: (formKey, value) {
+                            contactFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(phoneFocusNode);
+                          },
+                        ),
+
+                        //输入框 - 联系电话
+                        FormRequireText(
+                          text: S.current.mobile_phone,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14, bottom: 16, left: 15, right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "phone",
+                          textInputType: TextInputType.phone,
+                          textInputAction: TextInputAction.next,
+                          controller: phoneController,
+                          focusNode: phoneFocusNode,
+                          onSubmit: (formKey, value) {
+                            phoneFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(addressFocusNode);
+                          },
+                        ),
+
+                        //输入框 - 公司地址
+                        MyTextView(
+                          S.current.company_address,
+                          fontSize: 17,
+                          marginTop: 14,
+                          marginBottom: 16,
+                          marginLeft: 15,
+                          marginRight: 15,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //文本框
+                        IgnoreKeyboardDismiss(
+                          child: Container(
+                            height: 160,
+                            margin: const EdgeInsets.symmetric(horizontal: 15),
+                            padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                            decoration: BoxDecoration(
+                              color: context.appColors.authFiledBG,
+                              borderRadius: const BorderRadius.all(Radius.circular(5)),
+                            ),
+                            child: TextField(
+                              cursorColor: context.appColors.authFiledText,
+                              cursorWidth: 1.5,
+                              autofocus: false,
+                              enabled: true,
+                              focusNode: addressFocusNode,
+                              controller: addressController,
+                              decoration: InputDecoration(
+                                isDense: true,
+                                isCollapsed: true,
+                                border: InputBorder.none,
+                                hintStyle: TextStyle(
+                                  color: context.appColors.authFiledHint,
+                                  fontSize: 16.0,
+                                  fontWeight: FontWeight.w500,
+                                ),
+                              ),
+                              style: TextStyle(
+                                color: context.appColors.authFiledText,
+                                fontSize: 16.0,
+                                fontWeight: FontWeight.w500,
+                              ),
+                              textInputAction: TextInputAction.done,
+                              onSubmitted: (value) {
+                                FocusScope.of(context).unfocus();
+                              },
+                              maxLines: null,
+                              expands: true,
+                              onChanged: (text) {
+                                // 当文本改变时
+                              },
+                            ),
+                          ),
+                        ),
+                      ],
+                    ),
+                  ),
+                ).expanded(),
+
+                //底部按钮
+                MyButton(
+                  onPressed: () {
+                    companyFocusNode.unfocus();
+                    contactFocusNode.unfocus();
+                    phoneFocusNode.unfocus();
+                    addressFocusNode.unfocus();
+
+                    viewModel.gotoNextPage();
+                  },
+                  text: S.current.next,
+                  textColor: Colors.white,
+                  backgroundColor: context.appColors.btnBgDefault,
+                  fontWeight: FontWeight.w500,
+                  type: ClickType.throttle,
+                  fontSize: 16,
+                  minHeight: 50,
+                  radius: 0,
+                ),
+              ],
+            )),
+        onWillPop: () async {
+          viewModel.handlePopAction();
+          return true;
+        });
+  }
 
 
-    return Scaffold(
-      appBar: AppBar(title: Text("RenovationCompanyPage")),
-      body: Center(
-        child: Text("RenovationCompanyPage"),
+  Widget _buildInputLayout(
+    BuildContext context,
+    String key, {
+    double marginTop = 0,
+    bool? showRightIcon = false, //是否展示右侧的布局
+    Widget? rightWidget, //右侧的布局
+    TextInputType textInputType = TextInputType.text,
+    String? errorText,
+    bool obscureText = false,
+    required TextEditingController controller,
+    required FocusNode focusNode,
+    bool enable = true,
+    TextInputAction textInputAction = TextInputAction.done,
+    Function? onSubmit,
+  }) {
+    return IgnoreKeyboardDismiss(
+      child: MyTextField(
+        key,
+        fillBackgroundColor: context.appColors.authFiledBG,
+        "",
+        hintStyle: TextStyle(
+          color: context.appColors.authFiledHint,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        controller: controller,
+        focusNode: focusNode,
+        margin: EdgeInsets.only(top: marginTop, left: 15, right: 15),
+        padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
+        showDivider: false,
+        height: 44,
+        enabled: enable,
+        style: TextStyle(
+          color: context.appColors.authFiledText,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        inputType: textInputType,
+        textInputAction: textInputAction,
+        onSubmit: onSubmit,
+        cursorColor: context.appColors.authFiledText,
+        obscureText: obscureText,
+        errorText: errorText,
+        showLeftIcon: true,
+        showRightIcon: showRightIcon,
+        rightWidget: rightWidget,
       ),
       ),
     );
     );
   }
   }

+ 142 - 6
packages/cpt_form/lib/modules/apply/renovation_date_page.dart

@@ -1,9 +1,20 @@
 
 
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/picker_container.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
+import 'vm/apply_view_model.dart';
+
 @RoutePage()
 @RoutePage()
 class RenovationDatePage extends HookConsumerWidget {
 class RenovationDatePage extends HookConsumerWidget {
   const RenovationDatePage({Key? key}) : super(key: key);
   const RenovationDatePage({Key? key}) : super(key: key);
@@ -19,12 +30,137 @@ class RenovationDatePage extends HookConsumerWidget {
 
 
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
+
+    useEffect(() {
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 组件卸载时执行
+      };
+    }, []);
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
+            body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+
+                        //下拉选 - 开始时间
+                        MyTextView(
+                          S.current.renovation_start_date,
+                          fontSize: 17,
+                          marginTop: 30,
+                          marginLeft: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        PickerContainer(
+                          hint: S.current.choose_date,
+                          onClick: (){
+                            viewModel.pickDate(null,(date){
+                              ToastEngine.show("选择的日期:$date");
+                            });
+                          },
+                        ).marginOnly(left: 15, right: 15),
+
+                        //下拉选 - 结束时间
+                        MyTextView(
+                          S.current.renovation_end_date,
+                          fontSize: 17,
+                          marginTop: 14,
+                          marginLeft: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        PickerContainer(
+                          hint: S.current.choose_date,
+                          onClick: (){
+                            viewModel.pickDate(null,(date){
+                              ToastEngine.show("选择的日期:$date");
+                            });
+                          },
+                        ).marginOnly(left: 15, right: 15),
+
+                        //下拉选 - 施工时间开始时间
+                        MyTextView(
+                          S.current.hacking_start_date,
+                          fontSize: 17,
+                          marginTop: 14,
+                          marginLeft: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        PickerContainer(
+                          hint: S.current.choose_date,
+                          onClick: (){
+                            viewModel.pickDate(null,(date){
+                              ToastEngine.show("选择的日期:$date");
+                            });
+                          },
+                        ).marginOnly(left: 15, right: 15),
+
+                        //下拉选 - 施工时间结束时间
+                        MyTextView(
+                          S.current.hacking_end_date,
+                          fontSize: 17,
+                          marginTop: 14,
+                          marginLeft: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        PickerContainer(
+                          hint: S.current.choose_date,
+                          onClick: (){
+                            viewModel.pickDate(null,(date){
+                              ToastEngine.show("选择的日期:$date");
+                            });
+                          },
+                        ).marginOnly(left: 15, right: 15),
+
+                      ],
+                    ),
+                  ),
+                ).expanded(),
 
 
-    return Scaffold(
-      appBar: AppBar(title: Text("RenovationDatePage")),
-      body: Center(
-        child: Text("RenovationDatePage"),
-      ),
-    );
+                //底部按钮
+                MyButton(
+                  onPressed: viewModel.gotoNextPage,
+                  text: S.current.next,
+                  textColor: Colors.white,
+                  backgroundColor: context.appColors.btnBgDefault,
+                  fontWeight: FontWeight.w500,
+                  type: ClickType.throttle,
+                  fontSize: 16,
+                  minHeight: 50,
+                  radius: 0,
+                ),
+              ],
+            )),
+        onWillPop: () async {
+          viewModel.handlePopAction();
+          return true;
+        });
   }
   }
 }
 }

+ 147 - 5
packages/cpt_form/lib/modules/apply/signature_page.dart

@@ -1,8 +1,17 @@
 
 
+import 'package:cpt_form/modules/apply/vm/apply_view_model.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
 
 
 @RoutePage()
 @RoutePage()
@@ -20,12 +29,145 @@ class SignaturePage extends HookConsumerWidget {
 
 
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
 
 
-    return Scaffold(
-      appBar: AppBar(title: Text("SignaturePage")),
-      body: Center(
-        child: Text("SignaturePage"),
-      ),
+    //签名版配置
+    HandSignatureControl handSignatureControl = HandSignatureControl(
+      threshold: 3.0,
+      smoothRatio: 190 / 345,
+      velocityRange: 2.0,
     );
     );
+
+    useEffect(() {
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 组件卸载时执行
+        handSignatureControl.dispose();
+      };
+    }, []);
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
+            body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    margin: const EdgeInsets.symmetric(horizontal: 15),
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        MyTextView(
+                          S.current.signature,
+                          fontSize: 17,
+                          marginTop: 30,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //签名的说明文本
+                        MyTextView(
+                          state.applyDetail?['detail_data']['signature_txt'],
+                          fontSize: 15,
+                          marginTop: 26,
+                          marginBottom: 21,
+                          isFontRegular: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        //签名框
+                        Stack(
+                          children: [
+                            //签名
+                            Center(
+                              child: Container(
+                                width: 345,
+                                height: 190,
+                                color: context.appColors.imgGrayBg,
+                                child: HandSignature(
+                                  control: handSignatureControl,
+                                  color: context.appColors.textBlack,
+                                  width: 1.0,
+                                  maxWidth: 3.5,
+                                  type: SignatureDrawType.shape,
+                                ),
+                              ),
+                            ),
+
+                            //清除签名
+                            Align(
+                              alignment: Alignment.bottomRight,
+                              child: MyTextView(
+                                S.current.clean,
+                                fontSize: 12,
+                                textColor: Colors.white,
+                                cornerRadius: 10.37,
+                                backgroundColor: context.appColors.btnBgDefault,
+                                paddingTop: 4,
+                                paddingBottom: 4,
+                                paddingLeft: 11,
+                                paddingRight: 11,
+                                margin: 10,
+                                onClick: () {
+                                  handSignatureControl.clear();
+                                },
+                              ),
+                            ),
+                          ],
+                        ).constrained(
+                          width: 345,
+                          height: 190,
+                        ),
+
+                        RichText(
+                          text: TextSpan(
+                            style: TextStyle(fontSize: 15, fontWeight:  FontWeight.w400, color: context.appColors.textBlack),
+                            children: <TextSpan>[
+                              TextSpan(
+                                text: S.current.signed_and_agreed_by,
+                              ),
+                              TextSpan(
+                                text: " Wu Bing Bing ",
+                                style: TextStyle(color: context.appColors.textPrimary),
+                              ),
+                              TextSpan(
+                                text: " 21 Nov 2024, 03:08 PM",
+                              ),
+                            ],
+                          ),
+                        ).marginOnly(top: 21,bottom: 21),
+
+                      ],
+                    ),
+                  ),
+                ).expanded(),
+
+                //底部按钮
+                MyButton(
+                  onPressed: viewModel.gotoNextPage,
+                  text: S.current.submit,
+                  textColor: Colors.white,
+                  backgroundColor: context.appColors.btnBgDefault,
+                  fontWeight: FontWeight.w500,
+                  type: ClickType.throttle,
+                  fontSize: 16,
+                  minHeight: 50,
+                  radius: 0,
+                ),
+              ],
+            )),
+        onWillPop: () async {
+          viewModel.handlePopAction();
+          return true;
+        });
   }
   }
 }
 }

+ 23 - 3
packages/cpt_form/lib/modules/apply/type_of_application_page.dart

@@ -6,7 +6,10 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_button.dart';
 import 'package:widgets/my_button.dart';
+import 'package:widgets/shatter/picker_container.dart';
+import 'package:widgets/my_text_view.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
 import 'vm/apply_view_model.dart';
 import 'vm/apply_view_model.dart';
 
 
@@ -30,10 +33,27 @@ class TypeOfApplicationPage extends HookConsumerWidget {
 
 
     return WillPopScope(
     return WillPopScope(
         child: Scaffold(
         child: Scaffold(
-            appBar: AppBar(title: Text("TypeOfApplicationPage")),
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
             body: Column(
             body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               children: [
               children: [
-                Text("TypeOfApplicationPage").expanded(),
+                MyTextView(
+                  S.current.type_of_application,
+                  fontSize: 17,
+                  marginTop: 30,
+                  marginLeft: 15,
+                  marginBottom: 16,
+                  isFontMedium: true,
+                  textColor: context.appColors.textBlack,
+                ),
+
+                PickerContainer(
+                  hint: S.current.choose_an_option,
+                  onClick: viewModel.pickOption,
+                ).marginOnly(left: 15, right: 15),
+
+                const Spacer(),
 
 
                 //底部按钮
                 //底部按钮
                 MyButton(
                 MyButton(
@@ -49,7 +69,7 @@ class TypeOfApplicationPage extends HookConsumerWidget {
                 ),
                 ),
               ],
               ],
             )),
             )),
-        onWillPop: () async{
+        onWillPop: () async {
           viewModel.handlePopAction();
           viewModel.handlePopAction();
           return true;
           return true;
         });
         });

+ 237 - 4
packages/cpt_form/lib/modules/apply/vehicle_info_page.dart

@@ -1,8 +1,20 @@
 
 
+import 'package:cpt_form/modules/apply/vm/apply_view_model.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_field.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/form_require_text.dart';
+import 'package:widgets/shatter/picker_container.dart';
+import 'package:widgets/widget_export.dart';
 import '../../router/page/form_page_router.dart';
 import '../../router/page/form_page_router.dart';
 
 
 @RoutePage()
 @RoutePage()
@@ -20,12 +32,233 @@ class VehicleInfoPage extends HookConsumerWidget {
 
 
   @override
   @override
   Widget build(BuildContext context, WidgetRef ref) {
   Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
 
 
-    return Scaffold(
-      appBar: AppBar(title: Text("VehicleInfoPage")),
-      body: Center(
-        child: Text("VehicleInfoPage"),
+    // 使用 useState 来持久化 TextEditingController 和 FocusNode
+    final TextEditingController vehicleNumController = useTextEditingController();
+    final TextEditingController iuNumController = useTextEditingController();
+    final TextEditingController vehicleInfoController = useTextEditingController();
+    final FocusNode vehicleNumFocusNode = useFocusNode();
+    final FocusNode iuNumFocusNode = useFocusNode();
+    final FocusNode vehicleInfoFocusNode = useFocusNode();
+
+
+    useEffect(() {
+
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 释放控制器资源
+        vehicleNumController.dispose();
+        iuNumController.dispose();
+        vehicleInfoController.dispose();
+        vehicleNumFocusNode.dispose();
+        iuNumFocusNode.dispose();
+        vehicleInfoFocusNode.dispose();
+      };
+    }, []);
+
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
+            body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Container(
+                    width: double.infinity,
+                    child: Column(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+
+                        //下拉选 - Type类型
+                        MyTextView(
+                          S.current.type_of_application,
+                          fontSize: 17,
+                          marginTop: 30,
+                          marginLeft: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        PickerContainer(
+                          hint: S.current.choose_an_option,
+                          onClick: viewModel.pickOption,
+                        ).marginOnly(left: 15, right: 15),
+
+                        //下拉选 - 所有权状态
+                        MyTextView(
+                          S.current.ownership_status,
+                          fontSize: 17,
+                          marginTop: 14,
+                          marginLeft: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        PickerContainer(
+                          hint: S.current.choose_an_option,
+                          onClick: viewModel.pickOption,
+                        ).marginOnly(left: 15, right: 15),
+
+
+                        //输入框 - 车牌号
+                        FormRequireText(
+                          text: S.current.vehicle_number,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14,bottom: 16,left: 15,right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "vehicle_num",
+                          textInputType: TextInputType.text,
+                          textInputAction: TextInputAction.next,
+                          controller: vehicleNumController,
+                          focusNode: vehicleNumFocusNode,
+                          onSubmit: (formKey, value) {
+                            vehicleNumFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(iuNumFocusNode);
+                          },
+                        ),
+
+                        //输入框 - IU 号
+                        MyTextView(
+                          S.current.iu_number,
+                          fontSize: 17,
+                          marginTop: 14,
+                          marginLeft: 15,
+                          marginRight: 15,
+                          marginBottom: 16,
+                          isFontMedium: true,
+                          textColor: context.appColors.textBlack,
+                        ),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "iu_num",
+                          textInputType: TextInputType.text,
+                          textInputAction: TextInputAction.next,
+                          controller: iuNumController,
+                          focusNode: iuNumFocusNode,
+                          onSubmit: (formKey, value) {
+                            iuNumFocusNode.unfocus();
+                            FocusScope.of(context).requestFocus(vehicleInfoFocusNode);
+                          },
+                        ),
+
+                        //输入框 - 车辆信息
+                        FormRequireText(
+                          text: S.current.vehicle_make_model_colour,
+                          textColor: context.appColors.textBlack,
+                          fontSize: 17,
+                          fontWeight: FontWeight.w500,
+                        ).marginOnly(top: 14,bottom: 16,left: 15,right: 15),
+
+                        // 表单
+                        _buildInputLayout(
+                          context,
+                          "vehicle_info",
+                          textInputType: TextInputType.text,
+                          textInputAction: TextInputAction.done,
+                          controller: vehicleInfoController,
+                          focusNode: vehicleInfoFocusNode,
+                          onSubmit: (formKey, value) {
+                            vehicleInfoFocusNode.unfocus();
+                          },
+                        ),
+
+                      ],
+                    ),
+                  ),
+                ).expanded(),
+
+                //底部按钮
+                MyButton(
+                  onPressed: (){
+                    vehicleNumFocusNode.unfocus();
+                    iuNumFocusNode.unfocus();
+                    vehicleInfoFocusNode.unfocus();
+
+                    viewModel.gotoNextPage();
+                  },
+                  text: S.current.next,
+                  textColor: Colors.white,
+                  backgroundColor: context.appColors.btnBgDefault,
+                  fontWeight: FontWeight.w500,
+                  type: ClickType.throttle,
+                  fontSize: 16,
+                  minHeight: 50,
+                  radius: 0,
+                ),
+              ],
+            )),
+        onWillPop: () async {
+          viewModel.handlePopAction();
+          return true;
+        });
+  }
+
+  Widget _buildInputLayout(
+      BuildContext context,
+      String key, {
+        double marginTop = 0,
+        bool? showRightIcon = false, //是否展示右侧的布局
+        Widget? rightWidget, //右侧的布局
+        TextInputType textInputType = TextInputType.text,
+        String? errorText,
+        bool obscureText = false,
+        required TextEditingController controller,
+        required FocusNode focusNode,
+        bool enable = true,
+        TextInputAction textInputAction = TextInputAction.done,
+        Function? onSubmit,
+      }) {
+    return IgnoreKeyboardDismiss(
+      child: MyTextField(
+        key,
+        fillBackgroundColor: context.appColors.authFiledBG,
+        "",
+        hintStyle: TextStyle(
+          color: context.appColors.authFiledHint,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        controller: controller,
+        focusNode: focusNode,
+        margin: EdgeInsets.only(top: marginTop,left: 15,right: 15),
+        padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
+        showDivider: false,
+        height: 44,
+        enabled: enable,
+        style: TextStyle(
+          color: context.appColors.authFiledText,
+          fontSize: 16.0,
+          fontWeight: FontWeight.w500,
+        ),
+        inputType: textInputType,
+        textInputAction: textInputAction,
+        onSubmit: onSubmit,
+        cursorColor: context.appColors.authFiledText,
+        obscureText: obscureText,
+        errorText: errorText,
+        showLeftIcon: true,
+        showRightIcon: showRightIcon,
+        rightWidget: rightWidget,
       ),
       ),
     );
     );
   }
   }
+
 }
 }

+ 7 - 3
packages/cpt_form/lib/modules/apply/vm/apply_state.dart

@@ -1,14 +1,18 @@
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:flutter/material.dart';
+
 class ApplyState {
 class ApplyState {
-  //详情页面的索引,不参与Copy
+
+  //详情页面的索引,为了记录详情页面组的当前跳转索引,不参与状态所以不用参与Copy方法
   int detailPageIndex;
   int detailPageIndex;
 
 
-  //表单类型
+  //表单类型(列表的Form类型)
   String? formType;
   String? formType;
 
 
   //是否可编辑
   //是否可编辑
   bool enableEdit;
   bool enableEdit;
 
 
-  //表单对应的详情数据
+  //详情数据
   Map<String, dynamic>? applyDetail;
   Map<String, dynamic>? applyDetail;
 
 
   ApplyState({
   ApplyState({

+ 28 - 0
packages/cpt_form/lib/modules/apply/vm/apply_view_model.dart

@@ -1,8 +1,14 @@
+import 'dart:ui';
+
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:flutter/cupertino.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/picker/date_picker_util.dart';
 import '../../form/form_page.dart';
 import '../../form/form_page.dart';
 import '../../form/form_types.dart';
 import '../../form/form_types.dart';
 import 'apply_state.dart';
 import 'apply_state.dart';
+import 'package:widgets/picker/option_pick_util.dart';
 
 
 part 'apply_view_model.g.dart';
 part 'apply_view_model.g.dart';
 
 
@@ -36,4 +42,26 @@ class ApplyViewModel extends _$ApplyViewModel {
   void handlePopAction() {
   void handlePopAction() {
     state.detailPageIndex--;
     state.detailPageIndex--;
   }
   }
+
+  //选择一个选项
+  void pickOption() {
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: ["选项1", "选项2", "选项3"],
+      initialSelectIndex: 0,
+      onPickerChanged: (_, index) {},
+    );
+  }
+
+  //选择一个日期,并回调出去
+  void pickDate(DateTime? selectedDate, void Function(DateTime) dateCallback) {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: selectedDate ?? DateTime.now(),
+      mode: CupertinoDatePickerMode.date,
+      onDateTimeChanged: (date) {
+        dateCallback.call(date);
+      },
+      title: S.current.choose_date,
+    );
+  }
+
 }
 }

+ 1 - 1
packages/cpt_form/lib/modules/apply/vm/apply_view_model.g.dart

@@ -6,7 +6,7 @@ part of 'apply_view_model.dart';
 // RiverpodGenerator
 // RiverpodGenerator
 // **************************************************************************
 // **************************************************************************
 
 
-String _$applyViewModelHash() => r'22aedac0efe149d5544938acf75c975b743c7cd9';
+String _$applyViewModelHash() => r'ea1cdebf421fe02f772e0f1896e1bf37df0b5a5c';
 
 
 /// See also [ApplyViewModel].
 /// See also [ApplyViewModel].
 @ProviderFor(ApplyViewModel)
 @ProviderFor(ApplyViewModel)

+ 156 - 0
packages/cpt_form/lib/modules/detail/detail_approved_fragment.dart

@@ -0,0 +1,156 @@
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_view.dart';
+
+class DetailApprovedFragment extends HookConsumerWidget {
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    return SizedBox(
+      width: double.infinity,
+      height: double.infinity,
+      child: Column(
+        children: [
+          SingleChildScrollView(
+            scrollDirection: Axis.vertical,
+            physics: const BouncingScrollPhysics(),
+            child: Container(
+              width: double.infinity,
+              color: context.appColors.whiteBG,
+              child: Column(
+                mainAxisSize: MainAxisSize.min,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                children: [
+                  //状态
+                  MyTextView(
+                    S.current.approved,
+                    marginTop: 17,
+                    textColor: context.appColors.textPrimary,
+                    fontSize: 24,
+                    isFontMedium: true,
+                  ),
+                  MyTextView(
+                    S.current.status,
+                    marginTop: 12,
+                    textColor: context.appColors.textBlack,
+                    fontSize: 17,
+                    isFontRegular: true,
+                  ),
+
+                  //Send On时间
+                  RichText(
+                    text: TextSpan(
+                      style: TextStyle(fontSize: 15, fontWeight: FontWeight.w400, color: context.appColors.textBlack),
+                      children: <TextSpan>[
+                        TextSpan(
+                          text: S.current.send_on_sometime(' '),
+                        ),
+                        TextSpan(
+                          text: "21 Nov 2024, 03:08 PM",
+                          style: TextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: context.appColors.textBlack),
+                        ),
+                      ],
+                    ),
+                  ).marginOnly(top: 12),
+
+                  //处理时间
+                  RichText(
+                    text: TextSpan(
+                      style: TextStyle(fontSize: 15, fontWeight: FontWeight.w400, color: context.appColors.textBlack),
+                      children: <TextSpan>[
+                        TextSpan(
+                          text: S.current.approved_on_sometime(' '),
+                        ),
+                        TextSpan(
+                          text: "21 Nov 2024, 03:08 PM",
+                          style: TextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: context.appColors.textBlack),
+                        ),
+                      ],
+                    ),
+                  ).marginOnly(top: 10),
+
+                  //分割线
+                  Container(
+                    margin: const EdgeInsets.only(top: 19, bottom: 33),
+                    width: 260,
+                    color: context.appColors.dividerDefault,
+                    height: 0.5,
+                  ),
+
+                  //通行卡的数据
+                  MyTextView(
+                    S.current.serial_number,
+                    marginLeft: 50,
+                    marginRight: 50,
+                    textAlign: TextAlign.center,
+                    textColor: context.appColors.textBlack,
+                    fontSize: 17,
+                    isFontRegular: true,
+                  ),
+
+                  MyTextView(
+                    "PL24087",
+                    marginTop: 16,
+                    marginBottom: 16,
+                    textColor: context.appColors.textPrimary,
+                    fontSize: 24,
+                    isFontMedium: true,
+                  ),
+
+                  //提示 Feedback 文本
+                  MyTextView(
+                    S.current.send_feedback_management,
+                    marginBottom: 33,
+                    marginLeft: 50,
+                    marginRight: 50,
+                    textAlign: TextAlign.center,
+                    textColor: context.appColors.textBlack,
+                    fontSize: 15,
+                    isFontRegular: true,
+                  ),
+                ],
+              ),
+            ),
+          ).expanded(),
+          Row(
+            children: [
+              MyButton(
+                onPressed: () {},
+                text: S.current.send_feedback,
+                textColor: Colors.white,
+                fontSize: 15,
+                fontWeight: FontWeight.w400,
+                radius: 7,
+                backgroundColor: context.appColors.btnBgDefault,
+              ).expanded(),
+              const SizedBox(width: 10),
+              MyButton(
+                onPressed: () {},
+                text: S.current.view_application,
+                textColor: Colors.white,
+                fontSize: 15,
+                fontWeight: FontWeight.w400,
+                radius: 7,
+                backgroundColor: context.appColors.greenBG,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 15, right: 15),
+          MyButton(
+            onPressed: () {},
+            text: S.current.remove,
+            textColor: Colors.white,
+            fontSize: 15,
+            fontWeight: FontWeight.w400,
+            radius: 7,
+            backgroundColor: context.appColors.orangeBG,
+          ).marginOnly(top: 6, left: 15, right: 15, bottom: 17.5),
+        ],
+      ),
+    );
+  }
+}

+ 155 - 0
packages/cpt_form/lib/modules/detail/detail_not_approved_fragment.dart

@@ -0,0 +1,155 @@
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_view.dart';
+
+class DetailNotApprovedFragment extends HookConsumerWidget {
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    return SizedBox(
+      width: double.infinity,
+      height: double.infinity,
+      child: Column(
+        children: [
+          SingleChildScrollView(
+            scrollDirection: Axis.vertical,
+            physics: const BouncingScrollPhysics(),
+            child: Container(
+              width: double.infinity,
+              color: context.appColors.whiteBG,
+              child: Column(
+                mainAxisSize: MainAxisSize.min,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                children: [
+                  //状态
+                  MyTextView(
+                    S.current.not_approved,
+                    marginTop: 17,
+                    textColor: context.appColors.textPrimary,
+                    fontSize: 24,
+                    isFontMedium: true,
+                  ),
+                  MyTextView(
+                    S.current.status,
+                    marginTop: 12,
+                    textColor: context.appColors.textBlack,
+                    fontSize: 17,
+                    isFontRegular: true,
+                  ),
+
+                  //Send On时间
+                  RichText(
+                    text: TextSpan(
+                      style: TextStyle(fontSize: 15, fontWeight: FontWeight.w400, color: context.appColors.textBlack),
+                      children: <TextSpan>[
+                        TextSpan(
+                          text: S.current.send_on_sometime(' '),
+                        ),
+                        TextSpan(
+                          text: "21 Nov 2024, 03:08 PM",
+                          style: TextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: context.appColors.textBlack),
+                        ),
+                      ],
+                    ),
+                  ).marginOnly(top: 12),
+
+                  //处理时间
+                  RichText(
+                    text: TextSpan(
+                      style: TextStyle(fontSize: 15, fontWeight: FontWeight.w400, color: context.appColors.textBlack),
+                      children: <TextSpan>[
+                        TextSpan(
+                          text: S.current.approved_on_sometime(' '),
+                        ),
+                        TextSpan(
+                          text: "21 Nov 2024, 03:08 PM",
+                          style: TextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: context.appColors.textBlack),
+                        ),
+                      ],
+                    ),
+                  ).marginOnly(top: 10),
+
+                  //分割线
+                  Container(
+                    margin: const EdgeInsets.only(top: 19, bottom: 20),
+                    width: 260,
+                    color: context.appColors.dividerDefault,
+                    height: 0.5,
+                  ),
+
+                  //拒绝原因
+                  MyTextView(
+                    "The information you sent is incorrect. Please confirm the information and resubmit!",
+                    marginLeft: 50,
+                    marginRight: 50,
+                    textAlign: TextAlign.center,
+                    textColor: context.appColors.textBlack,
+                    fontSize: 17,
+                    isFontRegular: true,
+                  ),
+
+                  //分割线
+                  Container(
+                    margin: const EdgeInsets.only(top: 19, bottom: 20),
+                    width: 260,
+                    color: context.appColors.dividerDefault,
+                    height: 0.5,
+                  ),
+
+                  //提示 Feedback 文本
+                  MyTextView(
+                    S.current.send_feedback_management,
+                    marginBottom: 33,
+                    marginLeft: 50,
+                    marginRight: 50,
+                    textAlign: TextAlign.center,
+                    textColor: context.appColors.textBlack,
+                    fontSize: 15,
+                    isFontRegular: true,
+                  ),
+                ],
+              ),
+            ),
+          ).expanded(),
+          Row(
+            children: [
+              MyButton(
+                onPressed: () {},
+                text: S.current.send_feedback,
+                textColor: Colors.white,
+                fontSize: 15,
+                fontWeight: FontWeight.w400,
+                radius: 7,
+                backgroundColor: context.appColors.btnBgDefault,
+              ).expanded(),
+              const SizedBox(width: 10),
+              MyButton(
+                onPressed: () {},
+                text: S.current.view_application,
+                textColor: Colors.white,
+                fontSize: 15,
+                fontWeight: FontWeight.w400,
+                radius: 7,
+                backgroundColor: context.appColors.greenBG,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 15, right: 15),
+          MyButton(
+            onPressed: () {},
+            text: S.current.remove,
+            textColor: Colors.white,
+            fontSize: 15,
+            fontWeight: FontWeight.w400,
+            radius: 7,
+            backgroundColor: context.appColors.orangeBG,
+          ).marginOnly(top: 6, left: 15, right: 15, bottom: 17.5),
+        ],
+      ),
+    );
+  }
+}

+ 153 - 0
packages/cpt_form/lib/modules/detail/detail_processing_fragment.dart

@@ -0,0 +1,153 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class DetailProcessingFragment extends HookConsumerWidget {
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    return SizedBox(
+      width: double.infinity,
+      height: double.infinity,
+      child: Column(
+        children: [
+          SingleChildScrollView(
+            scrollDirection: Axis.vertical,
+            physics: const BouncingScrollPhysics(),
+            child: Container(
+              width: double.infinity,
+              color: context.appColors.whiteBG,
+              child: Column(
+                mainAxisSize: MainAxisSize.min,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                children: [
+                  //状态
+                  MyTextView(
+                    S.current.processing,
+                    marginTop: 17,
+                    textColor: context.appColors.textPrimary,
+                    fontSize: 24,
+                    isFontMedium: true,
+                  ),
+                  MyTextView(
+                    S.current.status,
+                    marginTop: 12,
+                    textColor: context.appColors.textBlack,
+                    fontSize: 17,
+                    isFontRegular: true,
+                  ),
+
+                  //Send On时间
+                  RichText(
+                    text: TextSpan(
+                      style: TextStyle(fontSize: 15, fontWeight: FontWeight.w400, color: context.appColors.textBlack),
+                      children: <TextSpan>[
+                        TextSpan(
+                          text: S.current.send_on_sometime(' '),
+                        ),
+                        TextSpan(
+                          text: "21 Nov 2024, 03:08 PM",
+                          style: TextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: context.appColors.textBlack),
+                        ),
+                      ],
+                    ),
+                  ).marginOnly(top: 12,bottom: 28),
+
+                  //图片
+                  const MyAssetImage(
+                    Assets.formDetailProcessingImg,
+                    width: 40,
+                    height: 51.5,
+                  ),
+
+                  //提示文本
+                  MyTextView(
+                    S.current.processing_in_progress,
+                    marginTop: 15,
+                    marginBottom: 34,
+                    marginLeft: 50,
+                    marginRight: 50,
+                    textAlign: TextAlign.center,
+                    textColor: context.appColors.textBlack,
+                    fontSize: 15,
+                    isFontRegular: true,
+                  ),
+
+                  Container(
+                    color: context.appColors.backgroundDark,
+                    height: 10,
+                  ),
+
+                  Align(
+                    alignment: Alignment.centerLeft, // 左对齐
+                    child: MyTextView(
+                      "Access Card - Owner",
+                      marginTop: 22,
+                      marginBottom: 12,
+                      marginLeft: 18,
+                      textColor: context.appColors.textPrimary,
+                      fontSize: 17,
+                      isFontMedium: true,
+                    ),
+                  ),
+
+                  Align(
+                    alignment: Alignment.centerLeft, // 左对齐
+                    child: MyTextView(
+                      "Damaged or faulty",
+                      marginBottom: 22,
+                      marginLeft: 18,
+                      textColor: context.appColors.textBlack,
+                      fontSize: 15,
+                      isFontMedium: true,
+                    ),
+                  ),
+
+                ],
+              ),
+            ),
+          ).expanded(),
+          Row(
+            children: [
+              MyButton(
+                onPressed: () {},
+                text: S.current.send_feedback,
+                textColor: Colors.white,
+                fontSize: 15,
+                fontWeight: FontWeight.w400,
+                radius: 7,
+                backgroundColor: context.appColors.btnBgDefault,
+              ).expanded(),
+              const SizedBox(width: 10),
+              MyButton(
+                onPressed: () {},
+                text: S.current.view_application,
+                textColor: Colors.white,
+                fontSize: 15,
+                fontWeight: FontWeight.w400,
+                radius: 7,
+                backgroundColor: context.appColors.greenBG,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 15, right: 15),
+          MyButton(
+            onPressed: () {},
+            text: S.current.remove,
+            textColor: Colors.white,
+            fontSize: 15,
+            fontWeight: FontWeight.w400,
+            radius: 7,
+            backgroundColor: context.appColors.orangeBG,
+          ).marginOnly(top: 6, left: 15, right: 15, bottom: 17.5),
+        ],
+      ),
+    );
+  }
+}

+ 75 - 0
packages/cpt_form/lib/modules/detail/form_detail_page.dart

@@ -0,0 +1,75 @@
+import 'package:cpt_form/modules/detail/detail_processing_fragment.dart';
+import 'package:cpt_form/modules/form/form_types.dart';
+import 'package:cs_resources/generated/l10n.dart';
+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:router/ext/auto_router_extensions.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_appbar.dart';
+
+import '../../router/page/form_page_router.dart';
+import 'detail_approved_fragment.dart';
+import 'detail_not_approved_fragment.dart';
+import 'form_detail_view_model.dart';
+
+@RoutePage()
+class FormDetailPage extends HookConsumerWidget {
+  final String applyId;
+  final String type;
+
+  const FormDetailPage({
+    Key? key,
+    @PathParam() required this.applyId,
+    @PathParam() required this.type,
+  }) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({
+    BuildContext? context,
+    required String applyId,
+    required String type,
+  }) {
+    if (context != null) {
+      context.router.push(FormDetailPageRoute(applyId: applyId, type: type));
+    } else {
+      appRouter.push(FormDetailPageRoute(applyId: applyId, type: type));
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(formDetailViewModelProvider.notifier);
+    final state = ref.watch(formDetailViewModelProvider);
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => viewModel.fetchFormDetail());
+      return () {
+        // 组件卸载时执行
+      };
+    }, []);
+
+    return Scaffold(
+      appBar: MyAppBar.appBar(context, FormTypes.iconMap[type]?['name'] ?? "", backgroundColor: context.appColors.whiteBG),
+      backgroundColor: context.appColors.backgroundDark,
+      body: SizedBox(
+        width: double.infinity,
+        height: double.infinity,
+        child: LoadStateLayout(
+            state: state.loadingState,
+            errorMessage: state.errorMessage,
+            errorRetry: () {
+              viewModel.retryRequest();
+            },
+            successWidget: state.status == 0
+                ? DetailProcessingFragment()
+                : state.status == 1
+                    ? DetailApprovedFragment()
+                    : DetailNotApprovedFragment()),
+      ),
+    );
+  }
+}

+ 31 - 0
packages/cpt_form/lib/modules/detail/form_detail_state.dart

@@ -0,0 +1,31 @@
+import 'package:widgets/load_state_layout.dart';
+
+class FormDetailState{
+
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+
+  int status;  // 0是Pending , 1是Approve , 2是Not Approve
+
+  // ===================================  Begin  ↓  ===================================
+
+  FormDetailState({
+    this.loadingState = LoadState.State_Loading,
+    this.errorMessage,
+    this.status = 0,
+  });
+
+  FormDetailState copyWith({
+    LoadState? loadingState,
+    String? errorMessage,
+    int? status,
+  }) {
+    return FormDetailState(
+      errorMessage: errorMessage ?? this.errorMessage,
+      loadingState: loadingState ?? this.loadingState,
+      status: status ?? this.status,
+    );
+  }
+
+}

+ 31 - 0
packages/cpt_form/lib/modules/detail/form_detail_view_model.dart

@@ -0,0 +1,31 @@
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:widgets/load_state_layout.dart';
+
+import 'form_detail_state.dart';
+
+part 'form_detail_view_model.g.dart';
+
+@riverpod
+class FormDetailViewModel extends _$FormDetailViewModel {
+  @override
+  FormDetailState build() {
+    return FormDetailState();
+  }
+
+  void retryRequest() {
+    fetchFormDetail();
+  }
+
+  //获取表单的详情数据
+  void fetchFormDetail() async {
+    //显示加载数据
+    state = state.copyWith(loadingState: LoadState.State_Loading);
+
+    await Future.delayed(const Duration(milliseconds: 1500));
+
+    //根据后端返回的数据赋值状态
+    state = state.copyWith(loadingState: LoadState.State_Success, status: 2);
+
+
+  }
+}

+ 27 - 0
packages/cpt_form/lib/modules/detail/form_detail_view_model.g.dart

@@ -0,0 +1,27 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'form_detail_view_model.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$formDetailViewModelHash() =>
+    r'ff75168453999e002ef05e85ede97021615b2181';
+
+/// See also [FormDetailViewModel].
+@ProviderFor(FormDetailViewModel)
+final formDetailViewModelProvider =
+    AutoDisposeNotifierProvider<FormDetailViewModel, FormDetailState>.internal(
+  FormDetailViewModel.new,
+  name: r'formDetailViewModelProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$formDetailViewModelHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$FormDetailViewModel = AutoDisposeNotifier<FormDetailState>;
+// 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

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

@@ -9,6 +9,7 @@ import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_text_view.dart';
 import 'package:widgets/my_text_view.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:widgets/widget_export.dart';
 
 
+import '../../detail/form_detail_page.dart';
 import 'form_approve_view_model.dart';
 import 'form_approve_view_model.dart';
 import 'item_form_approve.dart';
 import 'item_form_approve.dart';
 
 
@@ -45,7 +46,8 @@ class FormApproveScreen extends HookConsumerWidget {
                 delegate: SliverChildBuilderDelegate(
                 delegate: SliverChildBuilderDelegate(
               (context, index) {
               (context, index) {
                 return FormApproveItem(index: index, item: state.datas[index]).onTap((){
                 return FormApproveItem(index: index, item: state.datas[index]).onTap((){
-
+                  //去详情页面
+                  FormDetailPage.startInstance(context: context, applyId: "123", type: state.datas[index]);
                 });
                 });
               },
               },
               childCount: state.datas.length,
               childCount: state.datas.length,

+ 12 - 0
packages/cpt_form/lib/modules/form/form_types.dart

@@ -133,6 +133,7 @@ class FormTypes {
       ],
       ],
       'detail_data': {
       'detail_data': {
         'note_management_txt': S.current.access_card_desc,
         'note_management_txt': S.current.access_card_desc,
+        'signature_txt': S.current.signature_access_card,
       }
       }
     },
     },
     //Access Card-Tenant
     //Access Card-Tenant
@@ -148,6 +149,7 @@ class FormTypes {
       'detail_data': {
       'detail_data': {
         'attachment_txt': S.current.access_card_tenant_letter,
         'attachment_txt': S.current.access_card_tenant_letter,
         'note_management_txt': S.current.access_card_desc,
         'note_management_txt': S.current.access_card_desc,
+        'signature_txt': S.current.signature_access_card,
       }
       }
     },
     },
     //Car Park Cancellation
     //Car Park Cancellation
@@ -161,6 +163,7 @@ class FormTypes {
       ],
       ],
       'detail_data': {
       'detail_data': {
         'note_management_txt': '${S.current.car_cancel_txt}\n\n${S.current.car_cancel_txt_1}\n${S.current.car_cancel_txt_2}',
         'note_management_txt': '${S.current.car_cancel_txt}\n\n${S.current.car_cancel_txt_1}\n${S.current.car_cancel_txt_2}',
+        'signature_txt': S.current.signature_vehicle,
       }
       }
     },
     },
     //Moving In
     //Moving In
@@ -175,6 +178,7 @@ class FormTypes {
       ],
       ],
       'detail_data': {
       'detail_data': {
         'note_management_txt': S.current.moving_in_msg,
         'note_management_txt': S.current.moving_in_msg,
+        'signature_txt': S.current.signature_moving,
       }
       }
     },
     },
     //Moving Out
     //Moving Out
@@ -189,6 +193,7 @@ class FormTypes {
       ],
       ],
       'detail_data': {
       'detail_data': {
         'note_management_txt': S.current.moving_in_msg,
         'note_management_txt': S.current.moving_in_msg,
+        'signature_txt': S.current.signature_moving,
       }
       }
     },
     },
     //Overnight Parking
     //Overnight Parking
@@ -202,6 +207,7 @@ class FormTypes {
       ],
       ],
       'detail_data': {
       'detail_data': {
         'note_management_txt': S.current.overnight_parking_msg,
         'note_management_txt': S.current.overnight_parking_msg,
+        'signature_txt': S.current.signature_vehicle,
       }
       }
     },
     },
     //Registration of 2nd Vehicle
     //Registration of 2nd Vehicle
@@ -217,6 +223,7 @@ class FormTypes {
       'detail_data': {
       'detail_data': {
         'attachment_txt': '${S.current.label_txt}\n\n${S.current.label_txt_1}\n\n${S.current.label_txt_2}\n\n${S.current.label_txt_3}',
         'attachment_txt': '${S.current.label_txt}\n\n${S.current.label_txt_1}\n\n${S.current.label_txt_2}\n\n${S.current.label_txt_3}',
         'note_management_txt': S.current.moving_in_msg,
         'note_management_txt': S.current.moving_in_msg,
+        'signature_txt': S.current.signature_vehicle,
       }
       }
     },
     },
     //Renovation
     //Renovation
@@ -235,6 +242,7 @@ class FormTypes {
         'large_txt': S.current.list_of_renovation_works,
         'large_txt': S.current.list_of_renovation_works,
         'attachment_txt': S.current.renovation_attachments,
         'attachment_txt': S.current.renovation_attachments,
         'note_management_txt': S.current.renovation_note,
         'note_management_txt': S.current.renovation_note,
+        'signature_txt': S.current.signature_renovation,
       }
       }
     },
     },
     //Re-Registration of 1st Vehicle-Owner
     //Re-Registration of 1st Vehicle-Owner
@@ -250,6 +258,7 @@ class FormTypes {
       'detail_data': {
       'detail_data': {
         'attachment_txt': '${S.current.label_txt}\n\n${S.current.label_txt_1}\n\n${S.current.label_txt_2}\n\n${S.current.label_txt_3}',
         'attachment_txt': '${S.current.label_txt}\n\n${S.current.label_txt_1}\n\n${S.current.label_txt_2}\n\n${S.current.label_txt_3}',
         'note_management_txt': S.current.moving_in_msg,
         'note_management_txt': S.current.moving_in_msg,
+        'signature_txt': S.current.signature_vehicle,
       }
       }
     },
     },
     //Re-Registration of 1st Vehicle-Owner
     //Re-Registration of 1st Vehicle-Owner
@@ -265,6 +274,7 @@ class FormTypes {
       'detail_data': {
       'detail_data': {
         'attachment_txt': '${S.current.label_txt}\n\n${S.current.label_txt_1}\n\n${S.current.label_txt_2}\n\n${S.current.label_txt_3}',
         'attachment_txt': '${S.current.label_txt}\n\n${S.current.label_txt_1}\n\n${S.current.label_txt_2}\n\n${S.current.label_txt_3}',
         'note_management_txt': S.current.moving_in_msg,
         'note_management_txt': S.current.moving_in_msg,
+        'signature_txt': S.current.signature_vehicle,
       }
       }
     },
     },
     //Re-Registration of Bicycles
     //Re-Registration of Bicycles
@@ -280,6 +290,7 @@ class FormTypes {
       'detail_data': {
       'detail_data': {
         'attachment_txt': S.current.bicycle_desc,
         'attachment_txt': S.current.bicycle_desc,
         'note_management_txt': S.current.bicycle_note,
         'note_management_txt': S.current.bicycle_note,
+        'signature_txt': S.current.signature_bicycle,
       }
       }
     },
     },
     //Vehicle Label Replacement
     //Vehicle Label Replacement
@@ -295,6 +306,7 @@ class FormTypes {
       'detail_data': {
       'detail_data': {
         'attachment_txt': '${S.current.label_txt}\n\n${S.current.label_txt_1}\n\n${S.current.label_txt_2}\n\n${S.current.label_txt_3}',
         'attachment_txt': '${S.current.label_txt}\n\n${S.current.label_txt_1}\n\n${S.current.label_txt_2}\n\n${S.current.label_txt_3}',
         'note_management_txt': S.current.label_replace_note,
         'note_management_txt': S.current.label_replace_note,
+        'signature_txt': S.current.signature_vehicle,
       }
       }
     },
     },
   };
   };

+ 10 - 8
packages/cpt_form/lib/modules/form/not_approve/form_not_approve_screen.dart

@@ -1,4 +1,5 @@
 import 'package:auto_route/auto_route.dart';
 import 'package:auto_route/auto_route.dart';
+import 'package:cpt_form/modules/detail/form_detail_page.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
@@ -8,7 +9,6 @@ import 'package:widgets/widget_export.dart';
 import 'form_not_approve_view_model.dart';
 import 'form_not_approve_view_model.dart';
 import 'item_form_not_approve.dart';
 import 'item_form_not_approve.dart';
 
 
-
 @RoutePage()
 @RoutePage()
 class FormNotApproveScreen extends HookConsumerWidget {
 class FormNotApproveScreen extends HookConsumerWidget {
   @override
   @override
@@ -39,13 +39,15 @@ class FormNotApproveScreen extends HookConsumerWidget {
           },
           },
           successSliverWidget: [
           successSliverWidget: [
             SliverList(
             SliverList(
-                delegate: SliverChildBuilderDelegate((context, index) {
-                    return FormNotApproveItem(index: index, item: state.datas[index]).onTap((){
-
-                    });
-                  },
-                  childCount: state.datas.length,
-                )),
+                delegate: SliverChildBuilderDelegate(
+              (context, index) {
+                return FormNotApproveItem(index: index, item: state.datas[index]).onTap(() {
+                  //去详情页面
+                  FormDetailPage.startInstance(context: context, applyId: "123", type: state.datas[index]);
+                });
+              },
+              childCount: state.datas.length,
+            )),
           ],
           ],
         ),
         ),
       ).marginOnly(top: 5, bottom: 5),
       ).marginOnly(top: 5, bottom: 5),

+ 3 - 1
packages/cpt_form/lib/modules/form/submit/form_submit_screen.dart

@@ -6,6 +6,7 @@ import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:widgets/widget_export.dart';
+import '../../detail/form_detail_page.dart';
 import 'form_submit_view_model.dart';
 import 'form_submit_view_model.dart';
 import 'item_form_submit.dart';
 import 'item_form_submit.dart';
 
 
@@ -42,7 +43,8 @@ class FormSubmitScreen extends HookConsumerWidget {
                 delegate: SliverChildBuilderDelegate(
                 delegate: SliverChildBuilderDelegate(
               (context, index) {
               (context, index) {
                 return FormSubmitItem(index: index, item: state.datas[index]).onTap(() {
                 return FormSubmitItem(index: index, item: state.datas[index]).onTap(() {
-
+                  //去详情页面
+                  FormDetailPage.startInstance(context: context, applyId: "123", type: state.datas[index]);
                 });
                 });
               },
               },
               childCount: state.datas.length,
               childCount: state.datas.length,

+ 2 - 0
packages/cpt_form/lib/router/page/form_page_router.dart

@@ -21,6 +21,7 @@ import '../../modules/apply/signature_page.dart';
 import '../../modules/apply/type_of_application_page.dart';
 import '../../modules/apply/type_of_application_page.dart';
 import '../../modules/apply/vehicle_info_page.dart';
 import '../../modules/apply/vehicle_info_page.dart';
 import '../../modules/apply/form_terms_page.dart';
 import '../../modules/apply/form_terms_page.dart';
+import '../../modules/detail/form_detail_page.dart';
 
 
 part 'form_page_router.gr.dart';
 part 'form_page_router.gr.dart';
 
 
@@ -55,5 +56,6 @@ class FormPageRouter extends _$FormPageRouter {
         CustomRoute(page: TypeOfApplicationPageRoute.page, path: RouterPath.formTypeOfApplication, transitionsBuilder: applySlideTransition),
         CustomRoute(page: TypeOfApplicationPageRoute.page, path: RouterPath.formTypeOfApplication, transitionsBuilder: applySlideTransition),
         CustomRoute(page: VehicleInfoPageRoute.page, path: RouterPath.formVehicleInfo, transitionsBuilder: applySlideTransition),
         CustomRoute(page: VehicleInfoPageRoute.page, path: RouterPath.formVehicleInfo, transitionsBuilder: applySlideTransition),
         CustomRoute(page: FormTermsPageRoute.page, path: "${RouterPath.formTerms}:type", transitionsBuilder: applySlideTransition),
         CustomRoute(page: FormTermsPageRoute.page, path: "${RouterPath.formTerms}:type", transitionsBuilder: applySlideTransition),
+        CustomRoute(page: FormDetailPageRoute.page, path: "${RouterPath.formDetail}:applyId/:type", transitionsBuilder: applySlideTransition),
       ];
       ];
 }
 }

+ 63 - 0
packages/cpt_form/lib/router/page/form_page_router.gr.dart

@@ -33,6 +33,22 @@ abstract class _$FormPageRouter extends RootStackRouter {
         child: FormApproveScreen(),
         child: FormApproveScreen(),
       );
       );
     },
     },
+    FormDetailPageRoute.name: (routeData) {
+      final pathParams = routeData.inheritedPathParams;
+      final args = routeData.argsAs<FormDetailPageRouteArgs>(
+          orElse: () => FormDetailPageRouteArgs(
+                applyId: pathParams.getString('applyId'),
+                type: pathParams.getString('type'),
+              ));
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: FormDetailPage(
+          key: args.key,
+          applyId: args.applyId,
+          type: args.type,
+        ),
+      );
+    },
     FormNotApprovePageRoute.name: (routeData) {
     FormNotApprovePageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
       return AutoRoutePage<dynamic>(
         routeData: routeData,
         routeData: routeData,
@@ -176,6 +192,53 @@ class FormApprovePageRoute extends PageRouteInfo<void> {
 }
 }
 
 
 /// generated route for
 /// generated route for
+/// [FormDetailPage]
+class FormDetailPageRoute extends PageRouteInfo<FormDetailPageRouteArgs> {
+  FormDetailPageRoute({
+    Key? key,
+    required String applyId,
+    required String type,
+    List<PageRouteInfo>? children,
+  }) : super(
+          FormDetailPageRoute.name,
+          args: FormDetailPageRouteArgs(
+            key: key,
+            applyId: applyId,
+            type: type,
+          ),
+          rawPathParams: {
+            'applyId': applyId,
+            'type': type,
+          },
+          initialChildren: children,
+        );
+
+  static const String name = 'FormDetailPageRoute';
+
+  static const PageInfo<FormDetailPageRouteArgs> page =
+      PageInfo<FormDetailPageRouteArgs>(name);
+}
+
+class FormDetailPageRouteArgs {
+  const FormDetailPageRouteArgs({
+    this.key,
+    required this.applyId,
+    required this.type,
+  });
+
+  final Key? key;
+
+  final String applyId;
+
+  final String type;
+
+  @override
+  String toString() {
+    return 'FormDetailPageRouteArgs{key: $key, applyId: $applyId, type: $type}';
+  }
+}
+
+/// generated route for
 /// [FormNotApproveScreen]
 /// [FormNotApproveScreen]
 class FormNotApprovePageRoute extends PageRouteInfo<void> {
 class FormNotApprovePageRoute extends PageRouteInfo<void> {
   const FormNotApprovePageRoute({List<PageRouteInfo>? children})
   const FormNotApprovePageRoute({List<PageRouteInfo>? children})

BIN
packages/cs_resources/assets/form/detail_processing_img.webp


BIN
packages/cs_resources/assets/main/home_botice_board_icon.webp


BIN
packages/cs_resources/assets/main/home_community_icon.webp


BIN
packages/cs_resources/assets/main/home_facility_icon.webp


BIN
packages/cs_resources/assets/main/home_forms_icon.webp


BIN
packages/cs_resources/assets/main/home_property_icon.webp


BIN
packages/cs_resources/assets/main/home_service_icon.webp


BIN
packages/cs_resources/assets/payment/card_icon.webp


+ 2 - 0
packages/cs_resources/lib/generated/assets.dart

@@ -79,6 +79,7 @@ class Assets {
   static const String formApprovedIcon = 'assets/form/approved_icon.webp';
   static const String formApprovedIcon = 'assets/form/approved_icon.webp';
   static const String formBicycles = 'assets/form/bicycles.webp';
   static const String formBicycles = 'assets/form/bicycles.webp';
   static const String formCarVehicle = 'assets/form/car_vehicle.webp';
   static const String formCarVehicle = 'assets/form/car_vehicle.webp';
+  static const String formDetailProcessingImg = 'assets/form/detail_processing_img.webp';
   static const String formLabeReplace = 'assets/form/labe_replace.webp';
   static const String formLabeReplace = 'assets/form/labe_replace.webp';
   static const String formMoveInOut = 'assets/form/move_in_out.webp';
   static const String formMoveInOut = 'assets/form/move_in_out.webp';
   static const String formNotApprovedIcon = 'assets/form/not_approved_icon.webp';
   static const String formNotApprovedIcon = 'assets/form/not_approved_icon.webp';
@@ -140,6 +141,7 @@ class Assets {
   static const String noticeBoardDocumentsIcon = 'assets/notice_board/documents_icon.png';
   static const String noticeBoardDocumentsIcon = 'assets/notice_board/documents_icon.png';
   static const String noticeBoardEventIcon = 'assets/notice_board/event_icon.png';
   static const String noticeBoardEventIcon = 'assets/notice_board/event_icon.png';
   static const String paymentAmericanExpressIcon = 'assets/payment/american_express_icon.webp';
   static const String paymentAmericanExpressIcon = 'assets/payment/american_express_icon.webp';
+  static const String paymentCardIcon = 'assets/payment/card_icon.webp';
   static const String paymentCardName = 'assets/payment/card_name.webp';
   static const String paymentCardName = 'assets/payment/card_name.webp';
   static const String paymentCardNumber = 'assets/payment/card_number.webp';
   static const String paymentCardNumber = 'assets/payment/card_number.webp';
   static const String paymentCondoIcon = 'assets/payment/condo_icon.webp';
   static const String paymentCondoIcon = 'assets/payment/condo_icon.webp';

File diff suppressed because it is too large
+ 26 - 0
packages/cs_resources/lib/generated/intl/messages_en.dart


+ 3 - 0
packages/cs_resources/lib/generated/intl/messages_zh_CN.dart

@@ -83,6 +83,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "change": MessageLookupByLibrary.simpleMessage("更换"),
         "change": MessageLookupByLibrary.simpleMessage("更换"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "characters": m2,
         "characters": m2,
+        "choose_an_option": MessageLookupByLibrary.simpleMessage("选择一个选项"),
         "choose_category": MessageLookupByLibrary.simpleMessage("选择类型"),
         "choose_category": MessageLookupByLibrary.simpleMessage("选择类型"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "company_address": MessageLookupByLibrary.simpleMessage("公司地址"),
         "company_address": MessageLookupByLibrary.simpleMessage("公司地址"),
@@ -274,6 +275,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "sign_up_verify_txt":
         "sign_up_verify_txt":
             MessageLookupByLibrary.simpleMessage("我们已经向您发送了短信验证码,请在下面输入"),
             MessageLookupByLibrary.simpleMessage("我们已经向您发送了短信验证码,请在下面输入"),
         "signature": MessageLookupByLibrary.simpleMessage("签名"),
         "signature": MessageLookupByLibrary.simpleMessage("签名"),
+        "signature_vehicle": MessageLookupByLibrary.simpleMessage(
+            "I,the resident,herein confirm that we have read and will fully abide by the rules & regulations governing car parking of Parc Life. We  further undertake to display the car park label, prominently on the top left(passenger side) portion of the front windscreen of our vehicle at all times whilst in Parc Life."),
         "signed_and_agreed_by": MessageLookupByLibrary.simpleMessage("签字并同意"),
         "signed_and_agreed_by": MessageLookupByLibrary.simpleMessage("签字并同意"),
         "start_date_caps": MessageLookupByLibrary.simpleMessage("开始时间"),
         "start_date_caps": MessageLookupByLibrary.simpleMessage("开始时间"),
         "status": MessageLookupByLibrary.simpleMessage("状态"),
         "status": MessageLookupByLibrary.simpleMessage("状态"),

+ 1 - 0
packages/cs_resources/lib/generated/intl/messages_zh_HK.dart

@@ -83,6 +83,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "change": MessageLookupByLibrary.simpleMessage("更换"),
         "change": MessageLookupByLibrary.simpleMessage("更换"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "change_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "characters": m2,
         "characters": m2,
+        "choose_an_option": MessageLookupByLibrary.simpleMessage("选择一个选项"),
         "choose_category": MessageLookupByLibrary.simpleMessage("选择类型"),
         "choose_category": MessageLookupByLibrary.simpleMessage("选择类型"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "company_address": MessageLookupByLibrary.simpleMessage("公司地址"),
         "company_address": MessageLookupByLibrary.simpleMessage("公司地址"),

File diff suppressed because it is too large
+ 158 - 2
packages/cs_resources/lib/generated/l10n.dart


File diff suppressed because it is too large
+ 16 - 2
packages/cs_resources/lib/l10n/intl_en.arb


File diff suppressed because it is too large
+ 16 - 2
packages/cs_resources/lib/l10n/intl_zh_CN.arb


File diff suppressed because it is too large
+ 16 - 2
packages/cs_resources/lib/l10n/intl_zh_HK.arb


+ 7 - 1
packages/cs_resources/lib/theme/app_colors_theme.dart

@@ -33,6 +33,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
   static const _colorFE4066 = Color(0xFFFE4066);
   static const _colorFE4066 = Color(0xFFFE4066);
   static const _colorE9E9E9 = Color(0xFFE9E9E9);
   static const _colorE9E9E9 = Color(0xFFE9E9E9);
   static const _color99A8CA = Color(0xFF99A8CA);
   static const _color99A8CA = Color(0xFF99A8CA);
+  static const _color0DBE1E= Color(0xFF0DBE1E);
 
 
   //暗色主题的一些自定义颜色值
   //暗色主题的一些自定义颜色值
   static const _darkBlackBg = Color(0xFF0F0F0F);
   static const _darkBlackBg = Color(0xFF0F0F0F);
@@ -76,6 +77,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
   final Color grayBgE9; //e9灰色背景
   final Color grayBgE9; //e9灰色背景
   final Color disEnableGray; //禁用的灰色
   final Color disEnableGray; //禁用的灰色
   final Color authFiledHintDark; //文本Hint的深蓝色
   final Color authFiledHintDark; //文本Hint的深蓝色
+  final Color greenBG; //按钮的绿色背景
 
 
   // 私有的构造函数
   // 私有的构造函数
   const AppColorsTheme._internal({
   const AppColorsTheme._internal({
@@ -112,6 +114,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
     required this.grayBgE9,
     required this.grayBgE9,
     required this.disEnableGray,
     required this.disEnableGray,
     required this.authFiledHintDark,
     required this.authFiledHintDark,
+    required this.greenBG,
   });
   });
 
 
   // 浅色主题工厂方法
   // 浅色主题工厂方法
@@ -150,6 +153,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       grayBgE9: _colorE9E9E9,
       grayBgE9: _colorE9E9E9,
       disEnableGray: _colorBDBDBD,
       disEnableGray: _colorBDBDBD,
       authFiledHintDark: _color99A8CA,
       authFiledHintDark: _color99A8CA,
+      greenBG: _color0DBE1E,
     );
     );
   }
   }
 
 
@@ -174,7 +178,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       tabTextUnSelectedPrimary: Colors.white,
       tabTextUnSelectedPrimary: Colors.white,
       imgGrayBg: _darkBlackItem,
       imgGrayBg: _darkBlackItem,
       textDarkGray999: Colors.white,
       textDarkGray999: Colors.white,
-      whiteBG: _darkBlackItem,
+      whiteBG: _darkBlackBg,
       whiteSecondBG: _darkBlackItemLight,
       whiteSecondBG: _darkBlackItemLight,
       redDefault: _darkBlackItem,
       redDefault: _darkBlackItem,
       dividerDefault: _darkBlackItemDivider,
       dividerDefault: _darkBlackItemDivider,
@@ -189,6 +193,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       grayBgE9: _darkBlackItemLightMost,
       grayBgE9: _darkBlackItemLightMost,
       disEnableGray: _darkBlackItemLight,
       disEnableGray: _darkBlackItemLight,
       authFiledHintDark: _color99A8CA,
       authFiledHintDark: _color99A8CA,
+      greenBG: _darkBlackItemLight,
     );
     );
   }
   }
 
 
@@ -237,6 +242,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       grayBgE9: Color.lerp(grayBgE9, other.grayBgE9, t)!,
       grayBgE9: Color.lerp(grayBgE9, other.grayBgE9, t)!,
       disEnableGray: Color.lerp(disEnableGray, other.disEnableGray, t)!,
       disEnableGray: Color.lerp(disEnableGray, other.disEnableGray, t)!,
       authFiledHintDark: Color.lerp(authFiledHintDark, other.authFiledHintDark, t)!,
       authFiledHintDark: Color.lerp(authFiledHintDark, other.authFiledHintDark, t)!,
+      greenBG: Color.lerp(greenBG, other.greenBG, t)!,
     );
     );
   }
   }
 }
 }

+ 2 - 0
packages/cs_router/lib/path/router_path.dart

@@ -70,6 +70,7 @@ class RouterPath {
   static const facilityDetail = '/facility/detail';
   static const facilityDetail = '/facility/detail';
   static const facilityBook = '/facility/book';
   static const facilityBook = '/facility/book';
   static const facilityBookConfirm = '/facility/book/confirm';
   static const facilityBookConfirm = '/facility/book/confirm';
+  static const facilityLocation = '/facility/location';
 
 
   //表单
   //表单
   static const form = '/form';
   static const form = '/form';
@@ -86,6 +87,7 @@ class RouterPath {
   static const formTypeOfApplication='/form/type/application';
   static const formTypeOfApplication='/form/type/application';
   static const formVehicleInfo='/form/vehicle/info';
   static const formVehicleInfo='/form/vehicle/info';
   static const formTerms='/form/terms';
   static const formTerms='/form/terms';
+  static const formDetail='/form/detail';
 
 
   //消息板
   //消息板
   static const noticeBoard = '/notice_board';
   static const noticeBoard = '/notice_board';