2 Commity a9005ee62d ... 3de0bfd232

Autor SHA1 Wiadomość Data
  liukai 3de0bfd232 Merge remote-tracking branch 'origin/dev' into dev 1 dzień temu
  liukai 4a36d606da form的详情配置 1 dzień temu
35 zmienionych plików z 1515 dodań i 195 usunięć
  1. 32 0
      packages/cpt_form/lib/modules/apply/attachment_page.dart
  2. 57 0
      packages/cpt_form/lib/modules/apply/form_payment_page.dart
  3. 49 0
      packages/cpt_form/lib/modules/apply/form_terms_page.dart
  4. 30 0
      packages/cpt_form/lib/modules/apply/guest_vehicle_page.dart
  5. 30 0
      packages/cpt_form/lib/modules/apply/large_text_box_page.dart
  6. 30 0
      packages/cpt_form/lib/modules/apply/moving_company_page.dart
  7. 30 0
      packages/cpt_form/lib/modules/apply/moving_date_page.dart
  8. 56 0
      packages/cpt_form/lib/modules/apply/note_management_page.dart
  9. 30 0
      packages/cpt_form/lib/modules/apply/renovation_company_page.dart
  10. 30 0
      packages/cpt_form/lib/modules/apply/renovation_date_page.dart
  11. 31 0
      packages/cpt_form/lib/modules/apply/signature_page.dart
  12. 57 0
      packages/cpt_form/lib/modules/apply/type_of_application_page.dart
  13. 31 0
      packages/cpt_form/lib/modules/apply/vehicle_info_page.dart
  14. 33 0
      packages/cpt_form/lib/modules/apply/vm/apply_state.dart
  15. 39 0
      packages/cpt_form/lib/modules/apply/vm/apply_view_model.dart
  16. 26 0
      packages/cpt_form/lib/modules/apply/vm/apply_view_model.g.dart
  17. 10 10
      packages/cpt_form/lib/modules/form/apply/form_apply_screen.dart
  18. 6 21
      packages/cpt_form/lib/modules/form/apply/form_apply_view_model.dart
  19. 1 1
      packages/cpt_form/lib/modules/form/apply/form_apply_view_model.g.dart
  20. 5 3
      packages/cpt_form/lib/modules/form/apply/item_form_apply.dart
  21. 0 93
      packages/cpt_form/lib/modules/form/form_icons.dart
  22. 2 2
      packages/cpt_form/lib/modules/form/form_page.dart
  23. 353 0
      packages/cpt_form/lib/modules/form/form_types.dart
  24. 14 0
      packages/cpt_form/lib/modules/form_export.dart
  25. 26 0
      packages/cpt_form/lib/router/page/form_page_router.dart
  26. 292 0
      packages/cpt_form/lib/router/page/form_page_router.gr.dart
  27. 88 65
      packages/cs_plugin_basic/lib/widget/webview_page.dart
  28. 12 0
      packages/cs_resources/lib/generated/intl/messages_en.dart
  29. 12 0
      packages/cs_resources/lib/generated/intl/messages_zh_CN.dart
  30. 12 0
      packages/cs_resources/lib/generated/intl/messages_zh_HK.dart
  31. 60 0
      packages/cs_resources/lib/generated/l10n.dart
  32. 6 0
      packages/cs_resources/lib/l10n/intl_en.arb
  33. 6 0
      packages/cs_resources/lib/l10n/intl_zh_CN.arb
  34. 6 0
      packages/cs_resources/lib/l10n/intl_zh_HK.arb
  35. 13 0
      packages/cs_router/lib/path/router_path.dart

+ 32 - 0
packages/cpt_form/lib/modules/apply/attachment_page.dart

@@ -0,0 +1,32 @@
+
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+
+import '../../router/page/form_page_router.dart';
+
+@RoutePage()
+class AttachmentPage extends HookConsumerWidget {
+  const AttachmentPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const AttachmentPageRoute());
+    } else {
+      appRouter.push(const AttachmentPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return Scaffold(
+      appBar: AppBar(title: Text("NoteManagementPage")),
+      body: Center(
+        child: Text("NoteManagementPage"),
+      ),
+    );
+  }
+}

+ 57 - 0
packages/cpt_form/lib/modules/apply/form_payment_page.dart

@@ -0,0 +1,57 @@
+
+import 'package:cpt_form/modules/form/apply/form_apply_screen.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:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_button.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);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const FormPaymentPageRoute());
+    } else {
+      appRouter.push(const FormPaymentPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: AppBar(title: Text("FormPaymentPage")),
+            body: Column(
+              children: [
+                Text("FormPaymentPage").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;
+        });
+  }
+}

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

@@ -0,0 +1,49 @@
+import 'package:cpt_form/modules/apply/vm/apply_view_model.dart';
+import 'package:cs_resources/generated/l10n.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_basic/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;
+
+  const FormTermsPage({Key? key, @PathParam() required this.type}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context, required String formType}) {
+    if (context != null) {
+      context.router.push(FormTermsPageRoute(type: formType));
+    } else {
+      appRouter.push(FormTermsPageRoute(type: formType));
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
+
+    useEffect(() {
+      // 组件挂载时执行 - 执行接口请求
+      Future.microtask(() => viewModel.setFormType(type));
+      return () {
+        // 组件卸载时执行
+      };
+    }, []);
+
+    return state.applyDetail != null
+        ? WebViewPage(
+            showAppbar: true,
+            initialUrl: state.applyDetail?['term_url'],
+            arguments: {'title': state.applyDetail?['title']},
+            bottomBtnTxt: S.current.next,
+            bottomBtnAction: viewModel.gotoNextPage,
+          )
+        : const SizedBox();
+  }
+}

+ 30 - 0
packages/cpt_form/lib/modules/apply/guest_vehicle_page.dart

@@ -0,0 +1,30 @@
+
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import '../../router/page/form_page_router.dart';
+@RoutePage()
+class GuestVehiclePage extends HookConsumerWidget {
+  const GuestVehiclePage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const GuestVehiclePageRoute());
+    } else {
+      appRouter.push(const GuestVehiclePageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return Scaffold(
+      appBar: AppBar(title: Text("GuestVehiclePage")),
+      body: Center(
+        child: Text("GuestVehiclePage"),
+      ),
+    );
+  }
+}

+ 30 - 0
packages/cpt_form/lib/modules/apply/large_text_box_page.dart

@@ -0,0 +1,30 @@
+
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import '../../router/page/form_page_router.dart';
+@RoutePage()
+class LargeTextBoxPage extends HookConsumerWidget {
+  const LargeTextBoxPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const LargeTextBoxPageRoute());
+    } else {
+      appRouter.push(const LargeTextBoxPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return Scaffold(
+      appBar: AppBar(title: Text("LargeTextBoxPage")),
+      body: Center(
+        child: Text("LargeTextBoxPage"),
+      ),
+    );
+  }
+}

+ 30 - 0
packages/cpt_form/lib/modules/apply/moving_company_page.dart

@@ -0,0 +1,30 @@
+
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import '../../router/page/form_page_router.dart';
+@RoutePage()
+class MovingCompanyPage extends HookConsumerWidget {
+  const MovingCompanyPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const MovingCompanyPageRoute());
+    } else {
+      appRouter.push(const MovingCompanyPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return Scaffold(
+      appBar: AppBar(title: Text("MovingCompanyPage")),
+      body: Center(
+        child: Text("MovingCompanyPage"),
+      ),
+    );
+  }
+}

+ 30 - 0
packages/cpt_form/lib/modules/apply/moving_date_page.dart

@@ -0,0 +1,30 @@
+
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import '../../router/page/form_page_router.dart';
+@RoutePage()
+class MovingDatePage extends HookConsumerWidget {
+  const MovingDatePage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const MovingDatePageRoute());
+    } else {
+      appRouter.push(const MovingDatePageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return Scaffold(
+      appBar: AppBar(title: Text("MovingDatePage")),
+      body: Center(
+        child: Text("MovingDatePage"),
+      ),
+    );
+  }
+}

+ 56 - 0
packages/cpt_form/lib/modules/apply/note_management_page.dart

@@ -0,0 +1,56 @@
+
+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:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_button.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);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const NoteManagementPageRoute());
+    } else {
+      appRouter.push(const NoteManagementPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: AppBar(title: Text("NoteManagementPage")),
+            body: Column(
+              children: [
+                Text("NoteManagementPage").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;
+        });
+  }
+}

+ 30 - 0
packages/cpt_form/lib/modules/apply/renovation_company_page.dart

@@ -0,0 +1,30 @@
+
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import '../../router/page/form_page_router.dart';
+@RoutePage()
+class RenovationCompanyPage extends HookConsumerWidget {
+  const RenovationCompanyPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const RenovationCompanyPageRoute());
+    } else {
+      appRouter.push(const RenovationCompanyPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return Scaffold(
+      appBar: AppBar(title: Text("RenovationCompanyPage")),
+      body: Center(
+        child: Text("RenovationCompanyPage"),
+      ),
+    );
+  }
+}

+ 30 - 0
packages/cpt_form/lib/modules/apply/renovation_date_page.dart

@@ -0,0 +1,30 @@
+
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import '../../router/page/form_page_router.dart';
+@RoutePage()
+class RenovationDatePage extends HookConsumerWidget {
+  const RenovationDatePage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const RenovationDatePageRoute());
+    } else {
+      appRouter.push(const RenovationDatePageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return Scaffold(
+      appBar: AppBar(title: Text("RenovationDatePage")),
+      body: Center(
+        child: Text("RenovationDatePage"),
+      ),
+    );
+  }
+}

+ 31 - 0
packages/cpt_form/lib/modules/apply/signature_page.dart

@@ -0,0 +1,31 @@
+
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import '../../router/page/form_page_router.dart';
+
+@RoutePage()
+class SignaturePage extends HookConsumerWidget {
+  const SignaturePage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const SignaturePageRoute());
+    } else {
+      appRouter.push(const SignaturePageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return Scaffold(
+      appBar: AppBar(title: Text("SignaturePage")),
+      body: Center(
+        child: Text("SignaturePage"),
+      ),
+    );
+  }
+}

+ 57 - 0
packages/cpt_form/lib/modules/apply/type_of_application_page.dart

@@ -0,0 +1,57 @@
+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: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_button.dart';
+import '../../router/page/form_page_router.dart';
+import 'vm/apply_view_model.dart';
+
+@RoutePage()
+class TypeOfApplicationPage extends HookConsumerWidget {
+  const TypeOfApplicationPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const TypeOfApplicationPageRoute());
+    } else {
+      appRouter.push(const TypeOfApplicationPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final viewModel = ref.watch(applyViewModelProvider.notifier);
+    final state = ref.watch(applyViewModelProvider);
+
+    return WillPopScope(
+        child: Scaffold(
+            appBar: AppBar(title: Text("TypeOfApplicationPage")),
+            body: Column(
+              children: [
+                Text("TypeOfApplicationPage").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;
+        });
+  }
+}

+ 31 - 0
packages/cpt_form/lib/modules/apply/vehicle_info_page.dart

@@ -0,0 +1,31 @@
+
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import '../../router/page/form_page_router.dart';
+
+@RoutePage()
+class VehicleInfoPage extends HookConsumerWidget {
+  const VehicleInfoPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const VehicleInfoPageRoute());
+    } else {
+      appRouter.push(const VehicleInfoPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    return Scaffold(
+      appBar: AppBar(title: Text("VehicleInfoPage")),
+      body: Center(
+        child: Text("VehicleInfoPage"),
+      ),
+    );
+  }
+}

+ 33 - 0
packages/cpt_form/lib/modules/apply/vm/apply_state.dart

@@ -0,0 +1,33 @@
+class ApplyState {
+  //详情页面的索引,不参与Copy
+  int detailPageIndex;
+
+  //表单类型
+  String? formType;
+
+  //是否可编辑
+  bool enableEdit;
+
+  //表单对应的详情数据
+  Map<String, dynamic>? applyDetail;
+
+  ApplyState({
+    this.formType,
+    this.applyDetail,
+    this.enableEdit = true,
+    this.detailPageIndex = 0,
+  });
+
+  ApplyState copyWith({
+    String? formType,
+    bool? enableEdit,
+    Map<String, dynamic>? applyDetail,
+  }) {
+    return ApplyState(
+      formType: formType ?? this.formType,
+      enableEdit: enableEdit ?? this.enableEdit,
+      applyDetail: applyDetail ?? this.applyDetail,
+    );
+  }
+
+}

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

@@ -0,0 +1,39 @@
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/log_utils.dart';
+import '../../form/form_page.dart';
+import '../../form/form_types.dart';
+import 'apply_state.dart';
+
+part 'apply_view_model.g.dart';
+
+@riverpod
+class ApplyViewModel extends _$ApplyViewModel {
+  @override
+  ApplyState build() {
+    return ApplyState();
+  }
+
+  //设置具体的表单类型
+  void setFormType(String formType) {
+    final detail = FormTypes.detailPageMap[formType];
+    Log.d("applyViewModelProvider - detail:$detail");
+    state = state.copyWith(formType: formType, applyDetail: detail);
+  }
+
+  //进入下一步页面
+  void gotoNextPage() {
+    Log.d("applyViewModelProvider - detailPageIndex:${state.detailPageIndex}");
+    bool success = FormTypes.startDetailPageByType(state.applyDetail?['detail_pages'], state.detailPageIndex);
+    Log.d("applyViewModelProvider - gotoNextPage - success:$success");
+    if (!success) {
+      FormPage.startInstance();
+    } else {
+      state.detailPageIndex++;
+    }
+  }
+
+  //返回的时候处理当前的索引
+  void handlePopAction() {
+    state.detailPageIndex--;
+  }
+}

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

@@ -0,0 +1,26 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'apply_view_model.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$applyViewModelHash() => r'22aedac0efe149d5544938acf75c975b743c7cd9';
+
+/// See also [ApplyViewModel].
+@ProviderFor(ApplyViewModel)
+final applyViewModelProvider =
+    AutoDisposeNotifierProvider<ApplyViewModel, ApplyState>.internal(
+  ApplyViewModel.new,
+  name: r'applyViewModelProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$applyViewModelHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$ApplyViewModel = AutoDisposeNotifier<ApplyState>;
+// 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

+ 10 - 10
packages/cpt_form/lib/modules/form/apply/form_apply_screen.dart

@@ -1,4 +1,5 @@
 import 'package:auto_route/auto_route.dart';
+import 'package:cpt_form/modules/apply/form_terms_page.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
@@ -9,7 +10,6 @@ import 'package:widgets/widget_export.dart';
 import 'form_apply_view_model.dart';
 import 'item_form_apply.dart';
 
-
 @RoutePage()
 class FormApplyScreen extends HookConsumerWidget {
   @override
@@ -25,13 +25,12 @@ class FormApplyScreen extends HookConsumerWidget {
       };
     }, []);
 
-    return Container(
+    return SizedBox(
       width: double.infinity,
       height: double.infinity,
       child: EasyRefresh(
         controller: viewModel.refreshController,
         onRefresh: viewModel.onRefresh,
-        onLoad: viewModel.loadMore,
         child: LoadStateLayout(
           state: state.loadingState,
           errorMessage: state.errorMessage,
@@ -41,13 +40,14 @@ class FormApplyScreen extends HookConsumerWidget {
           successSliverWidget: [
             SliverList(
                 delegate: SliverChildBuilderDelegate(
-                      (context, index) {
-                    return FormApplyItem(index: index, item: state.datas[index]).onTap((){
-
-                    });
-                  },
-                  childCount: state.datas.length,
-                ))
+              (context, index) {
+                return FormApplyItem(index: index, item: state.datas[index]).onTap(() {
+                  //进入申请的协议页面
+                  FormTermsPage.startInstance(formType: state.datas[index]);
+                });
+              },
+              childCount: state.datas.length,
+            ))
           ],
         ),
       ).marginOnly(top: 5, bottom: 5),

+ 6 - 21
packages/cpt_form/lib/modules/form/apply/form_apply_view_model.dart

@@ -9,13 +9,12 @@ part 'form_apply_view_model.g.dart';
 
 @riverpod
 class FormApplyViewModel extends _$FormApplyViewModel {
-  var _curPage = 1; //请求参数当前的页面
   var _needShowPlaceholder = true; //是否展示LoadingView
 
   // Refresh 控制器
   final EasyRefreshController refreshController = EasyRefreshController(
-    controlFinishRefresh: true,  //允许刷新
-    controlFinishLoad: true,   //允许加载
+    controlFinishRefresh: true, //允许刷新
+    controlFinishLoad: false, //不允许加载
   );
 
   @override
@@ -30,19 +29,11 @@ class FormApplyViewModel extends _$FormApplyViewModel {
 
   // Refresh 刷新事件
   Future onRefresh() async {
-    _curPage = 1;
-    fetchList();
-  }
-
-  // Refresh 加载事件
-  Future loadMore() async {
-    _curPage++;
     fetchList();
   }
 
   // 重试请求
   Future retryRequest() async {
-    _curPage = 1;
     _needShowPlaceholder = true;
     fetchList();
   }
@@ -70,12 +61,11 @@ class FormApplyViewModel extends _$FormApplyViewModel {
     //   changeLoadingState(LoadState.State_Error);
     // }
 
-
     await Future.delayed(const Duration(milliseconds: 1500));
 
-    final List<String> list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
+    final List<String> list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"];
 
-    if (_curPage == 1) {
+    if (list.isNotEmpty) {
       //刷新的方式
       state = state.copyWith(datas: list);
       refreshController.finishRefresh();
@@ -84,13 +74,8 @@ class FormApplyViewModel extends _$FormApplyViewModel {
       changeLoadingState(LoadState.State_Success, null);
     } else {
       //加载更多
-      final allList = state.datas;
-      allList.addAll(list);
-      state.datas.addAll(list);
-
-      refreshController.finishLoad();
-
-      state = state.copyWith(datas: allList);
+      state = state.copyWith(datas: []);
+      changeLoadingState(LoadState.State_Empty, null);
     }
 
     // 最后赋值

+ 1 - 1
packages/cpt_form/lib/modules/form/apply/form_apply_view_model.g.dart

@@ -7,7 +7,7 @@ part of 'form_apply_view_model.dart';
 // **************************************************************************
 
 String _$formApplyViewModelHash() =>
-    r'9c08f52f81fe505e07c4b14dac66f10437f482e9';
+    r'1fba2b4d77c876507a8138c25ccf205d2b819f72';
 
 /// See also [FormApplyViewModel].
 @ProviderFor(FormApplyViewModel)

+ 5 - 3
packages/cpt_form/lib/modules/form/apply/item_form_apply.dart

@@ -1,3 +1,4 @@
+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';
@@ -31,12 +32,13 @@ class FormApplyItem extends StatelessWidget {
         crossAxisAlignment: CrossAxisAlignment.center,
         children: [
           MyLoadImage(
-            "https://img0.baidu.com/it/u=2679587808,2501833998&fm=253&fmt=auto&app=120&f=JPEG?w=372&h=400",
-            width: 38.5,
+            FormTypes.iconMap[item]?['icon_path'],
+              width: FormTypes.iconMap[item]?['width'],
+              height: FormTypes.iconMap[item]?['height'],
           ),
 
           MyTextView(
-            "Function Room",
+            FormTypes.iconMap[item]?['name'],
             marginLeft: 17,
             fontSize: 15,
             textColor: context.appColors.textBlack,

+ 0 - 93
packages/cpt_form/lib/modules/form/form_icons.dart

@@ -1,93 +0,0 @@
-import 'package:cs_resources/generated/assets.dart';
-import 'package:cs_resources/generated/l10n.dart';
-
-class FormIcons {
-
-  //对应的type类型 对应的icon的图片与宽高
-  static Map<String, Map<String, dynamic>> iconMap = {
-    //Access Card-Owner
-    '1': {
-      'name': S.current.access_card_owner,
-      'icon_path': Assets.formAccessCard,
-      'width': 39.0,
-      'height': 31.5,
-    },
-    //Access Card-Tenant
-    '2': {
-      'name': S.current.access_card_tenant,
-      'icon_path': Assets.formAccessCard,
-      'width': 39.0,
-      'height': 31.5,
-    },
-    //Car Park Cancellation
-    '3': {
-      'name': S.current.car_park_cancellation,
-      'icon_path': Assets.formCarVehicle,
-      'width': 39.5,
-      'height': 33.5,
-    },
-    //Moving In
-    '4': {
-      'name': S.current.moving_in,
-      'icon_path': Assets.formMoveInOut,
-      'width': 36.5,
-      'height': 39.5,
-    },
-    //Moving Out
-    '5': {
-      'name': S.current.moving_out,
-      'icon_path': Assets.formMoveInOut,
-      'width': 36.5,
-      'height': 39.5,
-    },
-    //Overnight Parking
-    '6': {
-      'name': S.current.overnight_parking,
-      'icon_path': Assets.formOvernight,
-      'width': 39.0,
-      'height': 37.0,
-    },
-    //Registration of 2nd Vehicle
-    '7': {
-      'name': S.current.registration_of_2_vehicle,
-      'icon_path': Assets.formCarVehicle,
-      'width': 39.5,
-      'height': 33.5,
-    },
-    //Renovation
-    '8': {
-      'name': S.current.renovation,
-      'icon_path': Assets.formRenovation,
-      'width': 35.5,
-      'height': 40.0,
-    },
-    //Re-Registration of 1st Vehicle-Owner
-    '9': {
-      'name': S.current.re_registration_of_1_vehicle_owner,
-      'icon_path': Assets.formCarVehicle,
-      'width': 39.5,
-      'height': 33.5,
-    },
-    //Re-Registration of 1st Vehicle-Owner
-    '10': {
-      'name': S.current.re_registration_of_1_vehicle_tenant,
-      'icon_path': Assets.formCarVehicle,
-      'width': 39.5,
-      'height': 33.5,
-    },
-    //Re-Registration of Bicycles
-    '11': {
-      'name': S.current.re_registration_of_bicycle,
-      'icon_path': Assets.formBicycles,
-      'width': 39.0,
-      'height': 33.5,
-    },
-    //Vehicle Label Replacement
-    '12': {
-      'name': S.current.vehicle_label_replacement,
-      'icon_path': Assets.formLabeReplace,
-      'width': 38.0,
-      'height': 27.5,
-    },
-  };
-}

+ 2 - 2
packages/cpt_form/lib/modules/form/form_page.dart

@@ -20,9 +20,9 @@ class FormPage extends HookConsumerWidget {
   //启动当前页面
   static void startInstance({BuildContext? context}) {
     if (context != null) {
-      context.router.push(const FormPageRoute());
+      context.router.navigate(const FormPageRoute());
     } else {
-      appRouter.push(const FormPageRoute());
+      appRouter.navigate(const FormPageRoute());
     }
   }
 

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

@@ -0,0 +1,353 @@
+import 'package:cpt_form/modules/apply/attachment_page.dart';
+import 'package:cpt_form/modules/apply/form_payment_page.dart';
+import 'package:cpt_form/modules/apply/guest_vehicle_page.dart';
+import 'package:cpt_form/modules/apply/large_text_box_page.dart';
+import 'package:cpt_form/modules/apply/moving_company_page.dart';
+import 'package:cpt_form/modules/apply/moving_date_page.dart';
+import 'package:cpt_form/modules/apply/note_management_page.dart';
+import 'package:cpt_form/modules/apply/renovation_company_page.dart';
+import 'package:cpt_form/modules/apply/renovation_date_page.dart';
+import 'package:cpt_form/modules/apply/signature_page.dart';
+import 'package:cpt_form/modules/apply/type_of_application_page.dart';
+import 'package:cpt_form/modules/apply/vehicle_info_page.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/generated/l10n.dart';
+
+//每一种 formType 对应的详情页面类型
+enum DetailPageType {
+  vehicleInfo, //车辆信息
+  note2Management, //备注给管理员输入框
+  signature, //单独的签名页面
+  typeOfApplication, //申请类型下拉选
+  attachment, //附件
+  movingDate, //搬家日期
+  movingCompany, //搬家公司信息
+  guestVehicleInfo, //访客与车辆信息
+  renovationDate, //装修日期
+  renovationCompany, //装修公司信息
+  largeTextBox, //大说明文本框
+  payment, //支付页面
+}
+
+class FormTypes {
+  //对应的type类型 对应的icon的图片与宽高
+  static Map<String, Map<String, dynamic>> iconMap = {
+    //Access Card-Owner
+    '1': {
+      'name': S.current.access_card_owner,
+      'icon_path': Assets.formAccessCard,
+      'width': 39.0,
+      'height': 31.5,
+    },
+    //Access Card-Tenant
+    '2': {
+      'name': S.current.access_card_tenant,
+      'icon_path': Assets.formAccessCard,
+      'width': 39.0,
+      'height': 31.5,
+    },
+    //Car Park Cancellation
+    '3': {
+      'name': S.current.car_park_cancellation,
+      'icon_path': Assets.formCarVehicle,
+      'width': 39.5,
+      'height': 33.5,
+    },
+    //Moving In
+    '4': {
+      'name': S.current.moving_in,
+      'icon_path': Assets.formMoveInOut,
+      'width': 36.5,
+      'height': 39.5,
+    },
+    //Moving Out
+    '5': {
+      'name': S.current.moving_out,
+      'icon_path': Assets.formMoveInOut,
+      'width': 36.5,
+      'height': 39.5,
+    },
+    //Overnight Parking
+    '6': {
+      'name': S.current.overnight_parking,
+      'icon_path': Assets.formOvernight,
+      'width': 39.0,
+      'height': 37.0,
+    },
+    //Registration of 2nd Vehicle
+    '7': {
+      'name': S.current.registration_of_2_vehicle,
+      'icon_path': Assets.formCarVehicle,
+      'width': 39.5,
+      'height': 33.5,
+    },
+    //Renovation
+    '8': {
+      'name': S.current.renovation,
+      'icon_path': Assets.formRenovation,
+      'width': 35.5,
+      'height': 40.0,
+    },
+    //Re-Registration of 1st Vehicle-Owner
+    '9': {
+      'name': S.current.re_registration_of_1_vehicle_owner,
+      'icon_path': Assets.formCarVehicle,
+      'width': 39.5,
+      'height': 33.5,
+    },
+    //Re-Registration of 1st Vehicle-Owner
+    '10': {
+      'name': S.current.re_registration_of_1_vehicle_tenant,
+      'icon_path': Assets.formCarVehicle,
+      'width': 39.5,
+      'height': 33.5,
+    },
+    //Re-Registration of Bicycles
+    '11': {
+      'name': S.current.re_registration_of_bicycle,
+      'icon_path': Assets.formBicycles,
+      'width': 39.0,
+      'height': 33.5,
+    },
+    //Vehicle Label Replacement
+    '12': {
+      'name': S.current.vehicle_label_replacement,
+      'icon_path': Assets.formLabeReplace,
+      'width': 38.0,
+      'height': 27.5,
+    },
+  };
+
+  // ===================================  Begin  ↓  ===================================
+
+  //type类型对应的详情页面组与对应的数据
+  static Map<String, Map<String, dynamic>> detailPageMap = {
+    //Access Card-Owner
+    '1': {
+      'title': S.current.access_card_owner,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.typeOfApplication,
+        DetailPageType.note2Management,
+        DetailPageType.payment,
+      ],
+      'detail_data': {
+        'note_management_txt': S.current.access_card_desc,
+      }
+    },
+    //Access Card-Tenant
+    '2': {
+      'title': S.current.access_card_tenant,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.typeOfApplication,
+        DetailPageType.attachment,
+        DetailPageType.note2Management,
+        DetailPageType.payment,
+      ],
+      'detail_data': {
+        'attachment_txt': S.current.access_card_tenant_letter,
+        'note_management_txt': S.current.access_card_desc,
+      }
+    },
+    //Car Park Cancellation
+    '3': {
+      'title': S.current.car_park_cancellation,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.vehicleInfo,
+        DetailPageType.note2Management,
+        DetailPageType.signature,
+      ],
+      '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}',
+      }
+    },
+    //Moving In
+    '4': {
+      'title': S.current.moving_in,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.movingDate,
+        DetailPageType.movingCompany,
+        DetailPageType.note2Management,
+        DetailPageType.payment,
+      ],
+      'detail_data': {
+        'note_management_txt': S.current.moving_in_msg,
+      }
+    },
+    //Moving Out
+    '5': {
+      'title': S.current.moving_out,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.movingDate,
+        DetailPageType.movingCompany,
+        DetailPageType.note2Management,
+        DetailPageType.payment,
+      ],
+      'detail_data': {
+        'note_management_txt': S.current.moving_in_msg,
+      }
+    },
+    //Overnight Parking
+    '6': {
+      'title': S.current.overnight_parking,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.guestVehicleInfo,
+        DetailPageType.note2Management,
+        DetailPageType.signature,
+      ],
+      'detail_data': {
+        'note_management_txt': S.current.overnight_parking_msg,
+      }
+    },
+    //Registration of 2nd Vehicle
+    '7': {
+      'title': S.current.registration_of_2_vehicle,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.vehicleInfo,
+        DetailPageType.attachment,
+        DetailPageType.note2Management,
+        DetailPageType.signature,
+      ],
+      '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,
+      }
+    },
+    //Renovation
+    '8': {
+      'title': S.current.renovation,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.renovationDate,
+        DetailPageType.renovationCompany,
+        DetailPageType.largeTextBox,
+        DetailPageType.attachment,
+        DetailPageType.note2Management,
+        DetailPageType.payment,
+      ],
+      'detail_data': {
+        'large_txt': S.current.list_of_renovation_works,
+        'attachment_txt': S.current.renovation_attachments,
+        'note_management_txt': S.current.renovation_note,
+      }
+    },
+    //Re-Registration of 1st Vehicle-Owner
+    '9': {
+      'title': S.current.re_registration_of_1_vehicle_owner,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.vehicleInfo,
+        DetailPageType.attachment,
+        DetailPageType.note2Management,
+        DetailPageType.signature,
+      ],
+      '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,
+      }
+    },
+    //Re-Registration of 1st Vehicle-Owner
+    '10': {
+      'title': S.current.re_registration_of_1_vehicle_tenant,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.vehicleInfo,
+        DetailPageType.attachment,
+        DetailPageType.note2Management,
+        DetailPageType.signature,
+      ],
+      '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,
+      }
+    },
+    //Re-Registration of Bicycles
+    '11': {
+      'title': S.current.re_registration_of_bicycle,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.typeOfApplication,
+        DetailPageType.attachment,
+        DetailPageType.note2Management,
+        DetailPageType.signature,
+      ],
+      'detail_data': {
+        'attachment_txt': S.current.bicycle_desc,
+        'note_management_txt': S.current.bicycle_note,
+      }
+    },
+    //Vehicle Label Replacement
+    '12': {
+      'title': S.current.vehicle_label_replacement,
+      'term_url': 'https://lehuoer.com/privacy.html',
+      'detail_pages': [
+        DetailPageType.typeOfApplication,
+        DetailPageType.attachment,
+        DetailPageType.note2Management,
+        DetailPageType.payment,
+      ],
+      '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,
+      }
+    },
+  };
+
+  // ===================================  Begin  ↓  ===================================
+
+  //根据详情页面类型跳转到对应的详情
+  static bool startDetailPageByType(List<DetailPageType>? types, int index) {
+    //判断数组是否为空
+    if (types == null || types.isEmpty || index >= types.length) return false;
+
+    //去除除数组的第0索引,根据PageType类型判断跳转进入哪一个页面
+    final nextPage = types[index];
+    switch (nextPage) {
+      case DetailPageType.vehicleInfo:
+        VehicleInfoPage.startInstance();
+        break;
+      case DetailPageType.note2Management:
+        NoteManagementPage.startInstance();
+        break;
+      case DetailPageType.signature:
+        SignaturePage.startInstance();
+        break;
+      case DetailPageType.typeOfApplication:
+        TypeOfApplicationPage.startInstance();
+        break;
+      case DetailPageType.attachment:
+        AttachmentPage.startInstance();
+        break;
+      case DetailPageType.movingDate:
+        MovingDatePage.startInstance();
+        break;
+      case DetailPageType.movingCompany:
+        MovingCompanyPage.startInstance();
+        break;
+      case DetailPageType.guestVehicleInfo:
+        GuestVehiclePage.startInstance();
+        break;
+      case DetailPageType.renovationDate:
+        RenovationDatePage.startInstance();
+        break;
+      case DetailPageType.renovationCompany:
+        RenovationCompanyPage.startInstance();
+        break;
+      case DetailPageType.largeTextBox:
+        LargeTextBoxPage.startInstance();
+        break;
+      case DetailPageType.payment:
+        FormPaymentPage.startInstance();
+        break;
+    }
+
+    //移除数组的第0索引,避免重复跳转页面
+    return true;
+  }
+}

+ 14 - 0
packages/cpt_form/lib/modules/form_export.dart

@@ -0,0 +1,14 @@
+enum DetailPageType {
+  vehicleInfo, //车辆信息
+  note2Management, //备注给管理员输入框
+  signature, //单独的签名页面
+  typeOfApplication, //申请类型下拉选
+  attachment, //附件
+  movingDate, //搬家日期
+  movingCompany, //搬家公司信息
+  guestVehicleInfo, //访客与车辆信息
+  renovationDate, //装修日期
+  renovationCompany, //装修公司信息
+  largeTextBox, //大说明文本框
+  payment, //支付页面
+}

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

@@ -8,6 +8,19 @@ import '../../modules/form/apply/form_apply_screen.dart';
 import '../../modules/form/submit/form_submit_screen.dart';
 import '../../modules/form/approve/form_approve_screen.dart';
 import '../../modules/form/not_approve/form_not_approve_screen.dart';
+import '../../modules/apply/attachment_page.dart';
+import '../../modules/apply/form_payment_page.dart';
+import '../../modules/apply/guest_vehicle_page.dart';
+import '../../modules/apply/large_text_box_page.dart';
+import '../../modules/apply/moving_company_page.dart';
+import '../../modules/apply/moving_date_page.dart';
+import '../../modules/apply/note_management_page.dart';
+import '../../modules/apply/renovation_company_page.dart';
+import '../../modules/apply/renovation_date_page.dart';
+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';
 
 part 'form_page_router.gr.dart';
 
@@ -29,5 +42,18 @@ class FormPageRouter extends _$FormPageRouter {
             AutoRoute(page: FormNotApprovePageRoute.page, path: 'not_approve'),
           ],
         ),
+        CustomRoute(page: AttachmentPageRoute.page, path: RouterPath.formAttachment, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: FormPaymentPageRoute.page, path: RouterPath.formPayment, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: GuestVehiclePageRoute.page, path: RouterPath.formGuestVehicle, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: LargeTextBoxPageRoute.page, path: RouterPath.formLargeTextBox, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: MovingCompanyPageRoute.page, path: RouterPath.formMovingCompany, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: MovingDatePageRoute.page, path: RouterPath.formMovingDate, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: NoteManagementPageRoute.page, path: RouterPath.formNoteManagement, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: RenovationCompanyPageRoute.page, path: RouterPath.formRenovationCompany, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: RenovationDatePageRoute.page, path: RouterPath.formRenovationDate, transitionsBuilder: applySlideTransition),
+        CustomRoute(page: SignaturePageRoute.page, path: RouterPath.formSignature, transitionsBuilder: applySlideTransition),
+        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),
       ];
 }

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

@@ -15,6 +15,12 @@ abstract class _$FormPageRouter extends RootStackRouter {
 
   @override
   final Map<String, PageFactory> pagesMap = {
+    AttachmentPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const AttachmentPage(),
+      );
+    },
     FormApplyPageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
         routeData: routeData,
@@ -39,16 +45,109 @@ abstract class _$FormPageRouter extends RootStackRouter {
         child: const FormPage(),
       );
     },
+    FormPaymentPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const FormPaymentPage(),
+      );
+    },
     FormSubmitPageRoute.name: (routeData) {
       return AutoRoutePage<dynamic>(
         routeData: routeData,
         child: FormSubmitScreen(),
       );
     },
+    FormTermsPageRoute.name: (routeData) {
+      final pathParams = routeData.inheritedPathParams;
+      final args = routeData.argsAs<FormTermsPageRouteArgs>(
+          orElse: () =>
+              FormTermsPageRouteArgs(type: pathParams.getString('type')));
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: FormTermsPage(
+          key: args.key,
+          type: args.type,
+        ),
+      );
+    },
+    GuestVehiclePageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const GuestVehiclePage(),
+      );
+    },
+    LargeTextBoxPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const LargeTextBoxPage(),
+      );
+    },
+    MovingCompanyPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const MovingCompanyPage(),
+      );
+    },
+    MovingDatePageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const MovingDatePage(),
+      );
+    },
+    NoteManagementPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const NoteManagementPage(),
+      );
+    },
+    RenovationCompanyPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const RenovationCompanyPage(),
+      );
+    },
+    RenovationDatePageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const RenovationDatePage(),
+      );
+    },
+    SignaturePageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const SignaturePage(),
+      );
+    },
+    TypeOfApplicationPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const TypeOfApplicationPage(),
+      );
+    },
+    VehicleInfoPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const VehicleInfoPage(),
+      );
+    },
   };
 }
 
 /// generated route for
+/// [AttachmentPage]
+class AttachmentPageRoute extends PageRouteInfo<void> {
+  const AttachmentPageRoute({List<PageRouteInfo>? children})
+      : super(
+          AttachmentPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'AttachmentPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
 /// [FormApplyScreen]
 class FormApplyPageRoute extends PageRouteInfo<void> {
   const FormApplyPageRoute({List<PageRouteInfo>? children})
@@ -105,6 +204,20 @@ class FormPageRoute extends PageRouteInfo<void> {
 }
 
 /// generated route for
+/// [FormPaymentPage]
+class FormPaymentPageRoute extends PageRouteInfo<void> {
+  const FormPaymentPageRoute({List<PageRouteInfo>? children})
+      : super(
+          FormPaymentPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'FormPaymentPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
 /// [FormSubmitScreen]
 class FormSubmitPageRoute extends PageRouteInfo<void> {
   const FormSubmitPageRoute({List<PageRouteInfo>? children})
@@ -117,3 +230,182 @@ class FormSubmitPageRoute extends PageRouteInfo<void> {
 
   static const PageInfo<void> page = PageInfo<void>(name);
 }
+
+/// generated route for
+/// [FormTermsPage]
+class FormTermsPageRoute extends PageRouteInfo<FormTermsPageRouteArgs> {
+  FormTermsPageRoute({
+    Key? key,
+    required String type,
+    List<PageRouteInfo>? children,
+  }) : super(
+          FormTermsPageRoute.name,
+          args: FormTermsPageRouteArgs(
+            key: key,
+            type: type,
+          ),
+          rawPathParams: {'type': type},
+          initialChildren: children,
+        );
+
+  static const String name = 'FormTermsPageRoute';
+
+  static const PageInfo<FormTermsPageRouteArgs> page =
+      PageInfo<FormTermsPageRouteArgs>(name);
+}
+
+class FormTermsPageRouteArgs {
+  const FormTermsPageRouteArgs({
+    this.key,
+    required this.type,
+  });
+
+  final Key? key;
+
+  final String type;
+
+  @override
+  String toString() {
+    return 'FormTermsPageRouteArgs{key: $key, type: $type}';
+  }
+}
+
+/// generated route for
+/// [GuestVehiclePage]
+class GuestVehiclePageRoute extends PageRouteInfo<void> {
+  const GuestVehiclePageRoute({List<PageRouteInfo>? children})
+      : super(
+          GuestVehiclePageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'GuestVehiclePageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [LargeTextBoxPage]
+class LargeTextBoxPageRoute extends PageRouteInfo<void> {
+  const LargeTextBoxPageRoute({List<PageRouteInfo>? children})
+      : super(
+          LargeTextBoxPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'LargeTextBoxPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [MovingCompanyPage]
+class MovingCompanyPageRoute extends PageRouteInfo<void> {
+  const MovingCompanyPageRoute({List<PageRouteInfo>? children})
+      : super(
+          MovingCompanyPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'MovingCompanyPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [MovingDatePage]
+class MovingDatePageRoute extends PageRouteInfo<void> {
+  const MovingDatePageRoute({List<PageRouteInfo>? children})
+      : super(
+          MovingDatePageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'MovingDatePageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [NoteManagementPage]
+class NoteManagementPageRoute extends PageRouteInfo<void> {
+  const NoteManagementPageRoute({List<PageRouteInfo>? children})
+      : super(
+          NoteManagementPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'NoteManagementPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [RenovationCompanyPage]
+class RenovationCompanyPageRoute extends PageRouteInfo<void> {
+  const RenovationCompanyPageRoute({List<PageRouteInfo>? children})
+      : super(
+          RenovationCompanyPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'RenovationCompanyPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [RenovationDatePage]
+class RenovationDatePageRoute extends PageRouteInfo<void> {
+  const RenovationDatePageRoute({List<PageRouteInfo>? children})
+      : super(
+          RenovationDatePageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'RenovationDatePageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [SignaturePage]
+class SignaturePageRoute extends PageRouteInfo<void> {
+  const SignaturePageRoute({List<PageRouteInfo>? children})
+      : super(
+          SignaturePageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'SignaturePageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [TypeOfApplicationPage]
+class TypeOfApplicationPageRoute extends PageRouteInfo<void> {
+  const TypeOfApplicationPageRoute({List<PageRouteInfo>? children})
+      : super(
+          TypeOfApplicationPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'TypeOfApplicationPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [VehicleInfoPage]
+class VehicleInfoPageRoute extends PageRouteInfo<void> {
+  const VehicleInfoPageRoute({List<PageRouteInfo>? children})
+      : super(
+          VehicleInfoPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'VehicleInfoPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}

+ 88 - 65
packages/cs_plugin_basic/lib/widget/webview_page.dart

@@ -1,10 +1,14 @@
+import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:flutter/material.dart';
+import 'package:plugin_platform/engine/image/image_nine_grid.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:url_launcher/url_launcher.dart';
 import 'dart:io';
 import 'package:webview_flutter/webview_flutter.dart';
+import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:cs_resources/constants/color_constants.dart';
+import 'package:widgets/my_button.dart';
 
 /// webview 封装
 // ignore: must_be_immutable
@@ -12,10 +16,12 @@ class WebViewPage extends StatefulWidget {
   final String? initialUrl;
   bool? showAppbar = true;
   Map? arguments = {'title': '', 'initialUrl': ''};
+  String? bottomBtnTxt; //是否有底部按钮,底部按钮的文本
+  VoidCallback? bottomBtnAction; //底部按钮的回调
 
   List<Widget>? actions = [];
 
-  WebViewPage({Key? key, this.showAppbar, this.initialUrl, this.arguments, this.actions}) : super(key: key);
+  WebViewPage({Key? key, this.showAppbar, this.initialUrl, this.arguments, this.actions, this.bottomBtnTxt, this.bottomBtnAction}) : super(key: key);
 
   @override
   _WebViewPageState createState() => _WebViewPageState();
@@ -154,80 +160,97 @@ class _WebViewPageState extends State<WebViewPage> {
   Widget build(BuildContext context) {
     return Scaffold(
         backgroundColor: Colors.white,
-        appBar:
-            _showAppbar ? MyAppBar.appBar(context, title, backgroundColor: Colors.white, actions: widget.actions, backCallback: _onWillPop) : null,
+        appBar: _showAppbar ? MyAppBar.appBar(context, title, backgroundColor: Colors.white, actions: widget.actions, backCallback: _onWillPop) : null,
         body: SafeArea(
           bottom: true,
           top: false,
-          child: IndexedStack(
-            index: _stackToView,
+          child: Column(
             children: [
-              Column(
+              IndexedStack(
+                index: _stackToView,
                 children: [
-                  Expanded(
-                    child: WillPopScope(
-                      onWillPop: _onWillPop,
-                      child: WebView(
-                        key: _key,
-                        initialUrl: _initialUrl,
-                        userAgent: '',
-                        //JS执行模式 是否允许JS执行
-                        javascriptMode: JavascriptMode.unrestricted,
-                        //webview创建好
-                        onWebViewCreated: (WebViewController controller) {
-                          webViewController = controller;
-                        },
-                        onProgress: (int progress) {
-                          // print('progress=====>$progress');
-                          if (progress == 100) {
-                            Future.delayed(const Duration(milliseconds: 500)).then((value) => {
-                                  // 获取页面高度
-                                  _getWebViewHeight()
+                  Column(
+                    children: [
+                      Expanded(
+                        child: WillPopScope(
+                          onWillPop: _onWillPop,
+                          child: WebView(
+                            key: _key,
+                            initialUrl: _initialUrl,
+                            userAgent: '',
+                            //JS执行模式 是否允许JS执行
+                            javascriptMode: JavascriptMode.unrestricted,
+                            //webview创建好
+                            onWebViewCreated: (WebViewController controller) {
+                              webViewController = controller;
+                            },
+                            onProgress: (int progress) {
+                              // print('progress=====>$progress');
+                              if (progress == 100) {
+                                Future.delayed(const Duration(milliseconds: 500)).then((value) => {
+                                      // 获取页面高度
+                                      _getWebViewHeight()
+                                    });
+                              }
+                            },
+                            onPageStarted: (String url) {
+                              // print('onPageStarted=====>$url');
+                            },
+                            onPageFinished: (String url) {
+                              Log.d('onPageFinished=====>$url');
+                              if (mounted) {
+                                setState(() {
+                                  _stackToView = 0;
                                 });
-                          }
-                        },
-                        onPageStarted: (String url) {
-                          // print('onPageStarted=====>$url');
-                        },
-                        onPageFinished: (String url) {
-                          Log.d('onPageFinished=====>$url');
-                          if (mounted) {
-                            setState(() {
-                              _stackToView = 0;
-                            });
-                          }
-                        },
-                        onWebResourceError: (WebResourceError error) {
-                          // print('error=====>$error');
-                        },
-                        gestureNavigationEnabled: true,
-                        // 注册js 回调
-                        javascriptChannels: _invokeJavascriptChannel(context).toSet(),
-                        navigationDelegate: (NavigationRequest request) async {
-                          //如果是tel标签需要阻止并调用 launchUrl 的方法调用拨打电话
-                          if (request.url.startsWith('tel:')) {
-                            // 拦截tel链接
-                            if (!await launchUrl(Uri.parse(request.url))) throw '无法启动拨打电话功能';
-                            return NavigationDecision.prevent; // 阻止WebView导航到该链接
-                          }
+                              }
+                            },
+                            onWebResourceError: (WebResourceError error) {
+                              // print('error=====>$error');
+                            },
+                            gestureNavigationEnabled: true,
+                            // 注册js 回调
+                            javascriptChannels: _invokeJavascriptChannel(context).toSet(),
+                            navigationDelegate: (NavigationRequest request) async {
+                              //如果是tel标签需要阻止并调用 launchUrl 的方法调用拨打电话
+                              if (request.url.startsWith('tel:')) {
+                                // 拦截tel链接
+                                if (!await launchUrl(Uri.parse(request.url))) throw '无法启动拨打电话功能';
+                                return NavigationDecision.prevent; // 阻止WebView导航到该链接
+                              }
 
-                          // 可以继续WebView的内部跳转
-                          return NavigationDecision.navigate;
-                        },
+                              // 可以继续WebView的内部跳转
+                              return NavigationDecision.navigate;
+                            },
+                          ),
+                        ),
+                      )
+                    ],
+                  ),
+                  Container(
+                    color: Colors.white,
+                    child: const Center(
+                      child: CircularProgressIndicator(
+                        strokeWidth: 3,
+                        valueColor: AlwaysStoppedAnimation(ColorConstants.appBlue),
                       ),
                     ),
-                  )
-                ],
-              ),
-              Container(
-                color: Colors.white,
-                child: Center(
-                  child: CircularProgressIndicator(
-                    strokeWidth: 3,
-                    valueColor: AlwaysStoppedAnimation(ColorConstants.appBlue),
                   ),
-                ),
-              ),
+                ],
+              ).expanded(),
+
+              //底部按钮
+              if (widget.bottomBtnTxt != null)
+                MyButton(
+                  onPressed: widget.bottomBtnAction,
+                  text: widget.bottomBtnTxt??"",
+                  textColor: Colors.white,
+                  backgroundColor: context.appColors.btnBgDefault,
+                  fontWeight: FontWeight.w500,
+                  type: ClickType.throttle,
+                  fontSize: 16,
+                  minHeight: 50,
+                  radius: 0,
+                )
             ],
           ),
         ));

+ 12 - 0
packages/cs_resources/lib/generated/intl/messages_en.dart

@@ -65,6 +65,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "back_home": MessageLookupByLibrary.simpleMessage("Back Home"),
         "bicycle_desc": MessageLookupByLibrary.simpleMessage(
             "Please upload a photo of your bicycle"),
+        "bicycle_note": MessageLookupByLibrary.simpleMessage(
+            "Kindly indicate the model, brand, colour and type of bicycle."),
         "block": MessageLookupByLibrary.simpleMessage("Block"),
         "block_desc": MessageLookupByLibrary.simpleMessage(
             "Block refers to the street number of the unit\'s official mailing address"),
@@ -196,6 +198,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "introduction_to_info_pack":
             MessageLookupByLibrary.simpleMessage("Introduction to info-pack"),
         "iu_number": MessageLookupByLibrary.simpleMessage("IU NUMBER"),
+        "label_replace_note": MessageLookupByLibrary.simpleMessage(
+            "If you would like to leave the Management a note to accompany this application, please leave them here.\n\nFor replacement of car label, please include the serial number of the damaged car label."),
         "label_txt": MessageLookupByLibrary.simpleMessage(
             "Please attach the following documents to accompany the vehicle registration form:"),
         "label_txt_1": MessageLookupByLibrary.simpleMessage(
@@ -210,6 +214,8 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Latest Transactions"),
         "license_plate_number":
             MessageLookupByLibrary.simpleMessage("License Plate Number"),
+        "list_of_renovation_works":
+            MessageLookupByLibrary.simpleMessage("LIST OF RENOVATION WORKS"),
         "login": MessageLookupByLibrary.simpleMessage("Log In"),
         "logout": MessageLookupByLibrary.simpleMessage("Logout"),
         "logout_alert": MessageLookupByLibrary.simpleMessage(
@@ -247,6 +253,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "other": MessageLookupByLibrary.simpleMessage("Other"),
         "overnight_parking":
             MessageLookupByLibrary.simpleMessage("Overnight Parking"),
+        "overnight_parking_msg": MessageLookupByLibrary.simpleMessage(
+            "Please provide the period of overnight parking."),
         "owner": MessageLookupByLibrary.simpleMessage("Owner"),
         "owner_or_tenant":
             MessageLookupByLibrary.simpleMessage("Are you an owner or tenant?"),
@@ -306,8 +314,12 @@ class MessageLookup extends MessageLookupByLibrary {
         "remove_account_tips": MessageLookupByLibrary.simpleMessage(
             "Are you sure you want to remove your account?"),
         "renovation": MessageLookupByLibrary.simpleMessage("Renovation"),
+        "renovation_attachments": MessageLookupByLibrary.simpleMessage(
+            "To assist us with the approval of your application, kindly attach the following documents:\n\n1. Floor Plan and drawings of the proposed renovation\n\n2.Professional Engineers Endorsement\n\n3.Electrical layout\n\n4.Joint Indemnity For Owner andContractors"),
         "renovation_end_date":
             MessageLookupByLibrary.simpleMessage("RENOVATION END DATE"),
+        "renovation_note": MessageLookupByLibrary.simpleMessage(
+            "Kindly list all other sub-contractors who are involved in your renovation.\n\nIf you would like to leave the Management a note to accompany this application or have any special requests, please leave them here."),
         "renovation_start_date":
             MessageLookupByLibrary.simpleMessage("RENOVATION START DATE"),
         "resend_code": MessageLookupByLibrary.simpleMessage("Resend Code"),

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

@@ -59,6 +59,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "attachments": MessageLookupByLibrary.simpleMessage("附件"),
         "back_home": MessageLookupByLibrary.simpleMessage("返回首页"),
         "bicycle_desc": MessageLookupByLibrary.simpleMessage("请上传您的自行车照片"),
+        "bicycle_note":
+            MessageLookupByLibrary.simpleMessage("请注明自行车的型号、品牌、颜色和自行车类型。"),
         "block": MessageLookupByLibrary.simpleMessage("街区"),
         "block_desc": MessageLookupByLibrary.simpleMessage("街区是指单位官方邮编街道号"),
         "block_example":
@@ -159,6 +161,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "introduction_to_info_pack":
             MessageLookupByLibrary.simpleMessage("信息介绍"),
         "iu_number": MessageLookupByLibrary.simpleMessage("IU 编号"),
+        "label_replace_note": MessageLookupByLibrary.simpleMessage(
+            "如果您想在申请时给管理层留一张便条,请在此处留下。\n\n更换汽车标签时,请附上损坏汽车标签的序列号。"),
         "label_txt": MessageLookupByLibrary.simpleMessage("请随车辆登记表附上以下文件:"),
         "label_txt_1": MessageLookupByLibrary.simpleMessage("1)一张机动车登记或日志卡"),
         "label_txt_2": MessageLookupByLibrary.simpleMessage("2)公司车辆需要公司授权书"),
@@ -167,6 +171,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "latest_news": MessageLookupByLibrary.simpleMessage("最新消息"),
         "latest_transactions": MessageLookupByLibrary.simpleMessage("最新交易"),
         "license_plate_number": MessageLookupByLibrary.simpleMessage("车牌号"),
+        "list_of_renovation_works":
+            MessageLookupByLibrary.simpleMessage("装修工程清单"),
         "login": MessageLookupByLibrary.simpleMessage("登录"),
         "logout": MessageLookupByLibrary.simpleMessage("退出登录"),
         "logout_alert": MessageLookupByLibrary.simpleMessage("你确定要退出登录吗?"),
@@ -197,6 +203,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "or": MessageLookupByLibrary.simpleMessage("或者"),
         "other": MessageLookupByLibrary.simpleMessage("其他"),
         "overnight_parking": MessageLookupByLibrary.simpleMessage("通宵停车"),
+        "overnight_parking_msg":
+            MessageLookupByLibrary.simpleMessage("请提供过夜停车时间。"),
         "owner": MessageLookupByLibrary.simpleMessage("业主"),
         "owner_or_tenant": MessageLookupByLibrary.simpleMessage("您是业主还是租户?"),
         "owners_desc1": MessageLookupByLibrary.simpleMessage("我的名字在分层标题上"),
@@ -240,7 +248,11 @@ class MessageLookup extends MessageLookupByLibrary {
         "remove_account_tips":
             MessageLookupByLibrary.simpleMessage("你确定要移除你的账号吗?"),
         "renovation": MessageLookupByLibrary.simpleMessage("装修"),
+        "renovation_attachments": MessageLookupByLibrary.simpleMessage(
+            "为协助我们批准您的申请,请附上以下文件:\n\n1.拟建装修平面图及图纸\n\n2.专业工程师认可\n\n3.电气布置\n\n4.业主和承包商的共同赔偿"),
         "renovation_end_date": MessageLookupByLibrary.simpleMessage("装修结束日期"),
+        "renovation_note": MessageLookupByLibrary.simpleMessage(
+            "请列出参与您装修的所有其他分包商。\n\n如果您想在提交此申请时给管理层留言或有任何特殊要求,请在此处留言。"),
         "renovation_start_date": MessageLookupByLibrary.simpleMessage("装修开始日期"),
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),

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

@@ -59,6 +59,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "attachments": MessageLookupByLibrary.simpleMessage("附件"),
         "back_home": MessageLookupByLibrary.simpleMessage("返回首页"),
         "bicycle_desc": MessageLookupByLibrary.simpleMessage("请上传您的自行车照片"),
+        "bicycle_note":
+            MessageLookupByLibrary.simpleMessage("请注明自行车的型号、品牌、颜色和自行车类型。"),
         "block": MessageLookupByLibrary.simpleMessage("街区"),
         "block_desc": MessageLookupByLibrary.simpleMessage("街区是指单位官方邮编街道号"),
         "block_example":
@@ -159,6 +161,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "introduction_to_info_pack":
             MessageLookupByLibrary.simpleMessage("信息介绍"),
         "iu_number": MessageLookupByLibrary.simpleMessage("IU 编号"),
+        "label_replace_note": MessageLookupByLibrary.simpleMessage(
+            "如果您想在申请时给管理层留一张便条,请在此处留下。\n\n更换汽车标签时,请附上损坏汽车标签的序列号。"),
         "label_txt": MessageLookupByLibrary.simpleMessage("请随车辆登记表附上以下文件:"),
         "label_txt_1": MessageLookupByLibrary.simpleMessage("1)一张机动车登记或日志卡"),
         "label_txt_2": MessageLookupByLibrary.simpleMessage("2)公司车辆需要公司授权书"),
@@ -167,6 +171,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "latest_news": MessageLookupByLibrary.simpleMessage("最新消息"),
         "latest_transactions": MessageLookupByLibrary.simpleMessage("最新交易"),
         "license_plate_number": MessageLookupByLibrary.simpleMessage("车牌号"),
+        "list_of_renovation_works":
+            MessageLookupByLibrary.simpleMessage("装修工程清单"),
         "login": MessageLookupByLibrary.simpleMessage("登录"),
         "logout": MessageLookupByLibrary.simpleMessage("退出登录"),
         "logout_alert": MessageLookupByLibrary.simpleMessage("你确定要退出登录吗?"),
@@ -197,6 +203,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "or": MessageLookupByLibrary.simpleMessage("或者"),
         "other": MessageLookupByLibrary.simpleMessage("其他"),
         "overnight_parking": MessageLookupByLibrary.simpleMessage("通宵停车"),
+        "overnight_parking_msg":
+            MessageLookupByLibrary.simpleMessage("请提供过夜停车时间。"),
         "ownership_status": MessageLookupByLibrary.simpleMessage("所有权状态"),
         "paid_on": MessageLookupByLibrary.simpleMessage("付款时间"),
         "password": MessageLookupByLibrary.simpleMessage("密码"),
@@ -232,7 +240,11 @@ class MessageLookup extends MessageLookupByLibrary {
         "remove_account_tips":
             MessageLookupByLibrary.simpleMessage("你确定要移除你的账号吗?"),
         "renovation": MessageLookupByLibrary.simpleMessage("装修"),
+        "renovation_attachments": MessageLookupByLibrary.simpleMessage(
+            "为协助我们批准您的申请,请附上以下文件:\n\n1.拟建装修平面图及图纸\n\n2.专业工程师认可\n\n3.电气布置\n\n4.业主和承包商的共同赔偿"),
         "renovation_end_date": MessageLookupByLibrary.simpleMessage("装修结束日期"),
+        "renovation_note": MessageLookupByLibrary.simpleMessage(
+            "请列出参与您装修的所有其他分包商。\n\n如果您想在提交此申请时给管理层留言或有任何特殊要求,请在此处留言。"),
         "renovation_start_date": MessageLookupByLibrary.simpleMessage("装修开始日期"),
         "resend_code": MessageLookupByLibrary.simpleMessage("重新发送"),
         "reset_password": MessageLookupByLibrary.simpleMessage("重置密码"),

+ 60 - 0
packages/cs_resources/lib/generated/l10n.dart

@@ -2444,6 +2444,66 @@ class S {
     );
   }
 
+  /// `Please provide the period of overnight parking.`
+  String get overnight_parking_msg {
+    return Intl.message(
+      'Please provide the period of overnight parking.',
+      name: 'overnight_parking_msg',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `LIST OF RENOVATION WORKS`
+  String get list_of_renovation_works {
+    return Intl.message(
+      'LIST OF RENOVATION WORKS',
+      name: 'list_of_renovation_works',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `To assist us with the approval of your application, kindly attach the following documents:\n\n1. Floor Plan and drawings of the proposed renovation\n\n2.Professional Engineers Endorsement\n\n3.Electrical layout\n\n4.Joint Indemnity For Owner andContractors`
+  String get renovation_attachments {
+    return Intl.message(
+      'To assist us with the approval of your application, kindly attach the following documents:\n\n1. Floor Plan and drawings of the proposed renovation\n\n2.Professional Engineers Endorsement\n\n3.Electrical layout\n\n4.Joint Indemnity For Owner andContractors',
+      name: 'renovation_attachments',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Kindly list all other sub-contractors who are involved in your renovation.\n\nIf you would like to leave the Management a note to accompany this application or have any special requests, please leave them here.`
+  String get renovation_note {
+    return Intl.message(
+      'Kindly list all other sub-contractors who are involved in your renovation.\n\nIf you would like to leave the Management a note to accompany this application or have any special requests, please leave them here.',
+      name: 'renovation_note',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Kindly indicate the model, brand, colour and type of bicycle.`
+  String get bicycle_note {
+    return Intl.message(
+      'Kindly indicate the model, brand, colour and type of bicycle.',
+      name: 'bicycle_note',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `If you would like to leave the Management a note to accompany this application, please leave them here.\n\nFor replacement of car label, please include the serial number of the damaged car label.`
+  String get label_replace_note {
+    return Intl.message(
+      'If you would like to leave the Management a note to accompany this application, please leave them here.\n\nFor replacement of car label, please include the serial number of the damaged car label.',
+      name: 'label_replace_note',
+      desc: '',
+      args: [],
+    );
+  }
+
   /// `Other`
   String get other {
     return Intl.message(

+ 6 - 0
packages/cs_resources/lib/l10n/intl_en.arb

@@ -240,5 +240,11 @@
   "car_cancel_signature_txt": "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": "Signed and agreed by",
   "moving_in_msg": "If you would like to leave the Management a note to accompany this application or have any special requests, please leave them here.",
+  "overnight_parking_msg": "Please provide the period of overnight parking.",
+  "list_of_renovation_works": "LIST OF RENOVATION WORKS",
+  "renovation_attachments": "To assist us with the approval of your application, kindly attach the following documents:\n\n1. Floor Plan and drawings of the proposed renovation\n\n2.Professional Engineers Endorsement\n\n3.Electrical layout\n\n4.Joint Indemnity For Owner andContractors",
+  "renovation_note": "Kindly list all other sub-contractors who are involved in your renovation.\n\nIf you would like to leave the Management a note to accompany this application or have any special requests, please leave them here.",
+  "bicycle_note": "Kindly indicate the model, brand, colour and type of bicycle.",
+  "label_replace_note": "If you would like to leave the Management a note to accompany this application, please leave them here.\n\nFor replacement of car label, please include the serial number of the damaged car label.",
   "other": "Other"
 }

+ 6 - 0
packages/cs_resources/lib/l10n/intl_zh_CN.arb

@@ -240,5 +240,11 @@
   "car_cancel_signature_txt": "居民在此确认,我们已阅读并将完全遵守Parc Life的停车规则和规定。我们进一步承诺,在Parc Life期间,我们将始终在车辆前挡风玻璃的左上角(乘客侧)突出显示停车场标签。",
   "signed_and_agreed_by": "签字并同意",
   "moving_in_msg": "如果您想在申请时给管理层留一张便条或有任何特殊要求,请在此处留下。",
+  "overnight_parking_msg": "请提供过夜停车时间。",
+  "list_of_renovation_works": "装修工程清单",
+  "renovation_attachments": "为协助我们批准您的申请,请附上以下文件:\n\n1.拟建装修平面图及图纸\n\n2.专业工程师认可\n\n3.电气布置\n\n4.业主和承包商的共同赔偿",
+  "renovation_note": "请列出参与您装修的所有其他分包商。\n\n如果您想在提交此申请时给管理层留言或有任何特殊要求,请在此处留言。",
+  "bicycle_note": "请注明自行车的型号、品牌、颜色和自行车类型。",
+  "label_replace_note": "如果您想在申请时给管理层留一张便条,请在此处留下。\n\n更换汽车标签时,请附上损坏汽车标签的序列号。",
   "other": "其他"
 }

+ 6 - 0
packages/cs_resources/lib/l10n/intl_zh_HK.arb

@@ -226,5 +226,11 @@
   "car_cancel_signature_txt": "居民在此确认,我们已阅读并将完全遵守Parc Life的停车规则和规定。我们进一步承诺,在Parc Life期间,我们将始终在车辆前挡风玻璃的左上角(乘客侧)突出显示停车场标签。",
   "signed_and_agreed_by": "签字并同意",
   "moving_in_msg": "如果您想在申请时给管理层留一张便条或有任何特殊要求,请在此处留下。",
+  "overnight_parking_msg": "请提供过夜停车时间。",
+  "list_of_renovation_works": "装修工程清单",
+  "renovation_attachments": "为协助我们批准您的申请,请附上以下文件:\n\n1.拟建装修平面图及图纸\n\n2.专业工程师认可\n\n3.电气布置\n\n4.业主和承包商的共同赔偿",
+  "renovation_note": "请列出参与您装修的所有其他分包商。\n\n如果您想在提交此申请时给管理层留言或有任何特殊要求,请在此处留言。",
+  "bicycle_note": "请注明自行车的型号、品牌、颜色和自行车类型。",
+  "label_replace_note": "如果您想在申请时给管理层留一张便条,请在此处留下。\n\n更换汽车标签时,请附上损坏汽车标签的序列号。",
   "other": "其他"
 }

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

@@ -62,6 +62,19 @@ class RouterPath {
 
   //表单
   static const form = '/form';
+  static const formAttachment = '/form/attachment';
+  static const formPayment= '/form/payment';
+  static const formGuestVehicle ='/form/guest/vehicle';
+  static const formLargeTextBox ='/form/large/text/box';
+  static const formMovingCompany ='/form/moving/company';
+  static const formMovingDate ='/form/moving/date';
+  static const formNoteManagement='/form/note/management';
+  static const formRenovationCompany='/form/renovation/company';
+  static const formRenovationDate='/form/renovation/date';
+  static const formSignature='/form/signature';
+  static const formTypeOfApplication='/form/type/application';
+  static const formVehicleInfo='/form/vehicle/info';
+  static const formTerms='/form/terms';
 
   //消息板
   static const noticeBoard = '/notice_board';