Browse Source

员工的详情与评论

liukai 7 months ago
parent
commit
eaf715c42b
26 changed files with 1882 additions and 14 deletions
  1. 0 6
      packages/cpt_job/lib/router/job_service_impl.dart
  2. 152 0
      packages/cpt_job_sg/lib/modules/applied_staff_detail/applied_staff_detail_controller.dart
  3. 120 0
      packages/cpt_job_sg/lib/modules/applied_staff_detail/applied_staff_detail_page.dart
  4. 14 0
      packages/cpt_job_sg/lib/modules/applied_staff_detail/applied_staff_detail_state.dart
  5. 170 0
      packages/cpt_job_sg/lib/modules/applied_staff_detail/staff_detail_widget.dart
  6. 183 0
      packages/cpt_job_sg/lib/modules/applied_staff_detail/staff_labour_history_item.dart
  7. 109 0
      packages/cpt_job_sg/lib/modules/applied_staff_reviews/applied_staff_reviews_controller.dart
  8. 151 0
      packages/cpt_job_sg/lib/modules/applied_staff_reviews/applied_staff_reviews_item.dart
  9. 162 0
      packages/cpt_job_sg/lib/modules/applied_staff_reviews/applied_staff_reviews_page.dart
  10. 10 0
      packages/cpt_job_sg/lib/modules/applied_staff_reviews/applied_staff_reviews_state.dart
  11. 2 1
      packages/cpt_job_sg/lib/modules/job_applied/job_applied_controller.dart
  12. 11 3
      packages/cpt_job_sg/lib/router/page_router.dart
  13. 12 0
      packages/cs_domain/lib/constants/api_constants.dart
  14. 83 0
      packages/cs_domain/lib/entity/response/staff_detail_s_g_entity.dart
  15. 54 0
      packages/cs_domain/lib/entity/response/staff_job_history_s_g_entity.dart
  16. 55 0
      packages/cs_domain/lib/entity/response/staff_review_history_s_g_entity.dart
  17. 31 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  18. 201 0
      packages/cs_domain/lib/generated/json/staff_detail_s_g_entity.g.dart
  19. 114 0
      packages/cs_domain/lib/generated/json/staff_job_history_s_g_entity.g.dart
  20. 121 0
      packages/cs_domain/lib/generated/json/staff_review_history_s_g_entity.g.dart
  21. 111 0
      packages/cs_domain/lib/repository/job_sg_repository.dart
  22. 5 1
      packages/cs_resources/lib/local/language/en_US.dart
  23. 5 1
      packages/cs_resources/lib/local/language/vi_VN.dart
  24. 5 1
      packages/cs_resources/lib/local/language/zh_CN.dart
  25. 0 1
      packages/cs_router/lib/componentRouter/job_service.dart
  26. 1 0
      packages/cs_router/lib/path/router_path.dart

+ 0 - 6
packages/cpt_job/lib/router/job_service_impl.dart

@@ -3,7 +3,6 @@ import 'package:plugin_basic/basic_export.dart';
 import 'package:router/componentRouter/job_service.dart';
 import 'package:shared/utils/log_utils.dart';
 
-import '../modules/applied_staff_detail/applied_staff_detail_page.dart';
 import '../modules/sign_in_sign_out/sign_in_sign_out_page.dart';
 
 class JobServiceImpl extends GetxService implements JobService {
@@ -32,9 +31,4 @@ class JobServiceImpl extends GetxService implements JobService {
     JobListPage.startInstance();
   }
 
-  @override
-  void startStaffDetailPage(String? memberId) {
-    AppliedStaffDetailPage.startInstance(memberId);
-  }
-
 }

+ 152 - 0
packages/cpt_job_sg/lib/modules/applied_staff_detail/applied_staff_detail_controller.dart

@@ -0,0 +1,152 @@
+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/repository/job_sg_repository.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/engine/loading/loading_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:plugin_platform/http/http_result.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../applied_staff_reviews/applied_staff_reviews_page.dart';
+import 'applied_staff_detail_state.dart';
+
+class AppliedStaffDetailController extends GetxController with DioCancelableMixin {
+  final JobSGRepository _jobRepository = Get.find();
+  final AppliedStaffDetailState state = AppliedStaffDetailState();
+
+  var _curPage = 1;
+  var _isSearch = false;
+  var _needShowPlaceholder = true;
+
+  //页面PlaceHolder的展示
+  LoadState loadingState = LoadState.State_Success;
+  String? errorMessage;
+
+  //刷新页面状态
+  void changeLoadingState(LoadState state) {
+    loadingState = state;
+    update();
+  }
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,
+    controlFinishLoad: true,
+  );
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    _curPage = 1;
+    fetchStaffDetail();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchStaffDetail();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchStaffDetail();
+  }
+
+  /// 获取列表数据
+  Future fetchStaffDetail() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading);
+    } else if (_isSearch) {
+      LoadingEngine.show();
+    }
+
+    // 并发执行两个请求
+    var futures = [
+      _jobRepository.fetchStaffJobHistory(
+        state.memberId,
+        curPage: _curPage,
+        cancelToken: cancelToken,
+      ),
+      state.detail == null
+          ? _jobRepository.fetchStaffDetail(state.memberId, cancelToken: cancelToken)
+          : Future(() => HttpResult(isSuccess: true).convert(data: state.detail!)),
+    ];
+
+    //拿到结果
+    var results = await Future.wait(futures);
+    var listResult = results[0] as HttpResult<StaffJobHistorySGEntity>;
+    var detailResult = results[1] as HttpResult<StaffDetailSGEntity>;
+
+    //详情数据
+    if (state.detail == null && detailResult.isSuccess) {
+      state.detail = detailResult.data!;
+    }
+
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.rows);
+    } else {
+      errorMessage = listResult.errorMsg;
+      changeLoadingState(LoadState.State_Error);
+    }
+
+    _isSearch = false;
+    LoadingEngine.dismiss();
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+  // 处理数据与展示的逻辑
+  void handleList(List<StaffJobHistorySGRows>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state.datas.clear();
+        state.datas.addAll(list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success);
+      } else {
+        //加载更多
+        state.datas.addAll(list);
+        refreshController.finishLoad();
+        update();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state.datas.clear();
+        changeLoadingState(LoadState.State_Empty);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchStaffDetail();
+  }
+
+  @override
+  void onClose() {
+    super.onClose();
+  }
+
+  // 去员工的评论列表页面
+  void gotoReviewHistoryPage() {
+    AppliedStaffReviewsPage.startInstance(
+      state.memberId,
+      state.detail?.workerName,
+      double.parse(state.detail?.reviews?.avgScore ?? "5.0"),
+      state.detail?.reviews?.count.toString() ?? "0",
+    );
+  }
+}

+ 120 - 0
packages/cpt_job_sg/lib/modules/applied_staff_detail/applied_staff_detail_page.dart

@@ -0,0 +1,120 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/widget_export.dart';
+import 'applied_staff_detail_controller.dart';
+import 'package:plugin_basic/base/base_state.dart';
+import 'package:plugin_basic/base/base_stateful_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/my_appbar.dart';
+
+import 'applied_staff_detail_state.dart';
+import 'staff_detail_widget.dart';
+import 'staff_labour_history_item.dart';
+
+/**
+ * 员工的详情(新加坡)
+ */
+class AppliedStaffDetailPage extends BaseStatefulPage<AppliedStaffDetailController> {
+  AppliedStaffDetailPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance(String? memberId) {
+    return Get.start(RouterPath.JOB_LIST_APPLIED_STAFF_DETAIL_SG, arguments: {'memberId': memberId});
+  }
+
+  @override
+  AppliedStaffDetailController createRawController() {
+    return AppliedStaffDetailController();
+  }
+
+  @override
+  State<AppliedStaffDetailPage> createState() => _AppliedStaffDetailState();
+}
+
+class _AppliedStaffDetailState extends BaseState<AppliedStaffDetailPage, AppliedStaffDetailController> {
+  late AppliedStaffDetailState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+    state.memberId = Get.arguments['memberId'];
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return SafeArea(
+          bottom: true,
+          top: false,
+          child: Container(
+            width: double.infinity,
+            height: double.infinity,
+            padding: EdgeInsets.only(top:ScreenUtil.getStatusBarH(context)),
+            decoration: const BoxDecoration(
+              gradient: LinearGradient(
+                colors: [
+                  Color(0xFF091D44),
+                  Color(0xFF245A8A),
+                  Color(0xFF7F7CEC),
+                ],
+                begin: Alignment.topCenter,
+                end: Alignment.bottomCenter,
+              ),
+            ),
+            child: Column(
+              children: [
+                MyAppBar.titleBar(context, "Staff Detail".tr),
+
+                EasyRefresh(
+                  controller: controller.refreshController,
+                  onRefresh: controller.onRefresh,
+                  onLoad: controller.loadMore,
+                  child: LoadStateLayout(
+                    state: controller.loadingState,
+                    errorMessage: controller.errorMessage,
+                    errorRetry: () {
+                      controller.retryRequest();
+                    },
+                    successSliverWidget: [
+                      //顶部用户信息
+                      SliverToBoxAdapter(
+                        child: StaffDetailWidget(detail: state.detail,onRemarkAction: (){
+                          controller.gotoReviewHistoryPage();
+                        }),
+                      ),
+
+                      SliverToBoxAdapter(
+                        child: MyTextView(
+                          "Job History",
+                          marginLeft: 15,
+                          marginTop: 10,
+                          fontSize: 17,
+                          textColor: ColorConstants.white,
+                          isFontMedium: true,
+                        ),
+                      ),
+
+                      //底部工作历史列表
+                      SliverList(delegate: SliverChildBuilderDelegate((context, index) {
+                          return StaffLabourHistoryItem(index: index, item: state.datas[index]);
+                        },
+                        childCount: state.datas.length,
+                      ))
+                    ],
+                  ),
+                ).marginOnly(top: 5,bottom: 5).expanded(),
+              ],
+            ),
+          ),
+        );
+    });
+  }
+
+}

+ 14 - 0
packages/cpt_job_sg/lib/modules/applied_staff_detail/applied_staff_detail_state.dart

@@ -0,0 +1,14 @@
+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:flutter/cupertino.dart';
+
+class AppliedStaffDetailState {
+
+  TextEditingController? searchController;
+
+  String? memberId;
+
+  StaffDetailSGEntity? detail;
+  List<StaffJobHistorySGRows> datas = [];
+
+}

+ 170 - 0
packages/cpt_job_sg/lib/modules/applied_staff_detail/staff_detail_widget.dart

@@ -0,0 +1,170 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:domain/entity/response/staff_detail_s_g_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_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+/**
+ * 员工的做工记录
+ */
+class StaffDetailWidget extends StatelessWidget {
+  final StaffDetailSGEntity? detail;
+  final void Function() onRemarkAction;
+
+  StaffDetailWidget({
+    required this.detail,
+    required this.onRemarkAction,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      margin: EdgeInsets.only(left: 15, right: 15, top: 5, bottom: 10),
+      decoration: BoxDecoration(
+        color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(5), // 设置圆角
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          //头像
+          Center(
+              child: MyLoadImage(
+            detail?.icon,
+            width: 100,
+            height: 100,
+          )).marginOnly(top: 25, bottom: 15),
+
+          //姓名
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Name:".tr,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.workerName ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22),
+
+          //性别
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Gender".tr+":",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.sex ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //电话号码
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Mobile".tr + ":",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.mobile ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //身份证
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Nric".tr + ":",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.nric ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //评分
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Reviews".tr + ":",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                "${detail?.reviews?.avgScore.toString() ?? "-"} (${detail?.reviews?.count ?? "0"} Reviews)",
+                marginLeft: 5,
+                textColor: ColorConstants.textGreen0AC074,
+                fontSize: 14,
+                onClick: onRemarkAction,
+                isFontMedium: true,
+                textDecoration: TextDecoration.underline,
+                decorationColor: ColorConstants.textGreen0AC074,
+                decorationThickness: 2.0,
+                decorationStyle: TextDecorationStyle.solid,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //时薪
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Hourly Rate".tr + ":",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.hourlyRate ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10, bottom: 26),
+        ],
+      ),
+    );
+  }
+}

+ 183 - 0
packages/cpt_job_sg/lib/modules/applied_staff_detail/staff_labour_history_item.dart

@@ -0,0 +1,183 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:domain/entity/response/staff_job_history_s_g_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 StaffLabourHistoryItem extends StatelessWidget {
+  final int index;
+  final StaffJobHistorySGRows item;
+
+  StaffLabourHistoryItem({
+    required this.index,
+    required this.item,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      padding: EdgeInsets.symmetric(vertical: 23, horizontal: 21),
+      margin: EdgeInsets.only(left: 15, right: 15, top: 5, bottom: 5),
+      decoration: BoxDecoration(
+        color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(5), // 设置圆角
+      ),
+      child: Column(
+        mainAxisSize: MainAxisSize.max,
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          //工作日期
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Job Date:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //日期
+              MyTextView(
+                item.jobDate ?? "-",
+                isFontRegular: true,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                marginLeft: 5,
+                marginRight: 5,
+              ).expanded(),
+
+            ],
+          ),
+
+          // 工作开始时间
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Start Time:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //时间
+              MyTextView(
+                item.startTime ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          //工作结束时间
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "End Time:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //时间
+              MyTextView(
+                item.endTime ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          //工作标题(模板)
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Job Title".tr+":",
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //标题
+              MyTextView(
+                item.jobTitle ?? "-",
+                isFontRegular: true,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                marginLeft: 5,
+                marginRight: 5,
+              ).expanded(),
+
+            ],
+          ).marginOnly(top: 12),
+
+          //部门
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Outlet:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //部门
+              MyTextView(
+                item.outletName ?? "-",
+                isFontRegular: true,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                marginLeft: 5,
+                marginRight: 5,
+              ).expanded(),
+
+            ],
+          ).marginOnly(top: 12),
+
+          // 状态
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Status:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //发布状态
+              MyTextView(
+                item.statusShow ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white ,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+        ],
+      ),
+    );
+  }
+}

+ 109 - 0
packages/cpt_job_sg/lib/modules/applied_staff_reviews/applied_staff_reviews_controller.dart

@@ -0,0 +1,109 @@
+import 'package:domain/entity/response/staff_remark_history_entity.dart';
+import 'package:domain/entity/response/staff_review_history_s_g_entity.dart';
+import 'package:domain/repository/job_sg_repository.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'applied_staff_reviews_state.dart';
+
+class AppliedStaffReviewsController extends GetxController with DioCancelableMixin {
+  final JobSGRepository _jobRepository = Get.find();
+  final AppliedStaffReviewsState state = AppliedStaffReviewsState();
+
+  var _curPage = 1;
+  var _needShowPlaceholder = true;
+
+  //页面PlaceHolder的展示
+  LoadState loadingState = LoadState.State_Success;
+  String? errorMessage;
+
+  //刷新页面状态
+  void changeLoadingState(LoadState state) {
+    loadingState = state;
+    update();
+  }
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,
+    controlFinishLoad: true,
+  );
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    _curPage = 1;
+    fetchStaffReviews();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchStaffReviews();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchStaffReviews();
+  }
+
+  /// 获取列表数据
+  Future fetchStaffReviews() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading);
+    }
+
+    var listResult = await _jobRepository.fetchStaffReviewHistory(state.memberId, curPage: _curPage, cancelToken: cancelToken);
+
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.reviews);
+    } else {
+      errorMessage = listResult.errorMsg;
+      changeLoadingState(LoadState.State_Error);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+  // 处理数据与展示的逻辑
+  void handleList(List<StaffReviewHistorySGReviews>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state.datas.clear();
+        state.datas.addAll(list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success);
+      } else {
+        //加载更多
+        state.datas.addAll(list);
+        refreshController.finishLoad();
+        update();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state.datas.clear();
+        changeLoadingState(LoadState.State_Empty);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchStaffReviews();
+  }
+}

+ 151 - 0
packages/cpt_job_sg/lib/modules/applied_staff_reviews/applied_staff_reviews_item.dart

@@ -0,0 +1,151 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/staff_review_history_s_g_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';
+import 'package:widgets/shatter/rating_widget.dart';
+
+/**
+ * 员工的评价记录
+ */
+class StaffReviewsItem extends StatelessWidget {
+  final int index;
+  final StaffReviewHistorySGReviews item;
+
+  StaffReviewsItem({
+    required this.index,
+    required this.item,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      padding: EdgeInsets.only(bottom: 25, left: 21,right: 21,top: 18.5),
+      margin: EdgeInsets.only(left: 15, right: 15, top: 5, bottom: 5),
+      decoration: BoxDecoration(
+        color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(5), // 设置圆角
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          MyTextView(
+            item.employerName ?? "",
+            isFontRegular: true,
+            textColor: Colors.white,
+            fontSize: 17,
+          ),
+
+          //态度评分
+          Row(
+            children: [
+              MyTextView(
+                "Attitude".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 15,
+              ).expanded(flex: 2),
+              RatingWidget(
+                nomalImage: Assets.baseServiceRatingUnselected,
+                selectImage: Assets.baseServiceRatingSelected,
+                size: 21,
+                padding: 5,
+                selectAble: false,
+                integerOnly: true,
+                value: item.attitudeRate,
+                onRatingUpdate: (value) {},
+              ).expanded(flex: 3)
+            ],
+          ).marginOnly(top: 15),
+
+          //表现评分
+          Row(
+            children: [
+              MyTextView(
+                "Performance".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 15,
+              ).expanded(flex: 2),
+              RatingWidget(
+                nomalImage: Assets.baseServiceRatingUnselected,
+                selectImage: Assets.baseServiceRatingSelected,
+                size: 21,
+                padding: 5,
+                selectAble: false,
+                integerOnly: true,
+                value: item.performanceRate,
+                onRatingUpdate: (value) {},
+              ).expanded(flex: 3)
+            ],
+          ).marginOnly(top: 15),
+
+          //经验评分
+          Row(
+            children: [
+              MyTextView(
+                "Experience".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 15,
+              ).expanded(flex: 2),
+              RatingWidget(
+                nomalImage: Assets.baseServiceRatingUnselected,
+                selectImage: Assets.baseServiceRatingSelected,
+                size: 21,
+                padding: 5,
+                selectAble: false,
+                integerOnly: true,
+                value: item.experienceRate,
+                onRatingUpdate: (value) {},
+              ).expanded(flex: 3)
+            ],
+          ).marginOnly(top: 15),
+
+          //着装评分
+          Row(
+            children: [
+              MyTextView(
+                "Grooming".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 15,
+              ).expanded(flex: 2),
+              RatingWidget(
+                nomalImage: Assets.baseServiceRatingUnselected,
+                selectImage: Assets.baseServiceRatingSelected,
+                size: 21,
+                padding: 5,
+                selectAble: false,
+                integerOnly: true,
+                value: item.groomingRate,
+                onRatingUpdate: (value) {},
+              ).expanded(flex: 3)
+            ],
+          ).marginOnly(top: 15),
+
+          MyTextView(
+            item.feedback ?? "",
+            textColor: Colors.white,
+            fontSize: 15,
+            isFontRegular: true,
+            borderColor: Color(0XFF6D92BA),
+            borderWidth: 0.5,
+            boxHeight: 130,
+            boxWidth: double.infinity,
+            paddingTop: 15,
+            paddingLeft: 12.5,
+            paddingRight: 12.5,
+            paddingBottom: 15,
+            marginTop: 18,
+          ),
+
+        ],
+      ),
+    );
+  }
+}

+ 162 - 0
packages/cpt_job_sg/lib/modules/applied_staff_reviews/applied_staff_reviews_page.dart

@@ -0,0 +1,162 @@
+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:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/rating_widget.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'applied_staff_reviews_controller.dart';
+
+import 'package:plugin_basic/base/base_state.dart';
+import 'package:plugin_basic/base/base_stateful_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/my_appbar.dart';
+
+import 'applied_staff_reviews_item.dart';
+import 'applied_staff_reviews_state.dart';
+
+/**
+ * 员工的评论页面
+ */
+class AppliedStaffReviewsPage extends BaseStatefulPage<AppliedStaffReviewsController> {
+  AppliedStaffReviewsPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance(String? memberId, String? staffName, double? reviews, String? reviewCount) {
+    return Get.start(
+      RouterPath.JOB_LIST_APPLIED_STAFF_REVIEWS_SG,
+      arguments: {'memberId': memberId, 'staffName': staffName, 'reviews': reviews, 'reviewCount': reviewCount},
+    );
+  }
+
+  @override
+  AppliedStaffReviewsController createRawController() {
+    return AppliedStaffReviewsController();
+  }
+
+  @override
+  State<AppliedStaffReviewsPage> createState() => _AppliedStaffReviewsState();
+}
+
+class _AppliedStaffReviewsState extends BaseState<AppliedStaffReviewsPage, AppliedStaffReviewsController> {
+  late AppliedStaffReviewsState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+    state.memberId = Get.arguments['memberId'];
+    state.staffName = Get.arguments['staffName'];
+    state.reviews = Get.arguments['reviews'];
+    state.reviewCount = Get.arguments['reviewCount'];
+  }
+
+  @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(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyAppBar.titleBar(context, "Staff Reviews".tr),
+              EasyRefresh(
+                controller: controller.refreshController,
+                onRefresh: controller.onRefresh,
+                onLoad: controller.loadMore,
+                child: LoadStateLayout(
+                  state: controller.loadingState,
+                  errorMessage: controller.errorMessage,
+                  errorRetry: () {
+                    controller.retryRequest();
+                  },
+                  successSliverWidget: [
+                    //顶部用户信息
+                    SliverToBoxAdapter(
+                      child: _buildRemarkWidget(),
+                    ),
+
+                    //底部工作历史列表
+                    SliverList(
+                        delegate: SliverChildBuilderDelegate(
+                      (context, index) {
+                        return StaffReviewsItem(index: index, item: state.datas[index]);
+                      },
+                      childCount: state.datas.length,
+                    ))
+                  ],
+                ),
+              ).expanded(),
+            ],
+          ),
+        ),
+      );
+    });
+  }
+
+  Widget _buildRemarkWidget() {
+    return Container(
+      padding: EdgeInsets.only(bottom: 22, left: 21, right: 21, top: 18.5),
+      margin: EdgeInsets.only(left: 15, right: 15, top: 14.5, bottom: 5),
+      decoration: BoxDecoration(
+        color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(5), // 设置圆角
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          MyTextView(
+            state.staffName ?? "-",
+            fontSize: 17,
+            textColor: ColorConstants.white,
+            isFontMedium: true,
+            marginBottom: 8,
+          ),
+          Row(
+            children: [
+              RatingWidget(
+                nomalImage: Assets.baseServiceRatingUnselected,
+                selectImage: Assets.baseServiceRatingSelected,
+                size: 21,
+                padding: 5,
+                selectAble: false,
+                integerOnly: false,
+                value: state.reviews ?? 0,
+                onRatingUpdate: (value) {},
+              ),
+              MyTextView(
+                "${state.reviews.toString()} (${state.reviewCount} Reviews)",
+                fontSize: 14,
+                marginLeft: 12,
+                textColor: ColorConstants.textYellowF8AE00,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 10 - 0
packages/cpt_job_sg/lib/modules/applied_staff_reviews/applied_staff_reviews_state.dart

@@ -0,0 +1,10 @@
+import 'package:domain/entity/response/staff_review_history_s_g_entity.dart';
+
+class AppliedStaffReviewsState {
+  String? memberId;
+  String? staffName;
+  double? reviews;
+  String? reviewCount;
+
+  List<StaffReviewHistorySGReviews> datas = [];
+}

+ 2 - 1
packages/cpt_job_sg/lib/modules/job_applied/job_applied_controller.dart

@@ -22,6 +22,7 @@ import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/picker/option_pick_util.dart';
 import 'package:widgets/widget_export.dart';
 
+import '../applied_staff_detail/applied_staff_detail_page.dart';
 import 'applied_staff_reviews.dart';
 import 'dialog_applied_butch_modify.dart';
 import 'dialog_applied_modify.dart';
@@ -289,7 +290,7 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
 
   /// 去查看员工详情页面
   void gotoStaffDetailPage(JobAppliedListSGRows data) {
-    ComponentRouterServices.jobService.startStaffDetailPage(data.memberId);
+    AppliedStaffDetailPage.startInstance(data.memberId);
   }
 
   /// Item选中与未选中设置

+ 11 - 3
packages/cpt_job_sg/lib/router/page_router.dart

@@ -1,14 +1,13 @@
-
 import 'package:get/get.dart';
 import 'package:router/path/router_path.dart';
 
 import '../modules/applied_staff/applied_staff_page.dart';
+import '../modules/applied_staff_detail/applied_staff_detail_page.dart';
+import '../modules/applied_staff_reviews/applied_staff_reviews_page.dart';
 import '../modules/job_applied/job_applied_page.dart';
 
-
 class JobPageSGRouter {
   static final routes = [
-
     // 工作列表 (新加坡)
     // 新加坡工作列表已申请列表
     GetPage(
@@ -21,5 +20,14 @@ class JobPageSGRouter {
       page: () => AppliedStaffPage(),
     ),
 
+    GetPage(
+      name: RouterPath.JOB_LIST_APPLIED_STAFF_DETAIL_SG,
+      page: () => AppliedStaffDetailPage(),
+    ),
+
+    GetPage(
+      name: RouterPath.JOB_LIST_APPLIED_STAFF_REVIEWS_SG,
+      page: () => AppliedStaffReviewsPage(),
+    ),
   ];
 }

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

@@ -217,6 +217,18 @@ class ApiConstants {
   //新加坡工作已申请的列表-提交评价
   static const apiJobAppliedRemarkSubmitSG = "/index.php/api/v1/hotel/applied/remark-submit";
 
+  //员工详情
+  static const apiJobListStaffDetailSG = "/index.php/api/v1/hotel/member/detail";
+
+  //员工做工历史记录
+  static const apiJobListStaffLabourHistorySG = "/index.php/api/v1/hotel/member/history";
+
+  //员工做工评价顶部数据
+  static const apiJobListStaffReviewHeadSG = "/index.php/api/v1/hotel/member/review";
+
+  //员工做工评价列表
+  static const apiJobListStaffReViewHistorySG = "/index.php/api/v1/hotel/member/review/table";
+
   // =========================== 报表与其他 ↓=========================================
 
   // 设备列表

+ 83 - 0
packages/cs_domain/lib/entity/response/staff_detail_s_g_entity.dart

@@ -0,0 +1,83 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/staff_detail_s_g_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/staff_detail_s_g_entity.g.dart';
+
+@JsonSerializable()
+class StaffDetailSGEntity {
+	@JSONField(name: "member_id")
+	String? memberId = null;
+	@JSONField(name: "worker_name")
+	String? workerName = null;
+	String? mobile = null;
+	String? icon = null;
+	String? sex = null;
+	String? nric = null;
+	@JSONField(name: "hourly_rate")
+	String? hourlyRate = null;
+	StaffDetailSGReviews? reviews;
+	@JSONField(name: "hotel_staff")
+	int hotelStaff = 0;
+	@JSONField(name: "salary_structure")
+	int salaryStructure = 0;
+	@JSONField(name: "show_star")
+	int showStar = 0;
+
+	StaffDetailSGEntity();
+
+	factory StaffDetailSGEntity.fromJson(Map<String, dynamic> json) => $StaffDetailSGEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffDetailSGEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class StaffDetailSGReviews {
+	int count = 0;
+	@JSONField(name: "avg_score")
+	String? avgScore = null;
+	List<StaffDetailSGReviewsReviews>? reviews = [];
+
+	StaffDetailSGReviews();
+
+	factory StaffDetailSGReviews.fromJson(Map<String, dynamic> json) => $StaffDetailSGReviewsFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffDetailSGReviewsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class StaffDetailSGReviewsReviews {
+	@JSONField(name: "employer_name")
+	String? employerName = null;
+	@JSONField(name: "attitude_rate")
+	String? attitudeRate = null;
+	@JSONField(name: "grooming_rate")
+	String? groomingRate = null;
+	@JSONField(name: "performance_rate")
+	String? performanceRate = null;
+	@JSONField(name: "experience_rate")
+	String? experienceRate = null;
+	String? feedback = null;
+	@JSONField(name: "created_at")
+	String? createdAt = null;
+
+	StaffDetailSGReviewsReviews();
+
+	factory StaffDetailSGReviewsReviews.fromJson(Map<String, dynamic> json) => $StaffDetailSGReviewsReviewsFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffDetailSGReviewsReviewsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 54 - 0
packages/cs_domain/lib/entity/response/staff_job_history_s_g_entity.dart

@@ -0,0 +1,54 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/staff_job_history_s_g_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/staff_job_history_s_g_entity.g.dart';
+
+@JsonSerializable()
+class StaffJobHistorySGEntity {
+	int total = 0;
+	List<StaffJobHistorySGRows> rows = [];
+
+	StaffJobHistorySGEntity();
+
+	factory StaffJobHistorySGEntity.fromJson(Map<String, dynamic> json) => $StaffJobHistorySGEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffJobHistorySGEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class StaffJobHistorySGRows {
+	@JSONField(name: "applied_id")
+	String? appliedId = null;
+	@JSONField(name: "job_title")
+	String? jobTitle = null;
+	@JSONField(name: "outlet_name")
+	String? outletName = null;
+	@JSONField(name: "job_date")
+	String? jobDate = null;
+	@JSONField(name: "start_time")
+	String? startTime = null;
+	@JSONField(name: "end_time")
+	String? endTime = null;
+	@JSONField(name: "source_show")
+	String? sourceShow = null;
+	@JSONField(name: "status_show")
+	String? statusShow = null;
+	@JSONField(name: "show_star")
+	int showStar = 0;
+
+	StaffJobHistorySGRows();
+
+	factory StaffJobHistorySGRows.fromJson(Map<String, dynamic> json) => $StaffJobHistorySGRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffJobHistorySGRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 55 - 0
packages/cs_domain/lib/entity/response/staff_review_history_s_g_entity.dart

@@ -0,0 +1,55 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/staff_review_history_s_g_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/staff_review_history_s_g_entity.g.dart';
+
+@JsonSerializable()
+class StaffReviewHistorySGEntity {
+	int count = 0;
+	@JSONField(name: "avg_score")
+	String? avgScore = null;
+	List<StaffReviewHistorySGReviews> reviews = [];
+	@JSONField(name: "member_id")
+	int? memberId = 0;
+	@JSONField(name: "labourer_name")
+	String? labourerName = null;
+
+	StaffReviewHistorySGEntity();
+
+	factory StaffReviewHistorySGEntity.fromJson(Map<String, dynamic> json) => $StaffReviewHistorySGEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffReviewHistorySGEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class StaffReviewHistorySGReviews {
+	@JSONField(name: "employer_name")
+	String? employerName = null;
+	@JSONField(name: "attitude_rate")
+	double attitudeRate = 0.0;
+	@JSONField(name: "grooming_rate")
+	double groomingRate = 0.0;
+	@JSONField(name: "performance_rate")
+	double performanceRate = 0.0;
+	@JSONField(name: "experience_rate")
+	double experienceRate = 0.0;
+	String? feedback = null;
+	@JSONField(name: "created_at")
+	String? createdAt = null;
+
+	StaffReviewHistorySGReviews();
+
+	factory StaffReviewHistorySGReviews.fromJson(Map<String, dynamic> json) => $StaffReviewHistorySGReviewsFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffReviewHistorySGReviewsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

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

@@ -38,8 +38,11 @@ import 'package:domain/entity/response/labour_request_s_g_add_index_entity.dart'
 import 'package:domain/entity/response/labour_request_s_g_entity.dart';
 import 'package:domain/entity/response/labour_request_work_flow_entity.dart';
 import 'package:domain/entity/response/staff_detail_entity.dart';
+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_review_history_s_g_entity.dart';
 import 'package:domain/entity/server_time.dart';
 
 JsonConvert jsonConvert = JsonConvert();
@@ -390,6 +393,21 @@ class JsonConvert {
     if (<StaffDetailEntity>[] is M) {
       return data.map<StaffDetailEntity>((Map<String, dynamic> e) => StaffDetailEntity.fromJson(e)).toList() as M;
     }
+    if (<StaffDetailSGEntity>[] is M) {
+      return data.map<StaffDetailSGEntity>((Map<String, dynamic> e) => StaffDetailSGEntity.fromJson(e)).toList() as M;
+    }
+    if (<StaffDetailSGReviews>[] is M) {
+      return data.map<StaffDetailSGReviews>((Map<String, dynamic> e) => StaffDetailSGReviews.fromJson(e)).toList() as M;
+    }
+    if (<StaffDetailSGReviewsReviews>[] is M) {
+      return data.map<StaffDetailSGReviewsReviews>((Map<String, dynamic> e) => StaffDetailSGReviewsReviews.fromJson(e)).toList() as M;
+    }
+    if (<StaffJobHistorySGEntity>[] is M) {
+      return data.map<StaffJobHistorySGEntity>((Map<String, dynamic> e) => StaffJobHistorySGEntity.fromJson(e)).toList() as M;
+    }
+    if (<StaffJobHistorySGRows>[] is M) {
+      return data.map<StaffJobHistorySGRows>((Map<String, dynamic> e) => StaffJobHistorySGRows.fromJson(e)).toList() as M;
+    }
     if (<StaffLabourHistoryEntity>[] is M) {
       return data.map<StaffLabourHistoryEntity>((Map<String, dynamic> e) => StaffLabourHistoryEntity.fromJson(e)).toList() as M;
     }
@@ -414,6 +432,12 @@ class JsonConvert {
     if (<StaffRemarkHistoryRows>[] is M) {
       return data.map<StaffRemarkHistoryRows>((Map<String, dynamic> e) => StaffRemarkHistoryRows.fromJson(e)).toList() as M;
     }
+    if (<StaffReviewHistorySGEntity>[] is M) {
+      return data.map<StaffReviewHistorySGEntity>((Map<String, dynamic> e) => StaffReviewHistorySGEntity.fromJson(e)).toList() as M;
+    }
+    if (<StaffReviewHistorySGReviews>[] is M) {
+      return data.map<StaffReviewHistorySGReviews>((Map<String, dynamic> e) => StaffReviewHistorySGReviews.fromJson(e)).toList() as M;
+    }
     if (<ServerTime>[] is M) {
       return data.map<ServerTime>((Map<String, dynamic> e) => ServerTime.fromJson(e)).toList() as M;
     }
@@ -511,6 +535,11 @@ class JsonConvertClassCollection {
     (LabourRequestWorkFlowEntity).toString(): LabourRequestWorkFlowEntity.fromJson,
     (LabourRequestWorkFlowRecords).toString(): LabourRequestWorkFlowRecords.fromJson,
     (StaffDetailEntity).toString(): StaffDetailEntity.fromJson,
+    (StaffDetailSGEntity).toString(): StaffDetailSGEntity.fromJson,
+    (StaffDetailSGReviews).toString(): StaffDetailSGReviews.fromJson,
+    (StaffDetailSGReviewsReviews).toString(): StaffDetailSGReviewsReviews.fromJson,
+    (StaffJobHistorySGEntity).toString(): StaffJobHistorySGEntity.fromJson,
+    (StaffJobHistorySGRows).toString(): StaffJobHistorySGRows.fromJson,
     (StaffLabourHistoryEntity).toString(): StaffLabourHistoryEntity.fromJson,
     (StaffLabourHistoryRows).toString(): StaffLabourHistoryRows.fromJson,
     (StaffLabourHistoryRowsSecurityIn).toString(): StaffLabourHistoryRowsSecurityIn.fromJson,
@@ -519,6 +548,8 @@ class JsonConvertClassCollection {
     (StaffLabourHistoryRowsWorkOut).toString(): StaffLabourHistoryRowsWorkOut.fromJson,
     (StaffRemarkHistoryEntity).toString(): StaffRemarkHistoryEntity.fromJson,
     (StaffRemarkHistoryRows).toString(): StaffRemarkHistoryRows.fromJson,
+    (StaffReviewHistorySGEntity).toString(): StaffReviewHistorySGEntity.fromJson,
+    (StaffReviewHistorySGReviews).toString(): StaffReviewHistorySGReviews.fromJson,
     (ServerTime).toString(): ServerTime.fromJson,
   };
 

+ 201 - 0
packages/cs_domain/lib/generated/json/staff_detail_s_g_entity.g.dart

@@ -0,0 +1,201 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/staff_detail_s_g_entity.dart';
+
+StaffDetailSGEntity $StaffDetailSGEntityFromJson(Map<String, dynamic> json) {
+  final StaffDetailSGEntity staffDetailSGEntity = StaffDetailSGEntity();
+  final String? memberId = jsonConvert.convert<String>(json['member_id']);
+  if (memberId != null) {
+    staffDetailSGEntity.memberId = memberId;
+  }
+  final String? workerName = jsonConvert.convert<String>(json['worker_name']);
+  if (workerName != null) {
+    staffDetailSGEntity.workerName = workerName;
+  }
+  final String? mobile = jsonConvert.convert<String>(json['mobile']);
+  if (mobile != null) {
+    staffDetailSGEntity.mobile = mobile;
+  }
+  final String? icon = jsonConvert.convert<String>(json['icon']);
+  if (icon != null) {
+    staffDetailSGEntity.icon = icon;
+  }
+  final String? sex = jsonConvert.convert<String>(json['sex']);
+  if (sex != null) {
+    staffDetailSGEntity.sex = sex;
+  }
+  final String? nric = jsonConvert.convert<String>(json['nric']);
+  if (nric != null) {
+    staffDetailSGEntity.nric = nric;
+  }
+  final String? hourlyRate = jsonConvert.convert<String>(json['hourly_rate']);
+  if (hourlyRate != null) {
+    staffDetailSGEntity.hourlyRate = hourlyRate;
+  }
+  final StaffDetailSGReviews? reviews = jsonConvert.convert<StaffDetailSGReviews>(json['reviews']);
+  if (reviews != null) {
+    staffDetailSGEntity.reviews = reviews;
+  }
+  final int? hotelStaff = jsonConvert.convert<int>(json['hotel_staff']);
+  if (hotelStaff != null) {
+    staffDetailSGEntity.hotelStaff = hotelStaff;
+  }
+  final int? salaryStructure = jsonConvert.convert<int>(json['salary_structure']);
+  if (salaryStructure != null) {
+    staffDetailSGEntity.salaryStructure = salaryStructure;
+  }
+  final int? showStar = jsonConvert.convert<int>(json['show_star']);
+  if (showStar != null) {
+    staffDetailSGEntity.showStar = showStar;
+  }
+  return staffDetailSGEntity;
+}
+
+Map<String, dynamic> $StaffDetailSGEntityToJson(StaffDetailSGEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['member_id'] = entity.memberId;
+  data['worker_name'] = entity.workerName;
+  data['mobile'] = entity.mobile;
+  data['icon'] = entity.icon;
+  data['sex'] = entity.sex;
+  data['nric'] = entity.nric;
+  data['hourly_rate'] = entity.hourlyRate;
+  data['reviews'] = entity.reviews?.toJson();
+  data['hotel_staff'] = entity.hotelStaff;
+  data['salary_structure'] = entity.salaryStructure;
+  data['show_star'] = entity.showStar;
+  return data;
+}
+
+extension StaffDetailSGEntityExtension on StaffDetailSGEntity {
+  StaffDetailSGEntity copyWith({
+    String? memberId,
+    String? workerName,
+    String? mobile,
+    String? icon,
+    String? sex,
+    String? nric,
+    String? hourlyRate,
+    StaffDetailSGReviews? reviews,
+    int? hotelStaff,
+    int? salaryStructure,
+    int? showStar,
+  }) {
+    return StaffDetailSGEntity()
+      ..memberId = memberId ?? this.memberId
+      ..workerName = workerName ?? this.workerName
+      ..mobile = mobile ?? this.mobile
+      ..icon = icon ?? this.icon
+      ..sex = sex ?? this.sex
+      ..nric = nric ?? this.nric
+      ..hourlyRate = hourlyRate ?? this.hourlyRate
+      ..reviews = reviews ?? this.reviews
+      ..hotelStaff = hotelStaff ?? this.hotelStaff
+      ..salaryStructure = salaryStructure ?? this.salaryStructure
+      ..showStar = showStar ?? this.showStar;
+  }
+}
+
+StaffDetailSGReviews $StaffDetailSGReviewsFromJson(Map<String, dynamic> json) {
+  final StaffDetailSGReviews staffDetailSGReviews = StaffDetailSGReviews();
+  final int? count = jsonConvert.convert<int>(json['count']);
+  if (count != null) {
+    staffDetailSGReviews.count = count;
+  }
+  final String? avgScore = jsonConvert.convert<String>(json['avg_score']);
+  if (avgScore != null) {
+    staffDetailSGReviews.avgScore = avgScore;
+  }
+  final List<StaffDetailSGReviewsReviews>? reviews = (json['reviews'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<StaffDetailSGReviewsReviews>(e) as StaffDetailSGReviewsReviews).toList();
+  if (reviews != null) {
+    staffDetailSGReviews.reviews = reviews;
+  }
+  return staffDetailSGReviews;
+}
+
+Map<String, dynamic> $StaffDetailSGReviewsToJson(StaffDetailSGReviews entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['count'] = entity.count;
+  data['avg_score'] = entity.avgScore;
+  data['reviews'] = entity.reviews?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension StaffDetailSGReviewsExtension on StaffDetailSGReviews {
+  StaffDetailSGReviews copyWith({
+    int? count,
+    String? avgScore,
+    List<StaffDetailSGReviewsReviews>? reviews,
+  }) {
+    return StaffDetailSGReviews()
+      ..count = count ?? this.count
+      ..avgScore = avgScore ?? this.avgScore
+      ..reviews = reviews ?? this.reviews;
+  }
+}
+
+StaffDetailSGReviewsReviews $StaffDetailSGReviewsReviewsFromJson(Map<String, dynamic> json) {
+  final StaffDetailSGReviewsReviews staffDetailSGReviewsReviews = StaffDetailSGReviewsReviews();
+  final String? employerName = jsonConvert.convert<String>(json['employer_name']);
+  if (employerName != null) {
+    staffDetailSGReviewsReviews.employerName = employerName;
+  }
+  final String? attitudeRate = jsonConvert.convert<String>(json['attitude_rate']);
+  if (attitudeRate != null) {
+    staffDetailSGReviewsReviews.attitudeRate = attitudeRate;
+  }
+  final String? groomingRate = jsonConvert.convert<String>(json['grooming_rate']);
+  if (groomingRate != null) {
+    staffDetailSGReviewsReviews.groomingRate = groomingRate;
+  }
+  final String? performanceRate = jsonConvert.convert<String>(json['performance_rate']);
+  if (performanceRate != null) {
+    staffDetailSGReviewsReviews.performanceRate = performanceRate;
+  }
+  final String? experienceRate = jsonConvert.convert<String>(json['experience_rate']);
+  if (experienceRate != null) {
+    staffDetailSGReviewsReviews.experienceRate = experienceRate;
+  }
+  final String? feedback = jsonConvert.convert<String>(json['feedback']);
+  if (feedback != null) {
+    staffDetailSGReviewsReviews.feedback = feedback;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    staffDetailSGReviewsReviews.createdAt = createdAt;
+  }
+  return staffDetailSGReviewsReviews;
+}
+
+Map<String, dynamic> $StaffDetailSGReviewsReviewsToJson(StaffDetailSGReviewsReviews entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['employer_name'] = entity.employerName;
+  data['attitude_rate'] = entity.attitudeRate;
+  data['grooming_rate'] = entity.groomingRate;
+  data['performance_rate'] = entity.performanceRate;
+  data['experience_rate'] = entity.experienceRate;
+  data['feedback'] = entity.feedback;
+  data['created_at'] = entity.createdAt;
+  return data;
+}
+
+extension StaffDetailSGReviewsReviewsExtension on StaffDetailSGReviewsReviews {
+  StaffDetailSGReviewsReviews copyWith({
+    String? employerName,
+    String? attitudeRate,
+    String? groomingRate,
+    String? performanceRate,
+    String? experienceRate,
+    String? feedback,
+    String? createdAt,
+  }) {
+    return StaffDetailSGReviewsReviews()
+      ..employerName = employerName ?? this.employerName
+      ..attitudeRate = attitudeRate ?? this.attitudeRate
+      ..groomingRate = groomingRate ?? this.groomingRate
+      ..performanceRate = performanceRate ?? this.performanceRate
+      ..experienceRate = experienceRate ?? this.experienceRate
+      ..feedback = feedback ?? this.feedback
+      ..createdAt = createdAt ?? this.createdAt;
+  }
+}

+ 114 - 0
packages/cs_domain/lib/generated/json/staff_job_history_s_g_entity.g.dart

@@ -0,0 +1,114 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/staff_job_history_s_g_entity.dart';
+
+StaffJobHistorySGEntity $StaffJobHistorySGEntityFromJson(Map<String, dynamic> json) {
+  final StaffJobHistorySGEntity staffJobHistorySGEntity = StaffJobHistorySGEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    staffJobHistorySGEntity.total = total;
+  }
+  final List<StaffJobHistorySGRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<StaffJobHistorySGRows>(e) as StaffJobHistorySGRows).toList();
+  if (rows != null) {
+    staffJobHistorySGEntity.rows = rows;
+  }
+  return staffJobHistorySGEntity;
+}
+
+Map<String, dynamic> $StaffJobHistorySGEntityToJson(StaffJobHistorySGEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension StaffJobHistorySGEntityExtension on StaffJobHistorySGEntity {
+  StaffJobHistorySGEntity copyWith({
+    int? total,
+    List<StaffJobHistorySGRows>? rows,
+  }) {
+    return StaffJobHistorySGEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+StaffJobHistorySGRows $StaffJobHistorySGRowsFromJson(Map<String, dynamic> json) {
+  final StaffJobHistorySGRows staffJobHistorySGRows = StaffJobHistorySGRows();
+  final String? appliedId = jsonConvert.convert<String>(json['applied_id']);
+  if (appliedId != null) {
+    staffJobHistorySGRows.appliedId = appliedId;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    staffJobHistorySGRows.jobTitle = jobTitle;
+  }
+  final String? outletName = jsonConvert.convert<String>(json['outlet_name']);
+  if (outletName != null) {
+    staffJobHistorySGRows.outletName = outletName;
+  }
+  final String? jobDate = jsonConvert.convert<String>(json['job_date']);
+  if (jobDate != null) {
+    staffJobHistorySGRows.jobDate = jobDate;
+  }
+  final String? startTime = jsonConvert.convert<String>(json['start_time']);
+  if (startTime != null) {
+    staffJobHistorySGRows.startTime = startTime;
+  }
+  final String? endTime = jsonConvert.convert<String>(json['end_time']);
+  if (endTime != null) {
+    staffJobHistorySGRows.endTime = endTime;
+  }
+  final String? sourceShow = jsonConvert.convert<String>(json['source_show']);
+  if (sourceShow != null) {
+    staffJobHistorySGRows.sourceShow = sourceShow;
+  }
+  final String? statusShow = jsonConvert.convert<String>(json['status_show']);
+  if (statusShow != null) {
+    staffJobHistorySGRows.statusShow = statusShow;
+  }
+  final int? showStar = jsonConvert.convert<int>(json['show_star']);
+  if (showStar != null) {
+    staffJobHistorySGRows.showStar = showStar;
+  }
+  return staffJobHistorySGRows;
+}
+
+Map<String, dynamic> $StaffJobHistorySGRowsToJson(StaffJobHistorySGRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['applied_id'] = entity.appliedId;
+  data['job_title'] = entity.jobTitle;
+  data['outlet_name'] = entity.outletName;
+  data['job_date'] = entity.jobDate;
+  data['start_time'] = entity.startTime;
+  data['end_time'] = entity.endTime;
+  data['source_show'] = entity.sourceShow;
+  data['status_show'] = entity.statusShow;
+  data['show_star'] = entity.showStar;
+  return data;
+}
+
+extension StaffJobHistorySGRowsExtension on StaffJobHistorySGRows {
+  StaffJobHistorySGRows copyWith({
+    String? appliedId,
+    String? jobTitle,
+    String? outletName,
+    String? jobDate,
+    String? startTime,
+    String? endTime,
+    String? sourceShow,
+    String? statusShow,
+    int? showStar,
+  }) {
+    return StaffJobHistorySGRows()
+      ..appliedId = appliedId ?? this.appliedId
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..outletName = outletName ?? this.outletName
+      ..jobDate = jobDate ?? this.jobDate
+      ..startTime = startTime ?? this.startTime
+      ..endTime = endTime ?? this.endTime
+      ..sourceShow = sourceShow ?? this.sourceShow
+      ..statusShow = statusShow ?? this.statusShow
+      ..showStar = showStar ?? this.showStar;
+  }
+}

+ 121 - 0
packages/cs_domain/lib/generated/json/staff_review_history_s_g_entity.g.dart

@@ -0,0 +1,121 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/staff_review_history_s_g_entity.dart';
+
+StaffReviewHistorySGEntity $StaffReviewHistorySGEntityFromJson(Map<String, dynamic> json) {
+  final StaffReviewHistorySGEntity staffReviewHistorySGEntity = StaffReviewHistorySGEntity();
+  final int? count = jsonConvert.convert<int>(json['count']);
+  if (count != null) {
+    staffReviewHistorySGEntity.count = count;
+  }
+  final String? avgScore = jsonConvert.convert<String>(json['avg_score']);
+  if (avgScore != null) {
+    staffReviewHistorySGEntity.avgScore = avgScore;
+  }
+  final List<StaffReviewHistorySGReviews>? reviews = (json['reviews'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<StaffReviewHistorySGReviews>(e) as StaffReviewHistorySGReviews).toList();
+  if (reviews != null) {
+    staffReviewHistorySGEntity.reviews = reviews;
+  }
+  final int? memberId = jsonConvert.convert<int>(json['member_id']);
+  if (memberId != null) {
+    staffReviewHistorySGEntity.memberId = memberId;
+  }
+  final String? labourerName = jsonConvert.convert<String>(json['labourer_name']);
+  if (labourerName != null) {
+    staffReviewHistorySGEntity.labourerName = labourerName;
+  }
+  return staffReviewHistorySGEntity;
+}
+
+Map<String, dynamic> $StaffReviewHistorySGEntityToJson(StaffReviewHistorySGEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['count'] = entity.count;
+  data['avg_score'] = entity.avgScore;
+  data['reviews'] = entity.reviews.map((v) => v.toJson()).toList();
+  data['member_id'] = entity.memberId;
+  data['labourer_name'] = entity.labourerName;
+  return data;
+}
+
+extension StaffReviewHistorySGEntityExtension on StaffReviewHistorySGEntity {
+  StaffReviewHistorySGEntity copyWith({
+    int? count,
+    String? avgScore,
+    List<StaffReviewHistorySGReviews>? reviews,
+    int? memberId,
+    String? labourerName,
+  }) {
+    return StaffReviewHistorySGEntity()
+      ..count = count ?? this.count
+      ..avgScore = avgScore ?? this.avgScore
+      ..reviews = reviews ?? this.reviews
+      ..memberId = memberId ?? this.memberId
+      ..labourerName = labourerName ?? this.labourerName;
+  }
+}
+
+StaffReviewHistorySGReviews $StaffReviewHistorySGReviewsFromJson(Map<String, dynamic> json) {
+  final StaffReviewHistorySGReviews staffReviewHistorySGReviews = StaffReviewHistorySGReviews();
+  final String? employerName = jsonConvert.convert<String>(json['employer_name']);
+  if (employerName != null) {
+    staffReviewHistorySGReviews.employerName = employerName;
+  }
+  final double? attitudeRate = jsonConvert.convert<double>(json['attitude_rate']);
+  if (attitudeRate != null) {
+    staffReviewHistorySGReviews.attitudeRate = attitudeRate;
+  }
+  final double? groomingRate = jsonConvert.convert<double>(json['grooming_rate']);
+  if (groomingRate != null) {
+    staffReviewHistorySGReviews.groomingRate = groomingRate;
+  }
+  final double? performanceRate = jsonConvert.convert<double>(json['performance_rate']);
+  if (performanceRate != null) {
+    staffReviewHistorySGReviews.performanceRate = performanceRate;
+  }
+  final double? experienceRate = jsonConvert.convert<double>(json['experience_rate']);
+  if (experienceRate != null) {
+    staffReviewHistorySGReviews.experienceRate = experienceRate;
+  }
+  final String? feedback = jsonConvert.convert<String>(json['feedback']);
+  if (feedback != null) {
+    staffReviewHistorySGReviews.feedback = feedback;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    staffReviewHistorySGReviews.createdAt = createdAt;
+  }
+  return staffReviewHistorySGReviews;
+}
+
+Map<String, dynamic> $StaffReviewHistorySGReviewsToJson(StaffReviewHistorySGReviews entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['employer_name'] = entity.employerName;
+  data['attitude_rate'] = entity.attitudeRate;
+  data['grooming_rate'] = entity.groomingRate;
+  data['performance_rate'] = entity.performanceRate;
+  data['experience_rate'] = entity.experienceRate;
+  data['feedback'] = entity.feedback;
+  data['created_at'] = entity.createdAt;
+  return data;
+}
+
+extension StaffReviewHistorySGReviewsExtension on StaffReviewHistorySGReviews {
+  StaffReviewHistorySGReviews copyWith({
+    String? employerName,
+    double? attitudeRate,
+    double? groomingRate,
+    double? performanceRate,
+    double? experienceRate,
+    String? feedback,
+    String? createdAt,
+  }) {
+    return StaffReviewHistorySGReviews()
+      ..employerName = employerName ?? this.employerName
+      ..attitudeRate = attitudeRate ?? this.attitudeRate
+      ..groomingRate = groomingRate ?? this.groomingRate
+      ..performanceRate = performanceRate ?? this.performanceRate
+      ..experienceRate = experienceRate ?? this.experienceRate
+      ..feedback = feedback ?? this.feedback
+      ..createdAt = createdAt ?? this.createdAt;
+  }
+}

+ 111 - 0
packages/cs_domain/lib/repository/job_sg_repository.dart

@@ -12,8 +12,10 @@ import 'package:domain/entity/response/job_list_entity.dart';
 import 'package:domain/entity/response/job_list_index_entity.dart';
 import 'package:domain/entity/response/job_list_remark_view_entity.dart';
 import 'package:domain/entity/response/staff_detail_entity.dart';
+import 'package:domain/entity/response/staff_detail_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_review_history_s_g_entity.dart';
 import 'package:get/get.dart';
 import 'package:plugin_platform/dio_export.dart';
 import 'package:plugin_platform/http/http_provider.dart';
@@ -27,6 +29,7 @@ import '../entity/response/job_applied_edit_index_s_g_entity.dart';
 import '../entity/response/job_applied_remark_view_s_g_entity.dart';
 import '../entity/response/job_applied_staff_s_g_entity.dart';
 import '../entity/response/job_list_applied_work_flow_entity.dart';
+import '../entity/response/staff_job_history_s_g_entity.dart';
 
 /// 工作相关(新加坡)
 class JobSGRepository extends GetxService {
@@ -417,4 +420,112 @@ class JobSGRepository extends GetxService {
     }
     return result.convert();
   }
+
+  /// 获取员工的详细信息
+  Future<HttpResult<StaffDetailSGEntity>> fetchStaffDetail(
+    String? memberId, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['member_id'] = memberId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListStaffDetailSG,
+      params: params,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = StaffDetailSGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<StaffDetailSGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取员工的做工历史列表
+  Future<HttpResult<StaffJobHistorySGEntity>> fetchStaffJobHistory(
+    String? memberId, {
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['member_id'] = memberId ?? "";
+    params['cur_page'] = curPage.toString();
+    params['page_size'] = "10";
+
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListStaffLabourHistorySG,
+      params: params,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = StaffJobHistorySGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<StaffJobHistorySGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取员工的做工评价历史列表
+  Future<HttpResult<StaffReviewHistorySGEntity>> fetchStaffReviewHeadView(
+      String? memberId, {
+        CancelToken? cancelToken,
+      }) async {
+    //参数
+    Map<String, String> params = {};
+    params['member_id'] = memberId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListStaffReviewHeadSG,
+      params: params,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = StaffReviewHistorySGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<StaffReviewHistorySGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取员工的做工评价历史列表
+  Future<HttpResult<StaffReviewHistorySGEntity>> fetchStaffReviewHistory(
+      String? memberId, {
+        required int curPage,
+        CancelToken? cancelToken,
+      }) async {
+    //参数
+    Map<String, String> params = {};
+    params['cur_page'] = curPage.toString();
+    params['page_size'] = "10";
+    params['member_id'] = memberId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListStaffReViewHistorySG,
+      params: params,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = StaffReviewHistorySGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<StaffReviewHistorySGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
 }

+ 5 - 1
packages/cs_resources/lib/local/language/en_US.dart

@@ -213,7 +213,11 @@ const Map<String, String> en_US = {
   'Applied': 'Applied',
   'No Show': 'No Show',
   'Modify': 'Modify',
-  'Subtract Hour': 'Subtract Hour',
+  'Subtract Hours': 'Subtract Hours',
+  'Hourly Rate': 'Hourly Rate',
+  'Reviews': 'Reviews',
+  'Mobile': 'Mobile',
+  'Staff Reviews': 'Staff Reviews',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

+ 5 - 1
packages/cs_resources/lib/local/language/vi_VN.dart

@@ -213,7 +213,11 @@ const Map<String, String> vi_VN = {
   'Applied': 'Đã thông qua',
   'No Show': 'No Show',
   'Modify': 'Sửa đổi',
-  'Subtract Hour': 'Trừ giờ',
+  'Subtract Hours': 'Trừ giờ',
+  'Hourly Rate': 'Giá theo giờ',
+  'Reviews': 'Bình luận',
+  'Mobile': 'Điện thoại',
+  'Staff Reviews': 'Đánh giá nhân viên',
 
   //插件的国际化
   "Pull to refresh": "Kéo để làm mới",

+ 5 - 1
packages/cs_resources/lib/local/language/zh_CN.dart

@@ -213,7 +213,11 @@ const Map<String, String> zh_CN = {
   'Applied': '已通过',
   'No Show': '缺席',
   'Modify': '修改',
-  'Subtract Hour': '扣除小时',
+  'Subtract Hours': '扣除小时',
+  'Hourly Rate': '时薪',
+  'Reviews': '评价',
+  'Mobile': '电话',
+  'Staff Reviews': '员工评价',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',

+ 0 - 1
packages/cs_router/lib/componentRouter/job_service.dart

@@ -8,5 +8,4 @@ abstract class JobService {
 
   void startJobListPage();
 
-  void startStaffDetailPage(String? memberId);
 }

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

@@ -48,6 +48,7 @@ class RouterPath {
   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'; //工作列表已申请列表员工的评论列表(新加坡)
 
 
   //全局其他