Explorar el Código

员工详情的接口与页面

liukai hace 7 meses
padre
commit
a1e8be322e
Se han modificado 25 ficheros con 2010 adiciones y 6 borrados
  1. 151 0
      packages/cpt_job/lib/modules/applied_staff_detail/applied_staff_detail_controller.dart
  2. 135 0
      packages/cpt_job/lib/modules/applied_staff_detail/applied_staff_detail_page.dart
  3. 15 0
      packages/cpt_job/lib/modules/applied_staff_detail/applied_staff_detail_state.dart
  4. 288 0
      packages/cpt_job/lib/modules/applied_staff_detail/staff_detail_widget.dart
  5. 333 0
      packages/cpt_job/lib/modules/applied_staff_detail/staff_labour_history_item.dart
  6. 7 0
      packages/cpt_job/lib/modules/applied_staff_reviews/applied_staff_reviews_controller.dart
  7. 72 0
      packages/cpt_job/lib/modules/applied_staff_reviews/applied_staff_reviews_page.dart
  8. 4 0
      packages/cpt_job/lib/modules/applied_staff_reviews/applied_staff_reviews_state.dart
  9. 3 0
      packages/cpt_job/lib/modules/job_applied/applied_staff_item.dart
  10. 6 1
      packages/cpt_job/lib/modules/job_applied/job_applied_controller.dart
  11. 3 0
      packages/cpt_job/lib/modules/job_applied/job_applied_page.dart
  12. 15 1
      packages/cpt_job/lib/router/page_router.dart
  13. 9 0
      packages/cs_domain/lib/constants/api_constants.dart
  14. 39 0
      packages/cs_domain/lib/entity/response/staff_detail_entity.dart
  15. 153 0
      packages/cs_domain/lib/entity/response/staff_labour_history_entity.dart
  16. 48 0
      packages/cs_domain/lib/entity/response/staff_remark_history_entity.dart
  17. 39 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  18. 124 0
      packages/cs_domain/lib/generated/json/staff_detail_entity.g.dart
  19. 365 0
      packages/cs_domain/lib/generated/json/staff_labour_history_entity.g.dart
  20. 100 0
      packages/cs_domain/lib/generated/json/staff_remark_history_entity.g.dart
  21. 97 3
      packages/cs_domain/lib/repository/job_repository.dart
  22. 1 0
      packages/cs_resources/lib/constants/color_constants.dart
  23. 1 0
      packages/cs_resources/lib/local/language/en_US.dart
  24. 1 0
      packages/cs_resources/lib/local/language/zh_CN.dart
  25. 1 1
      packages/cs_widgets/lib/load_state_layout.dart

+ 151 - 0
packages/cpt_job/lib/modules/applied_staff_detail/applied_staff_detail_controller.dart

@@ -0,0 +1,151 @@
+import 'package:domain/entity/response/staff_detail_entity.dart';
+import 'package:domain/entity/response/staff_labour_history_entity.dart';
+import 'package:domain/repository/job_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_detail_state.dart';
+
+class AppliedStaffDetailController extends GetxController with DioCancelableMixin {
+  final JobRepository _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.fetchStaffLabourHistory(
+        state.memberId,
+        state.keyword,
+        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<StaffLabourHistoryEntity>;
+    var detailResult = results[1] as HttpResult<StaffDetailEntity>;
+
+    //详情数据
+    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<StaffLabourHistoryRows>? 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);
+      }
+    }
+  }
+
+  // 执行搜索
+  void doSearch(String keyword) {
+    state.keyword = keyword;
+    //赋值之后刷新
+    // refreshController.callRefresh();
+    _isSearch = true;
+    onRefresh();
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchStaffDetail();
+  }
+
+  @override
+  void onClose() {
+    super.onClose();
+  }
+}

+ 135 - 0
packages/cpt_job/lib/modules/applied_staff_detail/applied_staff_detail_page.dart

@@ -0,0 +1,135 @@
+import 'package:cpt_job/modules/applied_staff_detail/staff_detail_widget.dart';
+import 'package:cpt_job/modules/applied_staff_detail/staff_labour_history_item.dart';
+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_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/search_app_bar.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';
+
+class AppliedStaffDetailPage extends BaseStatefulPage<AppliedStaffDetailController> {
+  AppliedStaffDetailPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance(String? memberId) {
+    return Get.start(RouterPath.JOB_APPLIED_STAFF_DETAIL, 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 Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(context, "Staff Detail".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: 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),
+                  ),
+
+                  //中间搜索布局
+                  SliverToBoxAdapter(
+                    child: _buildSearchWidget(),
+                  ),
+
+                  //底部工作历史列表
+                  SliverList(
+                      delegate: SliverChildBuilderDelegate(
+                    (context, index) {
+                      return StaffLabourHistoryItem(index: index, item: state.datas[index]);
+                    },
+                    childCount: state.datas.length,
+                  ))
+                ],
+              ),
+            ),
+          ),
+        ),
+      );
+    });
+  }
+
+  // 搜索的布局
+  Widget _buildSearchWidget() {
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        MyTextView(
+          "Job History",
+          marginLeft: 15,
+          marginTop: 10,
+          fontSize: 17,
+          textColor: ColorConstants.white,
+          isFontMedium: true,
+        ),
+        SearchAppBar(
+          value: state.keyword,
+          searchBarHeight: 38,
+          onSearch: (keyword) {
+            controller.doSearch(keyword);
+          },
+          hintText: "Job Title".tr,
+        ).marginOnly(left: 16.5, right: 1.5, bottom: 10, top: 10),
+      ],
+    );
+  }
+}

+ 15 - 0
packages/cpt_job/lib/modules/applied_staff_detail/applied_staff_detail_state.dart

@@ -0,0 +1,15 @@
+import 'package:domain/entity/response/staff_detail_entity.dart';
+import 'package:domain/entity/response/staff_labour_history_entity.dart';
+import 'package:flutter/cupertino.dart';
+
+class AppliedStaffDetailState {
+
+  TextEditingController? searchController;
+
+  String? memberId;
+  String keyword = "";
+
+  StaffDetailEntity? detail;
+  List<StaffLabourHistoryRows> datas = [];
+
+}

+ 288 - 0
packages/cpt_job/lib/modules/applied_staff_detail/staff_detail_widget.dart

@@ -0,0 +1,288 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/staff_detail_entity.dart';
+import 'package:domain/entity/response/staff_labour_history_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/ext/ex_widget.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+/**
+ * 员工的做工记录
+ */
+class StaffDetailWidget extends StatelessWidget {
+
+  final StaffDetailEntity? detail;
+
+  StaffDetailWidget({
+    required this.detail,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      margin: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
+      decoration: BoxDecoration(
+        color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(5), // 设置圆角
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          //头像
+          Center(
+              child: MyLoadImage(
+                detail?.avatar,
+                width: 100,
+                height: 100,
+              )).marginOnly(top: 25, bottom: 15),
+
+          //姓名
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Name:",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.name ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22),
+
+          //性别
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Gender:",
+                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(
+                "DOB:",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.dob ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //身份证
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "NRIC:",
+                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:",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                "${detail?.remRate.toString() ?? "-"} (${detail?.remNum.toString() ?? "0"} Reviews)",
+                marginLeft: 5,
+                textColor: ColorConstants.textGreen0AC074,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //电话号码
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Mobile:",
+                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(
+                "Email:",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.email ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //国籍
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Nationality:",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.natl ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //语言
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Language:",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.lang ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //地址
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Address:",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.address ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //紧急联系人
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Emergency Name:",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.emerName ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
+          //紧急联系人电话
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Emergency Phone:",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.emerPhone ?? "-",
+                marginLeft: 5,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10, bottom: 26),
+        ],
+      ),
+    );
+  }
+}

+ 333 - 0
packages/cpt_job/lib/modules/applied_staff_detail/staff_labour_history_item.dart

@@ -0,0 +1,333 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/staff_labour_history_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/ext/ex_widget.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+/**
+ * 员工的做工记录
+ */
+class StaffLabourHistoryItem extends StatelessWidget {
+  final int index;
+  final StaffLabourHistoryRows 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(
+                "Staff Name:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //姓名
+              MyTextView(
+                item.staffName ?? "-",
+                isFontRegular: true,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                marginLeft: 5,
+                marginRight: 5,
+              ).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(
+                "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(
+                "Security In:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //时间
+              MyTextView(
+                item.securityIn?.time ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: item.securityIn?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          // 工作地签到时间
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Work In:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //时间
+              MyTextView(
+                item.workIn?.time ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: item.workIn?.changed == 1 ? ColorConstants.textRedFF6262 : 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(
+                "Work Out:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //时间
+              MyTextView(
+                item.workOut?.time ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: item.workOut?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          // 门卫签出时间
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Security Out:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //时间
+              MyTextView(
+                item.securityOut?.time ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: item.securityOut?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          // 申请时间
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Applied At:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //发布状态
+              MyTextView(
+                item.appliedAt ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).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: "Completed" == item.statusShow
+                    ? ColorConstants.textGreen05DC82
+                    : "Cancelled" == item.statusShow || "Rejected" == item.statusShow
+                        ? ColorConstants.textRedFF6262
+                        : "Revised" == item.statusShow || "Pending" == item.statusShow || "Approve" == item.statusShow
+                            ? ColorConstants.textYellowFFBB1B
+                            : ColorConstants.textBlue06D9FF,  //默认蓝色
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+        ],
+      ),
+    );
+  }
+}

+ 7 - 0
packages/cpt_job/lib/modules/applied_staff_reviews/applied_staff_reviews_controller.dart

@@ -0,0 +1,7 @@
+import 'package:get/get.dart';
+
+import 'applied_staff_reviews_state.dart';
+
+class AppliedStaffReviewsController extends GetxController {
+  final AppliedStaffReviewsState state = AppliedStaffReviewsState();
+}

+ 72 - 0
packages/cpt_job/lib/modules/applied_staff_reviews/applied_staff_reviews_page.dart

@@ -0,0 +1,72 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.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_state.dart';
+
+class AppliedStaffReviewsPage extends BaseStatefulPage<AppliedStaffReviewsController> {
+  AppliedStaffReviewsPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance(String? memberId) {
+    return Get.start(RouterPath.JOB_APPLIED_STAFF_REVIEWS, arguments: {'memberId': memberId});
+  }
+
+  @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'];
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(context, "Reset Password".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: Container(),
+          ),
+        ),
+      );
+    });
+  }
+}

+ 4 - 0
packages/cpt_job/lib/modules/applied_staff_reviews/applied_staff_reviews_state.dart

@@ -0,0 +1,4 @@
+class AppliedStaffReviewsState {
+
+  String? memberId;
+}

+ 3 - 0
packages/cpt_job/lib/modules/job_applied/applied_staff_item.dart

@@ -23,6 +23,7 @@ class AppliedStaffItem extends StatelessWidget {
   final VoidCallback? onEditAction;
   final VoidCallback? onRemarkAction;
   final VoidCallback? onItemAction;
+  final VoidCallback? onMemberAction;
 
   AppliedStaffItem({
     required this.index,
@@ -32,6 +33,7 @@ class AppliedStaffItem extends StatelessWidget {
     this.onRemarkAction,
     this.onEditAction,
     this.onItemAction,
+    this.onMemberAction,
   });
 
   @override
@@ -73,6 +75,7 @@ class AppliedStaffItem extends StatelessWidget {
                 decorationThickness: 2.0,
                 // 可选,设置下划线的粗细
                 decorationStyle: TextDecorationStyle.solid,
+                onClick: onMemberAction,
               ).expanded(),
 
               //是否选中

+ 6 - 1
packages/cpt_job/lib/modules/job_applied/job_applied_controller.dart

@@ -1,3 +1,4 @@
+import 'package:cpt_job/modules/applied_staff_detail/applied_staff_detail_page.dart';
 import 'package:cpt_job/modules/job_applied_edit/job_applied_edit_page.dart';
 import 'package:cpt_job/widget/applied_staff_reviews.dart';
 import 'package:domain/entity/response/job_list_applied_staff_list_entity.dart';
@@ -168,7 +169,6 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
     bus.off(AppConstant.eventAppliedListRefresh, subscribe);
   }
 
-
   /// 搜索员工
   void doSearch(String keyword) {
     state.keyword = keyword;
@@ -257,6 +257,11 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
     AppliedWorkflowPage.startInstance(data.appliedId.toString());
   }
 
+  /// 去查看员工详情页面
+  void gotoStaffDetailPage(JobListAppliedStaffListRows data) {
+    AppliedStaffDetailPage.startInstance(data.memberId.toString());
+  }
+
   /// Item选中与未选中设置
   void doSelectedOrNot(JobListAppliedStaffListRows data) {
     //只有 Approve = 3 的状态才能选中

+ 3 - 0
packages/cpt_job/lib/modules/job_applied/job_applied_page.dart

@@ -157,6 +157,9 @@ class _JobAppliedState extends BaseState<JobAppliedPage, JobAppliedController> {
                             onItemAction: () {
                               controller.doSelectedOrNot(state.datas[index]);
                             },
+                            onMemberAction: (){
+                              controller.gotoStaffDetailPage(state.datas[index]);
+                            },
                           );
                         },
                         childCount: state.datas.length,

+ 15 - 1
packages/cpt_job/lib/router/page_router.dart

@@ -1,3 +1,5 @@
+import 'package:cpt_job/modules/applied_staff_detail/applied_staff_detail_page.dart';
+import 'package:cpt_job/modules/applied_staff_reviews/applied_staff_reviews_page.dart';
 import 'package:cpt_job/modules/applied_workflow/applied_workflow_page.dart';
 import 'package:cpt_job/modules/job_applied/job_applied_page.dart';
 import 'package:cpt_job/modules/job_applied_edit/job_applied_edit_page.dart';
@@ -40,11 +42,23 @@ class JobPageRouter {
       page: () => AppliedWorkflowPage(),
     ),
 
-    //工作已申请列表
+    //编辑申请
     GetPage(
       name: RouterPath.JOB_APPLIED_STAFF_EDIT,
       page: () => JobAppliedEditPage(),
     ),
 
+    //员工详情
+    GetPage(
+      name: RouterPath.JOB_APPLIED_STAFF_DETAIL,
+      page: () => AppliedStaffDetailPage(),
+    ),
+
+    //员工评价
+    GetPage(
+      name: RouterPath.JOB_APPLIED_STAFF_REVIEWS,
+      page: () => AppliedStaffReviewsPage(),
+    ),
+
   ];
 }

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

@@ -94,6 +94,15 @@ class ApiConstants {
   // 工作已申请员工列表- 提交指定员工们到审核流程
   static const apiJobListAppliedApprove = "/index.php/api/v1/hotel/applied/approve";
 
+  //员工详情
+  static const apiJobListStaffDetail = "/index.php/api/v1/hotel/member/detail";
+
+  //员工做工历史记录
+  static const apiJobListStaffLabourHistory = "/index.php/api/v1/hotel/member/history";
+
+  //员工做工评价记录
+  static const apiJobListStaffRemarkHistory = "/index.php/api/v1/hotel/member/remarks";
+
   // =========================== 签到签出 ↓=========================================
 
   // 用户签到签出列表

+ 39 - 0
packages/cs_domain/lib/entity/response/staff_detail_entity.dart

@@ -0,0 +1,39 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/staff_detail_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/staff_detail_entity.g.dart';
+
+@JsonSerializable()
+class StaffDetailEntity {
+	@JSONField(name: "member_id")
+	int memberId = 0;
+	String? name = null;
+	String? avatar = null;
+	String? sex = null;
+	String? dob = null;
+	String? nric = null;
+	String? mobile = null;
+	String? email = null;
+	String? address = null;
+	String? natl = null;
+	String? lang = null;
+	@JSONField(name: "emer_name")
+	String? emerName = null;
+	@JSONField(name: "emer_phone")
+	String? emerPhone = null;
+	@JSONField(name: "rem_num")
+	int remNum = 0;
+	@JSONField(name: "rem_rate")
+	double remRate = 5.0;
+
+	StaffDetailEntity();
+
+	factory StaffDetailEntity.fromJson(Map<String, dynamic> json) => $StaffDetailEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffDetailEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 153 - 0
packages/cs_domain/lib/entity/response/staff_labour_history_entity.dart

@@ -0,0 +1,153 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/staff_labour_history_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/staff_labour_history_entity.g.dart';
+
+@JsonSerializable()
+class StaffLabourHistoryEntity {
+	int total = 0;
+	List<StaffLabourHistoryRows>? rows = [];
+
+	StaffLabourHistoryEntity();
+
+	factory StaffLabourHistoryEntity.fromJson(Map<String, dynamic> json) => $StaffLabourHistoryEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffLabourHistoryEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class StaffLabourHistoryRows {
+	@JSONField(name: "applied_id")
+	int appliedId = 0;
+	@JSONField(name: "member_id")
+	int memberId = 0;
+	@JSONField(name: "staff_name")
+	String? staffName = null;
+	@JSONField(name: "job_date")
+	String? jobDate = null;
+	@JSONField(name: "job_title")
+	String? jobTitle = null;
+	@JSONField(name: "outlet_name")
+	String? outletName = null;
+	@JSONField(name: "start_time")
+	String? startTime = null;
+	@JSONField(name: "end_time")
+	String? endTime = null;
+	@JSONField(name: "adjust_show")
+	String? adjustShow = null;
+	@JSONField(name: "total_show")
+	String? totalShow = null;
+	@JSONField(name: "total_rooms")
+	int totalRooms = 0;
+	int status = 0;
+	@JSONField(name: "status_show")
+	String? statusShow = null;
+	@JSONField(name: "applied_at")
+	String? appliedAt = null;
+	@JSONField(name: "security_in")
+	StaffLabourHistoryRowsSecurityIn? securityIn;
+	@JSONField(name: "security_out")
+	StaffLabourHistoryRowsSecurityOut? securityOut;
+	@JSONField(name: "work_in")
+	StaffLabourHistoryRowsWorkIn? workIn;
+	@JSONField(name: "work_out")
+	StaffLabourHistoryRowsWorkOut? workOut;
+	@JSONField(name: "s_in")
+	int sIn = 0;
+	@JSONField(name: "s_out")
+	int sOut = 0;
+	@JSONField(name: "w_in")
+	int wIn = 0;
+	@JSONField(name: "w_out")
+	int wOut = 0;
+	@JSONField(name: "action_list")
+	List<String>? actionList = [];
+
+	StaffLabourHistoryRows();
+
+	factory StaffLabourHistoryRows.fromJson(Map<String, dynamic> json) => $StaffLabourHistoryRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffLabourHistoryRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class StaffLabourHistoryRowsSecurityIn {
+	String? time = null;
+	dynamic image;
+	int? changed = 0;
+
+	StaffLabourHistoryRowsSecurityIn();
+
+	factory StaffLabourHistoryRowsSecurityIn.fromJson(Map<String, dynamic> json) => $StaffLabourHistoryRowsSecurityInFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffLabourHistoryRowsSecurityInToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class StaffLabourHistoryRowsSecurityOut {
+	String? time = null;
+	dynamic image;
+	int? changed = 0;
+
+	StaffLabourHistoryRowsSecurityOut();
+
+	factory StaffLabourHistoryRowsSecurityOut.fromJson(Map<String, dynamic> json) => $StaffLabourHistoryRowsSecurityOutFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffLabourHistoryRowsSecurityOutToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class StaffLabourHistoryRowsWorkIn {
+	String? time = null;
+	dynamic image;
+	int? changed = 0;
+
+	StaffLabourHistoryRowsWorkIn();
+
+	factory StaffLabourHistoryRowsWorkIn.fromJson(Map<String, dynamic> json) => $StaffLabourHistoryRowsWorkInFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffLabourHistoryRowsWorkInToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class StaffLabourHistoryRowsWorkOut {
+	String? time = null;
+	dynamic image;
+	int? changed = 0;
+
+	StaffLabourHistoryRowsWorkOut();
+
+	factory StaffLabourHistoryRowsWorkOut.fromJson(Map<String, dynamic> json) => $StaffLabourHistoryRowsWorkOutFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffLabourHistoryRowsWorkOutToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

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

@@ -0,0 +1,48 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/staff_remark_history_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/staff_remark_history_entity.g.dart';
+
+@JsonSerializable()
+class StaffRemarkHistoryEntity {
+	int total = 0;
+	List<StaffRemarkHistoryRows>? rows = [];
+
+	StaffRemarkHistoryEntity();
+
+	factory StaffRemarkHistoryEntity.fromJson(Map<String, dynamic> json) => $StaffRemarkHistoryEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffRemarkHistoryEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class StaffRemarkHistoryRows {
+	String? company = null;
+	@JSONField(name: "attitude_rate")
+	int attitudeRate = 0;
+	@JSONField(name: "grooming_rate")
+	int groomingRate = 0;
+	@JSONField(name: "performance_rate")
+	int performanceRate = 0;
+	@JSONField(name: "experience_rate")
+	int experienceRate = 0;
+	String? feedback = null;
+	@JSONField(name: "created_at")
+	String? createdAt = null;
+
+	StaffRemarkHistoryRows();
+
+	factory StaffRemarkHistoryRows.fromJson(Map<String, dynamic> json) => $StaffRemarkHistoryRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $StaffRemarkHistoryRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

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

@@ -21,6 +21,9 @@ 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';
 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_labour_history_entity.dart';
+import 'package:domain/entity/response/staff_remark_history_entity.dart';
 import 'package:domain/entity/server_time.dart';
 
 JsonConvert jsonConvert = JsonConvert();
@@ -263,6 +266,33 @@ class JsonConvert {
     if (<LabourRequestWorkFlowRecords>[] is M) {
       return data.map<LabourRequestWorkFlowRecords>((Map<String, dynamic> e) => LabourRequestWorkFlowRecords.fromJson(e)).toList() as M;
     }
+    if (<StaffDetailEntity>[] is M) {
+      return data.map<StaffDetailEntity>((Map<String, dynamic> e) => StaffDetailEntity.fromJson(e)).toList() as M;
+    }
+    if (<StaffLabourHistoryEntity>[] is M) {
+      return data.map<StaffLabourHistoryEntity>((Map<String, dynamic> e) => StaffLabourHistoryEntity.fromJson(e)).toList() as M;
+    }
+    if (<StaffLabourHistoryRows>[] is M) {
+      return data.map<StaffLabourHistoryRows>((Map<String, dynamic> e) => StaffLabourHistoryRows.fromJson(e)).toList() as M;
+    }
+    if (<StaffLabourHistoryRowsSecurityIn>[] is M) {
+      return data.map<StaffLabourHistoryRowsSecurityIn>((Map<String, dynamic> e) => StaffLabourHistoryRowsSecurityIn.fromJson(e)).toList() as M;
+    }
+    if (<StaffLabourHistoryRowsSecurityOut>[] is M) {
+      return data.map<StaffLabourHistoryRowsSecurityOut>((Map<String, dynamic> e) => StaffLabourHistoryRowsSecurityOut.fromJson(e)).toList() as M;
+    }
+    if (<StaffLabourHistoryRowsWorkIn>[] is M) {
+      return data.map<StaffLabourHistoryRowsWorkIn>((Map<String, dynamic> e) => StaffLabourHistoryRowsWorkIn.fromJson(e)).toList() as M;
+    }
+    if (<StaffLabourHistoryRowsWorkOut>[] is M) {
+      return data.map<StaffLabourHistoryRowsWorkOut>((Map<String, dynamic> e) => StaffLabourHistoryRowsWorkOut.fromJson(e)).toList() as M;
+    }
+    if (<StaffRemarkHistoryEntity>[] is M) {
+      return data.map<StaffRemarkHistoryEntity>((Map<String, dynamic> e) => StaffRemarkHistoryEntity.fromJson(e)).toList() as M;
+    }
+    if (<StaffRemarkHistoryRows>[] is M) {
+      return data.map<StaffRemarkHistoryRows>((Map<String, dynamic> e) => StaffRemarkHistoryRows.fromJson(e)).toList() as M;
+    }
     if (<ServerTime>[] is M) {
       return data.map<ServerTime>((Map<String, dynamic> e) => ServerTime.fromJson(e)).toList() as M;
     }
@@ -324,6 +354,15 @@ class JsonConvertClassCollection {
     (LabourRequestListRows).toString(): LabourRequestListRows.fromJson,
     (LabourRequestWorkFlowEntity).toString(): LabourRequestWorkFlowEntity.fromJson,
     (LabourRequestWorkFlowRecords).toString(): LabourRequestWorkFlowRecords.fromJson,
+    (StaffDetailEntity).toString(): StaffDetailEntity.fromJson,
+    (StaffLabourHistoryEntity).toString(): StaffLabourHistoryEntity.fromJson,
+    (StaffLabourHistoryRows).toString(): StaffLabourHistoryRows.fromJson,
+    (StaffLabourHistoryRowsSecurityIn).toString(): StaffLabourHistoryRowsSecurityIn.fromJson,
+    (StaffLabourHistoryRowsSecurityOut).toString(): StaffLabourHistoryRowsSecurityOut.fromJson,
+    (StaffLabourHistoryRowsWorkIn).toString(): StaffLabourHistoryRowsWorkIn.fromJson,
+    (StaffLabourHistoryRowsWorkOut).toString(): StaffLabourHistoryRowsWorkOut.fromJson,
+    (StaffRemarkHistoryEntity).toString(): StaffRemarkHistoryEntity.fromJson,
+    (StaffRemarkHistoryRows).toString(): StaffRemarkHistoryRows.fromJson,
     (ServerTime).toString(): ServerTime.fromJson,
   };
 

+ 124 - 0
packages/cs_domain/lib/generated/json/staff_detail_entity.g.dart

@@ -0,0 +1,124 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/staff_detail_entity.dart';
+
+StaffDetailEntity $StaffDetailEntityFromJson(Map<String, dynamic> json) {
+  final StaffDetailEntity staffDetailEntity = StaffDetailEntity();
+  final int? memberId = jsonConvert.convert<int>(json['member_id']);
+  if (memberId != null) {
+    staffDetailEntity.memberId = memberId;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    staffDetailEntity.name = name;
+  }
+  final String? avatar = jsonConvert.convert<String>(json['avatar']);
+  if (avatar != null) {
+    staffDetailEntity.avatar = avatar;
+  }
+  final String? sex = jsonConvert.convert<String>(json['sex']);
+  if (sex != null) {
+    staffDetailEntity.sex = sex;
+  }
+  final String? dob = jsonConvert.convert<String>(json['dob']);
+  if (dob != null) {
+    staffDetailEntity.dob = dob;
+  }
+  final String? nric = jsonConvert.convert<String>(json['nric']);
+  if (nric != null) {
+    staffDetailEntity.nric = nric;
+  }
+  final String? mobile = jsonConvert.convert<String>(json['mobile']);
+  if (mobile != null) {
+    staffDetailEntity.mobile = mobile;
+  }
+  final String? email = jsonConvert.convert<String>(json['email']);
+  if (email != null) {
+    staffDetailEntity.email = email;
+  }
+  final String? address = jsonConvert.convert<String>(json['address']);
+  if (address != null) {
+    staffDetailEntity.address = address;
+  }
+  final String? natl = jsonConvert.convert<String>(json['natl']);
+  if (natl != null) {
+    staffDetailEntity.natl = natl;
+  }
+  final String? lang = jsonConvert.convert<String>(json['lang']);
+  if (lang != null) {
+    staffDetailEntity.lang = lang;
+  }
+  final String? emerName = jsonConvert.convert<String>(json['emer_name']);
+  if (emerName != null) {
+    staffDetailEntity.emerName = emerName;
+  }
+  final String? emerPhone = jsonConvert.convert<String>(json['emer_phone']);
+  if (emerPhone != null) {
+    staffDetailEntity.emerPhone = emerPhone;
+  }
+  final int? remNum = jsonConvert.convert<int>(json['rem_num']);
+  if (remNum != null) {
+    staffDetailEntity.remNum = remNum;
+  }
+  final double? remRate = jsonConvert.convert<double>(json['rem_rate']);
+  if (remRate != null) {
+    staffDetailEntity.remRate = remRate;
+  }
+  return staffDetailEntity;
+}
+
+Map<String, dynamic> $StaffDetailEntityToJson(StaffDetailEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['member_id'] = entity.memberId;
+  data['name'] = entity.name;
+  data['avatar'] = entity.avatar;
+  data['sex'] = entity.sex;
+  data['dob'] = entity.dob;
+  data['nric'] = entity.nric;
+  data['mobile'] = entity.mobile;
+  data['email'] = entity.email;
+  data['address'] = entity.address;
+  data['natl'] = entity.natl;
+  data['lang'] = entity.lang;
+  data['emer_name'] = entity.emerName;
+  data['emer_phone'] = entity.emerPhone;
+  data['rem_num'] = entity.remNum;
+  data['rem_rate'] = entity.remRate;
+  return data;
+}
+
+extension StaffDetailEntityExtension on StaffDetailEntity {
+  StaffDetailEntity copyWith({
+    int? memberId,
+    String? name,
+    String? avatar,
+    String? sex,
+    String? dob,
+    String? nric,
+    String? mobile,
+    String? email,
+    String? address,
+    String? natl,
+    String? lang,
+    String? emerName,
+    String? emerPhone,
+    int? remNum,
+    double? remRate,
+  }) {
+    return StaffDetailEntity()
+      ..memberId = memberId ?? this.memberId
+      ..name = name ?? this.name
+      ..avatar = avatar ?? this.avatar
+      ..sex = sex ?? this.sex
+      ..dob = dob ?? this.dob
+      ..nric = nric ?? this.nric
+      ..mobile = mobile ?? this.mobile
+      ..email = email ?? this.email
+      ..address = address ?? this.address
+      ..natl = natl ?? this.natl
+      ..lang = lang ?? this.lang
+      ..emerName = emerName ?? this.emerName
+      ..emerPhone = emerPhone ?? this.emerPhone
+      ..remNum = remNum ?? this.remNum
+      ..remRate = remRate ?? this.remRate;
+  }
+}

+ 365 - 0
packages/cs_domain/lib/generated/json/staff_labour_history_entity.g.dart

@@ -0,0 +1,365 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/staff_labour_history_entity.dart';
+
+StaffLabourHistoryEntity $StaffLabourHistoryEntityFromJson(Map<String, dynamic> json) {
+  final StaffLabourHistoryEntity staffLabourHistoryEntity = StaffLabourHistoryEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    staffLabourHistoryEntity.total = total;
+  }
+  final List<StaffLabourHistoryRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<StaffLabourHistoryRows>(e) as StaffLabourHistoryRows).toList();
+  if (rows != null) {
+    staffLabourHistoryEntity.rows = rows;
+  }
+  return staffLabourHistoryEntity;
+}
+
+Map<String, dynamic> $StaffLabourHistoryEntityToJson(StaffLabourHistoryEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension StaffLabourHistoryEntityExtension on StaffLabourHistoryEntity {
+  StaffLabourHistoryEntity copyWith({
+    int? total,
+    List<StaffLabourHistoryRows>? rows,
+  }) {
+    return StaffLabourHistoryEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+StaffLabourHistoryRows $StaffLabourHistoryRowsFromJson(Map<String, dynamic> json) {
+  final StaffLabourHistoryRows staffLabourHistoryRows = StaffLabourHistoryRows();
+  final int? appliedId = jsonConvert.convert<int>(json['applied_id']);
+  if (appliedId != null) {
+    staffLabourHistoryRows.appliedId = appliedId;
+  }
+  final int? memberId = jsonConvert.convert<int>(json['member_id']);
+  if (memberId != null) {
+    staffLabourHistoryRows.memberId = memberId;
+  }
+  final String? staffName = jsonConvert.convert<String>(json['staff_name']);
+  if (staffName != null) {
+    staffLabourHistoryRows.staffName = staffName;
+  }
+  final String? jobDate = jsonConvert.convert<String>(json['job_date']);
+  if (jobDate != null) {
+    staffLabourHistoryRows.jobDate = jobDate;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    staffLabourHistoryRows.jobTitle = jobTitle;
+  }
+  final String? outletName = jsonConvert.convert<String>(json['outlet_name']);
+  if (outletName != null) {
+    staffLabourHistoryRows.outletName = outletName;
+  }
+  final String? startTime = jsonConvert.convert<String>(json['start_time']);
+  if (startTime != null) {
+    staffLabourHistoryRows.startTime = startTime;
+  }
+  final String? endTime = jsonConvert.convert<String>(json['end_time']);
+  if (endTime != null) {
+    staffLabourHistoryRows.endTime = endTime;
+  }
+  final String? adjustShow = jsonConvert.convert<String>(json['adjust_show']);
+  if (adjustShow != null) {
+    staffLabourHistoryRows.adjustShow = adjustShow;
+  }
+  final String? totalShow = jsonConvert.convert<String>(json['total_show']);
+  if (totalShow != null) {
+    staffLabourHistoryRows.totalShow = totalShow;
+  }
+  final int? totalRooms = jsonConvert.convert<int>(json['total_rooms']);
+  if (totalRooms != null) {
+    staffLabourHistoryRows.totalRooms = totalRooms;
+  }
+  final int? status = jsonConvert.convert<int>(json['status']);
+  if (status != null) {
+    staffLabourHistoryRows.status = status;
+  }
+  final String? statusShow = jsonConvert.convert<String>(json['status_show']);
+  if (statusShow != null) {
+    staffLabourHistoryRows.statusShow = statusShow;
+  }
+  final String? appliedAt = jsonConvert.convert<String>(json['applied_at']);
+  if (appliedAt != null) {
+    staffLabourHistoryRows.appliedAt = appliedAt;
+  }
+  final StaffLabourHistoryRowsSecurityIn? securityIn = jsonConvert.convert<StaffLabourHistoryRowsSecurityIn>(json['security_in']);
+  if (securityIn != null) {
+    staffLabourHistoryRows.securityIn = securityIn;
+  }
+  final StaffLabourHistoryRowsSecurityOut? securityOut = jsonConvert.convert<StaffLabourHistoryRowsSecurityOut>(json['security_out']);
+  if (securityOut != null) {
+    staffLabourHistoryRows.securityOut = securityOut;
+  }
+  final StaffLabourHistoryRowsWorkIn? workIn = jsonConvert.convert<StaffLabourHistoryRowsWorkIn>(json['work_in']);
+  if (workIn != null) {
+    staffLabourHistoryRows.workIn = workIn;
+  }
+  final StaffLabourHistoryRowsWorkOut? workOut = jsonConvert.convert<StaffLabourHistoryRowsWorkOut>(json['work_out']);
+  if (workOut != null) {
+    staffLabourHistoryRows.workOut = workOut;
+  }
+  final int? sIn = jsonConvert.convert<int>(json['s_in']);
+  if (sIn != null) {
+    staffLabourHistoryRows.sIn = sIn;
+  }
+  final int? sOut = jsonConvert.convert<int>(json['s_out']);
+  if (sOut != null) {
+    staffLabourHistoryRows.sOut = sOut;
+  }
+  final int? wIn = jsonConvert.convert<int>(json['w_in']);
+  if (wIn != null) {
+    staffLabourHistoryRows.wIn = wIn;
+  }
+  final int? wOut = jsonConvert.convert<int>(json['w_out']);
+  if (wOut != null) {
+    staffLabourHistoryRows.wOut = wOut;
+  }
+  final List<String>? actionList = (json['action_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<String>(e) as String).toList();
+  if (actionList != null) {
+    staffLabourHistoryRows.actionList = actionList;
+  }
+  return staffLabourHistoryRows;
+}
+
+Map<String, dynamic> $StaffLabourHistoryRowsToJson(StaffLabourHistoryRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['applied_id'] = entity.appliedId;
+  data['member_id'] = entity.memberId;
+  data['staff_name'] = entity.staffName;
+  data['job_date'] = entity.jobDate;
+  data['job_title'] = entity.jobTitle;
+  data['outlet_name'] = entity.outletName;
+  data['start_time'] = entity.startTime;
+  data['end_time'] = entity.endTime;
+  data['adjust_show'] = entity.adjustShow;
+  data['total_show'] = entity.totalShow;
+  data['total_rooms'] = entity.totalRooms;
+  data['status'] = entity.status;
+  data['status_show'] = entity.statusShow;
+  data['applied_at'] = entity.appliedAt;
+  data['security_in'] = entity.securityIn?.toJson();
+  data['security_out'] = entity.securityOut?.toJson();
+  data['work_in'] = entity.workIn?.toJson();
+  data['work_out'] = entity.workOut?.toJson();
+  data['s_in'] = entity.sIn;
+  data['s_out'] = entity.sOut;
+  data['w_in'] = entity.wIn;
+  data['w_out'] = entity.wOut;
+  data['action_list'] = entity.actionList;
+  return data;
+}
+
+extension StaffLabourHistoryRowsExtension on StaffLabourHistoryRows {
+  StaffLabourHistoryRows copyWith({
+    int? appliedId,
+    int? memberId,
+    String? staffName,
+    String? jobDate,
+    String? jobTitle,
+    String? outletName,
+    String? startTime,
+    String? endTime,
+    String? adjustShow,
+    String? totalShow,
+    int? totalRooms,
+    int? status,
+    String? statusShow,
+    String? appliedAt,
+    StaffLabourHistoryRowsSecurityIn? securityIn,
+    StaffLabourHistoryRowsSecurityOut? securityOut,
+    StaffLabourHistoryRowsWorkIn? workIn,
+    StaffLabourHistoryRowsWorkOut? workOut,
+    int? sIn,
+    int? sOut,
+    int? wIn,
+    int? wOut,
+    List<String>? actionList,
+  }) {
+    return StaffLabourHistoryRows()
+      ..appliedId = appliedId ?? this.appliedId
+      ..memberId = memberId ?? this.memberId
+      ..staffName = staffName ?? this.staffName
+      ..jobDate = jobDate ?? this.jobDate
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..outletName = outletName ?? this.outletName
+      ..startTime = startTime ?? this.startTime
+      ..endTime = endTime ?? this.endTime
+      ..adjustShow = adjustShow ?? this.adjustShow
+      ..totalShow = totalShow ?? this.totalShow
+      ..totalRooms = totalRooms ?? this.totalRooms
+      ..status = status ?? this.status
+      ..statusShow = statusShow ?? this.statusShow
+      ..appliedAt = appliedAt ?? this.appliedAt
+      ..securityIn = securityIn ?? this.securityIn
+      ..securityOut = securityOut ?? this.securityOut
+      ..workIn = workIn ?? this.workIn
+      ..workOut = workOut ?? this.workOut
+      ..sIn = sIn ?? this.sIn
+      ..sOut = sOut ?? this.sOut
+      ..wIn = wIn ?? this.wIn
+      ..wOut = wOut ?? this.wOut
+      ..actionList = actionList ?? this.actionList;
+  }
+}
+
+StaffLabourHistoryRowsSecurityIn $StaffLabourHistoryRowsSecurityInFromJson(Map<String, dynamic> json) {
+  final StaffLabourHistoryRowsSecurityIn staffLabourHistoryRowsSecurityIn = StaffLabourHistoryRowsSecurityIn();
+  final String? time = jsonConvert.convert<String>(json['time']);
+  if (time != null) {
+    staffLabourHistoryRowsSecurityIn.time = time;
+  }
+  final dynamic image = json['image'];
+  if (image != null) {
+    staffLabourHistoryRowsSecurityIn.image = image;
+  }
+  final int? changed = jsonConvert.convert<int>(json['changed']);
+  if (changed != null) {
+    staffLabourHistoryRowsSecurityIn.changed = changed;
+  }
+  return staffLabourHistoryRowsSecurityIn;
+}
+
+Map<String, dynamic> $StaffLabourHistoryRowsSecurityInToJson(StaffLabourHistoryRowsSecurityIn entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['time'] = entity.time;
+  data['image'] = entity.image;
+  data['changed'] = entity.changed;
+  return data;
+}
+
+extension StaffLabourHistoryRowsSecurityInExtension on StaffLabourHistoryRowsSecurityIn {
+  StaffLabourHistoryRowsSecurityIn copyWith({
+    String? time,
+    dynamic image,
+    int? changed,
+  }) {
+    return StaffLabourHistoryRowsSecurityIn()
+      ..time = time ?? this.time
+      ..image = image ?? this.image
+      ..changed = changed ?? this.changed;
+  }
+}
+
+StaffLabourHistoryRowsSecurityOut $StaffLabourHistoryRowsSecurityOutFromJson(Map<String, dynamic> json) {
+  final StaffLabourHistoryRowsSecurityOut staffLabourHistoryRowsSecurityOut = StaffLabourHistoryRowsSecurityOut();
+  final String? time = jsonConvert.convert<String>(json['time']);
+  if (time != null) {
+    staffLabourHistoryRowsSecurityOut.time = time;
+  }
+  final dynamic image = json['image'];
+  if (image != null) {
+    staffLabourHistoryRowsSecurityOut.image = image;
+  }
+  final int? changed = jsonConvert.convert<int>(json['changed']);
+  if (changed != null) {
+    staffLabourHistoryRowsSecurityOut.changed = changed;
+  }
+  return staffLabourHistoryRowsSecurityOut;
+}
+
+Map<String, dynamic> $StaffLabourHistoryRowsSecurityOutToJson(StaffLabourHistoryRowsSecurityOut entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['time'] = entity.time;
+  data['image'] = entity.image;
+  data['changed'] = entity.changed;
+  return data;
+}
+
+extension StaffLabourHistoryRowsSecurityOutExtension on StaffLabourHistoryRowsSecurityOut {
+  StaffLabourHistoryRowsSecurityOut copyWith({
+    String? time,
+    dynamic image,
+    int? changed,
+  }) {
+    return StaffLabourHistoryRowsSecurityOut()
+      ..time = time ?? this.time
+      ..image = image ?? this.image
+      ..changed = changed ?? this.changed;
+  }
+}
+
+StaffLabourHistoryRowsWorkIn $StaffLabourHistoryRowsWorkInFromJson(Map<String, dynamic> json) {
+  final StaffLabourHistoryRowsWorkIn staffLabourHistoryRowsWorkIn = StaffLabourHistoryRowsWorkIn();
+  final String? time = jsonConvert.convert<String>(json['time']);
+  if (time != null) {
+    staffLabourHistoryRowsWorkIn.time = time;
+  }
+  final dynamic image = json['image'];
+  if (image != null) {
+    staffLabourHistoryRowsWorkIn.image = image;
+  }
+  final int? changed = jsonConvert.convert<int>(json['changed']);
+  if (changed != null) {
+    staffLabourHistoryRowsWorkIn.changed = changed;
+  }
+  return staffLabourHistoryRowsWorkIn;
+}
+
+Map<String, dynamic> $StaffLabourHistoryRowsWorkInToJson(StaffLabourHistoryRowsWorkIn entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['time'] = entity.time;
+  data['image'] = entity.image;
+  data['changed'] = entity.changed;
+  return data;
+}
+
+extension StaffLabourHistoryRowsWorkInExtension on StaffLabourHistoryRowsWorkIn {
+  StaffLabourHistoryRowsWorkIn copyWith({
+    String? time,
+    dynamic image,
+    int? changed,
+  }) {
+    return StaffLabourHistoryRowsWorkIn()
+      ..time = time ?? this.time
+      ..image = image ?? this.image
+      ..changed = changed ?? this.changed;
+  }
+}
+
+StaffLabourHistoryRowsWorkOut $StaffLabourHistoryRowsWorkOutFromJson(Map<String, dynamic> json) {
+  final StaffLabourHistoryRowsWorkOut staffLabourHistoryRowsWorkOut = StaffLabourHistoryRowsWorkOut();
+  final String? time = jsonConvert.convert<String>(json['time']);
+  if (time != null) {
+    staffLabourHistoryRowsWorkOut.time = time;
+  }
+  final dynamic image = json['image'];
+  if (image != null) {
+    staffLabourHistoryRowsWorkOut.image = image;
+  }
+  final int? changed = jsonConvert.convert<int>(json['changed']);
+  if (changed != null) {
+    staffLabourHistoryRowsWorkOut.changed = changed;
+  }
+  return staffLabourHistoryRowsWorkOut;
+}
+
+Map<String, dynamic> $StaffLabourHistoryRowsWorkOutToJson(StaffLabourHistoryRowsWorkOut entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['time'] = entity.time;
+  data['image'] = entity.image;
+  data['changed'] = entity.changed;
+  return data;
+}
+
+extension StaffLabourHistoryRowsWorkOutExtension on StaffLabourHistoryRowsWorkOut {
+  StaffLabourHistoryRowsWorkOut copyWith({
+    String? time,
+    dynamic image,
+    int? changed,
+  }) {
+    return StaffLabourHistoryRowsWorkOut()
+      ..time = time ?? this.time
+      ..image = image ?? this.image
+      ..changed = changed ?? this.changed;
+  }
+}

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

@@ -0,0 +1,100 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/staff_remark_history_entity.dart';
+
+StaffRemarkHistoryEntity $StaffRemarkHistoryEntityFromJson(Map<String, dynamic> json) {
+  final StaffRemarkHistoryEntity staffRemarkHistoryEntity = StaffRemarkHistoryEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    staffRemarkHistoryEntity.total = total;
+  }
+  final List<StaffRemarkHistoryRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<StaffRemarkHistoryRows>(e) as StaffRemarkHistoryRows).toList();
+  if (rows != null) {
+    staffRemarkHistoryEntity.rows = rows;
+  }
+  return staffRemarkHistoryEntity;
+}
+
+Map<String, dynamic> $StaffRemarkHistoryEntityToJson(StaffRemarkHistoryEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension StaffRemarkHistoryEntityExtension on StaffRemarkHistoryEntity {
+  StaffRemarkHistoryEntity copyWith({
+    int? total,
+    List<StaffRemarkHistoryRows>? rows,
+  }) {
+    return StaffRemarkHistoryEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+StaffRemarkHistoryRows $StaffRemarkHistoryRowsFromJson(Map<String, dynamic> json) {
+  final StaffRemarkHistoryRows staffRemarkHistoryRows = StaffRemarkHistoryRows();
+  final String? company = jsonConvert.convert<String>(json['company']);
+  if (company != null) {
+    staffRemarkHistoryRows.company = company;
+  }
+  final int? attitudeRate = jsonConvert.convert<int>(json['attitude_rate']);
+  if (attitudeRate != null) {
+    staffRemarkHistoryRows.attitudeRate = attitudeRate;
+  }
+  final int? groomingRate = jsonConvert.convert<int>(json['grooming_rate']);
+  if (groomingRate != null) {
+    staffRemarkHistoryRows.groomingRate = groomingRate;
+  }
+  final int? performanceRate = jsonConvert.convert<int>(json['performance_rate']);
+  if (performanceRate != null) {
+    staffRemarkHistoryRows.performanceRate = performanceRate;
+  }
+  final int? experienceRate = jsonConvert.convert<int>(json['experience_rate']);
+  if (experienceRate != null) {
+    staffRemarkHistoryRows.experienceRate = experienceRate;
+  }
+  final String? feedback = jsonConvert.convert<String>(json['feedback']);
+  if (feedback != null) {
+    staffRemarkHistoryRows.feedback = feedback;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    staffRemarkHistoryRows.createdAt = createdAt;
+  }
+  return staffRemarkHistoryRows;
+}
+
+Map<String, dynamic> $StaffRemarkHistoryRowsToJson(StaffRemarkHistoryRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['company'] = entity.company;
+  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 StaffRemarkHistoryRowsExtension on StaffRemarkHistoryRows {
+  StaffRemarkHistoryRows copyWith({
+    String? company,
+    int? attitudeRate,
+    int? groomingRate,
+    int? performanceRate,
+    int? experienceRate,
+    String? feedback,
+    String? createdAt,
+  }) {
+    return StaffRemarkHistoryRows()
+      ..company = company ?? this.company
+      ..attitudeRate = attitudeRate ?? this.attitudeRate
+      ..groomingRate = groomingRate ?? this.groomingRate
+      ..performanceRate = performanceRate ?? this.performanceRate
+      ..experienceRate = experienceRate ?? this.experienceRate
+      ..feedback = feedback ?? this.feedback
+      ..createdAt = createdAt ?? this.createdAt;
+  }
+}

+ 97 - 3
packages/cs_domain/lib/repository/job_repository.dart

@@ -8,6 +8,9 @@ import 'package:domain/entity/response/job_list_detail_entity.dart';
 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_labour_history_entity.dart';
+import 'package:domain/entity/response/staff_remark_history_entity.dart';
 import 'package:get/get.dart';
 import 'package:plugin_platform/dio_export.dart';
 import 'package:plugin_platform/http/http_provider.dart';
@@ -627,9 +630,100 @@ class JobRepository extends GetxService {
     return result.convert();
   }
 
-// 员工的信息
+  // 员工的信息
+  Future<HttpResult<StaffDetailEntity>> fetchStaffDetail(
+    String? memberId, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    if (!Utils.isEmpty(memberId)) {
+      params["member_id"] = memberId!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListStaffDetail,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = StaffDetailEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<StaffDetailEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  // 员工的历史申请记录
+  Future<HttpResult<StaffLabourHistoryEntity>> fetchStaffLabourHistory(
+    String? memberId,
+    String? keyword, {
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "10";
+
+    if (!Utils.isEmpty(memberId)) {
+      params["member_id"] = memberId!;
+    }
+
+    if (!Utils.isEmpty(keyword)) {
+      params["keyword"] = keyword!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListStaffLabourHistory,
+      params: params,
+      cancelToken: cancelToken,
+    );
 
-// 员工的历史申请记录
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = StaffLabourHistoryEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<StaffLabourHistoryEntity>(data: data);
+    }
+    return result.convert();
+  }
 
-// 员工的历史评价记录
+  // 员工的历史评价记录
+  Future<HttpResult<StaffRemarkHistoryEntity>> fetchStaffRemarkHistory(
+    String? memberId, {
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "10";
+
+    if (!Utils.isEmpty(memberId)) {
+      params["member_id"] = memberId!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListStaffRemarkHistory,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = StaffRemarkHistoryEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<StaffRemarkHistoryEntity>(data: data);
+    }
+    return result.convert();
+  }
 }

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

@@ -29,6 +29,7 @@ class ColorConstants {
   static const Color textGray9EB0C1 = Color(0xFF9EB0C1);
   static const Color textYellowFFBB1B = Color(0xFFFFBB1B);
   static const Color textGreen05DC82 = Color(0xFF05DC82);
+  static const Color textGreen0AC074 = Color(0xFF0AC074);
   static const Color textRedFF6262 = Color(0xFFFF6262);
   static const Color textBlue06D9FF = Color(0xFF06D9FF);
 

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

@@ -137,6 +137,7 @@ const Map<String, String> en_US = {
   'Forgot to clock in/out': 'Forgot to clock in/out',
   'Technical issue': 'Technical issue',
   'Others': 'Others',
+  'Staff Detail': 'Staff Detail',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

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

@@ -137,6 +137,7 @@ const Map<String, String> zh_CN = {
   'Forgot to clock in/out': '忘记签到/签出',
   'Technical issue': '技术问题',
   'Others': '其他',
+  'Staff Detail': '员工详情',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',

+ 1 - 1
packages/cs_widgets/lib/load_state_layout.dart

@@ -12,7 +12,7 @@ enum LoadState { State_Success, State_Error, State_Loading, State_Empty }
 class LoadStateLayout extends StatefulWidget {
   final LoadState state; //页面状态
   final Widget? successWidget; //成功视图
-  final List<SliverMultiBoxAdaptorWidget>? successSliverWidget; //成功的滚动视图
+  final List<Widget>? successSliverWidget; //成功的滚动视图(Sliver的布局)
   final VoidCallback? errorRetry; //错误事件处理
   final Color? themeColor;
   String? errorMessage;