소스 검색

报表的三个页面完成

liukai 6 달 전
부모
커밋
3c7508b314
91개의 변경된 파일2138개의 추가작업 그리고 159개의 파일을 삭제
  1. 1 1
      app/lib/main.dart
  2. 1 1
      app/lib/router/page_router.dart
  3. 2 2
      packages/cpt_auth/lib/modules/login/login_page.dart
  4. 1 1
      packages/cpt_auth/lib/modules/main/main_controller.dart
  5. 1 1
      packages/cpt_auth/lib/modules/main/main_item_module.dart
  6. 5 5
      packages/cpt_auth/lib/modules/main/main_page.dart
  7. 1 1
      packages/cpt_auth/lib/modules/reset_psd/reset_psd_page.dart
  8. 1 1
      packages/cpt_auth/lib/modules/select_country/select_country_page.dart
  9. 1 1
      packages/cpt_auth/lib/modules/setting/setting_page.dart
  10. 1 1
      packages/cpt_auth/lib/modules/sign_up/sign_up_page.dart
  11. 6 6
      packages/cpt_auth/lib/router/page_router.dart
  12. 1 1
      packages/cpt_job/lib/modules/applied_staff_detail/applied_staff_detail_page.dart
  13. 1 1
      packages/cpt_job/lib/modules/applied_staff_reviews/applied_staff_reviews_page.dart
  14. 1 1
      packages/cpt_job/lib/modules/applied_workflow/applied_workflow_page.dart
  15. 1 1
      packages/cpt_job/lib/modules/job_applied/job_applied_page.dart
  16. 1 1
      packages/cpt_job/lib/modules/job_applied_edit/job_applied_edit_page.dart
  17. 22 22
      packages/cpt_job/lib/modules/job_list/job_list_filter.dart
  18. 1 1
      packages/cpt_job/lib/modules/job_list/job_list_page.dart
  19. 1 1
      packages/cpt_job/lib/modules/job_list_detail/job_list_detail_page.dart
  20. 1 1
      packages/cpt_job/lib/modules/sign_in_sign_out/sign_in_sign_out_page.dart
  21. 8 8
      packages/cpt_job/lib/router/page_router.dart
  22. 1 1
      packages/cpt_job_sg/lib/modules/applied_staff/applied_staff_page.dart
  23. 1 1
      packages/cpt_job_sg/lib/modules/applied_staff_detail/applied_staff_detail_page.dart
  24. 1 1
      packages/cpt_job_sg/lib/modules/applied_staff_reviews/applied_staff_reviews_page.dart
  25. 1 1
      packages/cpt_job_sg/lib/modules/job_applied/job_applied_page.dart
  26. 1 1
      packages/cpt_job_sg/lib/modules/revise_add_edit/revise_add_edit_page.dart
  27. 1 1
      packages/cpt_job_sg/lib/modules/revise_applied/revise_applied_page.dart
  28. 1 1
      packages/cpt_job_sg/lib/modules/revise_list/revise_list_page.dart
  29. 1 1
      packages/cpt_job_sg/lib/modules/revise_log/revise_log_page.dart
  30. 8 8
      packages/cpt_job_sg/lib/router/page_router.dart
  31. 1 1
      packages/cpt_labour/lib/modules/labour_request_add/labour_request_add_page.dart
  32. 2 2
      packages/cpt_labour/lib/modules/labour_request_list/labour_request_list_page.dart
  33. 1 1
      packages/cpt_labour/lib/modules/labour_request_workflow/labour_request_workflow_page.dart
  34. 3 3
      packages/cpt_labour/lib/router/page_router.dart
  35. 1 1
      packages/cpt_labour_sg/lib/modules/job_list/job_list_page.dart
  36. 1 1
      packages/cpt_labour_sg/lib/modules/job_list_edit/job_list_edit_page.dart
  37. 1 1
      packages/cpt_labour_sg/lib/modules/job_template_add/job_template_add_page.dart
  38. 1 1
      packages/cpt_labour_sg/lib/modules/job_template_list/job_template_list_page.dart
  39. 1 1
      packages/cpt_labour_sg/lib/modules/job_title_list/job_title_list_page.dart
  40. 8 8
      packages/cpt_labour_sg/lib/modules/labour_request/labour_request_page.dart
  41. 1 1
      packages/cpt_labour_sg/lib/modules/labour_request_add/labour_request_add_page.dart
  42. 7 7
      packages/cpt_labour_sg/lib/router/page_router.dart
  43. 1 1
      packages/cpt_report/lib/modules/device_list/device_list_page.dart
  44. 81 0
      packages/cpt_report/lib/modules/report_finance/report_finance_controller.dart
  45. 113 0
      packages/cpt_report/lib/modules/report_finance/report_finance_item.dart
  46. 188 0
      packages/cpt_report/lib/modules/report_finance/report_finance_page.dart
  47. 11 0
      packages/cpt_report/lib/modules/report_finance/report_finance_state.dart
  48. 85 0
      packages/cpt_report/lib/modules/report_labour/report_labour_controller.dart
  49. 127 0
      packages/cpt_report/lib/modules/report_labour/report_labour_item.dart
  50. 125 0
      packages/cpt_report/lib/modules/report_labour/report_labour_page.dart
  51. 10 0
      packages/cpt_report/lib/modules/report_labour/report_labour_state.dart
  52. 66 0
      packages/cpt_report/lib/modules/report_list/report_list_controller.dart
  53. 56 0
      packages/cpt_report/lib/modules/report_list/report_list_item.dart
  54. 95 0
      packages/cpt_report/lib/modules/report_list/report_list_page.dart
  55. 16 0
      packages/cpt_report/lib/modules/report_list/report_list_state.dart
  56. 83 0
      packages/cpt_report/lib/modules/report_staff_request/report_staff_request_controller.dart
  57. 77 0
      packages/cpt_report/lib/modules/report_staff_request/report_staff_request_item.dart
  58. 141 0
      packages/cpt_report/lib/modules/report_staff_request/report_staff_request_page.dart
  59. 9 0
      packages/cpt_report/lib/modules/report_staff_request/report_staff_request_state.dart
  60. 29 4
      packages/cpt_report/lib/router/page_router.dart
  61. 2 3
      packages/cpt_report/lib/router/report_service_impl.dart
  62. 9 0
      packages/cs_domain/lib/constants/api_constants.dart
  63. 48 0
      packages/cs_domain/lib/entity/response/fiance_report_entity.dart
  64. 77 0
      packages/cs_domain/lib/entity/response/labour_report_entity.dart
  65. 23 0
      packages/cs_domain/lib/entity/response/staff_request_report_entity.dart
  66. 27 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  67. 100 0
      packages/cs_domain/lib/generated/json/fiance_report_entity.g.dart
  68. 166 0
      packages/cs_domain/lib/generated/json/labour_report_entity.g.dart
  69. 47 0
      packages/cs_domain/lib/generated/json/staff_request_report_entity.g.dart
  70. 108 5
      packages/cs_domain/lib/repository/other_repository.dart
  71. 1 1
      packages/cs_plugin_basic/lib/modules/global_web_page.dart
  72. 1 1
      packages/cs_plugin_basic/lib/modules/preview_photo_page.dart
  73. 2 2
      packages/cs_plugin_basic/lib/router/basic_page_router.dart
  74. BIN
      packages/cs_resources/assets/cpt_report/report_finance.webp
  75. BIN
      packages/cs_resources/assets/cpt_report/report_labour.webp
  76. BIN
      packages/cs_resources/assets/cpt_report/report_staff_request.webp
  77. BIN
      packages/cs_resources/assets/cpt_report/week_num_1.webp
  78. BIN
      packages/cs_resources/assets/cpt_report/week_num_2.webp
  79. BIN
      packages/cs_resources/assets/cpt_report/week_num_3.webp
  80. BIN
      packages/cs_resources/assets/cpt_report/week_num_4.webp
  81. BIN
      packages/cs_resources/assets/cpt_report/week_num_5.webp
  82. BIN
      packages/cs_resources/assets/cpt_report/week_num_6.webp
  83. BIN
      packages/cs_resources/assets/cpt_report/week_num_7.webp
  84. 1 0
      packages/cs_resources/lib/constants/color_constants.dart
  85. 10 0
      packages/cs_resources/lib/generated/assets.dart
  86. 7 0
      packages/cs_resources/lib/local/language/en_US.dart
  87. 7 0
      packages/cs_resources/lib/local/language/vi_VN.dart
  88. 7 0
      packages/cs_resources/lib/local/language/zh_CN.dart
  89. 1 0
      packages/cs_resources/pubspec.yaml
  90. 43 39
      packages/cs_router/lib/path/router_path.dart
  91. 35 0
      packages/cs_widgets/lib/shatter/custom_progress_bar.dart

+ 1 - 1
app/lib/main.dart

@@ -124,7 +124,7 @@ class MyApp extends StatelessWidget {
           //是否展示Log
           enableLog: true,
           //默认路由与路由表的加载
-          initialRoute: RouterPath.SPLASH,
+          initialRoute: RouterPath.splash,
           getPages: PageRouter.routes + BasicPageRouter.routes + AuthPageRouter.routes + JobPageRouter.routes + LabourPageRouter.routes +
               ReportPageRouter.routes + LabourSGPageRouter.routes + JobPageSGRouter.routes,
           //对原生导航的兼容;SmartDialog路由配置生命周期处理

+ 1 - 1
app/lib/router/page_router.dart

@@ -10,7 +10,7 @@ class PageRouter {
 
     //闪屏页
     GetPage(
-      name: RouterPath.SPLASH,
+      name: RouterPath.splash,
       page: () => SplashPage(),
     ),
 

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

@@ -34,11 +34,11 @@ class LoginPage extends BaseStatefulPage<LoginController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.AUTH_LOGIN, launchModel: LaunchModel.standard);
+    return Get.start(RouterPath.authLogin, launchModel: LaunchModel.standard);
   }
 
   static void startWithPopAll() {
-    Get.offAllNamed(RouterPath.AUTH_LOGIN);
+    Get.offAllNamed(RouterPath.authLogin);
   }
 
   @override

+ 1 - 1
packages/cpt_auth/lib/modules/main/main_controller.dart

@@ -159,7 +159,7 @@ class MainController extends GetxController {
         ComponentRouterServices.labourSGService.startJobTitlePage();
         break;
       case 'report':
-        ToastEngine.show("进入 Report 模块");
+        ComponentRouterServices.reportService.startReportMainPage();
         break;
     }
   }

+ 1 - 1
packages/cpt_auth/lib/modules/main/main_item_module.dart

@@ -17,7 +17,7 @@ class ModuleItem extends StatelessWidget {
       onTap: onTap,
       child: Container(
         decoration: BoxDecoration(
-          color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+          color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
           borderRadius: BorderRadius.circular(7.5), // 设置圆角
         ),
         child: Column(

+ 5 - 5
packages/cpt_auth/lib/modules/main/main_page.dart

@@ -33,11 +33,11 @@ class MainPage extends BaseStatefulPage<MainController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.MAIN);
+    return Get.start(RouterPath.main);
   }
 
   static void startWithPopAll() {
-    Get.offAllNamed(RouterPath.MAIN);
+    Get.offAllNamed(RouterPath.main);
   }
 
   @override
@@ -139,14 +139,14 @@ class _MainPageState extends BaseState<MainPage, MainController> with StateLifec
                         }).expanded(),
 
                         //设置图标,点击进入设置页面
-                        MyAssetImage(Assets.mainHomeSetting, width: 33, height: 33).onTap(() => controller.gotoSettingPage()),
+                        const MyAssetImage(Assets.mainHomeSetting, width: 33, height: 33).onTap(() => controller.gotoSettingPage()),
                       ],
                     ),
 
                     //欢迎的文本+姓名
                     Obx(() {
                       return MyTextView(
-                        "Welcome".tr + " ${UserService.to.getHotelInfo.name ?? "-"}",
+                        "${"Welcome".tr} ${UserService.to.getHotelInfo.name ?? "-"}",
                         textColor: ColorConstants.textGray9EB0C1,
                         isTextEllipsis: true,
                         isFontMedium: true,
@@ -177,7 +177,7 @@ class _MainPageState extends BaseState<MainPage, MainController> with StateLifec
                               },
                               childCount: state.datas.length,
                             ),
-                            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
+                            gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
                               crossAxisCount: 2, // 每行2个项目
                               mainAxisSpacing: 5, // 主轴方向的间距
                               crossAxisSpacing: 5, // 交叉轴方向的间距

+ 1 - 1
packages/cpt_auth/lib/modules/reset_psd/reset_psd_page.dart

@@ -19,7 +19,7 @@ class ResetPasswordPage extends BaseStatefulPage<ResetPasswordController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.AUTH_RESET_PSD);
+    return Get.start(RouterPath.authResetPassword);
   }
 
   @override

+ 1 - 1
packages/cpt_auth/lib/modules/select_country/select_country_page.dart

@@ -21,7 +21,7 @@ class SelectCountryPage extends BaseStatelessPage<SelectCountryController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.AUTH_SELECT_COUNTRY);
+    return Get.start(RouterPath.authSelectCountry);
   }
 
   @override

+ 1 - 1
packages/cpt_auth/lib/modules/setting/setting_page.dart

@@ -17,7 +17,7 @@ class SettingPage extends BaseStatelessPage<SettingController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.SETTINGS);
+    return Get.start(RouterPath.settings);
   }
 
   late SettingState state;

+ 1 - 1
packages/cpt_auth/lib/modules/sign_up/sign_up_page.dart

@@ -19,7 +19,7 @@ class SignUpPage extends BaseStatefulPage<SignUpController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.AUTH_SIGNUP);
+    return Get.start(RouterPath.authSignUp);
   }
 
   @override

+ 6 - 6
packages/cpt_auth/lib/router/page_router.dart

@@ -13,37 +13,37 @@ class AuthPageRouter {
   static final routes = [
     //首页
     GetPage(
-      name: RouterPath.MAIN,
+      name: RouterPath.main,
       page: () => MainPage(),
     ),
 
     //登录
     GetPage(
-      name: RouterPath.AUTH_LOGIN,
+      name: RouterPath.authLogin,
       page: () => LoginPage(),
     ),
 
     //注册
     GetPage(
-      name: RouterPath.AUTH_SIGNUP,
+      name: RouterPath.authSignUp,
       page: () => SignUpPage(),
     ),
 
     //重置密码
     GetPage(
-      name: RouterPath.AUTH_RESET_PSD,
+      name: RouterPath.authResetPassword,
       page: () => ResetPasswordPage(),
     ),
 
     //设置
     GetPage(
-      name: RouterPath.SETTINGS,
+      name: RouterPath.settings,
       page: () => SettingPage(),
     ),
 
     //切换国家
     GetPage(
-      name: RouterPath.AUTH_SELECT_COUNTRY,
+      name: RouterPath.authSelectCountry,
       page: () => SelectCountryPage(),
     ),
   ];

+ 1 - 1
packages/cpt_job/lib/modules/applied_staff_detail/applied_staff_detail_page.dart

@@ -24,7 +24,7 @@ class AppliedStaffDetailPage extends BaseStatefulPage<AppliedStaffDetailControll
 
   //启动当前页面
   static void startInstance(String? memberId) {
-    return Get.start(RouterPath.JOB_APPLIED_STAFF_DETAIL, arguments: {'memberId': memberId});
+    return Get.start(RouterPath.jobAppliedStaffDetail, arguments: {'memberId': memberId});
   }
 
   @override

+ 1 - 1
packages/cpt_job/lib/modules/applied_staff_reviews/applied_staff_reviews_page.dart

@@ -29,7 +29,7 @@ class AppliedStaffReviewsPage extends BaseStatefulPage<AppliedStaffReviewsContro
   //启动当前页面
   static void startInstance(String? memberId, String? staffName, double? reviews, String? reviewCount) {
     return Get.start(
-      RouterPath.JOB_APPLIED_STAFF_REVIEWS,
+      RouterPath.jobAppliedStaffReviews,
       arguments: {'memberId': memberId, 'staffName': staffName, 'reviews': reviews, 'reviewCount': reviewCount},
     );
   }

+ 1 - 1
packages/cpt_job/lib/modules/applied_workflow/applied_workflow_page.dart

@@ -23,7 +23,7 @@ class AppliedWorkflowPage extends BaseStatefulPage<AppliedWorkflowController> {
 
   //启动当前页面
   static void startInstance(String? appliedId) {
-    return Get.start(RouterPath.JOB_APPLIED_STAFF_WORKFLOW,arguments: {'appliedId': appliedId});
+    return Get.start(RouterPath.jobAppliedStaffWorkflow,arguments: {'appliedId': appliedId});
   }
 
   @override

+ 1 - 1
packages/cpt_job/lib/modules/job_applied/job_applied_page.dart

@@ -28,7 +28,7 @@ class JobAppliedPage extends BaseStatefulPage<JobAppliedController> {
 
   //启动当前页面
   static void startInstance(String? jobId) {
-    return Get.start(RouterPath.JOB_APPLIED_STAFF_LIST, arguments: {'jobId': jobId});
+    return Get.start(RouterPath.jobAppliedStaffList, arguments: {'jobId': jobId});
   }
 
   @override

+ 1 - 1
packages/cpt_job/lib/modules/job_applied_edit/job_applied_edit_page.dart

@@ -33,7 +33,7 @@ class JobAppliedEditPage extends BaseStatefulPage<JobAppliedEditController> {
 
   //启动当前页面
   static void startInstance(String? appliedId) {
-    return Get.start(RouterPath.JOB_APPLIED_STAFF_EDIT, arguments: {'appliedId': appliedId});
+    return Get.start(RouterPath.jobAppliedStaffEdit, arguments: {'appliedId': appliedId});
   }
 
   @override

+ 22 - 22
packages/cpt_job/lib/modules/job_list/job_list_filter.dart

@@ -66,9 +66,9 @@ class _JobListFilterState extends State<JobListFilter> {
           height: kToolbarHeight + ScreenUtil.getStatusBarH(context) + 1,
         ),
         Container(
-          padding: EdgeInsets.only(left: 15, right: 15, top: 17.5, bottom: 20),
+          padding: const EdgeInsets.only(left: 15, right: 15, top: 17.5, bottom: 20),
           width: double.infinity,
-          decoration: BoxDecoration(
+          decoration: const BoxDecoration(
             color: Colors.white,
           ),
           child: Column(
@@ -84,12 +84,12 @@ class _JobListFilterState extends State<JobListFilter> {
 
               //选择部门
               Container(
-                padding: EdgeInsets.only(left: 16, right: 10),
-                margin: EdgeInsets.only(top: 10),
+                padding: const EdgeInsets.only(left: 16, right: 10),
+                margin: const EdgeInsets.only(top: 10),
                 height: 45,
-                decoration: BoxDecoration(
+                decoration: const BoxDecoration(
                   color: ColorConstants.grayECECEC,
-                  borderRadius: const BorderRadius.all(Radius.circular(5)),
+                  borderRadius: BorderRadius.all(Radius.circular(5)),
                 ),
                 child: Row(
                   mainAxisSize: MainAxisSize.max,
@@ -106,7 +106,7 @@ class _JobListFilterState extends State<JobListFilter> {
                       isFontMedium: true,
                       textColor: ColorConstants.black33,
                     ).expanded(),
-                    MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                    const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
                   ],
                 ),
               ).onTap(() {
@@ -124,12 +124,12 @@ class _JobListFilterState extends State<JobListFilter> {
 
               //选择状态
               Container(
-                padding: EdgeInsets.only(left: 16, right: 10),
-                margin: EdgeInsets.only(top: 10),
+                padding: const EdgeInsets.only(left: 16, right: 10),
+                margin: const EdgeInsets.only(top: 10),
                 height: 45,
-                decoration: BoxDecoration(
+                decoration: const BoxDecoration(
                   color: ColorConstants.grayECECEC,
-                  borderRadius: const BorderRadius.all(Radius.circular(5)),
+                  borderRadius: BorderRadius.all(Radius.circular(5)),
                 ),
                 child: Row(
                   mainAxisSize: MainAxisSize.max,
@@ -146,7 +146,7 @@ class _JobListFilterState extends State<JobListFilter> {
                       isFontMedium: true,
                       textColor: ColorConstants.black33,
                     ).expanded(),
-                    MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                    const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
                   ],
                 ),
               ).onTap(() {
@@ -164,12 +164,12 @@ class _JobListFilterState extends State<JobListFilter> {
 
               //选择时间
               Container(
-                padding: EdgeInsets.only(left: 16, right: 10),
-                margin: EdgeInsets.only(top: 10),
+                padding: const EdgeInsets.only(left: 16, right: 10),
+                margin: const EdgeInsets.only(top: 10),
                 height: 45,
-                decoration: BoxDecoration(
+                decoration: const BoxDecoration(
                   color: ColorConstants.grayECECEC,
-                  borderRadius: const BorderRadius.all(Radius.circular(5)),
+                  borderRadius: BorderRadius.all(Radius.circular(5)),
                 ),
                 child: Row(
                   mainAxisSize: MainAxisSize.max,
@@ -184,7 +184,7 @@ class _JobListFilterState extends State<JobListFilter> {
                       isFontMedium: true,
                       textColor: ColorConstants.black33,
                     ).expanded(),
-                    MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                    const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
                   ],
                 ),
               ).onTap(() {
@@ -202,12 +202,12 @@ class _JobListFilterState extends State<JobListFilter> {
 
               //选择结束日期
               Container(
-                padding: EdgeInsets.only(left: 16, right: 10),
-                margin: EdgeInsets.only(top: 10),
+                padding: const EdgeInsets.only(left: 16, right: 10),
+                margin: const EdgeInsets.only(top: 10),
                 height: 45,
-                decoration: BoxDecoration(
+                decoration: const BoxDecoration(
                   color: ColorConstants.grayECECEC,
-                  borderRadius: const BorderRadius.all(Radius.circular(5)),
+                  borderRadius: BorderRadius.all(Radius.circular(5)),
                 ),
                 child: Row(
                   mainAxisSize: MainAxisSize.max,
@@ -222,7 +222,7 @@ class _JobListFilterState extends State<JobListFilter> {
                       isFontMedium: true,
                       textColor: ColorConstants.black33,
                     ).expanded(),
-                    MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                    const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
                   ],
                 ),
               ).onTap(() {

+ 1 - 1
packages/cpt_job/lib/modules/job_list/job_list_page.dart

@@ -26,7 +26,7 @@ class JobListPage extends BaseStatefulPage<JobListController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.JOB_LIST);
+    return Get.start(RouterPath.jobList);
   }
 
   @override

+ 1 - 1
packages/cpt_job/lib/modules/job_list_detail/job_list_detail_page.dart

@@ -26,7 +26,7 @@ class JobListDetailPage extends BaseStatefulPage<JobListDetailController> {
 
   //启动当前页面
   static void startInstance(String? jobId) {
-    return Get.start(RouterPath.JOB_LIST_DETAIL, arguments: {'jobId': jobId});
+    return Get.start(RouterPath.jobListDetail, arguments: {'jobId': jobId});
   }
 
   @override

+ 1 - 1
packages/cpt_job/lib/modules/sign_in_sign_out/sign_in_sign_out_page.dart

@@ -34,7 +34,7 @@ class SignInSignOutPage extends BaseStatefulPage<SignInSignOutController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.JOB_SIGN_IN_SIGN_OUT);
+    return Get.start(RouterPath.jobSignInSignOut);
   }
 
   @override

+ 8 - 8
packages/cpt_job/lib/router/page_router.dart

@@ -14,49 +14,49 @@ class JobPageRouter {
   static final routes = [
     //签到签出
     GetPage(
-      name: RouterPath.JOB_SIGN_IN_SIGN_OUT,
+      name: RouterPath.jobSignInSignOut,
       page: () => SignInSignOutPage(),
     ),
 
     //工作列表
     GetPage(
-      name: RouterPath.JOB_LIST,
+      name: RouterPath.jobList,
       page: () => JobListPage(),
     ),
 
     //工作列表详情
     GetPage(
-      name: RouterPath.JOB_LIST_DETAIL,
+      name: RouterPath.jobListDetail,
       page: () => JobListDetailPage(),
     ),
 
     //工作已申请列表
     GetPage(
-      name: RouterPath.JOB_APPLIED_STAFF_LIST,
+      name: RouterPath.jobAppliedStaffList,
       page: () => JobAppliedPage(),
     ),
 
     //工作已申请列表
     GetPage(
-      name: RouterPath.JOB_APPLIED_STAFF_WORKFLOW,
+      name: RouterPath.jobAppliedStaffWorkflow,
       page: () => AppliedWorkflowPage(),
     ),
 
     //编辑申请
     GetPage(
-      name: RouterPath.JOB_APPLIED_STAFF_EDIT,
+      name: RouterPath.jobAppliedStaffEdit,
       page: () => JobAppliedEditPage(),
     ),
 
     //员工详情
     GetPage(
-      name: RouterPath.JOB_APPLIED_STAFF_DETAIL,
+      name: RouterPath.jobAppliedStaffDetail,
       page: () => AppliedStaffDetailPage(),
     ),
 
     //员工评价
     GetPage(
-      name: RouterPath.JOB_APPLIED_STAFF_REVIEWS,
+      name: RouterPath.jobAppliedStaffReviews,
       page: () => AppliedStaffReviewsPage(),
     ),
 

+ 1 - 1
packages/cpt_job_sg/lib/modules/applied_staff/applied_staff_page.dart

@@ -28,7 +28,7 @@ class AppliedStaffPage extends BaseStatefulPage<AppliedStaffController> {
 
   //启动当前页面
   static void startInstance(String? jobId) {
-    return Get.start(RouterPath.JOB_LIST_APPLIED_STAFF_LIST_SG, arguments: {'jobId': jobId});
+    return Get.start(RouterPath.jobListAppliedStaffListSG, arguments: {'jobId': jobId});
   }
 
   @override

+ 1 - 1
packages/cpt_job_sg/lib/modules/applied_staff_detail/applied_staff_detail_page.dart

@@ -25,7 +25,7 @@ class AppliedStaffDetailPage extends BaseStatefulPage<AppliedStaffDetailControll
 
   //启动当前页面
   static void startInstance(String? memberId) {
-    return Get.start(RouterPath.JOB_LIST_APPLIED_STAFF_DETAIL_SG, arguments: {'memberId': memberId});
+    return Get.start(RouterPath.jobListAppliedStaffDetailSG, arguments: {'memberId': memberId});
   }
 
   @override

+ 1 - 1
packages/cpt_job_sg/lib/modules/applied_staff_reviews/applied_staff_reviews_page.dart

@@ -29,7 +29,7 @@ class AppliedStaffReviewsPage extends BaseStatefulPage<AppliedStaffReviewsContro
   //启动当前页面
   static void startInstance(String? memberId, String? staffName, double? reviews, String? reviewCount) {
     return Get.start(
-      RouterPath.JOB_LIST_APPLIED_STAFF_REVIEWS_SG,
+      RouterPath.jobListAppliedStaffReviewSG,
       arguments: {'memberId': memberId, 'staffName': staffName, 'reviews': reviews, 'reviewCount': reviewCount},
     );
   }

+ 1 - 1
packages/cpt_job_sg/lib/modules/job_applied/job_applied_page.dart

@@ -30,7 +30,7 @@ class JobAppliedPage extends BaseStatefulPage<JobAppliedController> {
 
   //启动当前页面
   static void startInstance(String? jobId) {
-    return Get.start(RouterPath.JOB_LIST_APPLIED_SG, arguments: {'jobId': jobId});
+    return Get.start(RouterPath.jobListAppliedSG, arguments: {'jobId': jobId});
   }
 
   @override

+ 1 - 1
packages/cpt_job_sg/lib/modules/revise_add_edit/revise_add_edit_page.dart

@@ -31,7 +31,7 @@ class ReviseAddEditPage extends BaseStatefulPage<ReviseAddEditController> {
 
   //启动当前页面,pageType 0 是新增  1是编辑  2是详情
   static void startInstance(int pageType, String? id, void Function(dynamic value)? cb) {
-    return Get.start(RouterPath.REVISE_EDIT_SG, arguments: {'pageType': pageType, 'id': id,'cb': cb});
+    return Get.start(RouterPath.reviseEditSG, arguments: {'pageType': pageType, 'id': id,'cb': cb});
   }
 
   @override

+ 1 - 1
packages/cpt_job_sg/lib/modules/revise_applied/revise_applied_page.dart

@@ -24,7 +24,7 @@ class ReviseAppliedPage extends BaseStatefulPage<ReviseAppliedController> {
 
   //启动当前页面
   static void startInstance(String? appliedId, String? jobTitle, String? jobDate) {
-    return Get.start(RouterPath.REVISE_APPLIED_SG, arguments: {'appliedId': appliedId, 'jobTitle': jobTitle, 'jobDate': jobDate});
+    return Get.start(RouterPath.reviseAppliedSG, arguments: {'appliedId': appliedId, 'jobTitle': jobTitle, 'jobDate': jobDate});
   }
 
   @override

+ 1 - 1
packages/cpt_job_sg/lib/modules/revise_list/revise_list_page.dart

@@ -26,7 +26,7 @@ class ReviseListPage extends BaseStatefulPage<ReviseListController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.REVISE_LIST_SG);
+    return Get.start(RouterPath.reviseListSG);
   }
 
   @override

+ 1 - 1
packages/cpt_job_sg/lib/modules/revise_log/revise_log_page.dart

@@ -23,7 +23,7 @@ class ReviseLogPage extends BaseStatefulPage<ReviseLogController> {
 
   //启动当前页面
   static void startInstance(String? reviseId) {
-    return Get.start(RouterPath.REVISE_LOG_SG,arguments: {'reviseId': reviseId});
+    return Get.start(RouterPath.reviseLogSG,arguments: {'reviseId': reviseId});
   }
 
   @override

+ 8 - 8
packages/cpt_job_sg/lib/router/page_router.dart

@@ -15,42 +15,42 @@ class JobPageSGRouter {
     // 工作列表 (新加坡)
     // 新加坡工作列表已申请列表
     GetPage(
-      name: RouterPath.JOB_LIST_APPLIED_SG,
+      name: RouterPath.jobListAppliedSG,
       page: () => JobAppliedPage(),
     ),
 
     GetPage(
-      name: RouterPath.JOB_LIST_APPLIED_STAFF_LIST_SG,
+      name: RouterPath.jobListAppliedStaffListSG,
       page: () => AppliedStaffPage(),
     ),
 
     GetPage(
-      name: RouterPath.JOB_LIST_APPLIED_STAFF_DETAIL_SG,
+      name: RouterPath.jobListAppliedStaffDetailSG,
       page: () => AppliedStaffDetailPage(),
     ),
 
     GetPage(
-      name: RouterPath.JOB_LIST_APPLIED_STAFF_REVIEWS_SG,
+      name: RouterPath.jobListAppliedStaffReviewSG,
       page: () => AppliedStaffReviewsPage(),
     ),
 
     GetPage(
-      name: RouterPath.REVISE_LIST_SG,
+      name: RouterPath.reviseListSG,
       page: () => ReviseListPage(),
     ),
 
     GetPage(
-      name: RouterPath.REVISE_LOG_SG,
+      name: RouterPath.reviseLogSG,
       page: () => ReviseLogPage(),
     ),
 
     GetPage(
-      name: RouterPath.REVISE_EDIT_SG,
+      name: RouterPath.reviseEditSG,
       page: () => ReviseAddEditPage(),
     ),
 
     GetPage(
-      name: RouterPath.REVISE_APPLIED_SG,
+      name: RouterPath.reviseAppliedSG,
       page: () => ReviseAppliedPage(),
     ),
 

+ 1 - 1
packages/cpt_labour/lib/modules/labour_request_add/labour_request_add_page.dart

@@ -29,7 +29,7 @@ class LabourRequestAddPage extends BaseStatefulPage<LabourRequestAddController>
 
   //启动当前页面,pageType 0 是新增  1是编辑  2是详情
   static void startInstance(int pageType, String? appliedId) {
-    return Get.start(RouterPath.JOB_LABOUR_REQUEST_ADD, arguments: {'pageType': pageType, 'appliedId': appliedId});
+    return Get.start(RouterPath.jobLabourRequestAdd, arguments: {'pageType': pageType, 'appliedId': appliedId});
   }
 
   @override

+ 2 - 2
packages/cpt_labour/lib/modules/labour_request_list/labour_request_list_page.dart

@@ -26,7 +26,7 @@ class LabourRequestListPage extends BaseStatefulPage<LabourRequestListController
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.JOB_LABOUR_REQUEST_LIST);
+    return Get.start(RouterPath.jobLabourRequestList);
   }
 
   @override
@@ -94,7 +94,7 @@ class _LabourRequestListState extends BaseState<LabourRequestListPage, LabourReq
                   ).marginOnly(right: 15),
 
                   //筛选图标
-                  MyAssetImage(
+                  const MyAssetImage(
                     Assets.baseServiceTitleBarFilterIcon,
                     width: 24,
                     height: 16.5,

+ 1 - 1
packages/cpt_labour/lib/modules/labour_request_workflow/labour_request_workflow_page.dart

@@ -23,7 +23,7 @@ class LabourRequestWorkflowPage extends BaseStatefulPage<LabourRequestWorkflowCo
 
   //启动当前页面
   static void startInstance(String? requestId) {
-    return Get.start(RouterPath.JOB_LABOUR_REQUEST_WORKFLOW,arguments: {'requestId': requestId});
+    return Get.start(RouterPath.jobLabourRequestWorkflow,arguments: {'requestId': requestId});
   }
 
   @override

+ 3 - 3
packages/cpt_labour/lib/router/page_router.dart

@@ -13,19 +13,19 @@ class LabourPageRouter {
 
     //用工请求列表
     GetPage(
-      name: RouterPath.JOB_LABOUR_REQUEST_LIST,
+      name: RouterPath.jobLabourRequestList,
       page: () => LabourRequestListPage(),
     ),
 
     //用工请求添加
     GetPage(
-      name: RouterPath.JOB_LABOUR_REQUEST_ADD,
+      name: RouterPath.jobLabourRequestAdd,
       page: () => LabourRequestAddPage(),
     ),
 
     //用工请求状态修改工作流
     GetPage(
-      name: RouterPath.JOB_LABOUR_REQUEST_WORKFLOW,
+      name: RouterPath.jobLabourRequestWorkflow,
       page: () => LabourRequestWorkflowPage(),
     ),
 

+ 1 - 1
packages/cpt_labour_sg/lib/modules/job_list/job_list_page.dart

@@ -26,7 +26,7 @@ class JobListPage extends BaseStatefulPage<JobListController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.JOB_LIST_SG);
+    return Get.start(RouterPath.jobListSG);
   }
 
   @override

+ 1 - 1
packages/cpt_labour_sg/lib/modules/job_list_edit/job_list_edit_page.dart

@@ -32,7 +32,7 @@ class JobListEditPage extends BaseStatelessPage<JobListEditController> {
 
   //启动当前页面
   static void startInstance(bool isEditType, String? jobId, void Function(dynamic value)? cb) {
-    return Get.start(RouterPath.JOB_LIST_EDIT, arguments: {'isEditType': isEditType, 'jobId': jobId, 'cb': cb});
+    return Get.start(RouterPath.jobListEditSG, arguments: {'isEditType': isEditType, 'jobId': jobId, 'cb': cb});
   }
 
   late JobListEditState state;

+ 1 - 1
packages/cpt_labour_sg/lib/modules/job_template_add/job_template_add_page.dart

@@ -34,7 +34,7 @@ class JobTemplateAddPage extends BaseStatelessPage<JobTemplateAddController> {
     String templateId,
     void Function(dynamic value)? cb,
   ) {
-    return Get.start(RouterPath.JOB_TEMPLATE_ADD_SG, arguments: {'templateId': templateId, 'cb': cb});
+    return Get.start(RouterPath.jobTemplateAddSG, arguments: {'templateId': templateId, 'cb': cb});
   }
 
   late JobTemplateAddState state;

+ 1 - 1
packages/cpt_labour_sg/lib/modules/job_template_list/job_template_list_page.dart

@@ -23,7 +23,7 @@ class JobTemplateListPage extends BaseStatefulPage<JobTemplateListController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.JOB_TEMPLATE_LIST_SG);
+    return Get.start(RouterPath.jobTemplateListSG);
   }
 
   @override

+ 1 - 1
packages/cpt_labour_sg/lib/modules/job_title_list/job_title_list_page.dart

@@ -26,7 +26,7 @@ class JobTitleListPage extends BaseStatefulPage<JobTitleListController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.JOB_TITLE_LIST_SG);
+    return Get.start(RouterPath.jobTitleListSG);
   }
 
   @override

+ 8 - 8
packages/cpt_labour_sg/lib/modules/labour_request/labour_request_page.dart

@@ -25,7 +25,7 @@ class LabourRequestPage extends BaseStatelessPage<LabourRequestController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.LABOUR_REQUEST_SG);
+    return Get.start(RouterPath.labourRequestSG);
   }
 
   late LabourRequestState state;
@@ -70,15 +70,15 @@ class LabourRequestPage extends BaseStatelessPage<LabourRequestController> {
                 Container(
                   width: double.infinity,
                   height: 42,
-                  margin: EdgeInsets.symmetric(vertical: 15, horizontal: 15),
-                  padding: EdgeInsets.symmetric(vertical: 0, horizontal: 13.5),
+                  margin: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                  padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 13.5),
                   decoration: BoxDecoration(
-                    color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+                    color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
                     borderRadius: BorderRadius.circular(20.0), // 设置圆角
                   ),
                   child: Row(
                     children: [
-                      MyAssetImage(Assets.cptJobPickDateIcon, width: 15, height: 15),
+                      const MyAssetImage(Assets.cptJobPickDateIcon, width: 15, height: 15),
                       MyTextView(
                         DateTimeUtils.formatDate(state.selectedDateTime, format: "yyyy-MM-dd"),
                         hint: "Select Date".tr,
@@ -112,9 +112,9 @@ class LabourRequestPage extends BaseStatelessPage<LabourRequestController> {
 
                 Container(
                   width: double.infinity,
-                  margin: EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                  margin: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),
                   decoration: BoxDecoration(
-                    color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+                    color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
                     borderRadius: BorderRadius.circular(5.0), // 设置圆角
                   ),
                   child: Column(
@@ -140,7 +140,7 @@ class LabourRequestPage extends BaseStatelessPage<LabourRequestController> {
                       ).constrained(height: 45),
 
                       //分割线
-                      Divider(color: ColorConstants.dividerBar, height: 0.5),
+                      const Divider(color: ColorConstants.dividerBar, height: 0.5),
 
                       //底部的数据
                       LoadStateLayout(

+ 1 - 1
packages/cpt_labour_sg/lib/modules/labour_request_add/labour_request_add_page.dart

@@ -30,7 +30,7 @@ class LabourRequestAddPage extends BaseStatelessPage<LabourRequestAddController>
 
   //启动当前页面
   static void startInstance(void Function(dynamic value)? cb) {
-    return Get.start(RouterPath.LABOUR_REQUEST_ADD_SG, arguments: {'cb': cb});
+    return Get.start(RouterPath.labourRequestAddSG, arguments: {'cb': cb});
   }
 
   late LabourRequestAddState state;

+ 7 - 7
packages/cpt_labour_sg/lib/router/page_router.dart

@@ -18,43 +18,43 @@ class LabourSGPageRouter {
 
     // 工作标题列表
     GetPage(
-      name: RouterPath.JOB_TITLE_LIST_SG,
+      name: RouterPath.jobTitleListSG,
       page: () => JobTitleListPage(),
     ),
 
     // 工作模板列表
     GetPage(
-      name: RouterPath.JOB_TEMPLATE_LIST_SG,
+      name: RouterPath.jobTemplateListSG,
       page: () => JobTemplateListPage(),
     ),
 
     // 添加模板
     GetPage(
-      name: RouterPath.JOB_TEMPLATE_ADD_SG,
+      name: RouterPath.jobTemplateAddSG,
       page: () => JobTemplateAddPage(),
     ),
 
     // 用工请求
     GetPage(
-      name: RouterPath.LABOUR_REQUEST_SG,
+      name: RouterPath.labourRequestSG,
       page: () => LabourRequestPage(),
     ),
 
     // 用工请求添加
     GetPage(
-      name: RouterPath.LABOUR_REQUEST_ADD_SG,
+      name: RouterPath.labourRequestAddSG,
       page: () => LabourRequestAddPage(),
     ),
 
     // 新加坡工作列表
     GetPage(
-      name: RouterPath.JOB_LIST_SG,
+      name: RouterPath.jobListSG,
       page: () => JobListPage(),
     ),
 
     // 新加坡工作列表编辑
     GetPage(
-      name: RouterPath.JOB_LIST_EDIT,
+      name: RouterPath.jobListEditSG,
       page: () => JobListEditPage(),
     ),
 

+ 1 - 1
packages/cpt_report/lib/modules/device_list/device_list_page.dart

@@ -21,7 +21,7 @@ class DeviceListPage extends BaseStatefulPage<DeviceListController> {
 
   //启动当前页面
   static void startInstance() {
-    return Get.start(RouterPath.DEVICE_LIST);
+    return Get.start(RouterPath.deviceList);
   }
 
   @override

+ 81 - 0
packages/cpt_report/lib/modules/report_finance/report_finance_controller.dart

@@ -0,0 +1,81 @@
+import 'package:domain/repository/other_repository.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/picker/date_picker_util.dart';
+
+import 'report_finance_state.dart';
+
+class ReportFinanceController extends GetxController with DioCancelableMixin {
+  final OtherRepository _otherRepository = Get.find();
+  final ReportFinanceState state = ReportFinanceState();
+
+  //页面PlaceHolder的展示
+  LoadState loadingState = LoadState.State_Success;
+  String? errorMessage;
+
+  //刷新页面状态
+  void changeLoadingState(LoadState state) {
+    loadingState = state;
+    update();
+  }
+
+  //重试
+  void retryRequest() {
+    fetchReportData();
+  }
+
+  // 获取列表数据
+  void fetchReportData() async {
+    changeLoadingState(LoadState.State_Loading);
+
+    var result = await _otherRepository.fetchReportFiance(
+      DateTimeUtils.formatDate(state.startDateTime, format: "yyyy-MM-dd"),
+      DateTimeUtils.formatDate(state.endDateTime, format: "yyyy-MM-dd"),
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      state.entity = result.data;
+      state.datas = result.data?.rateList ?? [];
+      changeLoadingState(LoadState.State_Success);
+    } else {
+      errorMessage = result.errorMsg ?? "Network Load Error".tr;
+      changeLoadingState(LoadState.State_Error);
+    }
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchReportData();
+  }
+
+  /// 筛选开始日期
+  void pickerStartDate() {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: state.startDateTime,
+      onDateTimeChanged: (date) {
+        state.startDateTime = date;
+        update();
+        fetchReportData();
+      },
+      title: "Start Date".tr,
+    );
+  }
+
+  /// 筛选结束日期
+  void pickerEndDate() {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: state.endDateTime??state.startDateTime,
+      onDateTimeChanged: (date) {
+        state.endDateTime = date;
+        update();
+        fetchReportData();
+      },
+      title: "End Date".tr,
+    );
+  }
+
+}

+ 113 - 0
packages/cpt_report/lib/modules/report_finance/report_finance_item.dart

@@ -0,0 +1,113 @@
+import 'package:cpt_report/modules/device_list/device_list_controller.dart';
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/fiance_report_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:plugin_basic/basic_export.dart';
+import 'package:plugin_platform/engine/loading/loading_engine.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class ReportFinanceItem extends StatelessWidget {
+  final FianceReportRateList item;
+
+  ReportFinanceItem({
+    required this.item,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      decoration: BoxDecoration(
+        color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(7.5), // 设置圆角
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          //星期与日期
+          Row(
+            children: [
+              MyAssetImage(
+                  item.weekNum == "1"
+                      ? Assets.cptReportWeekNum1
+                      : item.weekNum == "2"
+                          ? Assets.cptReportWeekNum2
+                          : item.weekNum == "3"
+                              ? Assets.cptReportWeekNum3
+                              : item.weekNum == "4"
+                                  ? Assets.cptReportWeekNum4
+                                  : item.weekNum == "5"
+                                      ? Assets.cptReportWeekNum5
+                                      : item.weekNum == "6"
+                                          ? Assets.cptReportWeekNum6
+                                          : Assets.cptReportWeekNum7,
+                  width: 29,
+                  height: 29),
+              MyTextView(item.day ?? "", textColor: Colors.white, fontSize: 13.3, isFontBold: true, marginLeft: 13.5),
+            ],
+          ).marginOnly(left: 15, top: 16, bottom: 14),
+
+          Row(
+            children: [
+              Column(
+                children: [
+                  MyTextView(
+                    "RQST",
+                    textColor: ColorConstants.textGrayAECAE5,
+                    fontSize: 11.7,
+                    isFontRegular: true,
+                  ),
+                  MyTextView(
+                    item.request.toString(),
+                    textColor: ColorConstants.textYellowF8AE00,
+                    fontSize: 11.7,
+                    isFontRegular: true,
+                  ),
+                ],
+              ),
+
+              Column(
+                children: [
+                  MyTextView(
+                    "Actual",
+                    textColor: ColorConstants.textGrayAECAE5,
+                    fontSize: 11.7,
+                    isFontRegular: true,
+                  ),
+
+                  MyTextView(
+                    item.actual.toString(),
+                    textColor: ColorConstants.textGreen00FB92,
+                    fontSize: 13.5,
+                    isFontBold: true,
+                  ),
+                ],
+              ).marginOnly(left: 9,right: 9),
+
+              Column(
+                children: [
+                  MyTextView(
+                    "Percentage",
+                    textColor: ColorConstants.textGrayAECAE5,
+                    fontSize: 11.7,
+                    isFontRegular: true,
+                  ),
+                  MyTextView(
+                    item.ratio ?? "-",
+                    textColor: ColorConstants.textPurpleFF35EE,
+                    fontSize: 13.5,
+                    isFontBold: true,
+                  ),
+                ],
+              ).expanded(),
+            ],
+          ).paddingOnly(left: 12,right: 12).expanded(),
+        ],
+      ),
+    );
+  }
+}

+ 188 - 0
packages/cpt_report/lib/modules/report_finance/report_finance_page.dart

@@ -0,0 +1,188 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+import 'report_finance_controller.dart';
+
+import 'package:plugin_basic/base/base_stateless_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+
+import 'report_finance_item.dart';
+import 'report_finance_state.dart';
+
+class ReportFinancePage extends BaseStatelessPage<ReportFinanceController> {
+  ReportFinancePage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.reportFinance);
+  }
+
+  late ReportFinanceState state;
+
+  @override
+  void initState() {
+    state = controller.state;
+  }
+
+  @override
+  ReportFinanceController createRawController() {
+    return ReportFinanceController();
+  }
+
+  @override
+  Widget buildWidget(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(context, "Finance Report".tr),
+        body: SafeArea(
+          bottom: true,
+          top: false,
+          child: Container(
+            width: double.infinity,
+            height: double.infinity,
+            padding: EdgeInsets.only(top: kToolbarHeight + ScreenUtil.getStatusBarH(context) + 1),
+            decoration: const BoxDecoration(
+              gradient: LinearGradient(
+                colors: [
+                  Color(0xFF091D44),
+                  Color(0xFF245A8A),
+                  Color(0xFF7F7CEC),
+                ],
+                begin: Alignment.topCenter,
+                end: Alignment.bottomCenter,
+              ),
+            ),
+            child: Column(
+              children: [
+                // 时间筛选
+                Container(
+                    width: double.infinity,
+                    height: 36,
+                    margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 15),
+                    decoration: BoxDecoration(
+                      color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+                      borderRadius: BorderRadius.circular(20.0), // 设置圆角
+                    ),
+                    child: Row(
+                      children: [
+                        MyTextView(
+                          DateTimeUtils.formatDate(state.startDateTime, format: "yyyy-MM-dd"),
+                          hint: "Start Date".tr,
+                          textHintColor: ColorConstants.textGrayAECAE5,
+                          fontSize: 15,
+                          textAlign: TextAlign.center,
+                          isFontRegular: true,
+                          onClick: controller.pickerStartDate,
+                          textColor: ColorConstants.textGrayAECAE5,
+                        ).expanded(),
+                        Container(color: ColorConstants.dividerBar, height: 21.5, width: 0.5),
+                        MyTextView(
+                          DateTimeUtils.formatDate(state.endDateTime, format: "yyyy-MM-dd"),
+                          hint: "End Date".tr,
+                          textHintColor: ColorConstants.textGrayAECAE5,
+                          fontSize: 15,
+                          textAlign: TextAlign.center,
+                          isFontRegular: true,
+                          onClick: controller.pickerEndDate,
+                          textColor: ColorConstants.textGrayAECAE5,
+                        ).expanded(),
+                      ],
+                    )),
+
+                //总数据
+                Container(
+                    margin: const EdgeInsets.only(left: 15, right: 15),
+                    width: double.infinity,
+                    height: 45,
+                    decoration: BoxDecoration(
+                      color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+                      borderRadius: BorderRadius.circular(5), // 设置圆角
+                    ),
+                    child: Row(
+                      children: [
+                        Row(
+                          mainAxisAlignment: MainAxisAlignment.center,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          children: [
+                            MyTextView(
+                              "Total RQST:",
+                              fontSize: 14,
+                              isFontRegular: true,
+                              onClick: controller.pickerStartDate,
+                              textColor: ColorConstants.textGrayAECAE5,
+                            ),
+                            MyTextView(
+                              state.entity?.requestTotal.toString() ?? "",
+                              fontSize: 14,
+                              marginLeft: 5,
+                              isFontRegular: true,
+                              textColor: ColorConstants.white,
+                            ),
+                          ],
+                        ).expanded(),
+                        Row(
+                          mainAxisAlignment: MainAxisAlignment.center,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          children: [
+                            MyTextView(
+                              "Total Actual:",
+                              fontSize: 14,
+                              isFontRegular: true,
+                              onClick: controller.pickerStartDate,
+                              textColor: ColorConstants.textGrayAECAE5,
+                            ),
+                            MyTextView(
+                              state.entity?.actualTotal.toString() ?? "",
+                              fontSize: 14,
+                              marginLeft: 5,
+                              isFontRegular: true,
+                              textColor: ColorConstants.white,
+                            ),
+                          ],
+                        ).expanded(),
+                      ],
+                    )),
+
+                //动态列表
+                LoadStateLayout(
+                  state: controller.loadingState,
+                  errorMessage: controller.errorMessage,
+                  errorRetry: () {
+                    controller.retryRequest();
+                  },
+                  successSliverWidget: [
+                    SliverGrid(
+                      delegate: SliverChildBuilderDelegate(
+                        (context, index) {
+                          return ReportFinanceItem(item: state.datas[index]);
+                        },
+                        childCount: state.datas.length,
+                      ),
+                      gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
+                        crossAxisCount: 2, // 每行2个项目
+                        mainAxisSpacing: 8.5, // 主轴方向的间距
+                        crossAxisSpacing: 9.5, // 交叉轴方向的间距
+                        childAspectRatio: 168.16 / 107.22, // 子项目的宽高比
+                      ),
+                    )
+                  ],
+                ).marginOnly(left: 15, right: 15, top: 10).expanded(),
+              ],
+            ),
+          ),
+        ),
+      );
+    });
+  }
+}

+ 11 - 0
packages/cpt_report/lib/modules/report_finance/report_finance_state.dart

@@ -0,0 +1,11 @@
+import 'package:domain/entity/response/fiance_report_entity.dart';
+
+class ReportFinanceState {
+
+  DateTime? startDateTime;
+  DateTime? endDateTime;
+
+  FianceReportEntity? entity;  //页面数据
+
+  List<FianceReportRateList> datas = [];  //列表数据
+}

+ 85 - 0
packages/cpt_report/lib/modules/report_labour/report_labour_controller.dart

@@ -0,0 +1,85 @@
+import 'package:domain/entity/response/staff_request_report_entity.dart';
+import 'package:domain/repository/other_repository.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/picker/date_picker_util.dart';
+
+import 'report_labour_state.dart';
+
+class ReportLabourController extends GetxController with DioCancelableMixin {
+  final OtherRepository _otherRepository = Get.find();
+  final ReportLabourState state = ReportLabourState();
+
+  //页面PlaceHolder的展示
+  LoadState loadingState = LoadState.State_Loading;
+  String? errorMessage;
+
+  //刷新页面状态
+  void changeLoadingState(LoadState state) {
+    loadingState = state;
+    update();
+  }
+
+  //重试
+  void retryRequest() {
+    fetchReportData();
+  }
+
+  // 获取当前列表数据
+  void fetchReportData() async {
+    changeLoadingState(LoadState.State_Loading);
+
+    var result = await _otherRepository.fetchReportLabour(
+      DateTimeUtils.formatDate(state.startDateTime, format: "yyyy-MM-dd"),
+      DateTimeUtils.formatDate(state.endDateTime, format: "yyyy-MM-dd"),
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      state.entity = result.data;
+      state.datas = result.data?.rows ?? [];
+      if (state.datas.isNotEmpty) {
+        changeLoadingState(LoadState.State_Success);
+      } else {
+        changeLoadingState(LoadState.State_Empty);
+      }
+    } else {
+      errorMessage = result.errorMsg ?? "Network Load Error".tr;
+      changeLoadingState(LoadState.State_Error);
+    }
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchReportData();
+  }
+
+  /// 筛选开始日期
+  void pickerStartDate() {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: state.startDateTime,
+      onDateTimeChanged: (date) {
+        state.startDateTime = date;
+        update();
+        fetchReportData();
+      },
+      title: "Start Date".tr,
+    );
+  }
+
+  /// 筛选结束日期
+  void pickerEndDate() {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: state.endDateTime ?? state.startDateTime,
+      onDateTimeChanged: (date) {
+        state.endDateTime = date;
+        update();
+        fetchReportData();
+      },
+      title: "End Date".tr,
+    );
+  }
+}

+ 127 - 0
packages/cpt_report/lib/modules/report_labour/report_labour_item.dart

@@ -0,0 +1,127 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:domain/entity/response/labour_report_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:plugin_basic/basic_export.dart';
+import 'package:widgets/ext/ex_widget.dart';
+
+import 'package:widgets/my_text_view.dart';
+
+class ReportLabourItem extends StatelessWidget {
+  LabourReportEntity? entity; //主体数据
+  int type; //0  1  2
+
+  ReportLabourItem({
+    required this.entity,
+    required this.type,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: double.infinity,
+      padding: const EdgeInsets.only(top: 16,bottom: 20),
+      margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 15),
+      decoration: BoxDecoration(
+        color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(5), // 设置圆角
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          MyTextView(
+            type == 0 ? "Completed".tr : type == 1 ? "Incomplete".tr : "Completed + Incomplete".tr,
+            fontSize: 14,
+            isFontBold: true,
+            marginBottom: 15,
+            marginLeft: 20,
+            marginRight: 20,
+            textColor: type == 0 ? ColorConstants.textGreen0AC074 : type == 1 ? ColorConstants.textBlue06D9FF : ColorConstants.textRedFF6262,
+          ),
+          const Divider(height: 0.5, color: ColorConstants.dividerBar),
+
+          Row(
+            children: [
+              MyTextView(
+                "Outlet".tr,
+                fontSize: 14,
+                textColor: Colors.white,
+                isFontRegular: true,
+              ).expanded(),
+
+              RichText(
+                text: TextSpan(
+                  children: [
+                    TextSpan(
+                      text: "Hours".tr,
+                      style: const TextStyle(color: Colors.white, fontSize: 14, fontWeight: FontWeight.w400),
+                    ),
+                    TextSpan(
+                      text: "(${entity?.total?.hrs})",
+                      style: const TextStyle(color: ColorConstants.textGreen0AC074, fontSize: 14, fontWeight: FontWeight.w400),
+                    ),
+                  ],
+                ),
+              ).expanded(),
+
+              RichText(
+                text: TextSpan(
+                  children: [
+                    TextSpan(
+                      text: "TotalAmt".tr,
+                      style: const TextStyle(color: Colors.white, fontSize: 14, fontWeight: FontWeight.w400),
+                    ),
+                    TextSpan(
+                      text: "(${entity?.total?.agAmt})",
+                      style: const TextStyle(color: ColorConstants.textGreen0AC074, fontSize: 14, fontWeight: FontWeight.w400),
+                    ),
+                  ],
+                ),
+              ).expanded(),
+
+            ],
+          ).marginOnly(left: 20,right:20,top: 18,bottom: 2),
+
+          //底部的实际数据
+          ...(entity?.rows.map((item) {
+            return _childItem(
+              item.outletName,
+              type == 0 ? item.hrs : type == 1 ? item.inHrs : item.totHrs,
+              type == 0 ? item.agAmt : type == 1 ? item.inAgAmt : item.totAgAmt,
+            );
+          }).toList() ?? []),
+
+        ],
+      ),
+    );
+  }
+
+  Widget _childItem(String? outletName, String? hours, String? agAmt) {
+    return Row(
+      children: [
+        MyTextView(
+          outletName ?? "",
+          fontSize: 14,
+          textColor: Colors.white,
+          isFontRegular: true,
+        ).expanded(),
+
+        MyTextView(
+          "$hours H",
+          fontSize: 14,
+          textColor: Colors.white,
+          isFontRegular: true,
+        ).expanded(),
+
+        MyTextView(
+          "\$ $agAmt",
+          fontSize: 14,
+          textColor: Colors.white,
+          isFontRegular: true,
+        ).expanded(),
+
+      ],
+    ).marginOnly(top: 16,left: 20,right: 20);
+  }
+}

+ 125 - 0
packages/cpt_report/lib/modules/report_labour/report_labour_page.dart

@@ -0,0 +1,125 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_text_view.dart';
+
+import 'report_labour_controller.dart';
+
+import 'package:plugin_basic/base/base_stateless_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+
+import 'report_labour_item.dart';
+import 'report_labour_state.dart';
+
+class ReportLabourPage extends BaseStatelessPage<ReportLabourController> {
+  ReportLabourPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.reportCasualLabour);
+  }
+
+  late ReportLabourState state;
+
+  @override
+  void initState() {
+    state = controller.state;
+  }
+
+  @override
+  ReportLabourController createRawController() {
+    return ReportLabourController();
+  }
+
+  @override
+  Widget buildWidget(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(context, "YY Casual Labour Report".tr),
+        body: SafeArea(
+          bottom: true,
+          top: false,
+          child: Container(
+            width: double.infinity,
+            height: double.infinity,
+            padding: EdgeInsets.only(top: kToolbarHeight + ScreenUtil.getStatusBarH(context) + 1),
+            decoration: const BoxDecoration(
+              gradient: LinearGradient(
+                colors: [
+                  Color(0xFF091D44),
+                  Color(0xFF245A8A),
+                  Color(0xFF7F7CEC),
+                ],
+                begin: Alignment.topCenter,
+                end: Alignment.bottomCenter,
+              ),
+            ),
+            child: Column(
+              children: [
+                // 时间筛选
+                Container(
+                    width: double.infinity,
+                    height: 36,
+                    margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 15),
+                    decoration: BoxDecoration(
+                      color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+                      borderRadius: BorderRadius.circular(20.0), // 设置圆角
+                    ),
+                    child: Row(
+                      children: [
+                        MyTextView(
+                          DateTimeUtils.formatDate(state.startDateTime, format: "yyyy-MM-dd"),
+                          hint: "Start Date".tr,
+                          textHintColor: ColorConstants.textGrayAECAE5,
+                          fontSize: 15,
+                          textAlign: TextAlign.center,
+                          isFontRegular: true,
+                          onClick: controller.pickerStartDate,
+                          textColor: ColorConstants.textGrayAECAE5,
+                        ).expanded(),
+                        Container(color: ColorConstants.dividerBar, height: 21.5, width: 0.5),
+                        MyTextView(
+                          DateTimeUtils.formatDate(state.endDateTime, format: "yyyy-MM-dd"),
+                          hint: "End Date".tr,
+                          textHintColor: ColorConstants.textGrayAECAE5,
+                          fontSize: 15,
+                          textAlign: TextAlign.center,
+                          isFontRegular: true,
+                          onClick: controller.pickerEndDate,
+                          textColor: ColorConstants.textGrayAECAE5,
+                        ).expanded(),
+                      ],
+                    )),
+
+                //动态列表
+                LoadStateLayout(
+                  state: controller.loadingState,
+                  errorMessage: controller.errorMessage,
+                  errorRetry: () {
+                    controller.retryRequest();
+                  },
+                  successSliverWidget: [
+
+                    SliverList(delegate: SliverChildBuilderDelegate((context, index) {
+                        return ReportLabourItem(entity: state.entity, type: index);
+                      },
+                      childCount: state.datas.isNotEmpty ? 3 : 0,
+                    ))
+
+                  ],
+                ).expanded(),
+              ],
+            ),
+          ),
+        ),
+      );
+    });
+  }
+}

+ 10 - 0
packages/cpt_report/lib/modules/report_labour/report_labour_state.dart

@@ -0,0 +1,10 @@
+import 'package:domain/entity/response/labour_report_entity.dart';
+
+class ReportLabourState {
+
+  DateTime? startDateTime;
+  DateTime? endDateTime;
+
+  LabourReportEntity? entity;   //主体数据
+  List<LabourReportRows> datas = [];  //列表数据
+}

+ 66 - 0
packages/cpt_report/lib/modules/report_list/report_list_controller.dart

@@ -0,0 +1,66 @@
+import 'package:domain/entity/home_module.dart';
+import 'package:domain/entity/response/hotel_info_entity.dart';
+import 'package:get/get.dart';
+import 'package:plugin_basic/service/user_service.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:shared/utils/log_utils.dart';
+
+import '../report_finance/report_finance_page.dart';
+import '../report_labour/report_labour_page.dart';
+import '../report_staff_request/report_staff_request_page.dart';
+import 'report_list_state.dart';
+
+class ReportListController extends GetxController {
+  final ReportListState state = ReportListState();
+
+  /// 获取报表的数据
+  void setupReportData() async {
+    final hotelInfo = UserService.to.getHotelInfo;
+
+    List<HotelInfoMenusChildren>? list = hotelInfo.menus?.firstWhereOrNull((element) => element.key == "report")?.children;
+
+    Log.d("list:$list");
+
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      state.datas.clear();
+
+      //如果是管理员登录,根据Key筛选需要展示的模块
+      for (var children in list) {
+        if (children.key != null) {
+          state.datas.addAll(_filterModulesByKey(children.key!));
+        }
+      }
+    } else {
+      //清除
+      state.datas.clear();
+    }
+
+    update();
+  }
+
+  List<HomeModule> _filterModulesByKey(String key) {
+    return state.modules.where((module) => module.key == key).toList();
+  }
+
+  @override
+  void onReady() async {
+    super.onReady();
+    setupReportData();
+  }
+
+  /// 跳转到指定的模块中去
+  void gotoReportPage(HomeModule module) {
+    switch (module.key) {
+      case 'finRep':
+        ReportFinancePage.startInstance();
+        break;
+      case 'casLab':
+        ReportLabourPage.startInstance();
+        break;
+      case 'monReq':
+        ReportStaffRequestPage.startInstance();
+        break;
+    }
+  }
+}

+ 56 - 0
packages/cpt_report/lib/modules/report_list/report_list_item.dart

@@ -0,0 +1,56 @@
+// 自定义的模块项 Widget
+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:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class ReportListItem extends StatelessWidget {
+  final HomeModule item;
+  final VoidCallback onTap;
+
+  ReportListItem(this.item, this.onTap);
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      onTap: onTap,
+      child: Container(
+        margin: const EdgeInsets.only(top: 5, bottom: 5),
+        padding: const EdgeInsets.only(left: 15, right: 16.5, top: 8, bottom: 8),
+        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,
+              textColor: ColorConstants.textGrayAECAE5,
+              isTextEllipsis: true,
+              maxLines: 2,
+              isFontMedium: true,
+              margin: 20,
+              fontSize: 14,
+            ).expanded(),
+
+            const MyAssetImage(
+              Assets.mainItemMoreIcon,
+              width: 7.5,
+              height: 13.5,
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 95 - 0
packages/cpt_report/lib/modules/report_list/report_list_page.dart

@@ -0,0 +1,95 @@
+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/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 'report_list_controller.dart';
+import 'report_list_item.dart';
+import 'report_list_state.dart';
+
+/*
+ *  报表的列表
+ */
+class ReportListPage extends BaseStatefulPage<ReportListController> {
+  ReportListPage({super.key});
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.reportList);
+  }
+
+  @override
+  State<ReportListPage> createState() => _MainPageState();
+
+  @override
+  ReportListController createRawController() {
+    return ReportListController();
+  }
+}
+
+class _MainPageState extends BaseState<ReportListPage, ReportListController> {
+  late ReportListState 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(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              MyAppBar.titleBar(context, "Report".tr),
+
+              //底部的列表
+              EasyRefresh(
+                controller: null,
+                onRefresh: null,
+                child: ListView.builder(
+                  padding: const EdgeInsets.only(top: 0),
+                  itemCount: state.datas.length,
+                  itemBuilder: (_, int index) {
+                    return ReportListItem(state.datas[index], () {
+                      controller.gotoReportPage(state.datas[index]);
+                    });
+                  },
+                ),
+              ).paddingOnly(left: 15, right: 15, top: 10, bottom: 15).expanded(),
+            ],
+          ),
+        ),
+      );
+    });
+  }
+}

+ 16 - 0
packages/cpt_report/lib/modules/report_list/report_list_state.dart

@@ -0,0 +1,16 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/home_module.dart';
+import 'package:plugin_basic/basic_export.dart';
+
+class ReportListState {
+  //当前显示的模块
+  List<HomeModule> datas = [];
+
+  //全部的模块
+  final List<HomeModule> modules = [
+    HomeModule(key: 'finRep', moduleName: 'Finance Report'.tr, moduleIconPath: Assets.cptReportReportFinance, iconWidth: 40, iconHeight: 40),
+    HomeModule(key: 'casLab', moduleName: 'YY Casual Labour Report'.tr, moduleIconPath: Assets.cptReportReportLabour, iconWidth: 40, iconHeight: 40),
+    HomeModule(key: 'monReq', moduleName: 'Monthly Staff Request Report'.tr, moduleIconPath: Assets.cptReportReportStaffRequest, iconWidth: 40, iconHeight: 40),
+  ];
+
+}

+ 83 - 0
packages/cpt_report/lib/modules/report_staff_request/report_staff_request_controller.dart

@@ -0,0 +1,83 @@
+import 'package:domain/entity/response/staff_request_report_entity.dart';
+import 'package:domain/repository/other_repository.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/picker/date_picker_util.dart';
+
+import 'report_staff_request_state.dart';
+
+class ReportStaffRequestController extends GetxController with DioCancelableMixin {
+  final OtherRepository _otherRepository = Get.find();
+  final ReportStaffRequestState state = ReportStaffRequestState();
+
+  //页面PlaceHolder的展示
+  LoadState loadingState = LoadState.State_Loading;
+  String? errorMessage;
+
+  //刷新页面状态
+  void changeLoadingState(LoadState state) {
+    loadingState = state;
+    update();
+  }
+
+  //重试
+  void retryRequest() {
+    fetchReportData();
+  }
+
+  // 获取当前列表数据
+  void fetchReportData() async {
+    changeLoadingState(LoadState.State_Loading);
+
+    var result = await _otherRepository.fetchReportStaffRequest(
+      DateTimeUtils.formatDate(state.startDateTime, format: "yyyy-MM-dd"),
+      DateTimeUtils.formatDate(state.endDateTime, format: "yyyy-MM-dd"),
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      state.datas = result.list
+          ?.whereType<StaffRequestReportEntity>() // 直接过滤出非 null 的 StaffRequestReportEntity
+          .toList() ?? [];
+      changeLoadingState(LoadState.State_Success);
+    } else {
+      errorMessage = result.errorMsg ?? "Network Load Error".tr;
+      changeLoadingState(LoadState.State_Error);
+    }
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchReportData();
+  }
+
+  /// 筛选开始日期
+  void pickerStartDate() {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: state.startDateTime,
+      onDateTimeChanged: (date) {
+        state.startDateTime = date;
+        update();
+        fetchReportData();
+      },
+      title: "Start Date".tr,
+    );
+  }
+
+  /// 筛选结束日期
+  void pickerEndDate() {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: state.endDateTime??state.startDateTime,
+      onDateTimeChanged: (date) {
+        state.endDateTime = date;
+        update();
+        fetchReportData();
+      },
+      title: "End Date".tr,
+    );
+  }
+
+}

+ 77 - 0
packages/cpt_report/lib/modules/report_staff_request/report_staff_request_item.dart

@@ -0,0 +1,77 @@
+import 'package:cpt_report/modules/device_list/device_list_controller.dart';
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:domain/entity/response/staff_request_report_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:plugin_basic/basic_export.dart';
+import 'package:shared/utils/util.dart';
+
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/custom_progress_bar.dart';
+
+class ReportStaffRequestItem extends StatelessWidget {
+  final StaffRequestReportEntity item;
+
+  ReportStaffRequestItem({
+    required this.item,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        Row(
+          children: [
+            MyTextView(
+              item.name ?? "",
+              fontSize: 14,
+              textColor: Colors.white,
+              isFontRegular: true,
+            ),
+            MyTextView(
+              "(${item.num})",
+              marginLeft: 3,
+              textColor: ColorConstants.textYellowF8AE00,
+              fontSize: 14,
+              isFontRegular: true,
+            ),
+          ],
+        ),
+        CustomProgressBar(
+          progress: _convertProgress(item.ratio),
+          color: item.bg == "rec-primary"
+              ? hexToColor("#228FFE")
+              : item.bg == "rec-success"
+                  ? hexToColor("#01A5A7")
+                  : item.bg == "rec-warning"
+                      ? hexToColor("#E0A721")
+                      : item.bg == "rec-orange"
+                          ? hexToColor("#DD592C")
+                          : item.bg == "rec-danger"
+                              ? hexToColor("#FE3737")
+                              : hexToColor("#943EFF"),
+        ).marginOnly(top: 6),
+      ],
+    ).paddingOnly(left: 22.5, right: 22.5, top: 8, bottom: 8);
+  }
+
+  // 进度的转换
+  double _convertProgress(String? percentageString) {
+    try {
+      if (Utils.isEmpty(percentageString)) {
+        return 0.0;
+      }
+
+      // 去掉百分号
+      String cleanedString = percentageString!.replaceAll('%', '');
+
+      // 将字符串转换为 double
+      return double.parse(cleanedString) / 100;
+    } catch (e) {
+      print('转换失败: $e');
+      return 0.0;
+    }
+  }
+}

+ 141 - 0
packages/cpt_report/lib/modules/report_staff_request/report_staff_request_page.dart

@@ -0,0 +1,141 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_text_view.dart';
+
+import 'report_staff_request_controller.dart';
+
+import 'package:plugin_basic/base/base_stateless_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+
+import 'report_staff_request_item.dart';
+import 'report_staff_request_state.dart';
+
+class ReportStaffRequestPage extends BaseStatelessPage<ReportStaffRequestController> {
+  ReportStaffRequestPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.reportStaffRequest);
+  }
+
+  late ReportStaffRequestState state;
+
+  @override
+  void initState() {
+    state = controller.state;
+  }
+
+  @override
+  ReportStaffRequestController createRawController() {
+    return ReportStaffRequestController();
+  }
+
+  @override
+  Widget buildWidget(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(context, "Monthly Staff Request Report".tr),
+        body: SafeArea(
+          bottom: true,
+          top: false,
+          child: Container(
+            width: double.infinity,
+            height: double.infinity,
+            padding: EdgeInsets.only(top: kToolbarHeight + ScreenUtil.getStatusBarH(context) + 1),
+            decoration: const BoxDecoration(
+              gradient: LinearGradient(
+                colors: [
+                  Color(0xFF091D44),
+                  Color(0xFF245A8A),
+                  Color(0xFF7F7CEC),
+                ],
+                begin: Alignment.topCenter,
+                end: Alignment.bottomCenter,
+              ),
+            ),
+            child: Column(
+              children: [
+                // 时间筛选
+                Container(
+                    width: double.infinity,
+                    height: 36,
+                    margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 15),
+                    decoration: BoxDecoration(
+                      color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+                      borderRadius: BorderRadius.circular(20.0), // 设置圆角
+                    ),
+                    child: Row(
+                      children: [
+                        MyTextView(
+                          DateTimeUtils.formatDate(state.startDateTime, format: "yyyy-MM-dd"),
+                          hint: "Start Date".tr,
+                          textHintColor: ColorConstants.textGrayAECAE5,
+                          fontSize: 15,
+                          textAlign: TextAlign.center,
+                          isFontRegular: true,
+                          onClick: controller.pickerStartDate,
+                          textColor: ColorConstants.textGrayAECAE5,
+                        ).expanded(),
+                        Container(color: ColorConstants.dividerBar, height: 21.5, width: 0.5),
+                        MyTextView(
+                          DateTimeUtils.formatDate(state.endDateTime, format: "yyyy-MM-dd"),
+                          hint: "End Date".tr,
+                          textHintColor: ColorConstants.textGrayAECAE5,
+                          fontSize: 15,
+                          textAlign: TextAlign.center,
+                          isFontRegular: true,
+                          onClick: controller.pickerEndDate,
+                          textColor: ColorConstants.textGrayAECAE5,
+                        ).expanded(),
+                      ],
+                    )),
+
+                //动态列表
+                LoadStateLayout(
+                  state: controller.loadingState,
+                  errorMessage: controller.errorMessage,
+                  errorRetry: () {
+                    controller.retryRequest();
+                  },
+                  successSliverWidget: [
+                    SliverPadding(
+                      padding: const EdgeInsets.only(left: 15, right: 15, bottom: 15),
+                      sliver: DecoratedSliver(
+                        decoration: BoxDecoration(
+                          color: const Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+                          borderRadius: BorderRadius.circular(5), // 设置圆角
+                        ),
+                        sliver: SliverList(
+                          delegate: SliverChildBuilderDelegate(
+                            (context, index) {
+                              if (index == 0) {
+                                return const SizedBox(height: 16); // 添加顶部间距
+                              } else if (index == state.datas.length + 1) {
+                                return const SizedBox(height: 20); // 添加底部间距
+                              } else {
+                                return ReportStaffRequestItem(item: state.datas[index - 1]); // 注意这里的 index - 1
+                              }
+                            },
+                            childCount: state.datas.length + 2,
+                          ),
+                        ),
+                      ),
+                    ),
+                  ],
+                ).expanded(),
+              ],
+            ),
+          ),
+        ),
+      );
+    });
+  }
+}

+ 9 - 0
packages/cpt_report/lib/modules/report_staff_request/report_staff_request_state.dart

@@ -0,0 +1,9 @@
+import 'package:domain/entity/response/staff_request_report_entity.dart';
+
+class ReportStaffRequestState {
+
+  DateTime? startDateTime;
+  DateTime? endDateTime;
+
+  List<StaffRequestReportEntity> datas = [];  //列表数据
+}

+ 29 - 4
packages/cpt_report/lib/router/page_router.dart

@@ -1,17 +1,42 @@
-
 import 'package:cpt_report/modules/device_list/device_list_page.dart';
+import 'package:cpt_report/modules/report_finance/report_finance_page.dart';
+import 'package:cpt_report/modules/report_labour/report_labour_page.dart';
+import 'package:cpt_report/modules/report_list/report_list_page.dart';
+import 'package:cpt_report/modules/report_staff_request/report_staff_request_page.dart';
 import 'package:get/get.dart';
 import 'package:router/path/router_path.dart';
 
 class ReportPageRouter {
-
   static final routes = [
-
     //设备列表
     GetPage(
-      name: RouterPath.DEVICE_LIST,
+      name: RouterPath.deviceList,
       page: () => DeviceListPage(),
     ),
 
+    //报表列表
+    GetPage(
+      name: RouterPath.reportList,
+      page: () => ReportListPage(),
+    ),
+
+    //财务报表
+    GetPage(
+      name: RouterPath.reportFinance,
+      page: () => ReportFinancePage(),
+    ),
+
+    //员工申请
+    GetPage(
+      name: RouterPath.reportStaffRequest,
+      page: () => ReportStaffRequestPage(),
+    ),
+
+    //用工统计
+    GetPage(
+      name: RouterPath.reportCasualLabour,
+      page: () => ReportLabourPage(),
+    ),
+
   ];
 }

+ 2 - 3
packages/cpt_report/lib/router/report_service_impl.dart

@@ -1,7 +1,7 @@
 import 'package:cpt_report/modules/device_list/device_list_page.dart';
+import 'package:cpt_report/modules/report_list/report_list_page.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:router/componentRouter/report_service.dart';
-import 'package:shared/utils/log_utils.dart';
 
 class ReportServiceImpl extends GetxService implements ReportService {
 
@@ -15,7 +15,6 @@ class ReportServiceImpl extends GetxService implements ReportService {
   void onClose() {
     super.onClose();
     //销毁资源
-
   }
 
   @override
@@ -25,6 +24,6 @@ class ReportServiceImpl extends GetxService implements ReportService {
 
   @override
   void startReportMainPage() {
-
+    ReportListPage.startInstance();
   }
 }

+ 9 - 0
packages/cs_domain/lib/constants/api_constants.dart

@@ -261,4 +261,13 @@ class ApiConstants {
   // 设备列表
   static const apiDeviceList = "/index.php/api/v1/hotel/device/table";
 
+  //财务报表
+  static const apiReportFiance = "/index.php/api/v1/hotel/report/finance";
+
+  //用工报表
+  static const apiReportLabour = "/index.php/api/v1/hotel/report/casual";
+
+  //员工申请报表
+  static const apiReportStaffRequest = "/index.php/api/v1/hotel/report/staff";
+
 }

+ 48 - 0
packages/cs_domain/lib/entity/response/fiance_report_entity.dart

@@ -0,0 +1,48 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/fiance_report_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/fiance_report_entity.g.dart';
+
+@JsonSerializable()
+class FianceReportEntity {
+	@JSONField(name: "rate_list")
+	List<FianceReportRateList> rateList = [];
+	@JSONField(name: "request_total")
+	int requestTotal = 0;
+	@JSONField(name: "actual_total")
+	int actualTotal = 0;
+
+	FianceReportEntity();
+
+	factory FianceReportEntity.fromJson(Map<String, dynamic> json) => $FianceReportEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $FianceReportEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class FianceReportRateList {
+	String? day = null;
+	@JSONField(name: "week_num")
+	String? weekNum = null;
+	@JSONField(name: "week_str")
+	String? weekStr = null;
+	int request = 0;
+	int actual = 0;
+	String? ratio = null;
+
+	FianceReportRateList();
+
+	factory FianceReportRateList.fromJson(Map<String, dynamic> json) => $FianceReportRateListFromJson(json);
+
+	Map<String, dynamic> toJson() => $FianceReportRateListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 77 - 0
packages/cs_domain/lib/entity/response/labour_report_entity.dart

@@ -0,0 +1,77 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/labour_report_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/labour_report_entity.g.dart';
+
+@JsonSerializable()
+class LabourReportEntity {
+	List<LabourReportRows> rows = [];
+	LabourReportTotal? total;
+
+	LabourReportEntity();
+
+	factory LabourReportEntity.fromJson(Map<String, dynamic> json) => $LabourReportEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourReportEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class LabourReportRows {
+	@JSONField(name: "outlet_id")
+	int? outletId = 0;
+	@JSONField(name: "outlet_name")
+	String? outletName = null;
+	String? hrs = null;
+	@JSONField(name: "ag_amt")
+	String? agAmt = null;
+	@JSONField(name: "in_hrs")
+	String? inHrs = null;
+	@JSONField(name: "in_ag_amt")
+	String? inAgAmt = null;
+	@JSONField(name: "tot_hrs")
+	String? totHrs = null;
+	@JSONField(name: "tot_ag_amt")
+	String? totAgAmt = null;
+
+	LabourReportRows();
+
+	factory LabourReportRows.fromJson(Map<String, dynamic> json) => $LabourReportRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourReportRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class LabourReportTotal {
+	String? hrs = null;
+	@JSONField(name: "ag_amt")
+	String? agAmt = null;
+	@JSONField(name: "in_hrs")
+	String? inHrs = null;
+	@JSONField(name: "in_ag_amt")
+	String? inAgAmt = null;
+	@JSONField(name: "tot_hrs")
+	String? totHrs = null;
+	@JSONField(name: "tot_ag_amt")
+	String? totAgAmt = null;
+
+	LabourReportTotal();
+
+	factory LabourReportTotal.fromJson(Map<String, dynamic> json) => $LabourReportTotalFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourReportTotalToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 23 - 0
packages/cs_domain/lib/entity/response/staff_request_report_entity.dart

@@ -0,0 +1,23 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/staff_request_report_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/staff_request_report_entity.g.dart';
+
+@JsonSerializable()
+class StaffRequestReportEntity {
+	String? name = null;
+	int num = 0;
+	String? ratio = null;
+	String? bg = null;
+
+	StaffRequestReportEntity();
+
+	factory StaffRequestReportEntity.fromJson(Map<String, dynamic> json) => $StaffRequestReportEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffRequestReportEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 27 - 0
packages/cs_domain/lib/generated/json/base/json_convert_content.dart

@@ -8,6 +8,7 @@ import 'package:domain/entity/response/add_edit_revise_view_s_g_entity.dart';
 import 'package:domain/entity/response/attendance_entity.dart';
 import 'package:domain/entity/response/check_success_entity.dart';
 import 'package:domain/entity/response/device_list_entity.dart';
+import 'package:domain/entity/response/fiance_report_entity.dart';
 import 'package:domain/entity/response/hotel_info_entity.dart';
 import 'package:domain/entity/response/id_name_entity.dart';
 import 'package:domain/entity/response/job_applied_edit_index_s_g_entity.dart';
@@ -32,6 +33,7 @@ import 'package:domain/entity/response/job_template_edit_index_entity.dart';
 import 'package:domain/entity/response/job_template_s_g_entity.dart';
 import 'package:domain/entity/response/job_title_edit_index_entity.dart';
 import 'package:domain/entity/response/job_title_s_g_entity.dart';
+import 'package:domain/entity/response/labour_report_entity.dart';
 import 'package:domain/entity/response/labour_request_edit_index_entity.dart';
 import 'package:domain/entity/response/labour_request_index_entity.dart';
 import 'package:domain/entity/response/labour_request_list_entity.dart';
@@ -46,6 +48,7 @@ import 'package:domain/entity/response/staff_detail_s_g_entity.dart';
 import 'package:domain/entity/response/staff_job_history_s_g_entity.dart';
 import 'package:domain/entity/response/staff_labour_history_entity.dart';
 import 'package:domain/entity/response/staff_remark_history_entity.dart';
+import 'package:domain/entity/response/staff_request_report_entity.dart';
 import 'package:domain/entity/response/staff_review_history_s_g_entity.dart';
 import 'package:domain/entity/server_time.dart';
 
@@ -193,6 +196,12 @@ class JsonConvert {
     if (<DeviceListRows>[] is M) {
       return data.map<DeviceListRows>((Map<String, dynamic> e) => DeviceListRows.fromJson(e)).toList() as M;
     }
+    if (<FianceReportEntity>[] is M) {
+      return data.map<FianceReportEntity>((Map<String, dynamic> e) => FianceReportEntity.fromJson(e)).toList() as M;
+    }
+    if (<FianceReportRateList>[] is M) {
+      return data.map<FianceReportRateList>((Map<String, dynamic> e) => FianceReportRateList.fromJson(e)).toList() as M;
+    }
     if (<HotelInfoEntity>[] is M) {
       return data.map<HotelInfoEntity>((Map<String, dynamic> e) => HotelInfoEntity.fromJson(e)).toList() as M;
     }
@@ -355,6 +364,15 @@ class JsonConvert {
     if (<JobTitleSGRows>[] is M) {
       return data.map<JobTitleSGRows>((Map<String, dynamic> e) => JobTitleSGRows.fromJson(e)).toList() as M;
     }
+    if (<LabourReportEntity>[] is M) {
+      return data.map<LabourReportEntity>((Map<String, dynamic> e) => LabourReportEntity.fromJson(e)).toList() as M;
+    }
+    if (<LabourReportRows>[] is M) {
+      return data.map<LabourReportRows>((Map<String, dynamic> e) => LabourReportRows.fromJson(e)).toList() as M;
+    }
+    if (<LabourReportTotal>[] is M) {
+      return data.map<LabourReportTotal>((Map<String, dynamic> e) => LabourReportTotal.fromJson(e)).toList() as M;
+    }
     if (<LabourRequestEditIndexEntity>[] is M) {
       return data.map<LabourRequestEditIndexEntity>((Map<String, dynamic> e) => LabourRequestEditIndexEntity.fromJson(e)).toList() as M;
     }
@@ -463,6 +481,9 @@ class JsonConvert {
     if (<StaffRemarkHistoryRows>[] is M) {
       return data.map<StaffRemarkHistoryRows>((Map<String, dynamic> e) => StaffRemarkHistoryRows.fromJson(e)).toList() as M;
     }
+    if (<StaffRequestReportEntity>[] is M) {
+      return data.map<StaffRequestReportEntity>((Map<String, dynamic> e) => StaffRequestReportEntity.fromJson(e)).toList() as M;
+    }
     if (<StaffReviewHistorySGEntity>[] is M) {
       return data.map<StaffReviewHistorySGEntity>((Map<String, dynamic> e) => StaffReviewHistorySGEntity.fromJson(e)).toList() as M;
     }
@@ -498,6 +519,8 @@ class JsonConvertClassCollection {
     (CheckSuccessEntity).toString(): CheckSuccessEntity.fromJson,
     (DeviceListEntity).toString(): DeviceListEntity.fromJson,
     (DeviceListRows).toString(): DeviceListRows.fromJson,
+    (FianceReportEntity).toString(): FianceReportEntity.fromJson,
+    (FianceReportRateList).toString(): FianceReportRateList.fromJson,
     (HotelInfoEntity).toString(): HotelInfoEntity.fromJson,
     (HotelInfoMenus).toString(): HotelInfoMenus.fromJson,
     (HotelInfoMenusChildren).toString(): HotelInfoMenusChildren.fromJson,
@@ -552,6 +575,9 @@ class JsonConvertClassCollection {
     (JobTitleEditIndexTemplate).toString(): JobTitleEditIndexTemplate.fromJson,
     (JobTitleSGEntity).toString(): JobTitleSGEntity.fromJson,
     (JobTitleSGRows).toString(): JobTitleSGRows.fromJson,
+    (LabourReportEntity).toString(): LabourReportEntity.fromJson,
+    (LabourReportRows).toString(): LabourReportRows.fromJson,
+    (LabourReportTotal).toString(): LabourReportTotal.fromJson,
     (LabourRequestEditIndexEntity).toString(): LabourRequestEditIndexEntity.fromJson,
     (LabourRequestEditIndexTemplateList).toString(): LabourRequestEditIndexTemplateList.fromJson,
     (LabourRequestEditIndexDepartmentList).toString(): LabourRequestEditIndexDepartmentList.fromJson,
@@ -588,6 +614,7 @@ class JsonConvertClassCollection {
     (StaffLabourHistoryRowsWorkOut).toString(): StaffLabourHistoryRowsWorkOut.fromJson,
     (StaffRemarkHistoryEntity).toString(): StaffRemarkHistoryEntity.fromJson,
     (StaffRemarkHistoryRows).toString(): StaffRemarkHistoryRows.fromJson,
+    (StaffRequestReportEntity).toString(): StaffRequestReportEntity.fromJson,
     (StaffReviewHistorySGEntity).toString(): StaffReviewHistorySGEntity.fromJson,
     (StaffReviewHistorySGReviews).toString(): StaffReviewHistorySGReviews.fromJson,
     (ServerTime).toString(): ServerTime.fromJson,

+ 100 - 0
packages/cs_domain/lib/generated/json/fiance_report_entity.g.dart

@@ -0,0 +1,100 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/fiance_report_entity.dart';
+
+FianceReportEntity $FianceReportEntityFromJson(Map<String, dynamic> json) {
+  final FianceReportEntity fianceReportEntity = FianceReportEntity();
+  final List<FianceReportRateList>? rateList = (json['rate_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<FianceReportRateList>(e) as FianceReportRateList).toList();
+  if (rateList != null) {
+    fianceReportEntity.rateList = rateList;
+  }
+  final int? requestTotal = jsonConvert.convert<int>(json['request_total']);
+  if (requestTotal != null) {
+    fianceReportEntity.requestTotal = requestTotal;
+  }
+  final int? actualTotal = jsonConvert.convert<int>(json['actual_total']);
+  if (actualTotal != null) {
+    fianceReportEntity.actualTotal = actualTotal;
+  }
+  return fianceReportEntity;
+}
+
+Map<String, dynamic> $FianceReportEntityToJson(FianceReportEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['rate_list'] = entity.rateList.map((v) => v.toJson()).toList();
+  data['request_total'] = entity.requestTotal;
+  data['actual_total'] = entity.actualTotal;
+  return data;
+}
+
+extension FianceReportEntityExtension on FianceReportEntity {
+  FianceReportEntity copyWith({
+    List<FianceReportRateList>? rateList,
+    int? requestTotal,
+    int? actualTotal,
+  }) {
+    return FianceReportEntity()
+      ..rateList = rateList ?? this.rateList
+      ..requestTotal = requestTotal ?? this.requestTotal
+      ..actualTotal = actualTotal ?? this.actualTotal;
+  }
+}
+
+FianceReportRateList $FianceReportRateListFromJson(Map<String, dynamic> json) {
+  final FianceReportRateList fianceReportRateList = FianceReportRateList();
+  final String? day = jsonConvert.convert<String>(json['day']);
+  if (day != null) {
+    fianceReportRateList.day = day;
+  }
+  final String? weekNum = jsonConvert.convert<String>(json['week_num']);
+  if (weekNum != null) {
+    fianceReportRateList.weekNum = weekNum;
+  }
+  final String? weekStr = jsonConvert.convert<String>(json['week_str']);
+  if (weekStr != null) {
+    fianceReportRateList.weekStr = weekStr;
+  }
+  final int? request = jsonConvert.convert<int>(json['request']);
+  if (request != null) {
+    fianceReportRateList.request = request;
+  }
+  final int? actual = jsonConvert.convert<int>(json['actual']);
+  if (actual != null) {
+    fianceReportRateList.actual = actual;
+  }
+  final String? ratio = jsonConvert.convert<String>(json['ratio']);
+  if (ratio != null) {
+    fianceReportRateList.ratio = ratio;
+  }
+  return fianceReportRateList;
+}
+
+Map<String, dynamic> $FianceReportRateListToJson(FianceReportRateList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['day'] = entity.day;
+  data['week_num'] = entity.weekNum;
+  data['week_str'] = entity.weekStr;
+  data['request'] = entity.request;
+  data['actual'] = entity.actual;
+  data['ratio'] = entity.ratio;
+  return data;
+}
+
+extension FianceReportRateListExtension on FianceReportRateList {
+  FianceReportRateList copyWith({
+    String? day,
+    String? weekNum,
+    String? weekStr,
+    int? request,
+    int? actual,
+    String? ratio,
+  }) {
+    return FianceReportRateList()
+      ..day = day ?? this.day
+      ..weekNum = weekNum ?? this.weekNum
+      ..weekStr = weekStr ?? this.weekStr
+      ..request = request ?? this.request
+      ..actual = actual ?? this.actual
+      ..ratio = ratio ?? this.ratio;
+  }
+}

+ 166 - 0
packages/cs_domain/lib/generated/json/labour_report_entity.g.dart

@@ -0,0 +1,166 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/labour_report_entity.dart';
+
+LabourReportEntity $LabourReportEntityFromJson(Map<String, dynamic> json) {
+  final LabourReportEntity labourReportEntity = LabourReportEntity();
+  final List<LabourReportRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<LabourReportRows>(e) as LabourReportRows).toList();
+  if (rows != null) {
+    labourReportEntity.rows = rows;
+  }
+  final LabourReportTotal? total = jsonConvert.convert<LabourReportTotal>(json['total']);
+  if (total != null) {
+    labourReportEntity.total = total;
+  }
+  return labourReportEntity;
+}
+
+Map<String, dynamic> $LabourReportEntityToJson(LabourReportEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['rows'] = entity.rows.map((v) => v.toJson()).toList();
+  data['total'] = entity.total?.toJson();
+  return data;
+}
+
+extension LabourReportEntityExtension on LabourReportEntity {
+  LabourReportEntity copyWith({
+    List<LabourReportRows>? rows,
+    LabourReportTotal? total,
+  }) {
+    return LabourReportEntity()
+      ..rows = rows ?? this.rows
+      ..total = total ?? this.total;
+  }
+}
+
+LabourReportRows $LabourReportRowsFromJson(Map<String, dynamic> json) {
+  final LabourReportRows labourReportRows = LabourReportRows();
+  final int? outletId = jsonConvert.convert<int>(json['outlet_id']);
+  if (outletId != null) {
+    labourReportRows.outletId = outletId;
+  }
+  final String? outletName = jsonConvert.convert<String>(json['outlet_name']);
+  if (outletName != null) {
+    labourReportRows.outletName = outletName;
+  }
+  final String? hrs = jsonConvert.convert<String>(json['hrs']);
+  if (hrs != null) {
+    labourReportRows.hrs = hrs;
+  }
+  final String? agAmt = jsonConvert.convert<String>(json['ag_amt']);
+  if (agAmt != null) {
+    labourReportRows.agAmt = agAmt;
+  }
+  final String? inHrs = jsonConvert.convert<String>(json['in_hrs']);
+  if (inHrs != null) {
+    labourReportRows.inHrs = inHrs;
+  }
+  final String? inAgAmt = jsonConvert.convert<String>(json['in_ag_amt']);
+  if (inAgAmt != null) {
+    labourReportRows.inAgAmt = inAgAmt;
+  }
+  final String? totHrs = jsonConvert.convert<String>(json['tot_hrs']);
+  if (totHrs != null) {
+    labourReportRows.totHrs = totHrs;
+  }
+  final String? totAgAmt = jsonConvert.convert<String>(json['tot_ag_amt']);
+  if (totAgAmt != null) {
+    labourReportRows.totAgAmt = totAgAmt;
+  }
+  return labourReportRows;
+}
+
+Map<String, dynamic> $LabourReportRowsToJson(LabourReportRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['outlet_id'] = entity.outletId;
+  data['outlet_name'] = entity.outletName;
+  data['hrs'] = entity.hrs;
+  data['ag_amt'] = entity.agAmt;
+  data['in_hrs'] = entity.inHrs;
+  data['in_ag_amt'] = entity.inAgAmt;
+  data['tot_hrs'] = entity.totHrs;
+  data['tot_ag_amt'] = entity.totAgAmt;
+  return data;
+}
+
+extension LabourReportRowsExtension on LabourReportRows {
+  LabourReportRows copyWith({
+    int? outletId,
+    String? outletName,
+    String? hrs,
+    String? agAmt,
+    String? inHrs,
+    String? inAgAmt,
+    String? totHrs,
+    String? totAgAmt,
+  }) {
+    return LabourReportRows()
+      ..outletId = outletId ?? this.outletId
+      ..outletName = outletName ?? this.outletName
+      ..hrs = hrs ?? this.hrs
+      ..agAmt = agAmt ?? this.agAmt
+      ..inHrs = inHrs ?? this.inHrs
+      ..inAgAmt = inAgAmt ?? this.inAgAmt
+      ..totHrs = totHrs ?? this.totHrs
+      ..totAgAmt = totAgAmt ?? this.totAgAmt;
+  }
+}
+
+LabourReportTotal $LabourReportTotalFromJson(Map<String, dynamic> json) {
+  final LabourReportTotal labourReportTotal = LabourReportTotal();
+  final String? hrs = jsonConvert.convert<String>(json['hrs']);
+  if (hrs != null) {
+    labourReportTotal.hrs = hrs;
+  }
+  final String? agAmt = jsonConvert.convert<String>(json['ag_amt']);
+  if (agAmt != null) {
+    labourReportTotal.agAmt = agAmt;
+  }
+  final String? inHrs = jsonConvert.convert<String>(json['in_hrs']);
+  if (inHrs != null) {
+    labourReportTotal.inHrs = inHrs;
+  }
+  final String? inAgAmt = jsonConvert.convert<String>(json['in_ag_amt']);
+  if (inAgAmt != null) {
+    labourReportTotal.inAgAmt = inAgAmt;
+  }
+  final String? totHrs = jsonConvert.convert<String>(json['tot_hrs']);
+  if (totHrs != null) {
+    labourReportTotal.totHrs = totHrs;
+  }
+  final String? totAgAmt = jsonConvert.convert<String>(json['tot_ag_amt']);
+  if (totAgAmt != null) {
+    labourReportTotal.totAgAmt = totAgAmt;
+  }
+  return labourReportTotal;
+}
+
+Map<String, dynamic> $LabourReportTotalToJson(LabourReportTotal entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['hrs'] = entity.hrs;
+  data['ag_amt'] = entity.agAmt;
+  data['in_hrs'] = entity.inHrs;
+  data['in_ag_amt'] = entity.inAgAmt;
+  data['tot_hrs'] = entity.totHrs;
+  data['tot_ag_amt'] = entity.totAgAmt;
+  return data;
+}
+
+extension LabourReportTotalExtension on LabourReportTotal {
+  LabourReportTotal copyWith({
+    String? hrs,
+    String? agAmt,
+    String? inHrs,
+    String? inAgAmt,
+    String? totHrs,
+    String? totAgAmt,
+  }) {
+    return LabourReportTotal()
+      ..hrs = hrs ?? this.hrs
+      ..agAmt = agAmt ?? this.agAmt
+      ..inHrs = inHrs ?? this.inHrs
+      ..inAgAmt = inAgAmt ?? this.inAgAmt
+      ..totHrs = totHrs ?? this.totHrs
+      ..totAgAmt = totAgAmt ?? this.totAgAmt;
+  }
+}

+ 47 - 0
packages/cs_domain/lib/generated/json/staff_request_report_entity.g.dart

@@ -0,0 +1,47 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/staff_request_report_entity.dart';
+
+StaffRequestReportEntity $StaffRequestReportEntityFromJson(Map<String, dynamic> json) {
+  final StaffRequestReportEntity staffRequestReportEntity = StaffRequestReportEntity();
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    staffRequestReportEntity.name = name;
+  }
+  final int? num = jsonConvert.convert<int>(json['num']);
+  if (num != null) {
+    staffRequestReportEntity.num = num;
+  }
+  final String? ratio = jsonConvert.convert<String>(json['ratio']);
+  if (ratio != null) {
+    staffRequestReportEntity.ratio = ratio;
+  }
+  final String? bg = jsonConvert.convert<String>(json['bg']);
+  if (bg != null) {
+    staffRequestReportEntity.bg = bg;
+  }
+  return staffRequestReportEntity;
+}
+
+Map<String, dynamic> $StaffRequestReportEntityToJson(StaffRequestReportEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['name'] = entity.name;
+  data['num'] = entity.num;
+  data['ratio'] = entity.ratio;
+  data['bg'] = entity.bg;
+  return data;
+}
+
+extension StaffRequestReportEntityExtension on StaffRequestReportEntity {
+  StaffRequestReportEntity copyWith({
+    String? name,
+    int? num,
+    String? ratio,
+    String? bg,
+  }) {
+    return StaffRequestReportEntity()
+      ..name = name ?? this.name
+      ..num = num ?? this.num
+      ..ratio = ratio ?? this.ratio
+      ..bg = bg ?? this.bg;
+  }
+}

+ 108 - 5
packages/cs_domain/lib/repository/other_repository.dart

@@ -1,5 +1,7 @@
-
 import 'package:domain/entity/response/device_list_entity.dart';
+import 'package:domain/entity/response/fiance_report_entity.dart';
+import 'package:domain/entity/response/labour_report_entity.dart';
+import 'package:domain/entity/response/staff_request_report_entity.dart';
 import 'package:get/get.dart';
 import 'package:plugin_platform/dio_export.dart';
 import 'package:plugin_platform/http/http_provider.dart';
@@ -8,7 +10,6 @@ import 'package:shared/utils/util.dart';
 
 import '../constants/api_constants.dart';
 
-
 /// 报表与其他的相关数据
 class OtherRepository extends GetxService {
   HttpProvider httpProvider;
@@ -17,9 +18,9 @@ class OtherRepository extends GetxService {
 
   // 雇主的设备列表
   Future<HttpResult<DeviceListEntity>> fetchDeviceList({
-        required int curPage,
-        CancelToken? cancelToken,
-      }) async {
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
     //参数
     Map<String, String> params = {};
     params["cur_page"] = curPage.toString();
@@ -42,5 +43,107 @@ class OtherRepository extends GetxService {
     return result.convert();
   }
 
+  //财务报表
+  Future<HttpResult<FianceReportEntity>> fetchReportFiance(
+    String? startDate,
+    String? endDate, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    if (Utils.isEmpty(startDate)) {
+      params["start_date"] = startDate!;
+    }
+    if (Utils.isEmpty(endDate)) {
+      params["end_date"] = endDate!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiReportFiance,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = FianceReportEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<FianceReportEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  //用工报表
+  Future<HttpResult<LabourReportEntity>> fetchReportLabour(
+    String? startDate,
+    String? endDate, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    if (Utils.isEmpty(startDate)) {
+      params["start_date"] = startDate!;
+    }
+    if (Utils.isEmpty(endDate)) {
+      params["end_date"] = endDate!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiReportLabour,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = LabourReportEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<LabourReportEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  //员工请求报表
+  Future<HttpResult<StaffRequestReportEntity?>> fetchReportStaffRequest(
+    String? startDate,
+    String? endDate, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    if (Utils.isEmpty(startDate)) {
+      params["start_date"] = startDate!;
+    }
+    if (Utils.isEmpty(endDate)) {
+      params["end_date"] = endDate!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiReportStaffRequest,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      var jsonList = result.getListJson();
+
+      var list = jsonList?.map((e) {
+        if (e is Map<String, dynamic>) {
+          return StaffRequestReportEntity.fromJson(e);
+        } else {
+          return null;
+        }
+      }).toList();
+
+      return result.convert<StaffRequestReportEntity?>(list: list);
+    }
+
+    return result.convert<StaffRequestReportEntity>();
+
+  }
 
 }

+ 1 - 1
packages/cs_plugin_basic/lib/modules/global_web_page.dart

@@ -19,7 +19,7 @@ class GlobalWebPage extends BaseStatelessPage {
     String url, {
     bool isShowAppBar = true,
   }) {
-    return Get.start(RouterPath.GLOBAL_WEB, arguments: {'title': title, 'initialUrl': Uri.encodeFull(url), 'isShowAppBar': isShowAppBar});
+    return Get.start(RouterPath.globalWeb, arguments: {'title': title, 'initialUrl': Uri.encodeFull(url), 'isShowAppBar': isShowAppBar});
   }
 
   @override

+ 1 - 1
packages/cs_plugin_basic/lib/modules/preview_photo_page.dart

@@ -19,7 +19,7 @@ class PreviewPhotoPage extends BaseStatefulPage {
 
   //启动当前页面
   static Future<T?>? startInstance<T>(List<String> imgs, int position) {
-    return Get.toNamed(RouterPath.PREVIEW_IMAGE, arguments: {'imgs': imgs, "position": position});
+    return Get.toNamed(RouterPath.previewImage, arguments: {'imgs': imgs, "position": position});
   }
 
   @override

+ 2 - 2
packages/cs_plugin_basic/lib/router/basic_page_router.dart

@@ -13,7 +13,7 @@ class BasicPageRouter {
 
     //全局公用的图片预览
     GetPage(
-      name: RouterPath.PREVIEW_IMAGE,
+      name: RouterPath.previewImage,
       page: () => PreviewPhotoPage(),
       transition: Transition.noTransition,
     ),
@@ -21,7 +21,7 @@ class BasicPageRouter {
 
     //全局公用的WebView
     GetPage(
-      name: RouterPath.GLOBAL_WEB,
+      name: RouterPath.globalWeb,
       page: () => GlobalWebPage(key: UniqueKey()),
     ),
   ];

BIN
packages/cs_resources/assets/cpt_report/report_finance.webp


BIN
packages/cs_resources/assets/cpt_report/report_labour.webp


BIN
packages/cs_resources/assets/cpt_report/report_staff_request.webp


BIN
packages/cs_resources/assets/cpt_report/week_num_1.webp


BIN
packages/cs_resources/assets/cpt_report/week_num_2.webp


BIN
packages/cs_resources/assets/cpt_report/week_num_3.webp


BIN
packages/cs_resources/assets/cpt_report/week_num_4.webp


BIN
packages/cs_resources/assets/cpt_report/week_num_5.webp


BIN
packages/cs_resources/assets/cpt_report/week_num_6.webp


BIN
packages/cs_resources/assets/cpt_report/week_num_7.webp


+ 1 - 0
packages/cs_resources/lib/constants/color_constants.dart

@@ -37,6 +37,7 @@ class ColorConstants {
   static const Color textBlue5CEEFF = Color(0xFF5CEEFF);
   static const Color textBlue56AAFF = Color(0xFF56AAFF);
   static const Color textYellowF8AE00 = Color(0xFFF8AE00);
+  static const Color textPurpleFF35EE = Color(0xFFFF35EE);
 
   //黑暗模式的一些色值
   static const Color darkBlackBg = Color(0xFF0F0F0F);

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

@@ -35,6 +35,16 @@ class Assets {
   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';
+  static const String cptReportReportFinance = 'assets/cpt_report/report_finance.webp';
+  static const String cptReportReportLabour = 'assets/cpt_report/report_labour.webp';
+  static const String cptReportReportStaffRequest = 'assets/cpt_report/report_staff_request.webp';
+  static const String cptReportWeekNum1 = 'assets/cpt_report/week_num_1.webp';
+  static const String cptReportWeekNum2 = 'assets/cpt_report/week_num_2.webp';
+  static const String cptReportWeekNum3 = 'assets/cpt_report/week_num_3.webp';
+  static const String cptReportWeekNum4 = 'assets/cpt_report/week_num_4.webp';
+  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 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';

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

@@ -228,6 +228,13 @@ const Map<String, String> en_US = {
   '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',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

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

@@ -228,6 +228,13 @@ const Map<String, String> vi_VN = {
   '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',
 
   //插件的国际化
   "Pull to refresh": "Kéo để làm mới",

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

@@ -228,6 +228,13 @@ const Map<String, String> zh_CN = {
   'Revise': '修改',
   'Add Revise': '添加修改',
   'Edit Revise': '编辑修改',
+  'Incomplete': '未完成',
+  'Completed + Incomplete': '已完成 + 未完成',
+  'YY Casual Labour Report': 'YY用工报表',
+  'TotalAmt': '总金额',
+  'Hours': '小时',
+  'Monthly Staff Request Report': '月度员工请求报表',
+  'Finance Report': '财务报表',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',

+ 1 - 0
packages/cs_resources/pubspec.yaml

@@ -26,4 +26,5 @@ flutter:
     - assets/base_service/
     - assets/cpt_auth/
     - assets/cpt_job/
+    - assets/cpt_report/
     - assets/main/

+ 43 - 39
packages/cs_router/lib/path/router_path.dart

@@ -1,63 +1,67 @@
 class RouterPath {
   // 默认的路由
-  static const SPLASH = '/';
+  static const splash = '/';
 
-  static const GUIDE = '/guide'; //指引页面
+  static const guide = '/guide'; //指引页面
 
   //用户
-  static const AUTH_LOGIN = '/auth/login'; //用户登录注册
-  static const AUTH_SIGNUP = '/auth/signup'; //注册
-  static const AUTH_RESET_PSD = '/auth/rest_psd'; //重置密码
-  static const AUTH_SELECT_COUNTRY = '/auth/select/country'; //切换国家
+  static const authLogin = '/auth/login'; //用户登录注册
+  static const authSignUp = '/auth/signup'; //注册
+  static const authResetPassword = '/auth/rest_psd'; //重置密码
+  static const authSelectCountry = '/auth/select/country'; //切换国家
 
   //首页
-  static const MAIN = '/main';
-  static const SETTINGS = '/settings';
+  static const main = '/main';
+  static const settings = '/settings';
 
   //工作-签到签出
-  static const JOB_SIGN_IN_SIGN_OUT = '/job/sign_in_sign_out';
+  static const jobSignInSignOut = '/job/sign_in_sign_out';
 
   //工作-列表
-  static const JOB_LIST = '/job/list';
-  static const JOB_LIST_DETAIL = '/job/list/detail'; //查看工作的详情
-  static const JOB_APPLIED_STAFF_LIST = '/job/applied'; //指定工作中已申请的成员列表
-  static const JOB_APPLIED_STAFF_EDIT = '/job/applied/edit'; //指定工作中已申请的指定员工的信息修改(签到签出等修改)
-  static const JOB_APPLIED_STAFF_WORKFLOW = '/job/applied/workflow'; //指定工作中已申请的指定员工的信息与状态修改工作流
-  static const JOB_APPLIED_STAFF_DETAIL = '/job/applied/staff/detail'; //工作中员工的详细信息
-  static const JOB_APPLIED_STAFF_REVIEWS = '/job/applied/staff/reviews'; //工作中员工的被评价列表
+  static const jobList = '/job/list';
+  static const jobListDetail = '/job/list/detail'; //查看工作的详情
+  static const jobAppliedStaffList = '/job/applied'; //指定工作中已申请的成员列表
+  static const jobAppliedStaffEdit = '/job/applied/edit'; //指定工作中已申请的指定员工的信息修改(签到签出等修改)
+  static const jobAppliedStaffWorkflow = '/job/applied/workflow'; //指定工作中已申请的指定员工的信息与状态修改工作流
+  static const jobAppliedStaffDetail = '/job/applied/staff/detail'; //工作中员工的详细信息
+  static const jobAppliedStaffReviews = '/job/applied/staff/reviews'; //工作中员工的被评价列表
 
   //用工请求
-  static const JOB_LABOUR_REQUEST_LIST = '/labour/list'; //用工请求列表
-  static const JOB_LABOUR_REQUEST_ADD = '/labour/add'; //用工请求添加
-  static const JOB_LABOUR_REQUEST_Detail = '/labour/detail'; //用工请求详情
-  static const JOB_LABOUR_REQUEST_WORKFLOW = '/labour/workflow'; //用工请求修改状态的工作流
+  static const jobLabourRequestList = '/labour/list'; //用工请求列表
+  static const jobLabourRequestAdd = '/labour/add'; //用工请求添加
+  static const jobLabourRequestDetail = '/labour/detail'; //用工请求详情
+  static const jobLabourRequestWorkflow = '/labour/workflow'; //用工请求修改状态的工作流
 
   //其他模块和报表模块
-  static const DEVICE_LIST = '/device/list'; //雇主绑定的设备列表
+  static const deviceList = '/device/list'; //雇主绑定的设备列表
+  static const reportList = '/report/list'; //报表的选项
+  static const reportFinance = '/report/finance'; //金额报表
+  static const reportCasualLabour = '/report/labour'; //用工请求报表
+  static const reportStaffRequest = '/report/staff/request'; //员工申请报表
 
   //新加坡的用工请求
-  static const JOB_TITLE_LIST_SG = '/job/title/list/sg'; //模板的工作标题列表
-  static const JOB_TEMPLATE_LIST_SG = '/job/template/list/sg'; //模板列表
-  static const JOB_TEMPLATE_ADD_SG = '/job/template/add/sg'; //模板添加
-  static const LABOUR_REQUEST_SG = '/labour/request/sg'; //用工首页
-  static const LABOUR_REQUEST_ADD_SG = '/labour/request/add/sg'; //用工请求添加
+  static const jobTitleListSG = '/job/title/list/sg'; //模板的工作标题列表
+  static const jobTemplateListSG = '/job/template/list/sg'; //模板列表
+  static const jobTemplateAddSG = '/job/template/add/sg'; //模板添加
+  static const labourRequestSG = '/labour/request/sg'; //用工首页
+  static const labourRequestAddSG = '/labour/request/add/sg'; //用工请求添加
 
   //新加坡的工作列表
-  static const JOB_LIST_SG = '/job/list/sg'; //工作列表(新加坡)
-  static const JOB_LIST_EDIT = '/job/list/edit'; //工作列表编辑与详情(新加坡)
-  static const JOB_LIST_APPLIED_SG = '/job/list/applied'; //工作列表已申请列表(新加坡)
-  static const JOB_LIST_APPLIED_STAFF_LIST_SG = '/job/list/applied/staff/list'; //工作列表已申请列表添加员工列表(新加坡)
-  static const JOB_LIST_APPLIED_STAFF_DETAIL_SG = '/job/list/applied/staff/detail'; //工作列表已申请列表员工详情(新加坡)
-  static const JOB_LIST_APPLIED_STAFF_REVIEWS_SG = '/job/list/applied/staff/reviews'; //工作列表已申请列表员工的评论列表(新加坡)
-  static const REVISE_LIST_SG = '/revise/list'; //Revise列表(新加坡)
-  static const REVISE_APPLIED_SG = '/revise/applied'; //Applied的Revise(新加坡)
-  static const REVISE_LOG_SG = '/revise/log'; //Revise 的日志(新加坡)
-  static const REVISE_EDIT_SG = '/revise/edit'; //Revise 的添加,编辑,详情(新加坡)
+  static const jobListSG = '/job/list/sg'; //工作列表(新加坡)
+  static const jobListEditSG = '/job/list/edit'; //工作列表编辑与详情(新加坡)
+  static const jobListAppliedSG = '/job/list/applied'; //工作列表已申请列表(新加坡)
+  static const jobListAppliedStaffListSG = '/job/list/applied/staff/list'; //工作列表已申请列表添加员工列表(新加坡)
+  static const jobListAppliedStaffDetailSG = '/job/list/applied/staff/detail'; //工作列表已申请列表员工详情(新加坡)
+  static const jobListAppliedStaffReviewSG = '/job/list/applied/staff/reviews'; //工作列表已申请列表员工的评论列表(新加坡)
+  static const reviseListSG = '/revise/list'; //Revise列表(新加坡)
+  static const reviseAppliedSG = '/revise/applied'; //Applied的Revise(新加坡)
+  static const reviseLogSG = '/revise/log'; //Revise 的日志(新加坡)
+  static const reviseEditSG = '/revise/edit'; //Revise 的添加,编辑,详情(新加坡)
 
   //全局其他
-  static const PREVIEW_IMAGE = '/preview/image'; //预览图片
-  static const GLOBAL_WEB = '/global/web'; //全局公用的Web页面
+  static const previewImage = '/preview/image'; //预览图片
+  static const globalWeb = '/global/web'; //全局公用的Web页面
 
   //Runalone
-  static const RunaloneMain = '/runalone/main'; //独立运行的入口页面
+  static const runAloneMain = '/runalone/main'; //独立运行的入口页面
 }

+ 35 - 0
packages/cs_widgets/lib/shatter/custom_progress_bar.dart

@@ -0,0 +1,35 @@
+import 'package:flutter/material.dart';
+
+class CustomProgressBar extends StatelessWidget {
+  final double progress; // 进度值,范围 [0, 1]
+  final Color color; // 进度条的颜色
+  final double radius; // 进度条的圆角
+
+  const CustomProgressBar({
+    Key? key,
+    required this.progress,
+    required this.color,
+    this.radius = 0,
+  })  : assert(progress >= 0 && progress <= 1, '进度值必须在 0 到 1 之间'),
+        super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: double.infinity, // 进度条宽度
+      height: 16, // 进度条高度
+      decoration: BoxDecoration(
+        border: Border.all(color: color, width: 0.5), // 边框颜色和宽度
+        borderRadius: BorderRadius.circular(radius), // 边框圆角
+      ),
+      child: ClipRRect(
+        borderRadius: BorderRadius.circular(radius), // 内部进度条也有相同的圆角
+        child: LinearProgressIndicator(
+          value: progress, // 进度值
+          backgroundColor: Colors.transparent, // 背景透明
+          valueColor: AlwaysStoppedAnimation<Color>(color), // 进度条颜色
+        ),
+      ),
+    );
+  }
+}