Browse Source

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

glglove 3 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() =>
-    r'94f61f3b11ea3f6bc8baa1abaccf013230ecf2e4';
+    r'fdd3f7fffe200110bd14f0d3b2ce2d83c1d6a74a';
 
 /// See also [BookConfirmViewModel].
 @ProviderFor(BookConfirmViewModel)

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

@@ -1,5 +1,6 @@
 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/l10n.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
@@ -49,7 +50,20 @@ class FacilityBookingPage extends HookConsumerWidget {
     }, []);
 
     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,
       body: Column(
         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() =>
-    r'c6d1d64d1d7100b6864c53327150a9893201e3a9';
+    r'c9a681e01791881d17dc58b3a8e45153e6fe62ad';
 
 /// See also [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/booking/facility_booking_page.dart';
 import '../../modules/book_confirm/book_confirm_page.dart';
+import '../../modules/location/facility_location_page.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: FacilityBookingPageRoute.page, path: RouterPath.facilityBook, 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(),
       );
     },
+    FacilityLocationPageRoute.name: (routeData) {
+      final args = routeData.argsAs<FacilityLocationPageRouteArgs>();
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: FacilityLocationPage(
+          key: args.key,
+          imageUrls: args.imageUrls,
+        ),
+      );
+    },
     FacilityPageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
         routeData: routeData,
@@ -165,6 +175,45 @@ class FacilityHistoryPageRoute extends PageRouteInfo<void> {
 }
 
 /// 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]
 class FacilityPageRoute extends PageRouteInfo<void> {
   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:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.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: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 'vm/apply_view_model.dart';
 
 @RoutePage()
 class AttachmentPage extends HookConsumerWidget {
@@ -22,11 +31,90 @@ class AttachmentPage extends HookConsumerWidget {
   @override
   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:cs_resources/generated/assets.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/componentRouter/component_service_manager.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_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
 import '../../router/page/form_page_router.dart';
 import 'vm/apply_view_model.dart';
+
 @RoutePage()
 class FormPaymentPage extends HookConsumerWidget {
   const FormPaymentPage({Key? key}) : super(key: key);
@@ -28,17 +35,249 @@ class FormPaymentPage extends HookConsumerWidget {
     final viewModel = ref.watch(applyViewModelProvider.notifier);
     final state = ref.watch(applyViewModelProvider);
 
+    //签名版配置
+    HandSignatureControl handSignatureControl = HandSignatureControl(
+      threshold: 3.0,
+      smoothRatio: 190 / 345,
+      velocityRange: 2.0,
+    );
+
+    useEffect(() {
+      //赋值State的值
+      Future.microtask(() {});
+
+      return () {
+        // 释放控制器资源
+      };
+    }, []);
+
     return WillPopScope(
         child: Scaffold(
-            appBar: AppBar(title: Text("FormPaymentPage")),
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
             body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               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(
-                  onPressed: viewModel.gotoNextPage,
-                  text: S.current.submit,
+                  onPressed: () {
+                    viewModel.gotoNextPage();
+                  },
+                  text: S.current.next,
                   textColor: Colors.white,
                   backgroundColor: context.appColors.btnBgDefault,
                   fontWeight: FontWeight.w500,
@@ -49,9 +288,48 @@ class FormPaymentPage extends HookConsumerWidget {
                 ),
               ],
             )),
-        onWillPop: () async{
+        onWillPop: () async {
           viewModel.handlePopAction();
           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 '../../router/page/form_page_router.dart';
 
+//协议页面,也是详情页面的第一个页面入口,内部可以请求详情数据和选项数据
 @RoutePage()
 class FormTermsPage extends HookConsumerWidget {
   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:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+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 'vm/apply_view_model.dart';
+
 @RoutePage()
 class GuestVehiclePage extends HookConsumerWidget {
   const GuestVehiclePage({Key? key}) : super(key: key);
@@ -19,11 +32,237 @@ class GuestVehiclePage extends HookConsumerWidget {
 
   @override
   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: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/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 'vm/apply_view_model.dart';
 @RoutePage()
 class LargeTextBoxPage extends HookConsumerWidget {
   const LargeTextBoxPage({Key? key}) : super(key: key);
@@ -19,12 +28,122 @@ class LargeTextBoxPage extends HookConsumerWidget {
 
   @override
   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: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/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 'vm/apply_view_model.dart';
+
 @RoutePage()
 class MovingCompanyPage extends HookConsumerWidget {
   const MovingCompanyPage({Key? key}) : super(key: key);
@@ -19,11 +30,254 @@ class MovingCompanyPage extends HookConsumerWidget {
 
   @override
   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:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+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 'vm/apply_view_model.dart';
 @RoutePage()
 class MovingDatePage extends HookConsumerWidget {
   const MovingDatePage({Key? key}) : super(key: key);
@@ -19,12 +29,117 @@ class MovingDatePage extends HookConsumerWidget {
 
   @override
   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/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/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 'vm/apply_view_model.dart';
+
 @RoutePage()
 class NoteManagementPage extends HookConsumerWidget {
   const NoteManagementPage({Key? key}) : super(key: key);
@@ -27,16 +31,114 @@ class NoteManagementPage extends HookConsumerWidget {
     final viewModel = ref.watch(applyViewModelProvider.notifier);
     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(
         child: Scaffold(
-            appBar: AppBar(title: Text("NoteManagementPage")),
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
             body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               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(
-                  onPressed: viewModel.gotoNextPage,
+                  onPressed: (){
+                    focusNode.unfocus();
+
+                    viewModel.gotoNextPage();
+                  },
                   text: S.current.next,
                   textColor: Colors.white,
                   backgroundColor: context.appColors.btnBgDefault,
@@ -48,7 +150,7 @@ class NoteManagementPage extends HookConsumerWidget {
                 ),
               ],
             )),
-        onWillPop: () async{
+        onWillPop: () async {
           viewModel.handlePopAction();
           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: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/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 'vm/apply_view_model.dart';
+
 @RoutePage()
 class RenovationCompanyPage extends HookConsumerWidget {
   const RenovationCompanyPage({Key? key}) : super(key: key);
@@ -19,11 +30,253 @@ class RenovationCompanyPage extends HookConsumerWidget {
 
   @override
   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:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+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 'vm/apply_view_model.dart';
+
 @RoutePage()
 class RenovationDatePage extends HookConsumerWidget {
   const RenovationDatePage({Key? key}) : super(key: key);
@@ -19,12 +30,137 @@ class RenovationDatePage extends HookConsumerWidget {
 
   @override
   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: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/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';
 
 @RoutePage()
@@ -20,12 +29,145 @@ class SignaturePage extends HookConsumerWidget {
 
   @override
   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:shared/utils/log_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.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 'vm/apply_view_model.dart';
 
@@ -30,10 +33,27 @@ class TypeOfApplicationPage extends HookConsumerWidget {
 
     return WillPopScope(
         child: Scaffold(
-            appBar: AppBar(title: Text("TypeOfApplicationPage")),
+            appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
+            backgroundColor: context.appColors.whiteBG,
             body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               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(
@@ -49,7 +69,7 @@ class TypeOfApplicationPage extends HookConsumerWidget {
                 ),
               ],
             )),
-        onWillPop: () async{
+        onWillPop: () async {
           viewModel.handlePopAction();
           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: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/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';
 
 @RoutePage()
@@ -20,12 +32,233 @@ class VehicleInfoPage extends HookConsumerWidget {
 
   @override
   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 {
-  //详情页面的索引,不参与Copy
+
+  //详情页面的索引,为了记录详情页面组的当前跳转索引,不参与状态所以不用参与Copy方法
   int detailPageIndex;
 
-  //表单类型
+  //表单类型(列表的Form类型)
   String? formType;
 
   //是否可编辑
   bool enableEdit;
 
-  //表单对应的详情数据
+  //详情数据
   Map<String, dynamic>? applyDetail;
 
   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:shared/utils/log_utils.dart';
+import 'package:widgets/picker/date_picker_util.dart';
 import '../../form/form_page.dart';
 import '../../form/form_types.dart';
 import 'apply_state.dart';
+import 'package:widgets/picker/option_pick_util.dart';
 
 part 'apply_view_model.g.dart';
 
@@ -36,4 +42,26 @@ class ApplyViewModel extends _$ApplyViewModel {
   void handlePopAction() {
     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
 // **************************************************************************
 
-String _$applyViewModelHash() => r'22aedac0efe149d5544938acf75c975b743c7cd9';
+String _$applyViewModelHash() => r'ea1cdebf421fe02f772e0f1896e1bf37df0b5a5c';
 
 /// See also [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/widget_export.dart';
 
+import '../../detail/form_detail_page.dart';
 import 'form_approve_view_model.dart';
 import 'item_form_approve.dart';
 
@@ -45,7 +46,8 @@ class FormApproveScreen extends HookConsumerWidget {
                 delegate: SliverChildBuilderDelegate(
               (context, index) {
                 return FormApproveItem(index: index, item: state.datas[index]).onTap((){
-
+                  //去详情页面
+                  FormDetailPage.startInstance(context: context, applyId: "123", type: state.datas[index]);
                 });
               },
               childCount: state.datas.length,

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

@@ -133,6 +133,7 @@ class FormTypes {
       ],
       'detail_data': {
         'note_management_txt': S.current.access_card_desc,
+        'signature_txt': S.current.signature_access_card,
       }
     },
     //Access Card-Tenant
@@ -148,6 +149,7 @@ class FormTypes {
       'detail_data': {
         'attachment_txt': S.current.access_card_tenant_letter,
         'note_management_txt': S.current.access_card_desc,
+        'signature_txt': S.current.signature_access_card,
       }
     },
     //Car Park Cancellation
@@ -161,6 +163,7 @@ class FormTypes {
       ],
       '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}',
+        'signature_txt': S.current.signature_vehicle,
       }
     },
     //Moving In
@@ -175,6 +178,7 @@ class FormTypes {
       ],
       'detail_data': {
         'note_management_txt': S.current.moving_in_msg,
+        'signature_txt': S.current.signature_moving,
       }
     },
     //Moving Out
@@ -189,6 +193,7 @@ class FormTypes {
       ],
       'detail_data': {
         'note_management_txt': S.current.moving_in_msg,
+        'signature_txt': S.current.signature_moving,
       }
     },
     //Overnight Parking
@@ -202,6 +207,7 @@ class FormTypes {
       ],
       'detail_data': {
         'note_management_txt': S.current.overnight_parking_msg,
+        'signature_txt': S.current.signature_vehicle,
       }
     },
     //Registration of 2nd Vehicle
@@ -217,6 +223,7 @@ class FormTypes {
       '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}',
         'note_management_txt': S.current.moving_in_msg,
+        'signature_txt': S.current.signature_vehicle,
       }
     },
     //Renovation
@@ -235,6 +242,7 @@ class FormTypes {
         'large_txt': S.current.list_of_renovation_works,
         'attachment_txt': S.current.renovation_attachments,
         'note_management_txt': S.current.renovation_note,
+        'signature_txt': S.current.signature_renovation,
       }
     },
     //Re-Registration of 1st Vehicle-Owner
@@ -250,6 +258,7 @@ class FormTypes {
       '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}',
         'note_management_txt': S.current.moving_in_msg,
+        'signature_txt': S.current.signature_vehicle,
       }
     },
     //Re-Registration of 1st Vehicle-Owner
@@ -265,6 +274,7 @@ class FormTypes {
       '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}',
         'note_management_txt': S.current.moving_in_msg,
+        'signature_txt': S.current.signature_vehicle,
       }
     },
     //Re-Registration of Bicycles
@@ -280,6 +290,7 @@ class FormTypes {
       'detail_data': {
         'attachment_txt': S.current.bicycle_desc,
         'note_management_txt': S.current.bicycle_note,
+        'signature_txt': S.current.signature_bicycle,
       }
     },
     //Vehicle Label Replacement
@@ -295,6 +306,7 @@ class FormTypes {
       '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}',
         '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:cpt_form/modules/detail/form_detail_page.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_hooks/flutter_hooks.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 'item_form_not_approve.dart';
 
-
 @RoutePage()
 class FormNotApproveScreen extends HookConsumerWidget {
   @override
@@ -39,13 +39,15 @@ class FormNotApproveScreen extends HookConsumerWidget {
           },
           successSliverWidget: [
             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),

+ 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/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
+import '../../detail/form_detail_page.dart';
 import 'form_submit_view_model.dart';
 import 'item_form_submit.dart';
 
@@ -42,7 +43,8 @@ class FormSubmitScreen extends HookConsumerWidget {
                 delegate: SliverChildBuilderDelegate(
               (context, index) {
                 return FormSubmitItem(index: index, item: state.datas[index]).onTap(() {
-
+                  //去详情页面
+                  FormDetailPage.startInstance(context: context, applyId: "123", type: state.datas[index]);
                 });
               },
               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/vehicle_info_page.dart';
 import '../../modules/apply/form_terms_page.dart';
+import '../../modules/detail/form_detail_page.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: VehicleInfoPageRoute.page, path: RouterPath.formVehicleInfo, 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(),
       );
     },
+    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) {
       return AutoRoutePage<dynamic>(
         routeData: routeData,
@@ -176,6 +192,53 @@ class FormApprovePageRoute extends PageRouteInfo<void> {
 }
 
 /// 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]
 class FormNotApprovePageRoute extends PageRouteInfo<void> {
   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 formBicycles = 'assets/form/bicycles.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 formMoveInOut = 'assets/form/move_in_out.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 noticeBoardEventIcon = 'assets/notice_board/event_icon.png';
   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 paymentCardNumber = 'assets/payment/card_number.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_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "characters": m2,
+        "choose_an_option": MessageLookupByLibrary.simpleMessage("选择一个选项"),
         "choose_category": MessageLookupByLibrary.simpleMessage("选择类型"),
         "community": MessageLookupByLibrary.simpleMessage("社区"),
         "company_address": MessageLookupByLibrary.simpleMessage("公司地址"),
@@ -274,6 +275,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "sign_up_verify_txt":
             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("签字并同意"),
         "start_date_caps": 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_mobile_phone": MessageLookupByLibrary.simpleMessage("修改手机号码"),
         "characters": m2,
+        "choose_an_option": MessageLookupByLibrary.simpleMessage("选择一个选项"),
         "choose_category": MessageLookupByLibrary.simpleMessage("选择类型"),
         "community": 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 _colorE9E9E9 = Color(0xFFE9E9E9);
   static const _color99A8CA = Color(0xFF99A8CA);
+  static const _color0DBE1E= Color(0xFF0DBE1E);
 
   //暗色主题的一些自定义颜色值
   static const _darkBlackBg = Color(0xFF0F0F0F);
@@ -76,6 +77,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
   final Color grayBgE9; //e9灰色背景
   final Color disEnableGray; //禁用的灰色
   final Color authFiledHintDark; //文本Hint的深蓝色
+  final Color greenBG; //按钮的绿色背景
 
   // 私有的构造函数
   const AppColorsTheme._internal({
@@ -112,6 +114,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
     required this.grayBgE9,
     required this.disEnableGray,
     required this.authFiledHintDark,
+    required this.greenBG,
   });
 
   // 浅色主题工厂方法
@@ -150,6 +153,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       grayBgE9: _colorE9E9E9,
       disEnableGray: _colorBDBDBD,
       authFiledHintDark: _color99A8CA,
+      greenBG: _color0DBE1E,
     );
   }
 
@@ -174,7 +178,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       tabTextUnSelectedPrimary: Colors.white,
       imgGrayBg: _darkBlackItem,
       textDarkGray999: Colors.white,
-      whiteBG: _darkBlackItem,
+      whiteBG: _darkBlackBg,
       whiteSecondBG: _darkBlackItemLight,
       redDefault: _darkBlackItem,
       dividerDefault: _darkBlackItemDivider,
@@ -189,6 +193,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       grayBgE9: _darkBlackItemLightMost,
       disEnableGray: _darkBlackItemLight,
       authFiledHintDark: _color99A8CA,
+      greenBG: _darkBlackItemLight,
     );
   }
 
@@ -237,6 +242,7 @@ class AppColorsTheme extends ThemeExtension<AppColorsTheme> {
       grayBgE9: Color.lerp(grayBgE9, other.grayBgE9, t)!,
       disEnableGray: Color.lerp(disEnableGray, other.disEnableGray, 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 facilityBook = '/facility/book';
   static const facilityBookConfirm = '/facility/book/confirm';
+  static const facilityLocation = '/facility/location';
 
   //表单
   static const form = '/form';
@@ -86,6 +87,7 @@ class RouterPath {
   static const formTypeOfApplication='/form/type/application';
   static const formVehicleInfo='/form/vehicle/info';
   static const formTerms='/form/terms';
+  static const formDetail='/form/detail';
 
   //消息板
   static const noticeBoard = '/notice_board';