Sfoglia il codice sorgente

加入 UK 国家的模块
1、完善登录与国家选择逻辑。
2、UK的首页单独处理
3、UK的Job下面的子分类列表

liukai 1 settimana fa
parent
commit
6736ab2a22
50 ha cambiato i file con 1007 aggiunte e 695 eliminazioni
  1. 5 2
      app/lib/main.dart
  2. 8 1
      app/lib/modules/splash/splash_controller.dart
  3. 3 0
      app/pubspec.yaml
  4. 1 1
      melos.yaml
  5. 23 14
      packages/cpt_auth/lib/modules/login/login_controller.dart
  6. 7 7
      packages/cpt_auth/lib/modules/login/login_page.dart
  7. 4 4
      packages/cpt_auth/lib/modules/select_country/select_country_controller.dart
  8. 30 61
      packages/cpt_auth/lib/modules/select_country/select_country_page.dart
  9. 31 0
      packages/cpt_uk/.gitignore
  10. 66 0
      packages/cpt_uk/lib/modules/job/job_category/item_job_category.dart
  11. 50 0
      packages/cpt_uk/lib/modules/job/job_category/job_category_controller.dart
  12. 96 0
      packages/cpt_uk/lib/modules/job/job_category/job_category_page.dart
  13. 14 0
      packages/cpt_uk/lib/modules/job/job_category/job_category_state.dart
  14. 0 0
      packages/cpt_uk/lib/modules/job/job_export.dart
  15. 46 0
      packages/cpt_uk/lib/modules/main/item_main_module.dart
  16. 143 0
      packages/cpt_uk/lib/modules/main/main_controller.dart
  17. 198 0
      packages/cpt_uk/lib/modules/main/main_page.dart
  18. 17 0
      packages/cpt_uk/lib/modules/main/main_state.dart
  19. 0 0
      packages/cpt_uk/lib/modules/uk_export.dart
  20. 23 0
      packages/cpt_uk/lib/router/uk_router.dart
  21. 23 0
      packages/cpt_uk/lib/router/uk_service_impl.dart
  22. 40 0
      packages/cpt_uk/pubspec.yaml
  23. 16 0
      packages/cpt_uk/pubspec_overrides.yaml
  24. 3 6
      packages/cs_domain/lib/constants/api_constants.dart
  25. 65 65
      packages/cs_domain/lib/repository/labour_sg_repository.dart
  26. 10 0
      packages/cs_domain/lib/repository/uk_attendance_repository.dart
  27. 10 0
      packages/cs_domain/lib/repository/uk_job_repository.dart
  28. 10 0
      packages/cs_domain/lib/repository/uk_report_repository.dart
  29. 10 0
      packages/cs_domain/lib/repository/uk_review_repository.dart
  30. 4 4
      packages/cs_initializer/lib/app_initializer.dart
  31. 13 3
      packages/cs_initializer/lib/global_services_injection.dart
  32. 2 2
      packages/cs_plugin_basic/lib/service/app_config_service.dart
  33. 4 4
      packages/cs_plugin_basic/lib/service/http_provider_injection.dart
  34. BIN
      packages/cs_resources/assets/cpt_auth/uk_icon.webp
  35. BIN
      packages/cs_resources/assets/cpt_job/category_attendance_review.webp
  36. BIN
      packages/cs_resources/assets/cpt_job/category_labour.webp
  37. BIN
      packages/cs_resources/assets/cpt_job/category_labour_review.webp
  38. BIN
      packages/cs_resources/assets/cpt_job/category_list.webp
  39. BIN
      packages/cs_resources/assets/cpt_job/category_template.webp
  40. BIN
      packages/cs_resources/assets/main/home_attendance.webp
  41. BIN
      packages/cs_resources/assets/main/home_security.webp
  42. 8 0
      packages/cs_resources/lib/generated/assets.dart
  43. 4 0
      packages/cs_resources/lib/local/language/en_US.dart
  44. 0 258
      packages/cs_resources/lib/local/language/ko_KR.dart
  45. 0 4
      packages/cs_resources/lib/local/language/translation_service.dart
  46. 0 258
      packages/cs_resources/lib/local/language/vi_VN.dart
  47. 4 0
      packages/cs_resources/lib/local/language/zh_CN.dart
  48. 5 1
      packages/cs_router/lib/componentRouter/component_router_service.dart
  49. 6 0
      packages/cs_router/lib/componentRouter/uk_service.dart
  50. 5 0
      packages/cs_router/lib/path/router_path.dart

+ 5 - 2
app/lib/main.dart

@@ -10,6 +10,8 @@ import 'package:cpt_labour_sg/router/labour_sg_service_impl.dart';
 import 'package:cpt_labour_sg/router/page_router.dart';
 import 'package:cpt_report/router/page_router.dart';
 import 'package:cpt_report/router/report_service_impl.dart';
+import 'package:cpt_uk/router/uk_router.dart';
+import 'package:cpt_uk/router/uk_service_impl.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_localizations/flutter_localizations.dart';
@@ -24,6 +26,7 @@ import 'package:router/componentRouter/labour_sg_service.dart';
 import 'package:router/componentRouter/report_service.dart';
 import 'package:cs_resources/local/theme/theme_config.dart';
 import 'package:cs_resources/local/language/translation_service.dart';
+import 'package:router/componentRouter/uk_service.dart';
 import 'package:router/path/router_path.dart';
 import 'package:router/observer/getx_router_observer.dart';
 import 'package:plugin_basic/router/basic_page_router.dart';
@@ -49,6 +52,7 @@ void main() async{
       Get.lazyPut<ReportService>(() => ReportServiceImpl());
       Get.lazyPut<JobSGService>(() => JobSGServiceImpl());
       Get.lazyPut<LabourSGService>(() => LabourSGServiceImpl());
+      Get.lazyPut<UKService>(() => UKServiceImpl());
     });
 
     runApp(MyApp());
@@ -126,7 +130,7 @@ class MyApp extends StatelessWidget {
           //默认路由与路由表的加载
           initialRoute: RouterPath.splash,
           getPages: PageRouter.routes + BasicPageRouter.routes + AuthPageRouter.routes + JobPageRouter.routes + LabourPageRouter.routes +
-              ReportPageRouter.routes + LabourSGPageRouter.routes + JobPageSGRouter.routes,
+              ReportPageRouter.routes + LabourSGPageRouter.routes + JobPageSGRouter.routes + UKPageRouter.routes,
           //对原生导航的兼容;SmartDialog路由配置生命周期处理
           navigatorObservers: [GetXRouterObserver(), FlutterSmartDialog.observer, routeObserver],
           //默认页面动画
@@ -149,7 +153,6 @@ class MyApp extends StatelessWidget {
           supportedLocales: const [
             Locale('en', 'US'),
             Locale('zh', ''),
-            Locale('vi', ''),
           ],
           translations: TranslationService(),
           //SmartDialog初始化默认Loading与Toast

+ 8 - 1
app/lib/modules/splash/splash_controller.dart

@@ -3,6 +3,7 @@ import 'package:get/get.dart';
 import 'package:app/jpush/jpush_receive.dart';
 import 'package:initializer/app_initializer.dart';
 import 'package:plugin_basic/constants/app_constant.dart';
+import 'package:plugin_basic/service/app_config_service.dart';
 import 'package:plugin_basic/service/user_service.dart';
 import 'package:plugin_platform/engine/sp/sp_util.dart';
 import 'package:router/componentRouter/component_router_service.dart';
@@ -46,7 +47,13 @@ void _gotoNextPage() async {
   if (UserService.to.isLogin) {
     //去Attendance页面签到
     Log.d("去首页页面");
-    ComponentRouterServices.authService.startPopAllMainPage();
+    if (ConfigService.to.selectCountry.value == 2) {
+      //去英国首页
+      ComponentRouterServices.ukService.startUKMainPage();
+    } else {
+      //去新加坡首页
+      ComponentRouterServices.authService.startPopAllMainPage();
+    }
   } else {
     //去登录页面
     Log.d("去登录页面");

+ 3 - 0
app/pubspec.yaml

@@ -55,6 +55,9 @@ dependencies:
   cpt_report:
     path: ../packages/cpt_report
 
+  cpt_uk:
+    path: ../packages/cpt_uk
+
   initializer:
     path: ../packages/cs_initializer
 

+ 1 - 1
melos.yaml

@@ -15,7 +15,7 @@ packages:
   - "packages/cpt_labour/"
   - "packages/cpt_labour_sg/"
   - "packages/cpt_report/"
-
+  - "packages/cpt_uk/"
 
 
 command:

+ 23 - 14
packages/cpt_auth/lib/modules/login/login_controller.dart

@@ -63,15 +63,19 @@ class LoginController extends GetxController with DioCancelableMixin {
 
   /// 请求接口执行登录
   void _request2LoginPassword() async {
-    var result = await authRepository.userLogin(state.code, state.password, cancelToken: cancelToken);
-
-    //处理数据
-    if (result.isSuccess) {
-      //保存Token,去首页
-      _handleLoginSuccess(result.data!);
-    } else {
-      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
-    }
+    // var result = await authRepository.userLogin(state.code, state.password, cancelToken: cancelToken);
+    //
+    // //处理数据
+    // if (result.isSuccess) {
+    //   //保存Token,去首页
+    //   _handleLoginSuccess(result.data!);
+    // } else {
+    //   ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    // }
+
+    //todo 英国的假登录
+    await Future.delayed(const Duration(seconds: 2));
+    _handleLoginSuccess(HotelInfoEntity()..token = "123");
   }
 
   /// 登录成功的统一处理 - 去首页
@@ -81,15 +85,20 @@ class LoginController extends GetxController with DioCancelableMixin {
     UserService.to.setToken(token);
 
     //保存是否是管理员登录
-    if (ConfigService.to.selectCountry.value == 1) {
-      //如果是新加坡户,强制是管理员登录
+    if (ConfigService.to.selectCountry.value == 1 || ConfigService.to.selectCountry.value == 2) {
+      //如果是新加坡、英国国户,强制是管理员登录
       SPUtil.putInt(AppConstant.storageIsAdmin, 1);
-    }else{
+    } else {
       SPUtil.putInt(AppConstant.storageIsAdmin, state.loginOptionPosition);
     }
 
-    //去首页
-    MainPage.startWithPopAll();
+    if (ConfigService.to.selectCountry.value == 2) {
+      //去英国首页
+      ComponentRouterServices.ukService.startUKMainPage();
+    } else {
+      //去新加坡首页
+      ComponentRouterServices.authService.startPopAllMainPage();
+    }
   }
 
   @override

+ 7 - 7
packages/cpt_auth/lib/modules/login/login_page.dart

@@ -105,8 +105,8 @@ class _LoginPageState extends BaseState<LoginPage, LoginController> with StateLi
                           ConfigService.to.selectCountry.value == 1
                               ? "Singapore".tr
                               : ConfigService.to.selectCountry.value == 2
-                                  ? "Korea".tr
-                                  : "Vietnam".tr,
+                                  ? "United Kingdom".tr
+                                  : "Singapore".tr,
                           textColor: ColorConstants.white,
                           isFontMedium: true,
                           marginRight: 5,
@@ -218,7 +218,7 @@ class _LoginPageState extends BaseState<LoginPage, LoginController> with StateLi
                                 //选择签到功能还是全功能
                                 Obx(() {
                                   return Visibility(
-                                    visible: ConfigService.to.selectCountry.value != 1,
+                                    visible: ConfigService.to.selectCountry.value == 0 ,  //这是越南的逻辑,新加坡与英国不需要
                                     child: CustomRadioCheck(
                                       options: state.loginOption,
                                       onOptionSelected: (index, text) {
@@ -289,15 +289,15 @@ class _LoginPageState extends BaseState<LoginPage, LoginController> with StateLi
       alignment: Alignment.center,
       child: RichText(
         text: TextSpan(
-          style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.w500, color: ColorConstants.textGrayAECAE5),
+          style: const TextStyle(fontSize: 14.0, fontWeight: FontWeight.w500, color: ColorConstants.textGrayAECAE5),
           children: <TextSpan>[
             TextSpan(
               text: "Don’t have an account?".tr,
-              style: TextStyle(color: ColorConstants.textGrayAECAE5),
+              style: const TextStyle(color: ColorConstants.textGrayAECAE5),
             ),
             TextSpan(
               text: "Sign up".tr,
-              style: TextStyle(color: ColorConstants.textYellowFFBB1B),
+              style: const TextStyle(color: ColorConstants.textYellowFFBB1B),
               recognizer: TapGestureRecognizer()
                 ..onTap = () {
                   //去登录页面
@@ -337,7 +337,7 @@ class _LoginPageState extends BaseState<LoginPage, LoginController> with StateLi
         margin: EdgeInsets.only(top: marginTop),
         showDivider: true,
         dividerColor: hexToColor("#7BABC8"),
-        style: TextStyle(
+        style: const TextStyle(
           color: ColorConstants.white,
           fontSize: 15.0,
           fontWeight: FontWeight.w500,

+ 4 - 4
packages/cpt_auth/lib/modules/select_country/select_country_controller.dart

@@ -12,16 +12,16 @@ class SelectCountryController extends GetxController {
     int country = ConfigService.to.selectCountry.value;
     SPUtil.putInt(AppConstant.storageSelectedCountry, country);
 
-
     String baseUrl;
     if (country == 1) {
       //新加坡
       baseUrl = ApiConstants.sgBaseUrl;
     } else if (country == 2) {
-      //
-      baseUrl = ApiConstants.koreaBaseUrl;
+      //
+      baseUrl = ApiConstants.ukBaseUrl;
     } else {
-      baseUrl = ApiConstants.baseUrl;
+      //默认无效-还是新加坡
+      baseUrl = ApiConstants.sgBaseUrl;
     }
 
     Log.d("当前选择的国家:$country 当前要切换的域名为:$baseUrl");

+ 30 - 61
packages/cpt_auth/lib/modules/select_country/select_country_page.dart

@@ -123,67 +123,36 @@ class SelectCountryPage extends BaseStatelessPage<SelectCountryController> {
                         ConfigService.to.selectCountry.value = 1;
                       }),
 
-                      //越南的选项
-                      // Container(
-                      //   width: double.infinity,
-                      //   margin: const EdgeInsets.only(top: 13.5, left: 20, right: 20),
-                      //   padding: const EdgeInsets.symmetric(vertical: 13, horizontal: 17),
-                      //   decoration: BoxDecoration(
-                      //     color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
-                      //     borderRadius: BorderRadius.circular(5.0), // 设置圆角
-                      //   ),
-                      //   child: Row(
-                      //     children: [
-                      //       const MyAssetImage(Assets.cptAuthVnIcon, width: 50, height: 33),
-                      //       MyTextView(
-                      //         "Vietnam".tr,
-                      //         marginLeft: 17,
-                      //         textColor: ColorConstants.white,
-                      //         isFontMedium: true,
-                      //         fontSize: 18,
-                      //       ).expanded(),
-                      //       Obx(() {
-                      //         return Visibility(
-                      //           visible: ConfigService.to.selectCountry.value == 0,
-                      //           child: const MyAssetImage(Assets.cptAuthCheckedIcon, width: 22, height: 22),
-                      //         );
-                      //       }),
-                      //     ],
-                      //   ),
-                      // ).onTap(() {
-                      //   ConfigService.to.selectCountry.value = 0;
-                      // }),
-
-                      //韩国的选项
-                      // Container(
-                      //   width: double.infinity,
-                      //   margin: const EdgeInsets.only(top: 13.5, left: 20, right: 20),
-                      //   padding: const EdgeInsets.symmetric(vertical: 13, horizontal: 17),
-                      //   decoration: BoxDecoration(
-                      //     color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
-                      //     borderRadius: BorderRadius.circular(5.0), // 设置圆角
-                      //   ),
-                      //   child: Row(
-                      //     children: [
-                      //       const MyAssetImage(Assets.cptAuthKoreaIcon, width: 50, height: 33),
-                      //       MyTextView(
-                      //         "Korea".tr,
-                      //         marginLeft: 17,
-                      //         textColor: ColorConstants.white,
-                      //         isFontMedium: true,
-                      //         fontSize: 18,
-                      //       ).expanded(),
-                      //       Obx(() {
-                      //         return Visibility(
-                      //           visible: ConfigService.to.selectCountry.value == 2,
-                      //           child: const MyAssetImage(Assets.cptAuthCheckedIcon, width: 22, height: 22),
-                      //         );
-                      //       }),
-                      //     ],
-                      //   ),
-                      // ).onTap(() {
-                      //   ConfigService.to.selectCountry.value = 2;
-                      // }),
+                      //英国的选项
+                      Container(
+                        width: double.infinity,
+                        margin: const EdgeInsets.only(top: 13.5, left: 20, right: 20),
+                        padding: const EdgeInsets.symmetric(vertical: 13, horizontal: 17),
+                        decoration: BoxDecoration(
+                          color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+                          borderRadius: BorderRadius.circular(5.0), // 设置圆角
+                        ),
+                        child: Row(
+                          children: [
+                            const MyAssetImage(Assets.cptAuthUkIcon, width: 50, height: 33),
+                            MyTextView(
+                              "United Kingdom".tr,
+                              marginLeft: 17,
+                              textColor: ColorConstants.white,
+                              isFontMedium: true,
+                              fontSize: 18,
+                            ).expanded(),
+                            Obx(() {
+                              return Visibility(
+                                visible: ConfigService.to.selectCountry.value == 2,
+                                child: const MyAssetImage(Assets.cptAuthCheckedIcon, width: 22, height: 22),
+                              );
+                            }),
+                          ],
+                        ),
+                      ).onTap(() {
+                        ConfigService.to.selectCountry.value = 2;
+                      }),
 
                       //Next按钮
                       Stack(

+ 31 - 0
packages/cpt_uk/.gitignore

@@ -0,0 +1,31 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+*.lock
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# Visual Studio Code related
+.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+proguardMapping.txt

+ 66 - 0
packages/cpt_uk/lib/modules/job/job_category/item_job_category.dart

@@ -0,0 +1,66 @@
+import 'package:cpt_uk/modules/job/job_category/job_category_page.dart';
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/home_module.dart';
+import 'package:domain/entity/response/labour_request_list_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+/*
+ * Item布局
+ */
+class JobCategoryItem extends StatelessWidget {
+  final HomeModule item;
+  final VoidCallback? onClickAction;
+
+  JobCategoryItem({
+    required this.item,
+    this.onClickAction,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+      margin: const EdgeInsets.only(left: 15, right: 15, top: 5, bottom: 5),
+      decoration: BoxDecoration(
+        color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(5), // 设置圆角
+      ),
+      child: Row(
+        children: [
+          //图标
+          MyAssetImage(
+            item.moduleIconPath,
+            width: item.iconWidth,
+            height: item.iconHeight,
+          ),
+
+          //名称
+          MyTextView(
+            item.moduleName,
+            isFontRegular: true,
+            marginLeft: 10,
+            textColor: ColorConstants.textGrayAECAE5,
+            fontSize: 14,
+          ),
+
+          const Spacer(),
+
+          //箭头
+          const MyAssetImage(
+            Assets.mainItemMoreIcon,
+            width: 7.5,
+            height: 13.5,
+          ),
+        ],
+      ),
+    ).onTap(() {
+      onClickAction?.call();
+    });
+  }
+}

+ 50 - 0
packages/cpt_uk/lib/modules/job/job_category/job_category_controller.dart

@@ -0,0 +1,50 @@
+import 'package:domain/entity/home_module.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:widgets/widget_export.dart';
+import 'job_category_state.dart';
+
+class JobCategoryController extends GetxController with DioCancelableMixin {
+  final JobCategoryState state = JobCategoryState();
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: false,
+    controlFinishLoad: false,
+  );
+
+  @override
+  void onReady() {
+    super.onReady();
+  }
+
+  /// 跳转到指定的模块中去
+  void gotoModulePage(HomeModule module) {
+    switch (module.key) {
+      case 'job_template':
+        ToastEngine.show("点击 job_template 模块");
+        break;
+      case 'labour_request':
+        ToastEngine.show("点击 labour_request 模块");
+        break;
+      case 'lab_review':
+        ToastEngine.show("点击 lab_review 模块");
+        break;
+      case 'job_list':
+        ToastEngine.show("点击 job_list 模块");
+        break;
+      case 'attendance_review':
+        ToastEngine.show("点击 attendance_review 模块");
+        break;
+    }
+  }
+
+  @override
+  void onClose() {
+    state.datas.clear();
+    super.onClose();
+  }
+
+
+}

+ 96 - 0
packages/cpt_uk/lib/modules/job/job_category/job_category_page.dart

@@ -0,0 +1,96 @@
+
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:plugin_basic/base/base_state.dart';
+import 'package:plugin_basic/base/base_stateful_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/widget_export.dart';
+import 'item_job_category.dart';
+import 'job_category_controller.dart';
+import 'job_category_state.dart';
+
+/*
+ * 工作下面的子模块分类列表
+ */
+class JobCategoryPage extends BaseStatefulPage<JobCategoryController> {
+  JobCategoryPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.UKJobCategory);
+  }
+
+  @override
+  JobCategoryController createRawController() {
+    return JobCategoryController();
+  }
+
+  @override
+  State<JobCategoryPage> createState() => _LabourRequestListState();
+}
+
+class _LabourRequestListState extends BaseState<JobCategoryPage, JobCategoryController> {
+  late JobCategoryState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return SafeArea(
+        bottom: true,
+        top: false,
+        child: Container(
+          width: double.infinity,
+          height: double.infinity,
+          padding: EdgeInsets.only(top: ScreenUtil.getStatusBarH(context)),
+          decoration: const BoxDecoration(
+            gradient: LinearGradient(
+              colors: [
+                Color(0xFF091D44),
+                Color(0xFF245A8A),
+                Color(0xFF7F7CEC),
+              ],
+              begin: Alignment.topCenter,
+              end: Alignment.bottomCenter,
+            ),
+          ),
+          child: Column(
+            children: [
+              MyAppBar.titleBar(context, "Jobs".tr),
+
+              //底部的列表
+              EasyRefresh(
+                controller: controller.refreshController,
+                onRefresh: null,
+                onLoad: null,
+                child: ListView.builder(
+                  padding: const EdgeInsets.only(top: 8),
+                  itemCount: state.datas.length,
+                  itemBuilder: (_, int index) {
+                    //Item布局
+                    return JobCategoryItem(
+                      item: state.datas[index],
+                      onClickAction: () {
+                        controller.gotoModulePage(state.datas[index]);
+                      },
+                    );
+                  },
+                ),
+              ).expanded(),
+
+            ],
+          ),
+        ),
+      );
+    });
+  }
+}

+ 14 - 0
packages/cpt_uk/lib/modules/job/job_category/job_category_state.dart

@@ -0,0 +1,14 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/home_module.dart';
+import 'package:plugin_basic/basic_export.dart';
+
+class JobCategoryState {
+  //全部的模块
+  final List<HomeModule> datas = [
+    HomeModule(key: 'job_template', moduleName: 'Job Template'.tr, moduleIconPath: Assets.cptJobCategoryTemplate, iconWidth: 40, iconHeight: 40),
+    HomeModule(key: 'labour_request', moduleName: 'Labour Request'.tr, moduleIconPath: Assets.cptJobCategoryLabour, iconWidth: 40, iconHeight: 40),
+    HomeModule(key: 'lab_review', moduleName: 'Labour Request Review'.tr, moduleIconPath: Assets.cptJobCategoryLabourReview, iconWidth: 40, iconHeight: 40),
+    HomeModule(key: 'job_list', moduleName: 'Job List'.tr, moduleIconPath: Assets.cptJobCategoryList, iconWidth: 40, iconHeight: 40),
+    HomeModule(key: 'attendance_review', moduleName: 'Attendance Review'.tr, moduleIconPath: Assets.cptJobCategoryAttendanceReview, iconWidth: 40, iconHeight: 40),
+  ];
+}

+ 0 - 0
packages/cpt_uk/lib/modules/job/job_export.dart


+ 46 - 0
packages/cpt_uk/lib/modules/main/item_main_module.dart

@@ -0,0 +1,46 @@
+// 自定义的模块项 Widget
+import 'package:domain/entity/home_module.dart';
+import 'package:flutter/material.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class ModuleItem extends StatelessWidget {
+  final HomeModule item;
+  final VoidCallback onTap;
+
+  ModuleItem(this.item, this.onTap);
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      onTap: onTap,
+      child: Container(
+        decoration: BoxDecoration(
+          color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+          borderRadius: BorderRadius.circular(7.5), // 设置圆角
+        ),
+        child: Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            // 模块的名称
+            MyTextView(
+              item.moduleName,
+              textColor: Colors.white,
+              isTextEllipsis: true,
+              maxLines: 2,
+              isFontBold: true,
+              marginLeft: 20,
+              marginRight: 20,
+              marginTop: 20,
+              fontSize: 17,
+            ),
+            Center(
+              child: MyAssetImage(item.moduleIconPath, width: item.iconWidth, height: item.iconHeight),
+            ).expanded(),
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 143 - 0
packages/cpt_uk/lib/modules/main/main_controller.dart

@@ -0,0 +1,143 @@
+import 'package:cpt_uk/modules/job/job_category/job_category_page.dart';
+import 'package:domain/entity/home_module.dart';
+import 'package:domain/repository/auth_repository.dart';
+import 'package:get/get.dart';
+import 'package:plugin_basic/service/app_config_service.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:router/componentRouter/component_router_service.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'main_state.dart';
+
+class MainController extends GetxController {
+  final AuthRepository _authRepository = Get.find();
+  final MainState state = MainState();
+
+  var _needShowPlaceholder = true;
+
+  //页面PlaceHolder的展示
+  LoadState loadingState = LoadState.State_Success;
+  String? errorMessage;
+
+  //刷新页面状态
+  void changeLoadingState(LoadState state) {
+    loadingState = state;
+    update();
+  }
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,
+    controlFinishLoad: false,
+  );
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    fetchHomeData();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _needShowPlaceholder = true;
+    fetchHomeData();
+  }
+
+  /// 获取首页的数据
+  void fetchHomeData() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading);
+    }
+
+    //获取到数据
+    // var result = await _authRepository.fetchHotelInfo();
+    //
+    // //处理数据
+    // if (result.isSuccess) {
+    //   final hotelInfo = result.data;
+    //
+    //   if (hotelInfo != null) {
+    //     UserService.to.hotelInfo.value = hotelInfo;
+    //
+    //     _handleList(hotelInfo.menus);
+    //   } else {
+    //     ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    //   }
+    // } else {
+    //   ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    // }
+
+    //todo 模拟网络请求
+    await Future.delayed(const Duration(seconds: 2));
+    state.datas.clear();
+    state.datas.addAll(state.modules);
+    changeLoadingState(LoadState.State_Success);
+
+    //停止刷新
+    refreshController.finishRefresh();
+    //最后赋值
+    _needShowPlaceholder = false;
+  }
+
+  // 处理数据与展示的逻辑
+  // void _handleList(List<HotelInfoMenus>? list) {
+  //   if (list != null && list.isNotEmpty) {
+  //     //有数据,判断是刷新还是加载更多的数据
+  //     state.datas.clear();
+  //
+  //     int? isAdmin = SPUtil.getInt(AppConstant.storageIsAdmin);
+  //     if (isAdmin == 1) {
+  //       //如果是管理员登录,根据Key筛选需要展示的模块
+  //       for (var hotelInfo in list) {
+  //         if (hotelInfo.key != null) {
+  //           state.datas.addAll(_filterModulesByKey(hotelInfo.key!));
+  //         }
+  //       }
+  //     } else {
+  //       //如果只是签到签出模式,手动的添加模块
+  //       state.datas.addAll(_filterModulesByKey("sign"));
+  //     }
+  //
+  //     //更新状态
+  //     changeLoadingState(LoadState.State_Success);
+  //   } else {
+  //     //展示无数据的布局
+  //     state.datas.clear();
+  //     changeLoadingState(LoadState.State_Empty);
+  //   }
+  // }
+
+  // List<HomeModule> _filterModulesByKey(String key) {
+  //   return state.modules.where((module) => module.key == key).toList();
+  // }
+
+  @override
+  void onReady() async {
+    super.onReady();
+    fetchHomeData();
+  }
+
+  /// 跳转到指定的模块中去
+  void gotoModulePage(HomeModule module) {
+    switch (module.key) {
+      case 'job':
+        JobCategoryPage.startInstance();
+        break;
+      case 'device':
+        ToastEngine.show("点击 device 模块");
+        break;
+      case 'security':
+        ToastEngine.show("点击 security 模块");
+        break;
+      case 'attendance':
+        ToastEngine.show("点击 attendance 模块");
+        break;
+      case 'report':
+        ToastEngine.show("点击 report 模块");
+        break;
+    }
+  }
+
+  /// 跳转到设置页面
+  void gotoSettingPage() {}
+}

+ 198 - 0
packages/cpt_uk/lib/modules/main/main_page.dart

@@ -0,0 +1,198 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/home_module.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:get/get.dart';
+import 'package:plugin_basic/base/base_stateful_page.dart';
+import 'package:plugin_basic/base/base_state.dart';
+import 'package:plugin_basic/base/mixin_state_lifecycle.dart';
+import 'package:plugin_basic/service/user_service.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:cs_resources/local/theme/theme_config.dart';
+import 'package:router/path/router_path.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/double_tap_back_exit_app.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'main_controller.dart';
+import 'item_main_module.dart';
+import 'main_state.dart';
+
+/*
+ *  UK的首页页面
+ */
+class UKMainPage extends BaseStatefulPage<MainController> {
+  UKMainPage({super.key});
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.UKMain);
+  }
+
+  static void startWithPopAll() {
+    Get.offAllNamed(RouterPath.UKMain);
+  }
+
+  @override
+  State<UKMainPage> createState() => _MainPageState();
+
+  @override
+  MainController createRawController() {
+    return MainController();
+  }
+}
+
+class _MainPageState extends BaseState<UKMainPage, MainController> with StateLifecycle {
+  late MainState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+  }
+
+  @override
+  void dispose() {
+    Get.delete<MainController>();
+    super.dispose();
+  }
+
+  @override
+  void onResume() {
+    super.onResume();
+    Log.d("MainPage Lifecycle - onResume");
+  }
+
+  @override
+  void onPause() {
+    super.onPause();
+    Log.d("MainPage Lifecycle - onPause");
+  }
+
+  @override
+  void onStop() {
+    super.onStop();
+    Log.d("MainPage Lifecycle - onStop");
+  }
+
+  @override
+  void onStart() {
+    super.onStart();
+    Log.d("MainPage Lifecycle - onStart");
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    Log.d("MainPage Lifecycle - build走了一遍");
+
+    //双击退出应用
+    return DoubleTapBackExitApp(
+      child: AnnotatedRegion<SystemUiOverlayStyle>(
+        value: ThemeConfig.systemUiOverlayStyleLightThemeWhite,
+        child: autoCtlGetBuilder(builder: (controller) {
+          return Scaffold(
+            body: SafeArea(
+              bottom: true,
+              top: false,
+              //真正的 Content 布局,使用PageView保存状态
+              child: Container(
+                width: double.infinity,
+                height: double.infinity,
+                padding: EdgeInsets.only(top: ScreenUtil.getStatusBarH(context)),
+                decoration: const BoxDecoration(
+                  gradient: LinearGradient(
+                    colors: [
+                      Color(0xFF091D44),
+                      Color(0xFF245A8A),
+                      Color(0xFF7F7CEC),
+                    ],
+                    begin: Alignment.topCenter,
+                    end: Alignment.bottomCenter,
+                  ),
+                ),
+                child: Column(
+                  mainAxisSize: MainAxisSize.max,
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    Row(
+                      mainAxisSize: MainAxisSize.max,
+                      mainAxisAlignment: MainAxisAlignment.start,
+                      crossAxisAlignment: CrossAxisAlignment.center,
+                      children: [
+                        // 酒店的名字
+                        Obx(() {
+                          return MyTextView(
+                            UserService.to.getHotelInfo.hotelName ?? "-",
+                            textColor: ColorConstants.white,
+                            isTextEllipsis: true,
+                            maxLines: 2,
+                            isFontBold: true,
+                            fontSize: 21,
+                          );
+                        }).expanded(),
+
+                        //设置图标,点击进入设置页面
+                        const MyAssetImage(Assets.mainHomeSetting, width: 33, height: 33).onTap(() => controller.gotoSettingPage()),
+                      ],
+                    ),
+
+                    //欢迎的文本+姓名
+                    Obx(() {
+                      return MyTextView(
+                        "${"Welcome".tr} ${UserService.to.getHotelInfo.name ?? "-"}",
+                        textColor: ColorConstants.textGray9EB0C1,
+                        isTextEllipsis: true,
+                        isFontMedium: true,
+                        marginTop: 5,
+                        marginBottom: 15,
+                        fontSize: 18,
+                      );
+                    }),
+
+                    //底部的列表
+                    EasyRefresh(
+                      controller: controller.refreshController,
+                      onRefresh: controller.onRefresh,
+                      child: LoadStateLayout(
+                        state: controller.loadingState,
+                        errorMessage: controller.errorMessage,
+                        errorRetry: () {
+                          controller.retryRequest();
+                        },
+                        successSliverWidget: [
+                          //接口控制显示的模块
+                          SliverGrid(
+                            delegate: SliverChildBuilderDelegate(
+                              (context, index) {
+                                return ModuleItem(state.datas[index], () {
+                                  controller.gotoModulePage(state.datas[index]);
+                                });
+                              },
+                              childCount: state.datas.length,
+                            ),
+                            gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
+                              crossAxisCount: 2, // 每行2个项目
+                              mainAxisSpacing: 5, // 主轴方向的间距
+                              crossAxisSpacing: 5, // 交叉轴方向的间距
+                              childAspectRatio: 171 / 161, // 子项目的宽高比
+                            ),
+                          ),
+                        ],
+                      ),
+                    ).expanded(),
+                  ],
+                ).paddingSymmetric(horizontal: 15, vertical: 17),
+              ),
+            ),
+          );
+        }),
+      ),
+    );
+  }
+}

+ 17 - 0
packages/cpt_uk/lib/modules/main/main_state.dart

@@ -0,0 +1,17 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/home_module.dart';
+import 'package:plugin_basic/basic_export.dart';
+
+class MainState {
+  //当前显示的模块
+  List<HomeModule> datas = [];
+
+  //全部的模块
+  final List<HomeModule> modules = [
+    HomeModule(key: 'job', moduleName: 'Jobs'.tr, moduleIconPath: Assets.mainHomeJobList, iconWidth: 45, iconHeight: 45),
+    HomeModule(key: 'device', moduleName: 'Devices'.tr, moduleIconPath: Assets.mainHomeDevices, iconWidth: 45.5, iconHeight: 45.5),
+    HomeModule(key: 'security', moduleName: 'Security Registration'.tr, moduleIconPath: Assets.mainHomeSecurity, iconWidth: 58.5, iconHeight: 44.5),
+    HomeModule(key: 'attendance', moduleName: 'E-Attendance'.tr, moduleIconPath: Assets.mainHomeAttendance, iconWidth: 44.5, iconHeight: 44.5),
+    HomeModule(key: 'report', moduleName: 'Report'.tr, moduleIconPath: Assets.mainHomeReport, iconWidth: 50.5, iconHeight: 45.5),
+  ];
+}

+ 0 - 0
packages/cpt_uk/lib/modules/uk_export.dart


+ 23 - 0
packages/cpt_uk/lib/router/uk_router.dart

@@ -0,0 +1,23 @@
+import 'package:cpt_uk/modules/job/job_category/job_category_page.dart';
+import 'package:cpt_uk/modules/main/main_page.dart';
+import 'package:get/get.dart';
+import 'package:router/path/router_path.dart';
+
+/// UK模块路由配置
+class UKPageRouter {
+  static final routes = <GetPage<dynamic>>[
+
+    //首页
+    GetPage(
+      name: RouterPath.UKMain,
+      page: () => UKMainPage(),
+    ),
+
+    //工作的子模块列表
+    GetPage(
+      name: RouterPath.UKJobCategory,
+      page: () => JobCategoryPage(),
+    ),
+
+  ];
+}

+ 23 - 0
packages/cpt_uk/lib/router/uk_service_impl.dart

@@ -0,0 +1,23 @@
+import 'package:cpt_uk/modules/main/main_page.dart';
+import 'package:plugin_basic/basic_export.dart';
+import 'package:router/componentRouter/uk_service.dart';
+
+/// 英国组件对应的路由实现类
+class UKServiceImpl extends GetxService implements UKService {
+  @override
+  void onInit() {
+    super.onInit();
+    //初始化资源
+  }
+
+  @override
+  void onClose() {
+    super.onClose();
+    //销毁资源
+  }
+
+  @override
+  void startUKMainPage() {
+    UKMainPage.startWithPopAll();
+  }
+}

+ 40 - 0
packages/cpt_uk/pubspec.yaml

@@ -0,0 +1,40 @@
+name: cpt_uk
+description: 按照国家区分模块-英国
+
+version: 1.0.0
+
+environment:
+  sdk: '>=3.0.2 <4.0.0'
+
+dependencies:
+
+  flutter_localizations:
+    sdk: flutter
+
+  flutter:
+    sdk: flutter
+
+  #基础组件的依赖
+  domain:
+    path: ../cs_domain
+
+  plugin_basic:
+    path: ../cs_plugin_basic
+
+  plugin_platform:
+    path: ../cs_plugin_platform
+
+  shared:
+    path: ../cs_shared
+
+  cs_resources:
+    path: ../cs_resources
+
+  router:
+    path: ../cs_router
+
+  widgets:
+    path: ../cs_widgets
+
+flutter:
+  uses-material-design: true

+ 16 - 0
packages/cpt_uk/pubspec_overrides.yaml

@@ -0,0 +1,16 @@
+# melos_managed_dependency_overrides: cs_resources,domain,plugin_basic,plugin_platform,router,shared,widgets
+dependency_overrides:
+  cs_resources:
+    path: ../cs_resources
+  domain:
+    path: ../cs_domain
+  plugin_basic:
+    path: ../cs_plugin_basic
+  plugin_platform:
+    path: ../cs_plugin_platform
+  router:
+    path: ../cs_router
+  shared:
+    path: ../cs_shared
+  widgets:
+    path: ../cs_widgets

+ 3 - 6
packages/cs_domain/lib/constants/api_constants.dart

@@ -2,16 +2,13 @@
 
 class ApiConstants {
   //当前服务器环境
-  static const isServerRelease = true;
-
-  //越南的域名
-  static const baseUrl = isServerRelease ? 'https://vietnam.casualabour.com' : 'http://vietnam-dev.casualabour.com';
+  static const isServerRelease = false;
 
   //新加坡的域名
   static const sgBaseUrl = isServerRelease ? 'http://singapore-dev-v2.casualabour.com/' : 'http://singapore-dev-v2.casualabour.com/';
 
-  //国的域名
-  static const koreaBaseUrl = isServerRelease ? 'https://korea.casualabour.com' : 'http://korea-dev.casualabour.com';
+  //国的域名
+  static const ukBaseUrl = isServerRelease ? 'https://uk.casualabour.com' : 'http://uk-dev.casualabour.com';
 
   // =========================== 用户相关 ↓=========================================
 

+ 65 - 65
packages/cs_domain/lib/repository/labour_sg_repository.dart

@@ -1017,71 +1017,71 @@ class LabourSGRepository extends GetxService {
   }
 
   /// 删除工作标题的提交
-  Future<HttpResult> submitLabourRequestAdd(
-    String? jobTitleId,
-    String? startTime,
-    String? endTime,
-    String? repeatStart,
-    String? repeatEnd,
-    String? outletId,
-    int sexLimit,
-    String? maleLimit,
-    String? femaleLimit,
-    String? needNum,
-    String? requestType,
-    String? remark, {
-    CancelToken? cancelToken,
-  }) async {
-    //参数
-    Map<String, String> params = {};
-
-    params['job_title_id'] = jobTitleId ?? "";
-    params['start_time'] = startTime ?? "";
-    params['end_time'] = endTime ?? "";
-    params['outlet_id'] = outletId ?? "";
-
-    params['sex_limit'] = sexLimit.toString();
-
-    if (sexLimit == 1) {
-      params['male_limit'] = maleLimit ?? "0";
-      params['female_limit'] = femaleLimit ?? "0";
-      // params['need_num'] = (int.parse(maleLimit ?? "0") + int.parse(femaleLimit ?? "0")).toString();  //不传 need_num 字段
-    } else {
-      params['need_num'] = needNum ?? "0";
-    }
-
-    if (Utils.isNotEmpty(repeatStart)) {
-      params['repeat_start'] = repeatStart ?? "";
-    }
-
-    if (Utils.isNotEmpty(repeatEnd)) {
-      params['repeat_end'] = repeatEnd ?? "";
-    }
-
-    if (Utils.isNotEmpty(requestType)) {
-      params['request_type'] = requestType ?? "";
-    }
-
-    if (Utils.isNotEmpty(remark)) {
-      params['remark'] = remark ?? "";
-    }
-
-    final result = await httpProvider.requestNetResult(
-      ApiConstants.apiLabourRequestAddSubmitSG,
-      method: HttpMethod.POST,
-      params: params,
-      networkDebounce: true,
-      isShowLoadingDialog: true,
-      cancelToken: cancelToken,
-    );
-
-    //根据返回的结果,封装原始数据为Bean/Entity对象
-    if (result.isSuccess) {
-      //重新赋值data或list
-      return result.convert();
-    }
-    return result.convert();
-  }
+  // Future<HttpResult> submitLabourRequestAdd(
+  //   String? jobTitleId,
+  //   String? startTime,
+  //   String? endTime,
+  //   String? repeatStart,
+  //   String? repeatEnd,
+  //   String? outletId,
+  //   int sexLimit,
+  //   String? maleLimit,
+  //   String? femaleLimit,
+  //   String? needNum,
+  //   String? requestType,
+  //   String? remark, {
+  //   CancelToken? cancelToken,
+  // }) async {
+  //   //参数
+  //   Map<String, String> params = {};
+  //
+  //   params['job_title_id'] = jobTitleId ?? "";
+  //   params['start_time'] = startTime ?? "";
+  //   params['end_time'] = endTime ?? "";
+  //   params['outlet_id'] = outletId ?? "";
+  //
+  //   params['sex_limit'] = sexLimit.toString();
+  //
+  //   if (sexLimit == 1) {
+  //     params['male_limit'] = maleLimit ?? "0";
+  //     params['female_limit'] = femaleLimit ?? "0";
+  //     // params['need_num'] = (int.parse(maleLimit ?? "0") + int.parse(femaleLimit ?? "0")).toString();  //不传 need_num 字段
+  //   } else {
+  //     params['need_num'] = needNum ?? "0";
+  //   }
+  //
+  //   if (Utils.isNotEmpty(repeatStart)) {
+  //     params['repeat_start'] = repeatStart ?? "";
+  //   }
+  //
+  //   if (Utils.isNotEmpty(repeatEnd)) {
+  //     params['repeat_end'] = repeatEnd ?? "";
+  //   }
+  //
+  //   if (Utils.isNotEmpty(requestType)) {
+  //     params['request_type'] = requestType ?? "";
+  //   }
+  //
+  //   if (Utils.isNotEmpty(remark)) {
+  //     params['remark'] = remark ?? "";
+  //   }
+  //
+  //   final result = await httpProvider.requestNetResult(
+  //     ApiConstants.apiLabourRequestAddSubmitSG,
+  //     method: HttpMethod.POST,
+  //     params: params,
+  //     networkDebounce: true,
+  //     isShowLoadingDialog: true,
+  //     cancelToken: cancelToken,
+  //   );
+  //
+  //   //根据返回的结果,封装原始数据为Bean/Entity对象
+  //   if (result.isSuccess) {
+  //     //重新赋值data或list
+  //     return result.convert();
+  //   }
+  //   return result.convert();
+  // }
 
   /// 用工的编辑详情
   Future<HttpResult<LabourRequestSGEditIndexEntity>> fetchLabourRequestEditDetail(

+ 10 - 0
packages/cs_domain/lib/repository/uk_attendance_repository.dart

@@ -0,0 +1,10 @@
+import 'package:get/get.dart';
+import 'package:plugin_platform/http/http_provider.dart';
+
+/// UK设备与考勤相关的数据仓库
+class UKAttendanceRepository extends GetxService {
+  HttpProvider httpProvider;
+
+  UKAttendanceRepository({required this.httpProvider});
+
+}

+ 10 - 0
packages/cs_domain/lib/repository/uk_job_repository.dart

@@ -0,0 +1,10 @@
+import 'package:get/get.dart';
+import 'package:plugin_platform/http/http_provider.dart';
+
+/// UK工作相关数据仓库
+class UKJobRepository extends GetxService {
+  HttpProvider httpProvider;
+
+  UKJobRepository({required this.httpProvider});
+
+}

+ 10 - 0
packages/cs_domain/lib/repository/uk_report_repository.dart

@@ -0,0 +1,10 @@
+import 'package:get/get.dart';
+import 'package:plugin_platform/http/http_provider.dart';
+
+/// UK报表与统计相关的数据仓库
+class UKReportRepository extends GetxService {
+  HttpProvider httpProvider;
+
+  UKReportRepository({required this.httpProvider});
+
+}

+ 10 - 0
packages/cs_domain/lib/repository/uk_review_repository.dart

@@ -0,0 +1,10 @@
+import 'package:get/get.dart';
+import 'package:plugin_platform/http/http_provider.dart';
+
+/// UK审核相关数据仓库
+class UKReviewRepository extends GetxService {
+  HttpProvider httpProvider;
+
+  UKReviewRepository({required this.httpProvider});
+
+}

+ 4 - 4
packages/cs_initializer/lib/app_initializer.dart

@@ -6,14 +6,14 @@ import 'package:plugin_platform/engine/directory/directory_util.dart';
 import 'package:plugin_platform/engine/sp/sp_util.dart';
 import 'package:shared/utils/log_utils.dart';
 
-/**
+/*
  * Main函数入口的初始化
  */
 class AppInitializer {
   // 私有的构造函数,防止实例化
   AppInitializer._();
 
-  /**
+  /*
    * 1.入口初始化方法 - Platform 插件中的Engine其他功能初始化
    * main.dart 中宿主的配置
    */
@@ -38,7 +38,7 @@ class AppInitializer {
     SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.top, SystemUiOverlay.bottom]);
   }
 
-  /**
+  /*
    * 2.延迟初始化,一般是在用户同意隐私权限之后再调用
    * 同意权限之后的其他插件初始化,用于宿主的配置
    */
@@ -78,7 +78,7 @@ class AppInitializer {
     await Future.wait(futures);
   }
 
-  /**
+  /*
    * 3.入口初始化方法 - Platform 插件中的Engine其他功能初始化
    * 独立运行模块中的 main.dart 配置,用于测试
    */

+ 13 - 3
packages/cs_initializer/lib/global_services_injection.dart

@@ -5,6 +5,10 @@ import 'package:domain/repository/job_sg_repository.dart';
 import 'package:domain/repository/labour_repository.dart';
 import 'package:domain/repository/labour_sg_repository.dart';
 import 'package:domain/repository/other_repository.dart';
+import 'package:domain/repository/uk_attendance_repository.dart';
+import 'package:domain/repository/uk_job_repository.dart';
+import 'package:domain/repository/uk_report_repository.dart';
+import 'package:domain/repository/uk_review_repository.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:plugin_basic/dio_interceptors/interceptor_auth_dio.dart';
 import 'package:plugin_basic/dio_interceptors/interceptor_status_code_dio.dart';
@@ -32,15 +36,21 @@ class GlobalServicesInjection {
     //全局单例的用户数据仓库
     Get.put(AuthRepository(httpProvider: Get.find()));
 
-    //其他的数据仓库注入
+    //全局单例用户信息服务(用户信息相关业务类)
+    Get.put(UserService(Get.find()));
+
+    //各模块的数据仓库注入
     Get.lazyPut(() => JobRepository(httpProvider: Get.find()));
     Get.lazyPut(() => JobSGRepository(httpProvider: Get.find()));
     Get.lazyPut(() => LabourRepository(httpProvider: Get.find()));
     Get.lazyPut(() => LabourSGRepository(httpProvider: Get.find()));
     Get.lazyPut(() => OtherRepository(httpProvider: Get.find()));
+    //UK的数据仓库注入
+    Get.lazyPut(() => UKJobRepository(httpProvider: Get.find()));
+    Get.lazyPut(() => UKAttendanceRepository(httpProvider: Get.find()));
+    Get.lazyPut(() => UKReviewRepository(httpProvider: Get.find()));
+    Get.lazyPut(() => UKReportRepository(httpProvider: Get.find()));
 
-    // 用户信息服务(用户信息相关业务类)
-    Get.put(UserService(Get.find()));
 
     // 调用额外的依赖注入逻辑(如果提供了)
     if (additionalDependencies != null) {

+ 2 - 2
packages/cs_plugin_basic/lib/service/app_config_service.dart

@@ -22,7 +22,7 @@ class ConfigService extends GetxService {
   static ConfigService get to => Get.find();
 
   //选择的国家,默认新加坡
-  RxInt selectCountry = 1.obs;  //0 越南  1 新加坡  2 韩
+  RxInt selectCountry = 1.obs;  //0 无效默认还是新加坡  1 新加坡  2 英
 
   // 设备信息
   /// android 设备信息
@@ -97,7 +97,7 @@ class ConfigService extends GetxService {
   void onReady() {
     super.onReady();
 
-    //赋值选中的国家
+    //赋值选中的国家(新加坡)
     int country = SPUtil.getInt(AppConstant.storageSelectedCountry, defValue: 1) ?? 1;
     selectCountry.value = country;
 

+ 4 - 4
packages/cs_plugin_basic/lib/service/http_provider_injection.dart

@@ -17,11 +17,11 @@ class HttpProviderInjection {
       //新加坡
       baseUrl = ApiConstants.sgBaseUrl;
     } else if (country == 2) {
-      //
-      baseUrl = ApiConstants.koreaBaseUrl;
+      //
+      baseUrl = ApiConstants.ukBaseUrl;
     } else {
-      //默认越南
-      baseUrl = ApiConstants.baseUrl;
+      //默认新加坡
+      baseUrl = ApiConstants.sgBaseUrl;
     }
 
     //注入 HttpProvider

BIN
packages/cs_resources/assets/cpt_auth/uk_icon.webp


BIN
packages/cs_resources/assets/cpt_job/category_attendance_review.webp


BIN
packages/cs_resources/assets/cpt_job/category_labour.webp


BIN
packages/cs_resources/assets/cpt_job/category_labour_review.webp


BIN
packages/cs_resources/assets/cpt_job/category_list.webp


BIN
packages/cs_resources/assets/cpt_job/category_template.webp


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


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


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

@@ -30,9 +30,15 @@ class Assets {
   static const String cptAuthPasswordHideIcon = 'assets/cpt_auth/password_hide_icon.webp';
   static const String cptAuthPasswordShowIcon = 'assets/cpt_auth/password_show_icon.webp';
   static const String cptAuthSgIcon = 'assets/cpt_auth/sg_icon.webp';
+  static const String cptAuthUkIcon = 'assets/cpt_auth/uk_icon.webp';
   static const String cptAuthVnIcon = 'assets/cpt_auth/vn_icon.webp';
   static const String cptJobArrawDownIcon = 'assets/cpt_job/arraw_down_icon.webp';
   static const String cptJobArrawUpIcon = 'assets/cpt_job/arraw_up_icon.webp';
+  static const String cptJobCategoryAttendanceReview = 'assets/cpt_job/category_attendance_review.webp';
+  static const String cptJobCategoryLabour = 'assets/cpt_job/category_labour.webp';
+  static const String cptJobCategoryLabourReview = 'assets/cpt_job/category_labour_review.webp';
+  static const String cptJobCategoryList = 'assets/cpt_job/category_list.webp';
+  static const String cptJobCategoryTemplate = 'assets/cpt_job/category_template.webp';
   static const String cptJobExportIcon = 'assets/cpt_job/export_icon.webp';
   static const String cptJobPickDateIcon = 'assets/cpt_job/pick_date_icon.png';
   static const String cptJobSearchIcon = 'assets/cpt_job/search_icon.webp';
@@ -46,6 +52,7 @@ class Assets {
   static const String cptReportWeekNum5 = 'assets/cpt_report/week_num_5.webp';
   static const String cptReportWeekNum6 = 'assets/cpt_report/week_num_6.webp';
   static const String cptReportWeekNum7 = 'assets/cpt_report/week_num_7.webp';
+  static const String mainHomeAttendance = 'assets/main/home_attendance.webp';
   static const String mainHomeAttendanceReview = 'assets/main/home_attendance_review.webp';
   static const String mainHomeDevices = 'assets/main/home_devices.webp';
   static const String mainHomeJobList = 'assets/main/home_job_list.webp';
@@ -53,6 +60,7 @@ class Assets {
   static const String mainHomeLabourRequest = 'assets/main/home_labour_request.webp';
   static const String mainHomeLabourRequestReview = 'assets/main/home_labour_request_review.webp';
   static const String mainHomeReport = 'assets/main/home_report.webp';
+  static const String mainHomeSecurity = 'assets/main/home_security.webp';
   static const String mainHomeSetting = 'assets/main/home_setting.webp';
   static const String mainHomeSignInOut = 'assets/main/home_sign_in_out.webp';
   static const String mainItemMoreIcon = 'assets/main/item_more_icon.webp';

+ 4 - 0
packages/cs_resources/lib/local/language/en_US.dart

@@ -238,6 +238,10 @@ const Map<String, String> en_US = {
   'Created By': 'Created By',
   'Language': 'Language',
   'Korea': 'Korea',
+  'United Kingdom': 'United Kingdom',
+  'Jobs': 'Jobs',
+  'Security Registration': 'Security Registration',
+  'E-Attendance': 'E-Attendance',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

+ 0 - 258
packages/cs_resources/lib/local/language/ko_KR.dart

@@ -1,258 +0,0 @@
-const Map<String, String> ko_KR = {
-  'YY Employer': 'YY Employer',
-  'Please enter your password': 'Please enter your password',
-  'The login code cannot be empty!': 'The login code cannot be empty!',
-  'The password cannot be empty!': 'The password cannot be empty!',
-  'The new password cannot be empty!': 'The new password cannot be empty!',
-  'Log in': 'Log in',
-  'Password': 'Password',
-  'Email': 'Email',
-  'Name/Mobile': 'Name/Mobile',
-  'Check In': 'Check In',
-  'Check Out': 'Check Out',
-  'Job Date': 'Job Date',
-  'Start Time:': 'Start Time:',
-  'End Time:': 'End Time:',
-  'Start Time': 'Start Time',
-  'End Time': 'End Time',
-  'Name:': 'Name:',
-  'Reset': 'Reset',
-  'Start Date': 'Start Date',
-  'End Date': 'End Date',
-  'Cancel': 'Cancel',
-  'Confirm': 'Confirm',
-  'Sign Here': 'Sign Here',
-  'Clean': 'Clean',
-  'Vietnam': 'Vietnam',
-  'Sign in/Sign out': 'Sign in/Sign out',
-  'Admin': 'Admin',
-  'Don’t have an account?': 'Don’t have an account?',
-  'Sign up': 'Sign up',
-  'Confirm Password': 'Confirm Password',
-  'Please enter your email': 'Please enter your email',
-  'Please enter confirm password': 'Please enter confirm password',
-  'Submit': 'Submit',
-  'The email cannot be empty!': 'The email cannot be empty!',
-  'The confirm password cannot be empty!': 'The confirm password cannot be empty!',
-  'Please confirm your confirmed password!': 'Please confirm your confirmed password!',
-  'Reset Password': 'Reset Password',
-  'New Password': 'New Password',
-  'Please enter your new password': 'Please enter your new password',
-  'Labour Request': 'Labour Request',
-  'Job List': 'Job List',
-  'Sign in Sign out': 'Sign in Sign out',
-  'Devices': 'Devices',
-  'Labour Request Review': 'Labour Request Review',
-  'Attendance Review': 'Attendance Review',
-  'Default Job Title': 'Default Job Title',
-  'Report': 'Report',
-  'Confirmation': 'Confirmation',
-  'Notice': 'Notice',
-  'Are you sure you need to exit the system?': 'Are you sure you need to exit the system?',
-  'Are you sure you want to deactivate your account? You will not be able to login into the app once you proceed with the request.':
-      'Are you sure you want to deactivate your account? You will not be able to login into the app once you proceed with the request.',
-  'Welcome': 'Welcome',
-  'Switch Projects': 'Switch Projects',
-  'Account Deactivation': 'Account Deactivation',
-  'Logout': 'Logout',
-  'Old Password': 'Old Password',
-  'Settings': 'Settings',
-  'Title': 'Title',
-  'Create New Job Request': 'Create New Job Request',
-  'Outlet': 'Outlet',
-  'Status': 'Status',
-  'Filter': 'Filter',
-  'Edit': 'Edit',
-  'Recall': 'Recall',
-  'Detail': 'Detail',
-  'Outlet:': 'Outlet:',
-  'DateTime:': 'DateTime:',
-  'No. of Staff:': 'No. of Staff:',
-  'Status:': 'Status:',
-  'Publish Status:': 'Publish Status:',
-  'Created At:': 'Created At:',
-  'Published': 'Published',
-  'Unpublished': 'Unpublished',
-  'Choose Outlet': 'Choose Outlet',
-  'Choose Status': 'Choose Status',
-  'Choose Job Title': 'Choose Job Title',
-  'Job Title': 'Job Title',
-  'Job Start Time': 'Job Start Time',
-  'Job End Time': 'Job End Time',
-  'No. of Staff': 'No. of Staff',
-  'Enter No. of Staff': 'Enter No. of Staff',
-  'Choose Start Date': 'Choose Start Date',
-  'Choose End Date': 'Choose End Date',
-  'Add Labour Requisition': 'Add Labour Requisition',
-  'Edit Labour Requisition': 'Edit Labour Requisition',
-  'Labour Requisition': 'Labour Requisition',
-  'Message': 'Message',
-  'Are you sure you want to recall?': 'Are you sure you want to recall?',
-  'Workflow': 'Workflow',
-  'Remark:': 'Remark:',
-  'Audit Time:': 'Audit Time:',
-  'Operator:': 'Operator:',
-  'Designation:': 'Designation:',
-  'Type:': 'Type:',
-  'Node:': 'Node:',
-  'Approved': 'Approved',
-  'Pending': 'Pending',
-  'Rejected': 'Rejected',
-  'Completed': 'Completed',
-  'Active': 'Active',
-  'Cancelled': 'Cancelled',
-  'Revised': 'Revised',
-  'Job Detail': 'Job Detail',
-  'Add Staff': 'Add Staff',
-  'Remarks': 'Remarks',
-  'Applied At:': 'Applied At:',
-  'Total Rooms:': 'Total Rooms:',
-  'Total Hours:': 'Total Hours:',
-  '+/- Hours:': '+/- Hours:',
-  'Security Out:': 'Security Out:',
-  'Work Out:': 'Work Out:',
-  'Work In:': 'Work In:',
-  'Security In:': 'Security In:',
-  'Staff Name:': 'Staff Name:',
-  'Staff Name': 'Staff Name',
-  'Work Out': 'Work Out',
-  'Work In': 'Work In',
-  'Security In': 'Security In',
-  'Security Out': 'Security Out',
-  '+/- Hours': '+/- Hours',
-  'Total Rooms': 'Total Rooms',
-  'Operation Approve': 'Operation Approve',
-  'Batch Modify': 'Batch Modify',
-  'Please select the applied record': 'Please select the applied record',
-  'Are you sure you want to setting approved?': 'Are you sure you want to setting approved?',
-  'Attitude': 'Attitude',
-  'Performance': 'Performance',
-  'Experience': 'Experience',
-  'Grooming': 'Grooming',
-  'Enter...': 'Enter...',
-  'Please Enter Remark': 'Please Enter Remark',
-  'Choose Staff': 'Choose Staff',
-  'Reason': 'Reason',
-  'None': 'None',
-  'Forgot to clock in/out': 'Forgot to clock in/out',
-  'Technical issue': 'Technical issue',
-  'Others': 'Others',
-  'Staff Detail': 'Staff Detail',
-  'Staff Name/ID/Phone': 'Staff Name/ID/Phone',
-  'Select Country': 'Select Country',
-  'Browse jobs available in your selected country.': 'Browse jobs available in your selected country.',
-  'Next': 'Next',
-  'Singapore': 'Singapore',
-  'Revise List': 'Revise List',
-  'Device List': 'Device List',
-  'Device MAC:': 'Device MAC:',
-  'Device Alias:': 'Device Alias:',
-  'Location:': 'Location:',
-  'Alive State:': 'Alive State:',
-  'Offline': 'Offline',
-  'Online': 'Online',
-  'Sort': 'Sort',
-  'Template': 'Template',
-  'Updated At': 'Updated At',
-  'Add New': 'Add New',
-  'Template Setting': 'Template Setting',
-  'Enter Job Title': 'Enter Job Title',
-  'Template Name': 'Template Name',
-  'Contact': 'Contact',
-  'Note': 'Note',
-  'Delete': 'Delete',
-  'Are you sure you want to delete this job title?': 'Are you sure you want to delete this job title?',
-  'Are you sure you want to delete this job template?': 'Are you sure you want to delete this job template?',
-  'Age': 'Age',
-  'Gender': 'Gender',
-  'Preferred Language': 'Preferred Language',
-  'Food Hygiene Cert': 'Food Hygiene Cert',
-  'Yes': 'Yes',
-  'No': 'No',
-  'Description': 'Description',
-  'Contact No': 'Contact No',
-  'Create Template': 'Create Template',
-  'Edit Template': 'Edit Template',
-  'Both': 'Both',
-  'Male': 'Male',
-  'Female': 'Female',
-  'English': 'English',
-  'Chinese': 'Chinese',
-  'Malay': 'Malay',
-  'Tamil': 'Tamil',
-  'Hindi': 'Hindi',
-  'Select Job Title': 'Select Job Title',
-  'Select Job Start Time': 'Select Job Start Time',
-  'Select Job End Time': 'Select Job End Time',
-  'Enter No. of Staff of The Corresponding Gender': 'Enter No. of Staff of The Corresponding Gender',
-  'Select Date': 'Select Date',
-  'Date': 'Date',
-  'Job Time': 'Job Time',
-  'Repeat': 'Repeat',
-  'Repeat Start Time': 'Repeat Start Time',
-  'Repeat End Time': 'Repeat End Time',
-  'Gender Unlimited': 'Gender Unlimited',
-  'Gender Limited': 'Gender Limited',
-  'Needs Num': 'Needs Num',
-  'Request Type': 'Request Type',
-  'Remark': 'Remark',
-  'Are you sure you want to cancel this job?': 'Are you sure you want to cancel this job?',
-  'Are you sure you want to delete this job?': 'Are you sure you want to delete this job?',
-  'Are you sure you want to confirm this job?': 'Are you sure you want to confirm this job?',
-  'Create New Job': 'Create New Job',
-  'Search': 'Search',
-  'Send E-Attendance': 'Send E-Attendance',
-  'Nric': 'Nric',
-  'Name / Nric': 'Name / Nric',
-  'Add Staff - Choose Staff': 'Add Staff - Choose Staff',
-  'Are you sure you want to send the e-attendance to agency?': 'Are you sure you want to send the e-attendance to agency?',
-  'Work Clock In': 'Work Clock In',
-  'Work Clock Out': 'Work Clock Out',
-  'Security Clock In': 'Security Clock In',
-  'Security Clock Out': 'Security Clock Out',
-  'Applied': 'Applied',
-  'No Show': 'No Show',
-  'Modify': 'Modify',
-  'Subtract Hours': 'Subtract Hours',
-  'Hourly Rate': 'Hourly Rate',
-  'Reviews': 'Reviews',
-  'Mobile': 'Mobile',
-  'Staff Reviews': 'Staff Reviews',
-  'Revise Hours': 'Revise Hours',
-  'Are you sure you want to recall this revise?': 'Are you sure you want to recall this revise?',
-  'Are you sure you want to delete this revise?': 'Are you sure you want to delete this revise?',
-  'Logs': 'Logs',
-  'Date Time': 'Date Time',
-  'Action': 'Action',
-  'Content': 'Content',
-  'Revise': 'Revise',
-  'Add Revise': 'Add Revise',
-  'Edit Revise': 'Edit Revise',
-  'Incomplete': 'Incomplete',
-  'Completed + Incomplete': 'Completed + Incomplete',
-  'YY Casual Labour Report': 'YY Casual Labour Report',
-  'TotalAmt': 'TotalAmt',
-  'Hours': 'Hours',
-  'Monthly Staff Request Report': 'Monthly Staff Request Report',
-  'Finance Report': 'Finance Report',
-  'Created By': 'Created By',
-  'Language': 'Language',
-  'Korea': 'Korea',
-
-  //插件的国际化
-  'Pull to refresh': 'Pull to refresh',
-  'Release ready': 'Release ready',
-  'Refreshing...': 'Refreshing...',
-  'Succeeded': 'Succeeded',
-  'No more': 'No more',
-  'Failed': 'Failed',
-  'Last updated at %T': 'Last updated at %T',
-  'Pull to load': 'Pull to load',
-  'Network Load Error': 'Network Load Error',
-  'Loading...': 'Loading...',
-  'Data loading failed! Please refresh and try again': 'Data loading failed! Please refresh and try again',
-  'There is currently no content available': 'There is currently no content available',
-  'Click again and exit the app': 'Click again and exit the app',
-  'The login credential have expired, please log in again.': 'The login credentials have expired, please log in again.',
-  'Successful': 'Successful',
-};

+ 0 - 4
packages/cs_resources/lib/local/language/translation_service.dart

@@ -1,9 +1,7 @@
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'en_US.dart';
-import 'vi_VN.dart';
 import 'zh_CN.dart';
-import 'ko_KR.dart';
 
 class TranslationService extends Translations {
   static Locale? get locale => Get.deviceLocale;
@@ -13,7 +11,5 @@ class TranslationService extends Translations {
   Map<String, Map<String, String>> get keys => {
         'en_US': en_US,
         'zh_CN': zh_CN,
-        'vi_VN': vi_VN,
-        'ko_KR': ko_KR,
       };
 }

+ 0 - 258
packages/cs_resources/lib/local/language/vi_VN.dart

@@ -1,258 +0,0 @@
-const Map<String, String> vi_VN = {
-  "YY Employer": "YY Employer",
-  "Please enter your password": "Vui lòng nhập mật khẩu của bạn",
-  "The login code cannot be empty!": "Mã đăng nhập không được để trống!",
-  "The password cannot be empty!": "Mật khẩu không được để trống!",
-  "The new password cannot be empty!": "Mật khẩu mới không được để trống!",
-  "Log in": "Đăng nhập",
-  "Password": "Mật khẩu",
-  "Email": "Email",
-  "Name/Mobile": "Tên / Số điện thoại",
-  "Check In": "Đăng ký vào",
-  "Check Out": "Đăng ký ra",
-  "Job Date": "Ngày làm việc",
-  "Start Time:": "Thời gian bắt đầu:",
-  "End Time:": "Thời gian kết thúc:",
-  "Start Time": "Thời gian bắt đầu",
-  "End Time": "Thời gian kết thúc",
-  "Name:": "Tên:",
-  "Reset": "Cài lại",
-  "Start Date": "Ngày bắt đầu",
-  "End Date": "Ngày kết thúc",
-  "Cancel": "Huỷ",
-  "Confirm": "Xác nhận",
-  "Sign Here": "Ký tại đây",
-  "Clean": "Làm sạch",
-  "Vietnam": "Việt Nam",
-  "Sign in/Sign out": "Đăng nhập/ Đăng xuất",
-  "Admin": "Quản trị viên",
-  "Don’t have an account?": "Bạn chưa có tài khoản?",
-  "Sign up": "Đăng ký",
-  "Confirm Password": "Xác nhận mật khẩu",
-  "Please enter your email": "Vui lòng nhập email của bạn",
-  "Please enter confirm password": "Vui lòng nhập xác nhận mật khẩu",
-  "Submit": "Nộp",
-  "The email cannot be empty!": "Email không được để trống!",
-  "The confirm password cannot be empty!": "Mật khẩu xác nhận không được để trống!",
-  "Please confirm your confirmed password!": "Vui lòng xác nhận mật khẩu đã được xác nhận của bạn!",
-  "Reset Password": "Đặt lại mật khẩu",
-  "New Password": "Mật khẩu mới",
-  "Please enter your new password": "Vui lòng nhập mật khẩu mới của bạn",
-  "Labour Request": "Yêu cầu lao động",
-  "Job List": "Danh sách việc làm",
-  "Sign in Sign out": "Đăng nhập/ Đăng xuất",
-  "Devices": "Thiết bị",
-  "Labour Request Review": "Xem xét yêu cầu lao động",
-  "Attendance Review": "Đánh giá điểm danh",
-  "Default Job Title": "Chức danh công việc mặc định",
-  "Report": "Báo cáo",
-  "Confirmation": "Sự xác nhận",
-  "Notice": "Lời báo trước",
-  "Are you sure you need to exit the system?": "Bạn có chắc chắn cần thoát khỏi hệ thống không?",
-  "Are you sure you want to deactivate your account? You will not be able to login into the app once you proceed with the request.":
-  "Bạn có chắc chắn muốn hủy kích hoạt tài khoản của mình không? Bạn sẽ không thể đăng nhập vào ứng dụng sau khi tiếp tục yêu cầu.",
-  "Welcome": "Chào mừng",
-  "Switch Projects": "Chuyển đổi dự án",
-  "Account Deactivation": "Vô hiệu hóa tài khoản",
-  "Logout": "Đăng xuất",
-  "Old Password": "Mật khẩu cũ",
-  "Settings": "Cài đặt",
-  "Title": "Tiêu đề",
-  "Create New Job Request": "Tạo yêu cầu công việc mới",
-  "Outlet": "Bộ phận",
-  "Status": "Trạng thái",
-  "Filter": "Lọc",
-  "Edit": "Biên tập",
-  "Recall": "Triệu hồi",
-  "Detail": "Chi tiết",
-  "Outlet:": "Bộ phận:",
-  "DateTime:": "Ngày Giờ:",
-  "No. of Staff:": "Số nhân viên:",
-  "Status:": "Trạng thái:",
-  "Publish Status:": "Trạng thái xuất bản:",
-  "Created At:": "Được tạo tại:",
-  "Published": "Được phát hành",
-  "Unpublished": "Chưa được xuất bản",
-  "Choose Outlet": "Chọn bộ phận",
-  "Choose Status": "Chọn trạng thái",
-  "Choose Job Title": "Chọn chức danh công việc",
-  "Job Title": "Chức danh công việc",
-  "Job Start Time": "Thời gian bắt đầu công việc",
-  "Job End Time": "Thời gian kết thúc công việc",
-  "No. of Staff": "Số nhân viên:",
-  "Enter No. of Staff": "Nhập số lượng nhân viên",
-  "Choose Start Date": "Chọn ngày bắt đầu",
-  "Choose End Date": "Chọn ngày kết thúc",
-  "Add Labour Requisition": "Thêm yêu cầu tuyển dụng lao động",
-  "Edit Labour Requisition": "Chỉnh sửa yêu cầu tuyển dụng lao động",
-  "Labour Requisition": "Trưng dụng lao động",
-  "Message": "Tin nhắn",
-  "Are you sure you want to recall?": "Bạn có chắc chắn muốn nhớ lại không?",
-  "Workflow": "Quy trình làm việc",
-  "Remark:": "Nhận xét:",
-  "Audit Time:": "Thời gian kiểm toán:",
-  "Operator:": "Nhà điều hành:",
-  "Designation:": "Chỉ định:",
-  "Type:": "Kiểu:",
-  "Node:": "Nút:",
-  "Approved": "Đã duyệt",
-  "Pending": "Chưa giải quyết",
-  "Rejected": "Bị loại bỏ",
-  "Completed": "Hoàn thành",
-  "Active": "Tích cực",
-  "Cancelled": "Đã hủy",
-  "Revised": "Đã chỉnh sửa",
-  "Job Detail": "Chi tiết công việc",
-  "Add Staff": "Thêm nhân viên",
-  "Remarks": "Bình luận",
-  "Applied At:": "Áp dụng tại:",
-  "Total Rooms:": "Tổng số phòng:",
-  "Total Hours:": "Tổng số giờ:",
-  "+/- Hours:": "+/- Giờ:",
-  "Security Out:": "Bảo vệ ký ra:",
-  "Work Out:": "Giờ làm việc ra:",
-  "Work In:": "Giờ làm việc vào:",
-  "Security In:": "Bảo vệ ký vào:",
-  "Staff Name:": "Tên nhân viên:",
-  "Staff Name": "Tên nhân viên:",
-  "Work Out": "Giờ làm việc ra",
-  "Work In": "Giờ làm việc vào",
-  "Security In": "Bảo vệ ký vào",
-  "Security Out": "Bảo vệ ký ra",
-  "+/- Hours": "+/- Giờ:",
-  "Total Rooms": "Tổng số phòng",
-  "Operation Approve": "Phê duyệt vận hành",
-  "Batch Modify": "Sửa đổi hàng loạt",
-  "Please select the applied record": "Vui lòng chọn hồ sơ áp dụng",
-  "Are you sure you want to setting approved?": "Bạn có chắc chắn muốn cài đặt được phê duyệt không?",
-  "Attitude": "Thái độ",
-  "Performance": "Hiệu suất thể hiện",
-  "Experience": "Kinh nghiệm",
-  "Grooming": "Dáng vẻ bên ngoài",
-  "Enter...": "Nhập vào...",
-  "Please Enter Remark": "Vui lòng nhập nhận xét",
-  "Choose Staff": "Chọn nhân viên",
-  "Reason": "Lý do",
-  "None": "Không có",
-  "Forgot to clock in/out": "Quên bấm giờ vào/ra",
-  "Technical issue": "Vấn đề kỹ thuật",
-  "Others": "Những cái khác",
-  "Staff Detail": "Chi tiết nhân viên",
-  'Staff Name/ID/Phone': 'Tên nhân viên/ID/Số điện thoại',
-  'Select Country': 'Chọn quốc gia',
-  'Browse jobs available in your selected country.': 'Duyệt các công việc có sẵn ở quốc gia đã chọn',
-  'Next': 'Tiếp theo',
-  'Singapore': 'Singapore',
-  'Revise List': 'Danh sách sửa đổi',
-  'Device List': 'Danh sách thiết bị',
-  'Device MAC:': 'Thiết bị Địa chỉ Mac:',
-  'Device Alias:': 'Bí danh thiết bị:',
-  'Location:': 'Địa điểm:',
-  'Alive State:': 'Tình trạng trực tuyến:',
-  'Offline': 'Ngoại tuyến',
-  'Online': 'Trực tuyến',
-  'Sort': 'Sắp xếp',
-  'Template': 'Mẫu',
-  'Updated At': 'Thời gian cập nhật',
-  'Add New': 'Thêm mới',
-  'Template Setting': 'Thiết lập mẫu',
-  'Enter Job Title': 'Nhập tên công việc',
-  'Template Name': 'Tên mẫu',
-  'Contact': 'Liên hệ',
-  'Note': 'Lưu ý',
-  'Delete': 'Xoá',
-  'Are you sure you want to delete this job title?': 'Bạn có chắc chắn muốn xóa bài đăng này?',
-  'Are you sure you want to delete this job template?': 'Bạn có chắc chắn muốn xóa template này?',
-  'Age': 'Tuổi',
-  'Gender': 'Giới tính',
-  'Preferred Language': 'Ngôn ngữ ưa thích',
-  'Food Hygiene Cert': 'Giấy chứng nhận vệ sinh thực phẩm',
-  'Yes': 'Vâng.',
-  'No': 'Không',
-  'Description': 'Mô tả',
-  'Contact No': 'Số điện thoại',
-  'Create Template': 'Tạo mẫu',
-  'Edit Template': 'Sửa mẫu',
-  'Both': 'Cả hai',
-  'Male': 'Việt',
-  'Female': 'Phụ nữ',
-  'English': 'Tiếng Việt',
-  'Chinese': 'Trung Quốc',
-  'Malay': 'Tiếng Việt',
-  'Tamil': 'Thái Lan',
-  'Hindi': 'Tiếng Hindi',
-  'Select Job Title': 'Chọn vị trí',
-  'Select Job Start Time': 'Chọn thời gian bắt đầu công việc',
-  'Select Job End Time': 'Chọn thời gian kết thúc công việc',
-  'Enter No. of Staff of The Corresponding Gender': 'Nhập số lượng nhân viên cần giới tính tương ứng',
-  'Select Date': 'Chọn ngày',
-  'Date': 'Ngày',
-  'Job Time': 'Thời gian làm việc',
-  'Repeat': 'Lặp lại',
-  'Repeat Start Time': 'Lặp lại thời gian bắt đầu',
-  'Repeat End Time': 'Lặp lại thời gian kết thúc',
-  'Gender Unlimited': 'Giới tính Không giới hạn',
-  'Gender Limited': 'Giới tính giới hạn',
-  'Needs Num': 'Số lượng cần thiết',
-  'Request Type': 'Loại yêu cầu',
-  'Remark': 'Ghi chú',
-  'Are you sure you want to cancel this job?': 'Bạn có chắc chắn muốn hủy bỏ công việc này?',
-  'Are you sure you want to delete this job?': 'Bạn có chắc chắn muốn xóa công việc này?',
-  'Are you sure you want to confirm this job?': 'Bạn có chắc chắn muốn xác nhận công việc này?',
-  'Create New Job': 'Tạo công việc mới',
-  'Search': 'Tìm kiếm',
-  'Send E-Attendance': 'Gửi chấm công điện tử',
-  'Nric': 'Chứng minh thư',
-  'Name / Nric': 'Tên / Thẻ căn cước',
-  'Add Staff - Choose Staff': 'Thêm nhân viên - Chọn nhân viên',
-  'Are you sure you want to send the e-attendance to agency?': 'Bạn có chắc chắn muốn gửi E-Attendance cho một đại lý?',
-  'Work Clock In': 'Nơi làm việc Đăng ký',
-  'Work Clock Out': 'Kiểm tra tại nơi làm việc',
-  'Security Clock In': 'Người gác cổng đã ký',
-  'Security Clock Out': 'Kiểm tra cửa',
-  'Applied': 'Đã thông qua',
-  'No Show': 'No Show',
-  'Modify': 'Sửa đổi',
-  'Subtract Hours': 'Trừ giờ',
-  'Hourly Rate': 'Giá theo giờ',
-  'Reviews': 'Bình luận',
-  'Mobile': 'Điện thoại',
-  'Staff Reviews': 'Đánh giá nhân viên',
-  'Revise Hours': 'Giờ sửa đổi',
-  'Are you sure you want to recall this revise?': 'Anh có chắc là anh muốn rút hồ sơ sửa đổi này không??',
-  'Are you sure you want to delete this revise?': 'Bạn có chắc chắn muốn xóa bản ghi sửa đổi này?',
-  'Logs': 'Đăng nhập',
-  'Date Time': 'Ngày giờ',
-  'Action': 'Sự kiện',
-  'Content': 'Nội dung',
-  'Revise': 'Sửa đổi',
-  'Add Revise': 'Thêm sửa đổi',
-  'Edit Revise': 'Sửa đổi',
-  'Incomplete': 'Không đầy đủ',
-  'Completed + Incomplete': 'Hoàn thành + Không đầy đủ',
-  'YY Casual Labour Report': 'Báo cáo tạm thời YY',
-  'TotalAmt': 'Tổng số tiền',
-  'Hours': 'Giờ',
-  'Monthly Staff Request Report': 'Báo cáo nhu cầu nhân viên hàng tháng',
-  'Finance Report':'Báo cáo tài chính',
-  'Created By': 'Trang chủ',
-  'Language': 'Ngôn ngữ',
-  'Korea': 'Hàn Quốc',
-
-  //插件的国际化
-  "Pull to refresh": "Kéo để làm mới",
-  "Release ready": "Sẵn sàng phát hành",
-  "Refreshing...": "Đang làm mới...",
-  "Succeeded": "Thành công",
-  "No more": "No more",
-  "Failed": "Thất bại",
-  "Last updated at %T": "Cập nhật lần cuối lúc",
-  "Pull to load": "Kéo để tải",
-  "Network Load Error": "Lỗi tải mạng",
-  "Loading...": "Đang tải...",
-  "Data loading failed! Please refresh and try again": "Tải dữ liệu không thành công! Vui lòng làm mới và thử lại",
-  "There is currently no content available": "Hiện tại không có nội dung nào phù hợp",
-  "Click again and exit the app": "Nhấp lại và thoát khỏi ứng dụng",
-  "The login credential have expired, please log in again.": "Thông tin đăng nhập đã hết hạn, vui lòng đăng nhập lại.",
-  "Successful": "Thành công",
-};

+ 4 - 0
packages/cs_resources/lib/local/language/zh_CN.dart

@@ -238,6 +238,10 @@ const Map<String, String> zh_CN = {
   'Created By': '创建者',
   'Language': '语言',
   'Korea': '韩国',
+  'United Kingdom': '英国',
+  'Jobs': '工作',
+  'Security Registration': '门卫登记',
+  'E-Attendance': '电子考勤',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',

+ 5 - 1
packages/cs_router/lib/componentRouter/component_router_service.dart

@@ -3,11 +3,12 @@ import 'package:router/componentRouter/auth_service.dart';
 import 'package:router/componentRouter/job_sg_service.dart';
 import 'package:router/componentRouter/labour_service.dart';
 import 'package:router/componentRouter/labour_sg_service.dart';
+import 'package:router/componentRouter/uk_service.dart';
 
 import 'job_service.dart';
 import 'report_service.dart';
 
-/**
+/*
  * 全局的组件路由服务,记得在 main.dart 中注入
  */
 class ComponentRouterServices{
@@ -38,5 +39,8 @@ class ComponentRouterServices{
   //获取 Labour 组件的服务 (新加坡)
   static LabourSGService get labourSGService => Get.find();
 
+  //获取 UK 组件服务(英国)
+  static UKService get ukService => Get.find();
+
 
 }

+ 6 - 0
packages/cs_router/lib/componentRouter/uk_service.dart

@@ -0,0 +1,6 @@
+/// UK组件对应的路由抽象接口
+abstract class UKService {
+
+  void startUKMainPage();
+
+}

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

@@ -70,6 +70,11 @@ class RouterPath {
   static const previewImage = '/preview/image'; //预览图片
   static const globalWeb = '/global/web'; //全局公用的Web页面
 
+  // ===================================  UK  ↓  ===================================
+
+  static const UKMain = '/uk/main';
+  static const UKJobCategory = '/uk/job/category';
+
   //Runalone
   static const runAloneMain = '/runalone/main'; //独立运行的入口页面
 }