Browse Source

job applied 列表部分功能

liukai 7 months ago
parent
commit
1188567fda
33 changed files with 3010 additions and 109 deletions
  1. 428 0
      packages/cpt_labour_sg/lib/modules/job_applied/applied_staff_item.dart
  2. 57 0
      packages/cpt_labour_sg/lib/modules/job_applied/drop_down_status.dart
  3. 463 0
      packages/cpt_labour_sg/lib/modules/job_applied/job_applied_controller.dart
  4. 247 0
      packages/cpt_labour_sg/lib/modules/job_applied/job_applied_page.dart
  5. 18 0
      packages/cpt_labour_sg/lib/modules/job_applied/job_applied_state.dart
  6. 35 3
      packages/cpt_labour_sg/lib/modules/job_list/job_list_controller.dart
  7. 86 89
      packages/cpt_labour_sg/lib/modules/job_list/job_list_page.dart
  8. 17 6
      packages/cpt_labour_sg/lib/modules/job_list_edit/job_list_edit_controller.dart
  9. 7 0
      packages/cpt_labour_sg/lib/router/page_router.dart
  10. 29 0
      packages/cs_domain/lib/constants/api_constants.dart
  11. 56 0
      packages/cs_domain/lib/entity/response/job_applied_edit_index_s_g_entity.dart
  12. 47 0
      packages/cs_domain/lib/entity/response/job_applied_index_s_g_entity.dart
  13. 135 0
      packages/cs_domain/lib/entity/response/job_applied_list_s_g_entity.dart
  14. 33 0
      packages/cs_domain/lib/entity/response/job_applied_remark_view_s_g_entity.dart
  15. 50 0
      packages/cs_domain/lib/entity/response/job_applied_staff_s_g_entity.dart
  16. 49 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  17. 128 0
      packages/cs_domain/lib/generated/json/job_applied_edit_index_s_g_entity.g.dart
  18. 93 0
      packages/cs_domain/lib/generated/json/job_applied_index_s_g_entity.g.dart
  19. 346 0
      packages/cs_domain/lib/generated/json/job_applied_list_s_g_entity.g.dart
  20. 75 0
      packages/cs_domain/lib/generated/json/job_applied_remark_view_s_g_entity.g.dart
  21. 121 0
      packages/cs_domain/lib/generated/json/job_applied_staff_s_g_entity.g.dart
  22. 383 0
      packages/cs_domain/lib/repository/job_sg_repository.dart
  23. 31 0
      packages/cs_domain/lib/repository/labour_sg_repository.dart
  24. 10 10
      packages/cs_plugin_platform/lib/engine/dialog/dialog_engine.dart
  25. BIN
      packages/cs_resources/assets/base_service/border_widget_drop_down.webp
  26. 2 0
      packages/cs_resources/lib/constants/color_constants.dart
  27. 1 0
      packages/cs_resources/lib/generated/assets.dart
  28. 1 0
      packages/cs_resources/lib/local/language/en_US.dart
  29. 1 0
      packages/cs_resources/lib/local/language/vi_VN.dart
  30. 1 0
      packages/cs_resources/lib/local/language/zh_CN.dart
  31. 3 0
      packages/cs_router/lib/path/router_path.dart
  32. 4 1
      packages/cs_widgets/lib/search_app_bar.dart
  33. 53 0
      packages/cs_widgets/lib/shatter/border_select_widget.dart

+ 428 - 0
packages/cpt_labour_sg/lib/modules/job_applied/applied_staff_item.dart

@@ -0,0 +1,428 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/job_applied_list_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:plugin_platform/engine/dialog/dialog_engine.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';
+import 'package:widgets/shatter/border_select_widget.dart';
+
+/**
+ * 已申请的员工列表Item
+ */
+class AppliedStaffItem extends StatelessWidget {
+  final int index;
+  final JobAppliedListSGRows item;
+  final VoidCallback? onModifyAction;
+  final VoidCallback? onEditAction;
+  final VoidCallback? onRemarkAction;
+  final VoidCallback? onItemAction;
+  final VoidCallback? onReviseAction;
+  final VoidCallback? onMemberAction;
+  final void Function(BuildContext targetContext)? onStatusAction;
+
+  AppliedStaffItem({
+    required this.index,
+    required this.item,
+    this.onModifyAction,
+    this.onRemarkAction,
+    this.onEditAction,
+    this.onItemAction,
+    this.onReviseAction,
+    this.onMemberAction,
+    this.onStatusAction,
+  });
+
+  @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(
+                "Staff Name:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //姓名
+              MyTextView(
+                item.labourerName ?? "-",
+                isFontMedium: true,
+                textColor: ColorConstants.textYellowFFBB1B,
+                fontSize: 14,
+                marginLeft: 5,
+                marginRight: 5,
+                textDecoration: TextDecoration.underline,
+                decorationColor: ColorConstants.textYellowFFBB1B,
+                // 可选,设置下划线的颜色
+                decorationThickness: 2.0,
+                // 可选,设置下划线的粗细
+                decorationStyle: TextDecorationStyle.solid,
+                onClick: onMemberAction,
+              ).expanded(),
+
+              //是否选中
+              Visibility(
+                visible: true,
+                child: MyAssetImage(
+                  item.isSelected ? Assets.baseServiceItemSelectedIcon : Assets.baseServiceItemUnselectedIcon,
+                  width: 20.5,
+                  height: 20.5,
+                ),
+              ),
+            ],
+          ),
+
+          // 身份证
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "NRIC".tr + ":",
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+              MyTextView(
+                item.labourerNric ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          // 性别
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Gender".tr + ":",
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+              MyTextView(
+                item.gender ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).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 ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          // 大厅
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Ballroom".tr + ":",
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+              MyTextView(
+                "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).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(
+                "Work Clock 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 Clock 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),
+
+          // + - Hours
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "+/- Hours:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //小时
+              MyTextView(
+                item.adjustHours.toString(),
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          // Total Hours
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Total Hours:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //小时
+              MyTextView(
+                item.totalHours ?? "",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          // 状态
+          Row(
+            children: [
+              MyTextView(
+                "Status:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //发布状态
+              BorderSelectWidget(
+                text: item.statusShow ?? "",
+                color: "Completed" == item.statusShow
+                    ? ColorConstants.textGreen00FB92
+                    : "Cancelled" == item.statusShow || "Rejected" == item.statusShow
+                        ? ColorConstants.textRedFF6262
+                        : "Revised" == item.statusShow || "Pending" == item.statusShow || "Approve" == item.statusShow
+                            ? ColorConstants.textYellowFFBB1B
+                            : ColorConstants.textBlue5CEEFF,
+                onTap: (targetContext) {
+                  onStatusAction?.call(targetContext);
+                },
+              ),
+            ],
+          ).marginOnly(top: 12),
+
+          //按钮组
+          Visibility(
+            visible: item.actionList?.isNotEmpty ?? false,
+            child: Row(
+              mainAxisSize: MainAxisSize.max,
+              mainAxisAlignment: MainAxisAlignment.end,
+              crossAxisAlignment: CrossAxisAlignment.center,
+              children: [
+                //编辑按钮
+                Visibility(
+                  visible: item.actionList?.contains("edit") ?? false,
+                  child: MyButton(
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      onEditAction?.call();
+                    },
+                    text: "Edit".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor(
+                      "#FFBB1B",
+                    ),
+                    radius: 17.25,
+                    minWidth: 60,
+                    minHeight: 35,
+                  ).marginOnly(left: 12),
+                ),
+
+                //状态工作流按钮
+                Visibility(
+                  visible: item.actionList?.contains("modify") ?? false,
+                  child: MyButton(
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      onModifyAction?.call();
+                    },
+                    text: "Modify".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor("#0AC074"),
+                    radius: 17.25,
+                    minWidth: 60,
+                    minHeight: 35,
+                  ).marginOnly(left: 12),
+                ),
+
+                Visibility(
+                  visible: item.actionList?.contains("revise") ?? false,
+                  child: MyButton(
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      onReviseAction?.call();
+                    },
+                    text: "Revise".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor("#0AC074"),
+                    radius: 17.25,
+                    minWidth: 60,
+                    minHeight: 35,
+                  ).marginOnly(left: 12),
+                ),
+
+                //Remark按钮
+                Visibility(
+                  visible: item.actionList?.contains("remarks") ?? false,
+                  child: MyButton(
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      onRemarkAction?.call();
+                    },
+                    text: "Remarks".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor("#56AAFF"),
+                    radius: 17.25,
+                    minWidth: 60,
+                    minHeight: 35,
+                  ).marginOnly(left: 12),
+                ),
+              ],
+            ).marginOnly(top: 15),
+          ),
+        ],
+      ).onTap(() {
+        onItemAction?.call();
+      }),
+    );
+  }
+}

+ 57 - 0
packages/cpt_labour_sg/lib/modules/job_applied/drop_down_status.dart

@@ -0,0 +1,57 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/job_applied_list_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:plugin_platform/engine/dialog/dialog_engine.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';
+import 'package:widgets/shatter/border_select_widget.dart';
+
+/**
+ * 已申请的员工列表Item
+ */
+class DropDownStatus extends StatelessWidget {
+  final List<JobAppliedListSGRowsStatusList> list;
+  final void Function(JobAppliedListSGRowsStatusList bean)? onSelectedAction;
+
+  DropDownStatus({
+    required this.list,
+    this.onSelectedAction,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      padding: EdgeInsets.symmetric(vertical: 5, horizontal: 12),
+      margin: EdgeInsets.only(left: 15, right: 15, top: 5, bottom: 5),
+      decoration: BoxDecoration(
+        color: Color(0xFF56AAFF), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(5), // 设置圆角
+      ),
+      child: Column(
+        mainAxisSize: MainAxisSize.max,
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: list
+            .map((e) => MyTextView(
+                  e.txt ?? "",
+                  fontSize: 14,
+                  marginTop: 5,
+                  marginBottom: 5,
+                  textColor: Colors.white,
+                  onClick: () {
+                    onSelectedAction?.call(e);
+                    DialogEngine.dismiss();
+                  },
+                  isFontRegular: true,
+                ))
+            .toList(),
+      ),
+    );
+  }
+}

+ 463 - 0
packages/cpt_labour_sg/lib/modules/job_applied/job_applied_controller.dart

@@ -0,0 +1,463 @@
+import 'package:domain/entity/response/job_applied_list_s_g_entity.dart';
+import 'package:domain/repository/job_sg_repository.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:get/get.dart';
+import 'package:plugin_basic/constants/app_constant.dart';
+import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/engine/notify/notify_engine.dart';
+
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:shared/utils/event_bus.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/util.dart';
+import 'package:widgets/dialog/app_default_dialog.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/picker/option_pick_util.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'drop_down_status.dart';
+import 'job_applied_state.dart';
+
+class JobAppliedController extends GetxController with DioCancelableMixin {
+  final JobSGRepository _jobRepository = Get.find();
+  final JobAppliedState state = JobAppliedState();
+
+  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;
+    fetchAppliedStaffList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchAppliedStaffList();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchAppliedStaffList();
+  }
+
+  /// 获取服务器数据,通知消息列表
+  Future fetchAppliedStaffList() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading);
+    }
+
+    if (state.appliedIndexEntity == null) {
+      //不是并发的,顺序执行接口
+      var jobInfoResult = await _jobRepository.fetchJobAppliedIndex(
+        state.jobId,
+        cancelToken: cancelToken,
+      );
+
+      if (jobInfoResult.isSuccess) {
+        state.appliedIndexEntity = jobInfoResult.data;
+        update();
+      } else {
+        errorMessage = jobInfoResult.errorMsg;
+        changeLoadingState(LoadState.State_Error);
+        return;
+      }
+    }
+
+    // 获取 Applied 列表
+    var listResult = await _jobRepository.fetchJobAppliedList(
+      state.jobId,
+      state.selectedStatusId,
+      state.keyword,
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
+
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.rows);
+    } else {
+      errorMessage = listResult.errorMsg;
+      changeLoadingState(LoadState.State_Error);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+  // 处理数据与展示的逻辑
+  void handleList(List<JobAppliedListSGRows>? 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();
+    fetchAppliedStaffList();
+    registerEventBus();
+  }
+
+  @override
+  void onClose() {
+    unregisterEventBus();
+    state.datas.clear();
+    super.onClose();
+  }
+
+  // EventBus 的事件接收
+  Subscription? subscribe;
+
+  void registerEventBus() {
+    subscribe = bus.on(AppConstant.eventAppliedListRefresh, (arg) {
+      var appliedId = arg as String;
+      if (Utils.isNotEmpty(appliedId)) {
+        fetchItemByIdAndRefreshItem(appliedId);
+      } else {
+        refreshController.callRefresh();
+      }
+    });
+  }
+
+  void unregisterEventBus() {
+    bus.off(AppConstant.eventAppliedListRefresh, subscribe);
+  }
+
+  /// 搜索员工
+  void doSearch(String keyword) {
+    state.keyword = keyword;
+    //赋值之后刷新
+    refreshController.callRefresh();
+  }
+
+  /// 清空筛选条件
+  void resetFiltering() {
+    state.keyword = "";
+    state.searchController.text = "";
+    state.selectedStatusTxt = "";
+    state.selectedStatusId = null;
+    update();
+
+    //赋值之后刷新
+    refreshController.callRefresh();
+  }
+
+  /// 展示添加员工的弹窗
+  void gotoAddStaffPage() {
+    ToastEngine.show("展示添加员工");
+  }
+
+  //调用接口添加员工
+  void _requestAddStaff2Applied(String selectedIds) async {
+    // var result = await _jobRepository.addStaff2Job(state.jobId, selectedIds, cancelToken: cancelToken);
+    //
+    // if (result.isSuccess) {
+    //   var addStaffEntity = result.data;
+    //   List<String> filteredMessages = [];
+    //   if (addStaffEntity != null && addStaffEntity.resultList?.isNotEmpty == true) {
+    //     filteredMessages = addStaffEntity.resultList!
+    //         .where((resultList) => resultList.result == false && Utils.isNotEmpty(resultList.msg))
+    //         .map((resultList) => '${resultList.name} : ${resultList.msg!}')
+    //         .toList();
+    //   }
+    //
+    //   if (filteredMessages.isNotEmpty) {
+    //     //有错误信息
+    //     NotifyEngine.showFailure(filteredMessages.join(" , "));
+    //   } else {
+    //     //无错误信息
+    //     NotifyEngine.showSuccess("Successful".tr);
+    //     //添加成功之后刷新页面
+    //     refreshController.callRefresh();
+    //   }
+    // } else {
+    //   ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    //   return;
+    // }
+  }
+
+  /// 去编辑员工信息页面
+  void gotoAppliedEditPage(JobAppliedListSGRows data) {
+    // JobAppliedEditPage.startInstance(data.appliedId.toString());
+  }
+
+  /// 展示评论的弹窗
+  void showRemarkDialog(JobAppliedListSGRows data) async {
+    // //请求接口获取到已评论的数据
+    // var result = await _jobRepository.fetchAppliedStaffReviewView(data.appliedId.toString());
+    //
+    // if (result.isSuccess) {
+    //   //接口数据获取成功,展示弹窗
+    //   DialogEngine.show(
+    //     widget: AppliedStaffReviews(
+    //       appliedReviews: result.data!,
+    //       confirmAction: (attitudeRate, performanceRate, experienceRate, groomingRate, content) async {
+    //         //请求接口,提交评论
+    //         var submitResult = await _jobRepository.remarkAppliedSingleStaffSubmit(
+    //           data.appliedId.toString(),
+    //           attitudeRate,
+    //           groomingRate,
+    //           performanceRate,
+    //           experienceRate,
+    //           content,
+    //         );
+    //
+    //         if (submitResult.isSuccess) {
+    //           NotifyEngine.showSuccess("Successful".tr);
+    //         } else {
+    //           ToastEngine.show(submitResult.errorMsg ?? "Network Load Error".tr);
+    //         }
+    //       },
+    //     ),
+    //   );
+    // } else {
+    //   ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    //   return;
+    // }
+  }
+
+  /// 去展示员工状态的审核流程页面
+  void gotoAppliedWorkflowPage(JobAppliedListSGRows data) {
+    // AppliedWorkflowPage.startInstance(data.appliedId.toString());
+  }
+
+  /// 去查看员工详情页面
+  void gotoStaffDetailPage(JobAppliedListSGRows data) {
+    // AppliedStaffDetailPage.startInstance(data.memberId.toString());
+  }
+
+  /// Item选中与未选中设置
+  void doSelectedOrNot(JobAppliedListSGRows data) {
+    //只有 Approve = 3 的状态才能选中
+
+    data.isSelected = !data.isSelected;
+    update();
+    Log.d("选中:${data.isSelected}");
+  }
+
+  /// 批量修改的弹窗
+  void showBatchModifyDialog() async {
+    if (state.appliedIndexEntity == null) return;
+    //找出已经选中的员工(只有状态为3 Approve的状态才能修改)
+    // var selectedList = state.datas.where((element) => element.isSelected && element.status == 3).toList(growable: false);
+    // if (selectedList.isNotEmpty) {
+    //   var ids = selectedList.map((e) => e.appliedId.toString()).toList(growable: false);
+    //   var separatedIds = ids.join(',');
+    //
+    //   DialogEngine.show(
+    //       widget: AppliedButchModify(
+    //           selectedStartDate: DateTimeUtils.getDateTime(state.jobInfo?.startTime ?? ""),
+    //           selectedEndDate: DateTimeUtils.getDateTime(state.jobInfo?.endTime ?? ""),
+    //           confirmAction: (start, end) {
+    //             _requestBatchModify(start, end, separatedIds);
+    //           }));
+    // } else {
+    //   ToastEngine.show("Please select the applied record".tr);
+    // }
+  }
+
+  /// 执行批量修改的请求
+  void _requestBatchModify(DateTime start, DateTime end, String separatedIds) async {
+    //执行请求
+    // var result = await _jobRepository.batchEditStaffCheckTime(
+    //   state.jobId,
+    //   separatedIds,
+    //   DateTimeUtils.formatDate(start),
+    //   DateTimeUtils.formatDate(end),
+    //   cancelToken: cancelToken,
+    // );
+    //
+    // if (result.isSuccess) {
+    //   NotifyEngine.showSuccess("Successful".tr);
+    //
+    //   //调用接口刷新指定的Staff的信息
+    //   fetchItemByIdAndRefreshItem(separatedIds);
+    // } else {
+    //   ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    //   return;
+    // }
+  }
+
+  /// 批准的操作
+  void operationApprove() async {
+    //找出已经选中的员工(只有状态为3 Approve的状态才能修改)
+    // var selectedList = state.datas.where((element) => element.isSelected && element.status == 3).toList(growable: false);
+    // if (selectedList.isNotEmpty) {
+    //   var ids = selectedList.map((e) => e.appliedId.toString()).toList(growable: false);
+    //   var separatedIds = ids.join(',');
+    //
+    //   // Are you sure 的弹窗
+    //   DialogEngine.show(
+    //     widget: AppDefaultDialog(
+    //       title: "Message".tr,
+    //       message: "Are you sure you want to setting approved?".tr,
+    //       confirmAction: () async {
+    //         //执行请求
+    //         var result = await _jobRepository.submitBatchStaffApprove(separatedIds, cancelToken: cancelToken);
+    //
+    //         if (result.isSuccess) {
+    //           NotifyEngine.showSuccess("Successful".tr);
+    //
+    //           //调用接口刷新指定的Staff的信息
+    //           fetchItemByIdAndRefreshItem(separatedIds);
+    //         } else {
+    //           ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    //           return;
+    //         }
+    //       },
+    //     ),
+    //   );
+    // } else {
+    //   ToastEngine.show("Please select the applied record".tr);
+    // }
+  }
+
+  /// 根据ID获取Item对象,用于刷新
+  void fetchItemByIdAndRefreshItem(String? appliedIds) async {
+    var result = await _jobRepository.fetchItemByAppliedIds(
+      state.jobId,
+      appliedIds,
+      cancelToken: cancelToken,
+    );
+
+    //处理数据
+    if (result.isSuccess) {
+      var data = result.data;
+      if (data != null && data.rows.isNotEmpty) {
+        List<JobAppliedListSGRows> newItem = data.rows;
+
+        // 创建一个 Map 来加速查找
+        Map<String, JobAppliedListSGRows> newItemMap = {for (var item in newItem) item.appliedId ?? "": item};
+
+        // 遍历 state.datas 进行替换
+        for (int i = 0; i < state.datas.length; i++) {
+          if (newItemMap.containsKey(state.datas[i].appliedId)) {
+            state.datas[i] = newItemMap[state.datas[i].appliedId]!;
+          }
+        }
+
+        //刷新
+        update();
+      }
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
+  void confirmJob() {}
+
+  // 顶部的筛选状态
+  void pickStatus() {
+    if (state.appliedIndexEntity == null) {
+      return;
+    }
+
+    int selectedTemplateIndex;
+    if (state.selectedStatusId == null) {
+      selectedTemplateIndex = 0;
+    } else {
+      selectedTemplateIndex = state.appliedIndexEntity!.statusList.indexWhere((department) => department.value.toString() == state.selectedStatusId);
+    }
+
+    if (selectedTemplateIndex < 0) {
+      selectedTemplateIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: state.appliedIndexEntity!.statusList.map((e) => e.txt!).toList(growable: false),
+      initialSelectIndex: selectedTemplateIndex,
+      onPickerChanged: (_, index) {
+        state.selectedStatusId = state.appliedIndexEntity!.statusList[index].value!.toString();
+        state.selectedStatusTxt = state.appliedIndexEntity!.statusList[index].txt!.toString();
+        update();
+
+        refreshController.callRefresh();
+      },
+    );
+  }
+
+  // 下拉选选择修改状态
+  void dropDownStatus(int index, BuildContext context) {
+    final statusOptions = state.datas[index].statusList;
+    if (statusOptions.isEmpty) return;
+
+    DialogEngine.showAttach(
+      targetContext: context,
+      position: DialogPosition.bottom,
+      widget: DropDownStatus(
+        list: statusOptions,
+        onSelectedAction: (item) {
+          _changeMemberStatus(state.datas[index].appliedId, item.value);
+        },
+      ),
+    );
+  }
+
+  // 请求接口修改用户的状态
+  void _changeMemberStatus(String? appliedId, String? statusId) async {
+    //执行请求
+    var result = await _jobRepository.submitEditAppliedStatus(
+      appliedId,
+      statusId,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      //调用接口刷新指定的Staff的信息
+      fetchItemByIdAndRefreshItem(appliedId);
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      return;
+    }
+  }
+
+}

+ 247 - 0
packages/cpt_labour_sg/lib/modules/job_applied/job_applied_page.dart

@@ -0,0 +1,247 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/cupertino.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_button.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_item.dart';
+import 'job_applied_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 'job_applied_state.dart';
+
+/**
+ * 已申请的页面 (新加坡)
+ */
+class JobAppliedPage extends BaseStatefulPage<JobAppliedController> {
+  JobAppliedPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance(String? jobId) {
+    return Get.start(RouterPath.JOB_LIST_APPLIED_SG, arguments: {'jobId': jobId});
+  }
+
+  @override
+  JobAppliedController createRawController() {
+    return JobAppliedController();
+  }
+
+  @override
+  State<JobAppliedPage> createState() => _JobAppliedState();
+}
+
+class _JobAppliedState extends BaseState<JobAppliedPage, JobAppliedController> {
+  late JobAppliedState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+    state.jobId = Get.arguments['jobId'];
+  }
+
+  @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,
+                state.appliedIndexEntity?.jobTitle ?? "Title".tr,
+                subTitle: "(${state.appliedIndexEntity?.jobDate ?? "-"})",
+                subTitleColor: ColorConstants.textGrayAECAE5,
+              ),
+
+              //搜索的条件
+              Row(
+                children: [
+                  Container(
+                    padding: EdgeInsets.only(left: 11, right: 11),
+                    margin: EdgeInsets.only(right: 10),
+                    height: 40,
+                    decoration: BoxDecoration(
+                      color: Color(0xFF4DCFF6).withOpacity(0.2),
+                      borderRadius: const BorderRadius.all(Radius.circular(20)),
+                    ),
+                    child: Row(
+                      mainAxisSize: MainAxisSize.max,
+                      crossAxisAlignment: CrossAxisAlignment.center,
+                      mainAxisAlignment: MainAxisAlignment.start,
+                      children: [
+                        MyTextView(
+                          state.selectedStatusTxt ?? "",
+                          fontSize: 14,
+                          hint: "Status".tr,
+                          textHintColor: ColorConstants.textGrayAECAE5,
+                          isFontMedium: true,
+                          textColor: ColorConstants.white,
+                        ).expanded(),
+
+                        //下拉选图标
+                        MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                      ],
+                    ),
+                  ).onTap(() {
+                    FocusScope.of(context).unfocus();
+                    controller.pickStatus();
+                  }).expanded(),
+
+                  SearchAppBar(
+                    value: state.keyword,
+                    searchBarHeight: 40,
+                    margin: EdgeInsets.only(right: 10),
+                    onSearch: (keyword) {
+                      controller.doSearch(keyword);
+                    },
+                    hintText: "Search".tr,
+                    controller: state.searchController,
+                  ).expanded(),
+
+                  MyButton(
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      controller.resetFiltering();
+                    },
+                    text: "Reset".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor("#2BA9F9", opacity: 0.5),
+                    radius: 20,
+                    minWidth: 60,
+                    minHeight: 40,
+                  ),
+                ],
+              ).marginOnly(top: 10, left: 15, right: 15, bottom: 5),
+
+              Row(
+                children: [
+                  MyButton(
+                    type: ClickType.throttle,
+                    milliseconds: 500,
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      controller.confirmJob();
+                    },
+                    text: "Send E-Attendance".tr,
+                    textColor: ColorConstants.white,
+                    fontSize: 16,
+                    radius: 20,
+                    backgroundColor: hexToColor("#855EF5"),
+                    fontWeight: FontWeight.w500,
+                  ).expanded(),
+
+                  // 添加按钮
+                  Visibility(
+                    visible: state.appliedIndexEntity?.canAppend == true,
+                    child: MyButton(
+                      type: ClickType.throttle,
+                      milliseconds: 500,
+                      onPressed: () {
+                        FocusScope.of(context).unfocus();
+                        controller.gotoAddStaffPage();
+                      },
+                      text: "Add Staff".tr,
+                      textColor: ColorConstants.white,
+                      fontSize: 16,
+                      radius: 20,
+                      backgroundColor: hexToColor("#FFBB1B"),
+                      fontWeight: FontWeight.w500,
+                    ).marginOnly(left: 10).expanded(),
+                  ),
+                ],
+              ).marginOnly(left: 15, right: 15, top: 5, bottom: 10),
+
+              //底部的列表
+              EasyRefresh(
+                controller: controller.refreshController,
+                onRefresh: controller.onRefresh,
+                onLoad: controller.loadMore,
+                child: LoadStateLayout(
+                  state: controller.loadingState,
+                  errorMessage: controller.errorMessage,
+                  errorRetry: () {
+                    controller.retryRequest();
+                  },
+                  successSliverWidget: [
+                    SliverList(
+                        delegate: SliverChildBuilderDelegate(
+                      (context, index) {
+                        return AppliedStaffItem(
+                          index: index,
+                          item: state.datas[index],
+                          onEditAction: () {
+                            controller.gotoAppliedEditPage(state.datas[index]);
+                          },
+                          onRemarkAction: () {
+                            controller.showRemarkDialog(state.datas[index]);
+                          },
+                          onReviseAction: () {
+                            controller.gotoAppliedWorkflowPage(state.datas[index]);
+                          },
+                          onModifyAction: () {},
+                          onItemAction: () {
+                            controller.doSelectedOrNot(state.datas[index]);
+                          },
+                          onMemberAction: () {
+                            controller.gotoStaffDetailPage(state.datas[index]);
+                          },
+                          onStatusAction: (targetContext){
+                             controller.dropDownStatus(index,targetContext);
+                          },
+                        );
+                      },
+                      childCount: state.datas.length,
+                    ))
+                  ],
+                ),
+              ).expanded(),
+
+              MyTextView(
+                "Batch Modify".tr,
+                fontSize: 17,
+                isFontMedium: true,
+                boxHeight: 48,
+                onClick: () {
+                  controller.showBatchModifyDialog();
+                },
+                alignment: Alignment.center,
+                textAlign: TextAlign.center,
+                textColor: Colors.white,
+                backgroundColor: Color(0XFFFFBB1B),
+              ),
+            ],
+          ),
+        ),
+      );
+    });
+  }
+}

+ 18 - 0
packages/cpt_labour_sg/lib/modules/job_applied/job_applied_state.dart

@@ -0,0 +1,18 @@
+import 'package:domain/entity/response/job_applied_index_s_g_entity.dart';
+import 'package:domain/entity/response/job_applied_list_s_g_entity.dart';
+import 'package:flutter/material.dart';
+
+class JobAppliedState {
+  //筛选条件
+  final TextEditingController searchController = TextEditingController();
+  String keyword = "";
+
+  String? selectedStatusId;
+  String? selectedStatusTxt;
+
+  String? jobId;
+
+  JobAppliedIndexSGEntity? appliedIndexEntity; //指定工作的简短信息
+
+  List<JobAppliedListSGRows> datas = []; //Applied的员工列表
+}

+ 35 - 3
packages/cpt_labour_sg/lib/modules/job_list/job_list_controller.dart

@@ -15,6 +15,7 @@ import 'package:widgets/dialog/app_default_dialog.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 
+import '../job_applied/job_applied_page.dart';
 import '../job_list_edit/job_list_edit_page.dart';
 import 'job_list_filter.dart';
 import 'job_list_state.dart';
@@ -194,13 +195,13 @@ class JobListController extends GetxController with DioCancelableMixin {
   // 执行编辑操作
   void doEditAction(int index) {
     JobListEditPage.startInstance(true, state.datas[index].jobId, (result) {
-
+      fetchItemByIdAndRefreshItem(state.datas[index].jobId ?? "");
     });
   }
 
   /// 去已申请的成员列表
   void gotoJobAppliedPage(int index) {
-    ToastEngine.show("去已申请的成员列表");
+    JobAppliedPage.startInstance(state.datas[index].jobId);
   }
 
   //执行取消操作
@@ -253,7 +254,7 @@ class JobListController extends GetxController with DioCancelableMixin {
     if (result.isSuccess) {
       NotifyEngine.showSuccess("Successful".tr);
 
-      //todo 需要单个刷新啊
+      fetchItemByIdAndRefreshItem(item.jobId ?? "");
     } else {
       ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
     }
@@ -268,4 +269,35 @@ class JobListController extends GetxController with DioCancelableMixin {
       }
     });
   }
+
+  /// 根据ID获取Item对象,用于刷新
+  void fetchItemByIdAndRefreshItem(String ids) async {
+    var result = await _jobRepository.fetchJobListByIds(
+      ids,
+      cancelToken: cancelToken,
+    );
+
+    //处理数据
+    if (result.isSuccess) {
+      var data = result.data;
+      if (data != null && data.rows.isNotEmpty) {
+        List<JobListSGRows> newItem = data.rows;
+
+        // 创建一个 Map 来加速查找
+        Map<String, JobListSGRows> newItemMap = {for (var item in newItem) item.jobId ?? "": item};
+
+        // 遍历 state.datas 进行替换
+        for (int i = 0; i < state.datas.length; i++) {
+          if (newItemMap.containsKey(state.datas[i].jobId)) {
+            state.datas[i] = newItemMap[state.datas[i].jobId]!;
+          }
+        }
+
+        //刷新
+        update();
+      }
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
 }

+ 86 - 89
packages/cpt_labour_sg/lib/modules/job_list/job_list_page.dart

@@ -50,98 +50,95 @@ class _JobListState extends BaseState<JobListPage, JobListController> {
   @override
   Widget build(BuildContext context) {
     return autoCtlGetBuilder(builder: (controller) {
-      return Scaffold(
-        extendBodyBehindAppBar: true,
-        appBar: MyAppBar.appBar(context, "Job List".tr, actions: [
-          //筛选图标
-          MyAssetImage(
-            Assets.baseServiceTitleBarFilterIcon,
-            width: 24,
-            height: 16.5,
-          ).onTap(() {
-            FocusScope.of(context).unfocus();
-            controller.showFilterDialog();
-          }).marginOnly(right: 15),
-        ]),
-        body: SafeArea(
-          bottom: true,
-          top: false,
-          child: Container(
-            width: double.infinity,
-            height: double.infinity,
-            padding: EdgeInsets.only(top: kToolbarHeight + ScreenUtil.getStatusBarH(context) + 1),
-            decoration: const BoxDecoration(
-              gradient: LinearGradient(
-                colors: [
-                  Color(0xFF091D44),
-                  Color(0xFF245A8A),
-                  Color(0xFF7F7CEC),
-                ],
-                begin: Alignment.topCenter,
-                end: Alignment.bottomCenter,
-              ),
-            ),
-            child: Column(
-              children: [
-                //添加用工请求按钮
-                MyButton(
-                  type: ClickType.throttle,
-                  milliseconds: 500,
-                  onPressed: () {
-                    FocusScope.of(context).unfocus();
-                    controller.gotoLabourRequestAddPage();
-                  },
-                  text: "Create New Job".tr,
-                  textColor: ColorConstants.white,
-                  fontSize: 16,
-                  radius: 20,
-                  backgroundColor: hexToColor("#FFBB1B"),
-                  fontWeight: FontWeight.w500,
-                ).marginOnly(left: 15, right: 15, top: 15, bottom: 5),
-
-                //底部的列表
-                EasyRefresh(
-                  controller: controller.refreshController,
-                  onRefresh: controller.onRefresh,
-                  onLoad: controller.loadMore,
-                  child: LoadStateLayout(
-                    state: controller.loadingState,
-                    errorMessage: controller.errorMessage,
-                    errorRetry: () {
-                      controller.retryRequest();
-                    },
-                    successSliverWidget: [
-                      SliverList(
-                          delegate: SliverChildBuilderDelegate(
-                        (context, index) {
-                          return JobListItem(
-                            index: index,
-                            item: state.datas[index],
-                            onDetailAction: () {
-                              controller.gotoJobDetailPage(index);
-                            },
-                            onEditAction: () {
-                              controller.doEditAction(index);
-                            },
-                            onCancelAction: () {
-                              controller.doCancelAction(index);
-                            },
-                            onDeleteAction: () {
-                              controller.doDeleteAction(index);
-                            },
-                            onAppliedAction: () {
-                              controller.gotoJobAppliedPage(index);
-                            },
-                          );
-                        },
-                        childCount: state.datas.length,
-                      ))
-                    ],
-                  ),
-                ).marginOnly(top: 5, bottom: 5).expanded(),
+      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, "Job List".tr, actions: [
+                //筛选图标
+                MyAssetImage(
+                  Assets.baseServiceTitleBarFilterIcon,
+                  width: 24,
+                  height: 16.5,
+                ).onTap(() {
+                  FocusScope.of(context).unfocus();
+                  controller.showFilterDialog();
+                }).marginOnly(right: 15),
+              ]),
+              //添加用工请求按钮
+              MyButton(
+                type: ClickType.throttle,
+                milliseconds: 500,
+                onPressed: () {
+                  FocusScope.of(context).unfocus();
+                  controller.gotoLabourRequestAddPage();
+                },
+                text: "Create New Job".tr,
+                textColor: ColorConstants.white,
+                fontSize: 16,
+                radius: 20,
+                backgroundColor: hexToColor("#FFBB1B"),
+                fontWeight: FontWeight.w500,
+              ).marginOnly(left: 15, right: 15, top: 15, bottom: 5),
+
+              //底部的列表
+              EasyRefresh(
+                controller: controller.refreshController,
+                onRefresh: controller.onRefresh,
+                onLoad: controller.loadMore,
+                child: LoadStateLayout(
+                  state: controller.loadingState,
+                  errorMessage: controller.errorMessage,
+                  errorRetry: () {
+                    controller.retryRequest();
+                  },
+                  successSliverWidget: [
+                    SliverList(
+                        delegate: SliverChildBuilderDelegate(
+                      (context, index) {
+                        return JobListItem(
+                          index: index,
+                          item: state.datas[index],
+                          onDetailAction: () {
+                            controller.gotoJobDetailPage(index);
+                          },
+                          onEditAction: () {
+                            controller.doEditAction(index);
+                          },
+                          onCancelAction: () {
+                            controller.doCancelAction(index);
+                          },
+                          onDeleteAction: () {
+                            controller.doDeleteAction(index);
+                          },
+                          onAppliedAction: () {
+                            controller.gotoJobAppliedPage(index);
+                          },
+                        );
+                      },
+                      childCount: state.datas.length,
+                    ))
+                  ],
+                ),
+              ).marginOnly(top: 5, bottom: 5).expanded(),
+            ],
+          ),
         ),
       );
     });

+ 17 - 6
packages/cpt_labour_sg/lib/modules/job_list_edit/job_list_edit_controller.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/response/job_list_s_g_entity.dart';
 import 'package:domain/repository/labour_sg_repository.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
@@ -25,17 +26,26 @@ class JobListEditController extends GetxController with DioCancelableMixin {
     if (result.isSuccess) {
       state.editEntity = result.data;
 
-      var maleNoController = state.formData['need_male']!['controller'];
-      var femaleNoController = state.formData['need_female']!['controller'];
-      var needNoController = state.formData['need_no']!['controller'];
-      var remarkController = state.formData['remark']!['controller'];
+      TextEditingController maleNoController = state.formData['need_male']!['controller'];
+      TextEditingController femaleNoController = state.formData['need_female']!['controller'];
+      TextEditingController needNoController = state.formData['need_no']!['controller'];
+      TextEditingController remarkController = state.formData['remark']!['controller'];
 
       //赋值展示
       state.selectedOutlet = state.editEntity?.outletList.firstWhere((e) => e.selected == "selected").txt;
       state.selectedOutletId = state.editEntity?.outletList.firstWhere((e) => e.selected == "selected").value;
       state.genderOptionType = state.editEntity?.sexLimit ?? 0;
       state.selectRequestTypeIndex = state.editEntity!.requestType.indexWhere((e) => e.checked == "checked");
-      
+
+      //时间赋值
+      state.selectedStartTime = state.editEntity?.startTime == null ? null : DateTimeUtils.getDateTime(state.editEntity?.startTime ?? "");
+      state.selectedEndTime = state.editEntity?.endTime == null ? null : DateTimeUtils.getDateTime(state.editEntity?.endTime ?? "");
+
+      maleNoController.text = state.editEntity?.femaleLimit == 0 ? "" : state.editEntity?.femaleLimit.toString() ?? "";
+      femaleNoController.text = state.editEntity?.maleLimit == 0 ? "" : state.editEntity?.maleLimit.toString() ?? "";
+      needNoController.text = state.editEntity?.needNum == 0 ? "" : state.editEntity?.needNum.toString() ?? "";
+      remarkController.text = state.editEntity?.remark.toString() ?? "";
+
       update();
     } else {
       ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
@@ -168,11 +178,12 @@ class JobListEditController extends GetxController with DioCancelableMixin {
       NotifyEngine.showSuccess("Successful".tr);
 
       //根据类型刷新
-      state.cb?.call(true);
+      state.cb?.call(state.jobId);
 
       Get.back();
     } else {
       ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
     }
+
   }
 }

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

@@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:router/path/router_path.dart';
 
+import '../modules/job_applied/job_applied_page.dart';
 import '../modules/job_list/job_list_page.dart';
 import '../modules/job_list_edit/job_list_edit_page.dart';
 import '../modules/labour_request/labour_request_page.dart';
@@ -58,5 +59,11 @@ class LabourSGPageRouter {
       page: () => JobListEditPage(),
     ),
 
+    // 新加坡工作列表已申请列表
+    GetPage(
+      name: RouterPath.JOB_LIST_APPLIED_SG,
+      page: () => JobAppliedPage(),
+    ),
+
   ];
 }

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

@@ -187,6 +187,35 @@ class ApiConstants {
 
   // =========================== 新加坡工作相关 ↓=========================================
 
+  //新加坡工作已申请的选项
+  static const apiJobAppliedIndexSG = "/index.php/api/v1/hotel/applied/index";
+
+  //新加坡工作已申请的列表
+  static const apiJobAppliedListSG = "/index.php/api/v1/hotel/applied/table";
+
+  //新加坡工作已申请的列表-添加员工搜索
+  static const apiJobAppliedSearchStaffSG = "/index.php/api/v1/hotel/applied/staff-view";
+
+  //新加坡工作已申请的列表-添加员工提交
+  static const apiJobAppliedAddStaffSubmitSG = "/index.php/api/v1/hotel/applied/staff-submit";
+
+  //新加坡工作已申请的列表-批量修改
+  static const apiJobAppliedBatchEditSG = "/index.php/api/v1/hotel/applied/batch-edit";
+
+  //新加坡工作已申请的列表-单独编辑的详情
+  static const apiJobAppliedEditViewSG = "/index.php/api/v1/hotel/applied/edit-view";
+
+  //新加坡工作已申请的列表-提交编辑
+  static const apiJobAppliedEditSubmitSG = "/index.php/api/v1/hotel/applied/edit-submit";
+
+  //新加坡工作已申请的列表-修改状态
+  static const apiJobAppliedChangeStatusSG = "/index.php/api/v1/hotel/applied/edit-status";
+
+  //新加坡工作已申请的列表-评价展示
+  static const apiJobAppliedRemarkViewSG = "/index.php/api/v1/hotel/applied/remark-view";
+
+  //新加坡工作已申请的列表-提交评价
+  static const apiJobAppliedRemarkSubmitSG = "/index.php/api/v1/hotel/applied/remark-submit";
 
   // =========================== 报表与其他 ↓=========================================
 

+ 56 - 0
packages/cs_domain/lib/entity/response/job_applied_edit_index_s_g_entity.dart

@@ -0,0 +1,56 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/job_applied_edit_index_s_g_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/job_applied_edit_index_s_g_entity.g.dart';
+
+@JsonSerializable()
+class JobAppliedEditIndexSGEntity {
+	@JSONField(name: "applied_id")
+	String? appliedId = null;
+	int status = 0;
+	@JSONField(name: "start_time")
+	String? startTime = null;
+	@JSONField(name: "end_time")
+	String? endTime = null;
+	@JSONField(name: "security_in")
+	String? securityIn = null;
+	@JSONField(name: "security_out")
+	String? securityOut = null;
+	@JSONField(name: "work_in")
+	String? workIn = null;
+	@JSONField(name: "work_out")
+	String? workOut = null;
+	@JSONField(name: "adjust_hours")
+	String? adjustHours = null;
+	@JSONField(name: "status_list")
+	List<JobAppliedEditIndexSGStatusList>? statusList = [];
+
+	JobAppliedEditIndexSGEntity();
+
+	factory JobAppliedEditIndexSGEntity.fromJson(Map<String, dynamic> json) => $JobAppliedEditIndexSGEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedEditIndexSGEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class JobAppliedEditIndexSGStatusList {
+	String? value = null;
+	String? txt = null;
+	String? checked = null;
+
+	JobAppliedEditIndexSGStatusList();
+
+	factory JobAppliedEditIndexSGStatusList.fromJson(Map<String, dynamic> json) => $JobAppliedEditIndexSGStatusListFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedEditIndexSGStatusListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 47 - 0
packages/cs_domain/lib/entity/response/job_applied_index_s_g_entity.dart

@@ -0,0 +1,47 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/job_applied_index_s_g_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/job_applied_index_s_g_entity.g.dart';
+
+@JsonSerializable()
+class JobAppliedIndexSGEntity {
+	@JSONField(name: "job_id")
+	String? jobId = null;
+	@JSONField(name: "job_date")
+	String? jobDate = null;
+	@JSONField(name: "job_title")
+	String? jobTitle = null;
+	@JSONField(name: "status_list")
+	List<JobAppliedIndexSGStatusList> statusList = [];
+	@JSONField(name: "can_append")
+	bool? canAppend = false;
+
+	JobAppliedIndexSGEntity();
+
+	factory JobAppliedIndexSGEntity.fromJson(Map<String, dynamic> json) => $JobAppliedIndexSGEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedIndexSGEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class JobAppliedIndexSGStatusList {
+	String? value = null;
+	String? txt = null;
+	String? selected = null;
+
+	JobAppliedIndexSGStatusList();
+
+	factory JobAppliedIndexSGStatusList.fromJson(Map<String, dynamic> json) => $JobAppliedIndexSGStatusListFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedIndexSGStatusListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 135 - 0
packages/cs_domain/lib/entity/response/job_applied_list_s_g_entity.dart

@@ -0,0 +1,135 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/job_applied_list_s_g_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/job_applied_list_s_g_entity.g.dart';
+
+@JsonSerializable()
+class JobAppliedListSGEntity {
+	int total = 0;
+	List<JobAppliedListSGRows> rows = [];
+
+	JobAppliedListSGEntity();
+
+	factory JobAppliedListSGEntity.fromJson(Map<String, dynamic> json) => $JobAppliedListSGEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedListSGEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class JobAppliedListSGRows {
+	@JSONField(name: "applied_id")
+	String? appliedId = null;
+	@JSONField(name: "member_id")
+	String? memberId = null;
+	@JSONField(name: "job_title")
+	String? jobTitle = null;
+	@JSONField(name: "outlet_name")
+	String? outletName = null;
+	@JSONField(name: "labourer_name")
+	String? labourerName = null;
+	@JSONField(name: "labourer_nric")
+	String? labourerNric = null;
+	String? gender = null;
+	@JSONField(name: "job_date")
+	String? jobDate = null;
+	@JSONField(name: "start_time")
+	String? startTime = null;
+	@JSONField(name: "end_time")
+	String? endTime = null;
+	@JSONField(name: "adjust_hours")
+	int adjustHours = 0;
+	@JSONField(name: "total_hours")
+	String? totalHours = null;
+	int status = 0;
+	@JSONField(name: "status_show")
+	String? statusShow = null;
+	@JSONField(name: "hourly_rate")
+	String? hourlyRate = null;
+	@JSONField(name: "remark_status")
+	int? remarkStatus = 0;
+
+	bool isSelected = false;   //自定义属性,是否选中
+
+	@JSONField(name: "security_in")
+	JobAppliedListSGRowsCheck? securityIn;
+	@JSONField(name: "security_out")
+	JobAppliedListSGRowsCheck? securityOut;
+	@JSONField(name: "work_in")
+	JobAppliedListSGRowsCheck? workIn;
+	@JSONField(name: "work_out")
+	JobAppliedListSGRowsCheck? 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: "revise_hours")
+	int reviseHours = 0;
+	@JSONField(name: "show_star")
+	int showStar = 0;
+	@JSONField(name: "status_list")
+	List<JobAppliedListSGRowsStatusList> statusList = [];  //切换状态的选项
+	@JSONField(name: "action_list")
+	List<String>? actionList = [];
+
+
+
+	JobAppliedListSGRows();
+
+	factory JobAppliedListSGRows.fromJson(Map<String, dynamic> json) => $JobAppliedListSGRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedListSGRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class JobAppliedListSGRowsCheck {
+	String? time = null;
+	String? temp = null;
+	String? image;
+	int? changed = 0;
+	String? key = null;
+
+	JobAppliedListSGRowsCheck();
+
+	factory JobAppliedListSGRowsCheck.fromJson(Map<String, dynamic> json) => $JobAppliedListSGRowsCheckFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedListSGRowsCheckToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+
+
+@JsonSerializable()
+class JobAppliedListSGRowsStatusList {
+	String? value = null;
+	String? txt = null;
+	String? checked = null;
+
+	JobAppliedListSGRowsStatusList();
+
+	factory JobAppliedListSGRowsStatusList.fromJson(Map<String, dynamic> json) => $JobAppliedListSGRowsStatusListFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedListSGRowsStatusListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 33 - 0
packages/cs_domain/lib/entity/response/job_applied_remark_view_s_g_entity.dart

@@ -0,0 +1,33 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/job_applied_remark_view_s_g_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/job_applied_remark_view_s_g_entity.g.dart';
+
+@JsonSerializable()
+class JobAppliedRemarkViewSGEntity {
+	@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: "applied_id")
+	String? appliedId = null;
+	@JSONField(name: "labourer_name")
+	String? labourerName = null;
+	String? disabled = null;
+
+	JobAppliedRemarkViewSGEntity();
+
+	factory JobAppliedRemarkViewSGEntity.fromJson(Map<String, dynamic> json) => $JobAppliedRemarkViewSGEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedRemarkViewSGEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 50 - 0
packages/cs_domain/lib/entity/response/job_applied_staff_s_g_entity.dart

@@ -0,0 +1,50 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/job_applied_staff_s_g_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/job_applied_staff_s_g_entity.g.dart';
+
+@JsonSerializable()
+class JobAppliedStaffSGEntity {
+	int total = 0;
+	List<JobAppliedStaffSGRows> rows = [];
+
+	JobAppliedStaffSGEntity();
+
+	factory JobAppliedStaffSGEntity.fromJson(Map<String, dynamic> json) => $JobAppliedStaffSGEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedStaffSGEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class JobAppliedStaffSGRows {
+	String? id = null;
+	String? name = null;
+	String? gender = null;
+	String? mobile = null;
+	String? nric = null;
+	@JSONField(name: "profile_picture")
+	String? profilePicture = null;
+	int status = 0;
+	@JSONField(name: "apply_state")
+	int applyState = 0;
+	@JSONField(name: "hotel_staff")
+	int hotelStaff = 0;
+	@JSONField(name: "salary_structure")
+	int salaryStructure = 0;
+
+	JobAppliedStaffSGRows();
+
+	factory JobAppliedStaffSGRows.fromJson(Map<String, dynamic> json) => $JobAppliedStaffSGRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobAppliedStaffSGRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

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

@@ -9,6 +9,11 @@ import 'package:domain/entity/response/check_success_entity.dart';
 import 'package:domain/entity/response/device_list_entity.dart';
 import 'package:domain/entity/response/hotel_info_entity.dart';
 import 'package:domain/entity/response/id_name_entity.dart';
+import 'package:domain/entity/response/job_applied_edit_index_s_g_entity.dart';
+import 'package:domain/entity/response/job_applied_index_s_g_entity.dart';
+import 'package:domain/entity/response/job_applied_list_s_g_entity.dart';
+import 'package:domain/entity/response/job_applied_remark_view_s_g_entity.dart';
+import 'package:domain/entity/response/job_applied_staff_s_g_entity.dart';
 import 'package:domain/entity/response/job_list_add_staff_entity.dart';
 import 'package:domain/entity/response/job_list_applied_edit_entity.dart';
 import 'package:domain/entity/response/job_list_applied_info_entity.dart';
@@ -190,6 +195,39 @@ class JsonConvert {
     if (<IdNameEntity>[] is M) {
       return data.map<IdNameEntity>((Map<String, dynamic> e) => IdNameEntity.fromJson(e)).toList() as M;
     }
+    if (<JobAppliedEditIndexSGEntity>[] is M) {
+      return data.map<JobAppliedEditIndexSGEntity>((Map<String, dynamic> e) => JobAppliedEditIndexSGEntity.fromJson(e)).toList() as M;
+    }
+    if (<JobAppliedEditIndexSGStatusList>[] is M) {
+      return data.map<JobAppliedEditIndexSGStatusList>((Map<String, dynamic> e) => JobAppliedEditIndexSGStatusList.fromJson(e)).toList() as M;
+    }
+    if (<JobAppliedIndexSGEntity>[] is M) {
+      return data.map<JobAppliedIndexSGEntity>((Map<String, dynamic> e) => JobAppliedIndexSGEntity.fromJson(e)).toList() as M;
+    }
+    if (<JobAppliedIndexSGStatusList>[] is M) {
+      return data.map<JobAppliedIndexSGStatusList>((Map<String, dynamic> e) => JobAppliedIndexSGStatusList.fromJson(e)).toList() as M;
+    }
+    if (<JobAppliedListSGEntity>[] is M) {
+      return data.map<JobAppliedListSGEntity>((Map<String, dynamic> e) => JobAppliedListSGEntity.fromJson(e)).toList() as M;
+    }
+    if (<JobAppliedListSGRows>[] is M) {
+      return data.map<JobAppliedListSGRows>((Map<String, dynamic> e) => JobAppliedListSGRows.fromJson(e)).toList() as M;
+    }
+    if (<JobAppliedListSGRowsCheck>[] is M) {
+      return data.map<JobAppliedListSGRowsCheck>((Map<String, dynamic> e) => JobAppliedListSGRowsCheck.fromJson(e)).toList() as M;
+    }
+    if (<JobAppliedListSGRowsStatusList>[] is M) {
+      return data.map<JobAppliedListSGRowsStatusList>((Map<String, dynamic> e) => JobAppliedListSGRowsStatusList.fromJson(e)).toList() as M;
+    }
+    if (<JobAppliedRemarkViewSGEntity>[] is M) {
+      return data.map<JobAppliedRemarkViewSGEntity>((Map<String, dynamic> e) => JobAppliedRemarkViewSGEntity.fromJson(e)).toList() as M;
+    }
+    if (<JobAppliedStaffSGEntity>[] is M) {
+      return data.map<JobAppliedStaffSGEntity>((Map<String, dynamic> e) => JobAppliedStaffSGEntity.fromJson(e)).toList() as M;
+    }
+    if (<JobAppliedStaffSGRows>[] is M) {
+      return data.map<JobAppliedStaffSGRows>((Map<String, dynamic> e) => JobAppliedStaffSGRows.fromJson(e)).toList() as M;
+    }
     if (<JobListAddStaffEntity>[] is M) {
       return data.map<JobListAddStaffEntity>((Map<String, dynamic> e) => JobListAddStaffEntity.fromJson(e)).toList() as M;
     }
@@ -408,6 +446,17 @@ class JsonConvertClassCollection {
     (HotelInfoMenus).toString(): HotelInfoMenus.fromJson,
     (HotelInfoMenusChildren).toString(): HotelInfoMenusChildren.fromJson,
     (IdNameEntity).toString(): IdNameEntity.fromJson,
+    (JobAppliedEditIndexSGEntity).toString(): JobAppliedEditIndexSGEntity.fromJson,
+    (JobAppliedEditIndexSGStatusList).toString(): JobAppliedEditIndexSGStatusList.fromJson,
+    (JobAppliedIndexSGEntity).toString(): JobAppliedIndexSGEntity.fromJson,
+    (JobAppliedIndexSGStatusList).toString(): JobAppliedIndexSGStatusList.fromJson,
+    (JobAppliedListSGEntity).toString(): JobAppliedListSGEntity.fromJson,
+    (JobAppliedListSGRows).toString(): JobAppliedListSGRows.fromJson,
+    (JobAppliedListSGRowsCheck).toString(): JobAppliedListSGRowsCheck.fromJson,
+    (JobAppliedListSGRowsStatusList).toString(): JobAppliedListSGRowsStatusList.fromJson,
+    (JobAppliedRemarkViewSGEntity).toString(): JobAppliedRemarkViewSGEntity.fromJson,
+    (JobAppliedStaffSGEntity).toString(): JobAppliedStaffSGEntity.fromJson,
+    (JobAppliedStaffSGRows).toString(): JobAppliedStaffSGRows.fromJson,
     (JobListAddStaffEntity).toString(): JobListAddStaffEntity.fromJson,
     (JobListAddStaffResultList).toString(): JobListAddStaffResultList.fromJson,
     (JobListAppliedEditEntity).toString(): JobListAppliedEditEntity.fromJson,

+ 128 - 0
packages/cs_domain/lib/generated/json/job_applied_edit_index_s_g_entity.g.dart

@@ -0,0 +1,128 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/job_applied_edit_index_s_g_entity.dart';
+
+JobAppliedEditIndexSGEntity $JobAppliedEditIndexSGEntityFromJson(Map<String, dynamic> json) {
+  final JobAppliedEditIndexSGEntity jobAppliedEditIndexSGEntity = JobAppliedEditIndexSGEntity();
+  final String? appliedId = jsonConvert.convert<String>(json['applied_id']);
+  if (appliedId != null) {
+    jobAppliedEditIndexSGEntity.appliedId = appliedId;
+  }
+  final int? status = jsonConvert.convert<int>(json['status']);
+  if (status != null) {
+    jobAppliedEditIndexSGEntity.status = status;
+  }
+  final String? startTime = jsonConvert.convert<String>(json['start_time']);
+  if (startTime != null) {
+    jobAppliedEditIndexSGEntity.startTime = startTime;
+  }
+  final String? endTime = jsonConvert.convert<String>(json['end_time']);
+  if (endTime != null) {
+    jobAppliedEditIndexSGEntity.endTime = endTime;
+  }
+  final String? securityIn = jsonConvert.convert<String>(json['security_in']);
+  if (securityIn != null) {
+    jobAppliedEditIndexSGEntity.securityIn = securityIn;
+  }
+  final String? securityOut = jsonConvert.convert<String>(json['security_out']);
+  if (securityOut != null) {
+    jobAppliedEditIndexSGEntity.securityOut = securityOut;
+  }
+  final String? workIn = jsonConvert.convert<String>(json['work_in']);
+  if (workIn != null) {
+    jobAppliedEditIndexSGEntity.workIn = workIn;
+  }
+  final String? workOut = jsonConvert.convert<String>(json['work_out']);
+  if (workOut != null) {
+    jobAppliedEditIndexSGEntity.workOut = workOut;
+  }
+  final String? adjustHours = jsonConvert.convert<String>(json['adjust_hours']);
+  if (adjustHours != null) {
+    jobAppliedEditIndexSGEntity.adjustHours = adjustHours;
+  }
+  final List<JobAppliedEditIndexSGStatusList>? statusList = (json['status_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<JobAppliedEditIndexSGStatusList>(e) as JobAppliedEditIndexSGStatusList).toList();
+  if (statusList != null) {
+    jobAppliedEditIndexSGEntity.statusList = statusList;
+  }
+  return jobAppliedEditIndexSGEntity;
+}
+
+Map<String, dynamic> $JobAppliedEditIndexSGEntityToJson(JobAppliedEditIndexSGEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['applied_id'] = entity.appliedId;
+  data['status'] = entity.status;
+  data['start_time'] = entity.startTime;
+  data['end_time'] = entity.endTime;
+  data['security_in'] = entity.securityIn;
+  data['security_out'] = entity.securityOut;
+  data['work_in'] = entity.workIn;
+  data['work_out'] = entity.workOut;
+  data['adjust_hours'] = entity.adjustHours;
+  data['status_list'] = entity.statusList?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension JobAppliedEditIndexSGEntityExtension on JobAppliedEditIndexSGEntity {
+  JobAppliedEditIndexSGEntity copyWith({
+    String? appliedId,
+    int? status,
+    String? startTime,
+    String? endTime,
+    String? securityIn,
+    String? securityOut,
+    String? workIn,
+    String? workOut,
+    String? adjustHours,
+    List<JobAppliedEditIndexSGStatusList>? statusList,
+  }) {
+    return JobAppliedEditIndexSGEntity()
+      ..appliedId = appliedId ?? this.appliedId
+      ..status = status ?? this.status
+      ..startTime = startTime ?? this.startTime
+      ..endTime = endTime ?? this.endTime
+      ..securityIn = securityIn ?? this.securityIn
+      ..securityOut = securityOut ?? this.securityOut
+      ..workIn = workIn ?? this.workIn
+      ..workOut = workOut ?? this.workOut
+      ..adjustHours = adjustHours ?? this.adjustHours
+      ..statusList = statusList ?? this.statusList;
+  }
+}
+
+JobAppliedEditIndexSGStatusList $JobAppliedEditIndexSGStatusListFromJson(Map<String, dynamic> json) {
+  final JobAppliedEditIndexSGStatusList jobAppliedEditIndexSGStatusList = JobAppliedEditIndexSGStatusList();
+  final String? value = jsonConvert.convert<String>(json['value']);
+  if (value != null) {
+    jobAppliedEditIndexSGStatusList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    jobAppliedEditIndexSGStatusList.txt = txt;
+  }
+  final String? checked = jsonConvert.convert<String>(json['checked']);
+  if (checked != null) {
+    jobAppliedEditIndexSGStatusList.checked = checked;
+  }
+  return jobAppliedEditIndexSGStatusList;
+}
+
+Map<String, dynamic> $JobAppliedEditIndexSGStatusListToJson(JobAppliedEditIndexSGStatusList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['checked'] = entity.checked;
+  return data;
+}
+
+extension JobAppliedEditIndexSGStatusListExtension on JobAppliedEditIndexSGStatusList {
+  JobAppliedEditIndexSGStatusList copyWith({
+    String? value,
+    String? txt,
+    String? checked,
+  }) {
+    return JobAppliedEditIndexSGStatusList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..checked = checked ?? this.checked;
+  }
+}

+ 93 - 0
packages/cs_domain/lib/generated/json/job_applied_index_s_g_entity.g.dart

@@ -0,0 +1,93 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/job_applied_index_s_g_entity.dart';
+
+JobAppliedIndexSGEntity $JobAppliedIndexSGEntityFromJson(Map<String, dynamic> json) {
+  final JobAppliedIndexSGEntity jobAppliedIndexSGEntity = JobAppliedIndexSGEntity();
+  final String? jobId = jsonConvert.convert<String>(json['job_id']);
+  if (jobId != null) {
+    jobAppliedIndexSGEntity.jobId = jobId;
+  }
+  final String? jobDate = jsonConvert.convert<String>(json['job_date']);
+  if (jobDate != null) {
+    jobAppliedIndexSGEntity.jobDate = jobDate;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    jobAppliedIndexSGEntity.jobTitle = jobTitle;
+  }
+  final List<JobAppliedIndexSGStatusList>? statusList = (json['status_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<JobAppliedIndexSGStatusList>(e) as JobAppliedIndexSGStatusList).toList();
+  if (statusList != null) {
+    jobAppliedIndexSGEntity.statusList = statusList;
+  }
+  final bool? canAppend = jsonConvert.convert<bool>(json['can_append']);
+  if (canAppend != null) {
+    jobAppliedIndexSGEntity.canAppend = canAppend;
+  }
+  return jobAppliedIndexSGEntity;
+}
+
+Map<String, dynamic> $JobAppliedIndexSGEntityToJson(JobAppliedIndexSGEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['job_id'] = entity.jobId;
+  data['job_date'] = entity.jobDate;
+  data['job_title'] = entity.jobTitle;
+  data['status_list'] = entity.statusList.map((v) => v.toJson()).toList();
+  data['can_append'] = entity.canAppend;
+  return data;
+}
+
+extension JobAppliedIndexSGEntityExtension on JobAppliedIndexSGEntity {
+  JobAppliedIndexSGEntity copyWith({
+    String? jobId,
+    String? jobDate,
+    String? jobTitle,
+    List<JobAppliedIndexSGStatusList>? statusList,
+    bool? canAppend,
+  }) {
+    return JobAppliedIndexSGEntity()
+      ..jobId = jobId ?? this.jobId
+      ..jobDate = jobDate ?? this.jobDate
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..statusList = statusList ?? this.statusList
+      ..canAppend = canAppend ?? this.canAppend;
+  }
+}
+
+JobAppliedIndexSGStatusList $JobAppliedIndexSGStatusListFromJson(Map<String, dynamic> json) {
+  final JobAppliedIndexSGStatusList jobAppliedIndexSGStatusList = JobAppliedIndexSGStatusList();
+  final String? value = jsonConvert.convert<String>(json['value']);
+  if (value != null) {
+    jobAppliedIndexSGStatusList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    jobAppliedIndexSGStatusList.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    jobAppliedIndexSGStatusList.selected = selected;
+  }
+  return jobAppliedIndexSGStatusList;
+}
+
+Map<String, dynamic> $JobAppliedIndexSGStatusListToJson(JobAppliedIndexSGStatusList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension JobAppliedIndexSGStatusListExtension on JobAppliedIndexSGStatusList {
+  JobAppliedIndexSGStatusList copyWith({
+    String? value,
+    String? txt,
+    String? selected,
+  }) {
+    return JobAppliedIndexSGStatusList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected;
+  }
+}

+ 346 - 0
packages/cs_domain/lib/generated/json/job_applied_list_s_g_entity.g.dart

@@ -0,0 +1,346 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/job_applied_list_s_g_entity.dart';
+
+JobAppliedListSGEntity $JobAppliedListSGEntityFromJson(Map<String, dynamic> json) {
+  final JobAppliedListSGEntity jobAppliedListSGEntity = JobAppliedListSGEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    jobAppliedListSGEntity.total = total;
+  }
+  final List<JobAppliedListSGRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<JobAppliedListSGRows>(e) as JobAppliedListSGRows).toList();
+  if (rows != null) {
+    jobAppliedListSGEntity.rows = rows;
+  }
+  return jobAppliedListSGEntity;
+}
+
+Map<String, dynamic> $JobAppliedListSGEntityToJson(JobAppliedListSGEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension JobAppliedListSGEntityExtension on JobAppliedListSGEntity {
+  JobAppliedListSGEntity copyWith({
+    int? total,
+    List<JobAppliedListSGRows>? rows,
+  }) {
+    return JobAppliedListSGEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+JobAppliedListSGRows $JobAppliedListSGRowsFromJson(Map<String, dynamic> json) {
+  final JobAppliedListSGRows jobAppliedListSGRows = JobAppliedListSGRows();
+  final String? appliedId = jsonConvert.convert<String>(json['applied_id']);
+  if (appliedId != null) {
+    jobAppliedListSGRows.appliedId = appliedId;
+  }
+  final String? memberId = jsonConvert.convert<String>(json['member_id']);
+  if (memberId != null) {
+    jobAppliedListSGRows.memberId = memberId;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    jobAppliedListSGRows.jobTitle = jobTitle;
+  }
+  final String? outletName = jsonConvert.convert<String>(json['outlet_name']);
+  if (outletName != null) {
+    jobAppliedListSGRows.outletName = outletName;
+  }
+  final String? labourerName = jsonConvert.convert<String>(json['labourer_name']);
+  if (labourerName != null) {
+    jobAppliedListSGRows.labourerName = labourerName;
+  }
+  final String? labourerNric = jsonConvert.convert<String>(json['labourer_nric']);
+  if (labourerNric != null) {
+    jobAppliedListSGRows.labourerNric = labourerNric;
+  }
+  final String? gender = jsonConvert.convert<String>(json['gender']);
+  if (gender != null) {
+    jobAppliedListSGRows.gender = gender;
+  }
+  final String? jobDate = jsonConvert.convert<String>(json['job_date']);
+  if (jobDate != null) {
+    jobAppliedListSGRows.jobDate = jobDate;
+  }
+  final String? startTime = jsonConvert.convert<String>(json['start_time']);
+  if (startTime != null) {
+    jobAppliedListSGRows.startTime = startTime;
+  }
+  final String? endTime = jsonConvert.convert<String>(json['end_time']);
+  if (endTime != null) {
+    jobAppliedListSGRows.endTime = endTime;
+  }
+  final int? adjustHours = jsonConvert.convert<int>(json['adjust_hours']);
+  if (adjustHours != null) {
+    jobAppliedListSGRows.adjustHours = adjustHours;
+  }
+  final String? totalHours = jsonConvert.convert<String>(json['total_hours']);
+  if (totalHours != null) {
+    jobAppliedListSGRows.totalHours = totalHours;
+  }
+  final int? status = jsonConvert.convert<int>(json['status']);
+  if (status != null) {
+    jobAppliedListSGRows.status = status;
+  }
+  final String? statusShow = jsonConvert.convert<String>(json['status_show']);
+  if (statusShow != null) {
+    jobAppliedListSGRows.statusShow = statusShow;
+  }
+  final String? hourlyRate = jsonConvert.convert<String>(json['hourly_rate']);
+  if (hourlyRate != null) {
+    jobAppliedListSGRows.hourlyRate = hourlyRate;
+  }
+  final int? remarkStatus = jsonConvert.convert<int>(json['remark_status']);
+  if (remarkStatus != null) {
+    jobAppliedListSGRows.remarkStatus = remarkStatus;
+  }
+  final bool? isSelected = jsonConvert.convert<bool>(json['isSelected']);
+  if (isSelected != null) {
+    jobAppliedListSGRows.isSelected = isSelected;
+  }
+  final JobAppliedListSGRowsCheck? securityIn = jsonConvert.convert<JobAppliedListSGRowsCheck>(json['security_in']);
+  if (securityIn != null) {
+    jobAppliedListSGRows.securityIn = securityIn;
+  }
+  final JobAppliedListSGRowsCheck? securityOut = jsonConvert.convert<JobAppliedListSGRowsCheck>(json['security_out']);
+  if (securityOut != null) {
+    jobAppliedListSGRows.securityOut = securityOut;
+  }
+  final JobAppliedListSGRowsCheck? workIn = jsonConvert.convert<JobAppliedListSGRowsCheck>(json['work_in']);
+  if (workIn != null) {
+    jobAppliedListSGRows.workIn = workIn;
+  }
+  final JobAppliedListSGRowsCheck? workOut = jsonConvert.convert<JobAppliedListSGRowsCheck>(json['work_out']);
+  if (workOut != null) {
+    jobAppliedListSGRows.workOut = workOut;
+  }
+  final int? sIn = jsonConvert.convert<int>(json['s_in']);
+  if (sIn != null) {
+    jobAppliedListSGRows.sIn = sIn;
+  }
+  final int? sOut = jsonConvert.convert<int>(json['s_out']);
+  if (sOut != null) {
+    jobAppliedListSGRows.sOut = sOut;
+  }
+  final int? wIn = jsonConvert.convert<int>(json['w_in']);
+  if (wIn != null) {
+    jobAppliedListSGRows.wIn = wIn;
+  }
+  final int? wOut = jsonConvert.convert<int>(json['w_out']);
+  if (wOut != null) {
+    jobAppliedListSGRows.wOut = wOut;
+  }
+  final int? reviseHours = jsonConvert.convert<int>(json['revise_hours']);
+  if (reviseHours != null) {
+    jobAppliedListSGRows.reviseHours = reviseHours;
+  }
+  final int? showStar = jsonConvert.convert<int>(json['show_star']);
+  if (showStar != null) {
+    jobAppliedListSGRows.showStar = showStar;
+  }
+  final List<JobAppliedListSGRowsStatusList>? statusList = (json['status_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<JobAppliedListSGRowsStatusList>(e) as JobAppliedListSGRowsStatusList).toList();
+  if (statusList != null) {
+    jobAppliedListSGRows.statusList = statusList;
+  }
+  final List<String>? actionList = (json['action_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<String>(e) as String).toList();
+  if (actionList != null) {
+    jobAppliedListSGRows.actionList = actionList;
+  }
+  return jobAppliedListSGRows;
+}
+
+Map<String, dynamic> $JobAppliedListSGRowsToJson(JobAppliedListSGRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['applied_id'] = entity.appliedId;
+  data['member_id'] = entity.memberId;
+  data['job_title'] = entity.jobTitle;
+  data['outlet_name'] = entity.outletName;
+  data['labourer_name'] = entity.labourerName;
+  data['labourer_nric'] = entity.labourerNric;
+  data['gender'] = entity.gender;
+  data['job_date'] = entity.jobDate;
+  data['start_time'] = entity.startTime;
+  data['end_time'] = entity.endTime;
+  data['adjust_hours'] = entity.adjustHours;
+  data['total_hours'] = entity.totalHours;
+  data['status'] = entity.status;
+  data['status_show'] = entity.statusShow;
+  data['hourly_rate'] = entity.hourlyRate;
+  data['remark_status'] = entity.remarkStatus;
+  data['isSelected'] = entity.isSelected;
+  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['revise_hours'] = entity.reviseHours;
+  data['show_star'] = entity.showStar;
+  data['status_list'] = entity.statusList.map((v) => v.toJson()).toList();
+  data['action_list'] = entity.actionList;
+  return data;
+}
+
+extension JobAppliedListSGRowsExtension on JobAppliedListSGRows {
+  JobAppliedListSGRows copyWith({
+    String? appliedId,
+    String? memberId,
+    String? jobTitle,
+    String? outletName,
+    String? labourerName,
+    String? labourerNric,
+    String? gender,
+    String? jobDate,
+    String? startTime,
+    String? endTime,
+    int? adjustHours,
+    String? totalHours,
+    int? status,
+    String? statusShow,
+    String? hourlyRate,
+    int? remarkStatus,
+    bool? isSelected,
+    JobAppliedListSGRowsCheck? securityIn,
+    JobAppliedListSGRowsCheck? securityOut,
+    JobAppliedListSGRowsCheck? workIn,
+    JobAppliedListSGRowsCheck? workOut,
+    int? sIn,
+    int? sOut,
+    int? wIn,
+    int? wOut,
+    int? reviseHours,
+    int? showStar,
+    List<JobAppliedListSGRowsStatusList>? statusList,
+    List<String>? actionList,
+  }) {
+    return JobAppliedListSGRows()
+      ..appliedId = appliedId ?? this.appliedId
+      ..memberId = memberId ?? this.memberId
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..outletName = outletName ?? this.outletName
+      ..labourerName = labourerName ?? this.labourerName
+      ..labourerNric = labourerNric ?? this.labourerNric
+      ..gender = gender ?? this.gender
+      ..jobDate = jobDate ?? this.jobDate
+      ..startTime = startTime ?? this.startTime
+      ..endTime = endTime ?? this.endTime
+      ..adjustHours = adjustHours ?? this.adjustHours
+      ..totalHours = totalHours ?? this.totalHours
+      ..status = status ?? this.status
+      ..statusShow = statusShow ?? this.statusShow
+      ..hourlyRate = hourlyRate ?? this.hourlyRate
+      ..remarkStatus = remarkStatus ?? this.remarkStatus
+      ..isSelected = isSelected ?? this.isSelected
+      ..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
+      ..reviseHours = reviseHours ?? this.reviseHours
+      ..showStar = showStar ?? this.showStar
+      ..statusList = statusList ?? this.statusList
+      ..actionList = actionList ?? this.actionList;
+  }
+}
+
+JobAppliedListSGRowsCheck $JobAppliedListSGRowsCheckFromJson(Map<String, dynamic> json) {
+  final JobAppliedListSGRowsCheck jobAppliedListSGRowsCheck = JobAppliedListSGRowsCheck();
+  final String? time = jsonConvert.convert<String>(json['time']);
+  if (time != null) {
+    jobAppliedListSGRowsCheck.time = time;
+  }
+  final String? temp = jsonConvert.convert<String>(json['temp']);
+  if (temp != null) {
+    jobAppliedListSGRowsCheck.temp = temp;
+  }
+  final String? image = jsonConvert.convert<String>(json['image']);
+  if (image != null) {
+    jobAppliedListSGRowsCheck.image = image;
+  }
+  final int? changed = jsonConvert.convert<int>(json['changed']);
+  if (changed != null) {
+    jobAppliedListSGRowsCheck.changed = changed;
+  }
+  final String? key = jsonConvert.convert<String>(json['key']);
+  if (key != null) {
+    jobAppliedListSGRowsCheck.key = key;
+  }
+  return jobAppliedListSGRowsCheck;
+}
+
+Map<String, dynamic> $JobAppliedListSGRowsCheckToJson(JobAppliedListSGRowsCheck entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['time'] = entity.time;
+  data['temp'] = entity.temp;
+  data['image'] = entity.image;
+  data['changed'] = entity.changed;
+  data['key'] = entity.key;
+  return data;
+}
+
+extension JobAppliedListSGRowsCheckExtension on JobAppliedListSGRowsCheck {
+  JobAppliedListSGRowsCheck copyWith({
+    String? time,
+    String? temp,
+    String? image,
+    int? changed,
+    String? key,
+  }) {
+    return JobAppliedListSGRowsCheck()
+      ..time = time ?? this.time
+      ..temp = temp ?? this.temp
+      ..image = image ?? this.image
+      ..changed = changed ?? this.changed
+      ..key = key ?? this.key;
+  }
+}
+
+JobAppliedListSGRowsStatusList $JobAppliedListSGRowsStatusListFromJson(Map<String, dynamic> json) {
+  final JobAppliedListSGRowsStatusList jobAppliedListSGRowsStatusList = JobAppliedListSGRowsStatusList();
+  final String? value = jsonConvert.convert<String>(json['value']);
+  if (value != null) {
+    jobAppliedListSGRowsStatusList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    jobAppliedListSGRowsStatusList.txt = txt;
+  }
+  final String? checked = jsonConvert.convert<String>(json['checked']);
+  if (checked != null) {
+    jobAppliedListSGRowsStatusList.checked = checked;
+  }
+  return jobAppliedListSGRowsStatusList;
+}
+
+Map<String, dynamic> $JobAppliedListSGRowsStatusListToJson(JobAppliedListSGRowsStatusList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['checked'] = entity.checked;
+  return data;
+}
+
+extension JobAppliedListSGRowsStatusListExtension on JobAppliedListSGRowsStatusList {
+  JobAppliedListSGRowsStatusList copyWith({
+    String? value,
+    String? txt,
+    String? checked,
+  }) {
+    return JobAppliedListSGRowsStatusList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..checked = checked ?? this.checked;
+  }
+}

+ 75 - 0
packages/cs_domain/lib/generated/json/job_applied_remark_view_s_g_entity.g.dart

@@ -0,0 +1,75 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/job_applied_remark_view_s_g_entity.dart';
+
+JobAppliedRemarkViewSGEntity $JobAppliedRemarkViewSGEntityFromJson(Map<String, dynamic> json) {
+  final JobAppliedRemarkViewSGEntity jobAppliedRemarkViewSGEntity = JobAppliedRemarkViewSGEntity();
+  final int? attitudeRate = jsonConvert.convert<int>(json['attitude_rate']);
+  if (attitudeRate != null) {
+    jobAppliedRemarkViewSGEntity.attitudeRate = attitudeRate;
+  }
+  final int? groomingRate = jsonConvert.convert<int>(json['grooming_rate']);
+  if (groomingRate != null) {
+    jobAppliedRemarkViewSGEntity.groomingRate = groomingRate;
+  }
+  final int? performanceRate = jsonConvert.convert<int>(json['performance_rate']);
+  if (performanceRate != null) {
+    jobAppliedRemarkViewSGEntity.performanceRate = performanceRate;
+  }
+  final int? experienceRate = jsonConvert.convert<int>(json['experience_rate']);
+  if (experienceRate != null) {
+    jobAppliedRemarkViewSGEntity.experienceRate = experienceRate;
+  }
+  final String? feedback = jsonConvert.convert<String>(json['feedback']);
+  if (feedback != null) {
+    jobAppliedRemarkViewSGEntity.feedback = feedback;
+  }
+  final String? appliedId = jsonConvert.convert<String>(json['applied_id']);
+  if (appliedId != null) {
+    jobAppliedRemarkViewSGEntity.appliedId = appliedId;
+  }
+  final String? labourerName = jsonConvert.convert<String>(json['labourer_name']);
+  if (labourerName != null) {
+    jobAppliedRemarkViewSGEntity.labourerName = labourerName;
+  }
+  final String? disabled = jsonConvert.convert<String>(json['disabled']);
+  if (disabled != null) {
+    jobAppliedRemarkViewSGEntity.disabled = disabled;
+  }
+  return jobAppliedRemarkViewSGEntity;
+}
+
+Map<String, dynamic> $JobAppliedRemarkViewSGEntityToJson(JobAppliedRemarkViewSGEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  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['applied_id'] = entity.appliedId;
+  data['labourer_name'] = entity.labourerName;
+  data['disabled'] = entity.disabled;
+  return data;
+}
+
+extension JobAppliedRemarkViewSGEntityExtension on JobAppliedRemarkViewSGEntity {
+  JobAppliedRemarkViewSGEntity copyWith({
+    int? attitudeRate,
+    int? groomingRate,
+    int? performanceRate,
+    int? experienceRate,
+    String? feedback,
+    String? appliedId,
+    String? labourerName,
+    String? disabled,
+  }) {
+    return JobAppliedRemarkViewSGEntity()
+      ..attitudeRate = attitudeRate ?? this.attitudeRate
+      ..groomingRate = groomingRate ?? this.groomingRate
+      ..performanceRate = performanceRate ?? this.performanceRate
+      ..experienceRate = experienceRate ?? this.experienceRate
+      ..feedback = feedback ?? this.feedback
+      ..appliedId = appliedId ?? this.appliedId
+      ..labourerName = labourerName ?? this.labourerName
+      ..disabled = disabled ?? this.disabled;
+  }
+}

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

@@ -0,0 +1,121 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/job_applied_staff_s_g_entity.dart';
+
+JobAppliedStaffSGEntity $JobAppliedStaffSGEntityFromJson(Map<String, dynamic> json) {
+  final JobAppliedStaffSGEntity jobAppliedStaffSGEntity = JobAppliedStaffSGEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    jobAppliedStaffSGEntity.total = total;
+  }
+  final List<JobAppliedStaffSGRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<JobAppliedStaffSGRows>(e) as JobAppliedStaffSGRows).toList();
+  if (rows != null) {
+    jobAppliedStaffSGEntity.rows = rows;
+  }
+  return jobAppliedStaffSGEntity;
+}
+
+Map<String, dynamic> $JobAppliedStaffSGEntityToJson(JobAppliedStaffSGEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension JobAppliedStaffSGEntityExtension on JobAppliedStaffSGEntity {
+  JobAppliedStaffSGEntity copyWith({
+    int? total,
+    List<JobAppliedStaffSGRows>? rows,
+  }) {
+    return JobAppliedStaffSGEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+JobAppliedStaffSGRows $JobAppliedStaffSGRowsFromJson(Map<String, dynamic> json) {
+  final JobAppliedStaffSGRows jobAppliedStaffSGRows = JobAppliedStaffSGRows();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    jobAppliedStaffSGRows.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    jobAppliedStaffSGRows.name = name;
+  }
+  final String? gender = jsonConvert.convert<String>(json['gender']);
+  if (gender != null) {
+    jobAppliedStaffSGRows.gender = gender;
+  }
+  final String? mobile = jsonConvert.convert<String>(json['mobile']);
+  if (mobile != null) {
+    jobAppliedStaffSGRows.mobile = mobile;
+  }
+  final String? nric = jsonConvert.convert<String>(json['nric']);
+  if (nric != null) {
+    jobAppliedStaffSGRows.nric = nric;
+  }
+  final String? profilePicture = jsonConvert.convert<String>(json['profile_picture']);
+  if (profilePicture != null) {
+    jobAppliedStaffSGRows.profilePicture = profilePicture;
+  }
+  final int? status = jsonConvert.convert<int>(json['status']);
+  if (status != null) {
+    jobAppliedStaffSGRows.status = status;
+  }
+  final int? applyState = jsonConvert.convert<int>(json['apply_state']);
+  if (applyState != null) {
+    jobAppliedStaffSGRows.applyState = applyState;
+  }
+  final int? hotelStaff = jsonConvert.convert<int>(json['hotel_staff']);
+  if (hotelStaff != null) {
+    jobAppliedStaffSGRows.hotelStaff = hotelStaff;
+  }
+  final int? salaryStructure = jsonConvert.convert<int>(json['salary_structure']);
+  if (salaryStructure != null) {
+    jobAppliedStaffSGRows.salaryStructure = salaryStructure;
+  }
+  return jobAppliedStaffSGRows;
+}
+
+Map<String, dynamic> $JobAppliedStaffSGRowsToJson(JobAppliedStaffSGRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  data['gender'] = entity.gender;
+  data['mobile'] = entity.mobile;
+  data['nric'] = entity.nric;
+  data['profile_picture'] = entity.profilePicture;
+  data['status'] = entity.status;
+  data['apply_state'] = entity.applyState;
+  data['hotel_staff'] = entity.hotelStaff;
+  data['salary_structure'] = entity.salaryStructure;
+  return data;
+}
+
+extension JobAppliedStaffSGRowsExtension on JobAppliedStaffSGRows {
+  JobAppliedStaffSGRows copyWith({
+    String? id,
+    String? name,
+    String? gender,
+    String? mobile,
+    String? nric,
+    String? profilePicture,
+    int? status,
+    int? applyState,
+    int? hotelStaff,
+    int? salaryStructure,
+  }) {
+    return JobAppliedStaffSGRows()
+      ..id = id ?? this.id
+      ..name = name ?? this.name
+      ..gender = gender ?? this.gender
+      ..mobile = mobile ?? this.mobile
+      ..nric = nric ?? this.nric
+      ..profilePicture = profilePicture ?? this.profilePicture
+      ..status = status ?? this.status
+      ..applyState = applyState ?? this.applyState
+      ..hotelStaff = hotelStaff ?? this.hotelStaff
+      ..salaryStructure = salaryStructure ?? this.salaryStructure;
+  }
+}

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

@@ -1,5 +1,7 @@
 import 'dart:typed_data';
 
+import 'package:domain/entity/response/job_applied_index_s_g_entity.dart';
+import 'package:domain/entity/response/job_applied_list_s_g_entity.dart';
 import 'package:domain/entity/response/job_list_add_staff_entity.dart';
 import 'package:domain/entity/response/job_list_applied_edit_entity.dart';
 import 'package:domain/entity/response/job_list_applied_info_entity.dart';
@@ -21,6 +23,8 @@ import 'package:shared/utils/util.dart';
 import '../constants/api_constants.dart';
 import '../entity/response/attendance_entity.dart';
 import '../entity/response/check_success_entity.dart';
+import '../entity/response/job_applied_edit_index_s_g_entity.dart';
+import '../entity/response/job_applied_staff_s_g_entity.dart';
 import '../entity/response/job_list_applied_work_flow_entity.dart';
 
 /// 工作相关(新加坡)
@@ -29,5 +33,384 @@ class JobSGRepository extends GetxService {
 
   JobSGRepository({required this.httpProvider});
 
+  /// 获取工作已申请的选项
+  Future<HttpResult<JobAppliedIndexSGEntity>> fetchJobAppliedIndex(
+    String? jobId, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["job_id"] = jobId ?? "";
 
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobAppliedIndexSG,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = JobAppliedIndexSGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<JobAppliedIndexSGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取工作已申请的列表
+  Future<HttpResult<JobAppliedListSGEntity>> fetchJobAppliedList(
+    String? jobId,
+    String? status,
+    String? keyword, {
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "10";
+    params["job_id"] = jobId ?? "";
+
+    if (!Utils.isEmpty(keyword)) {
+      params["keyword"] = keyword!;
+    }
+
+    if (!Utils.isEmpty(status)) {
+      params["status"] = status!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobAppliedListSG,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = JobAppliedListSGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<JobAppliedListSGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 根据ID获取主列表的Item数据,用于刷新Item
+  Future<HttpResult<JobAppliedListSGEntity>> fetchItemByAppliedIds(
+      String? jobId,
+      String? appliedIds, {
+        CancelToken? cancelToken,
+      }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = "1";
+    params["page_size"] = "9999";
+
+    if (!Utils.isEmpty(appliedIds)) {
+      params["applied_ids"] = appliedIds!;
+    }
+
+    if (!Utils.isEmpty(jobId)) {
+      params["job_id"] = jobId!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobAppliedListSG,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = JobAppliedListSGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<JobAppliedListSGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取工作已申请的列表中添加的员工搜索
+  Future<HttpResult<JobAppliedStaffSGEntity>> searchJobAppliedStaff(
+    String? jobId,
+    String? keyword, {
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "10";
+    params["job_id"] = jobId ?? "";
+
+    if (!Utils.isEmpty(keyword)) {
+      params["keyword"] = keyword!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobAppliedSearchStaffSG,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = JobAppliedStaffSGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<JobAppliedStaffSGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 添加员工到申请列表
+  Future<HttpResult> addStaff2AppliedJob(
+    String? jobId,
+    String? staffIds, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['job_id'] = jobId ?? "";
+    params['staff_ids'] = staffIds ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListConfirmSG,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 批量修改员工信息或考勤
+  Future<HttpResult> batchEditJobApplied(
+    String? appliedIds,
+    String? startTime,
+    String? endTime,
+    String? subtractHours,
+    String? status, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['applied_ids'] = appliedIds ?? "";
+
+    if (!Utils.isEmpty(startTime)) {
+      params['start_time'] = startTime ?? "";
+    }
+    if (!Utils.isEmpty(endTime)) {
+      params['end_time'] = endTime ?? "";
+    }
+    if (!Utils.isEmpty(subtractHours)) {
+      params['subtract_hours'] = subtractHours ?? "";
+    }
+    if (!Utils.isEmpty(status)) {
+      params['status'] = status ?? "";
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobAppliedBatchEditSG,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 编辑员工信息或考勤的选项详情
+  Future<HttpResult<JobAppliedEditIndexSGEntity>> fetchEditJobAppliedIndex(
+    String? appliedId, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['applied_id'] = appliedId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobAppliedEditViewSG,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = JobAppliedEditIndexSGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<JobAppliedEditIndexSGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 编辑员工信息或考勤的提交
+  Future<HttpResult> submitEditJobApplied(
+    String? appliedId,
+    String? startTime,
+    String? endTime,
+    String? security_in,
+    String? security_out,
+    String? work_in,
+    String? work_out,
+    String? adjustHours,
+    String? status, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['applied_id'] = appliedId ?? "";
+    params['start_time'] = startTime ?? "";
+    params['end_time'] = endTime ?? "";
+
+    if (!Utils.isEmpty(security_in)) {
+      params['security_in'] = security_in ?? "";
+    }
+    if (!Utils.isEmpty(security_out)) {
+      params['security_out'] = security_out ?? "";
+    }
+    if (!Utils.isEmpty(work_in)) {
+      params['work_in'] = work_in ?? "";
+    }
+    if (!Utils.isEmpty(work_out)) {
+      params['work_out'] = work_out ?? "";
+    }
+    if (!Utils.isEmpty(adjustHours)) {
+      params['subtract_hours'] = adjustHours ?? "";
+    }
+    if (!Utils.isEmpty(status)) {
+      params['status'] = status ?? "";
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobAppliedEditSubmitSG,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 修改考勤员工的考勤状态
+  Future<HttpResult> submitEditAppliedStatus(
+    String? appliedId,
+    String? status, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['applied_id'] = appliedId ?? "";
+    params['status'] = status ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobAppliedChangeStatusSG,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 获取员工的评价信息
+  Future<HttpResult<JobAppliedStaffSGEntity>> fetchJobAppliedRemarkView(
+    String? appliedId, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['applied_id'] = appliedId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobAppliedRemarkViewSG,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = JobAppliedStaffSGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<JobAppliedStaffSGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 提交员工的评价
+  Future<HttpResult> submitAppliedRemark(
+    String? appliedId,
+    String? attitude_rate,
+    String? grooming_rate,
+    String? performance_rate,
+    String? experience_rate,
+    String? feedback, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['applied_id'] = appliedId ?? "";
+    params['attitude_rate'] = attitude_rate ?? "";
+    params['grooming_rate'] = grooming_rate ?? "";
+    params['performance_rate'] = performance_rate ?? "";
+    params['experience_rate'] = experience_rate ?? "";
+
+    if (!Utils.isEmpty(feedback)) {
+      params['feedback'] = feedback ?? "";
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobAppliedChangeStatusSG,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
 }

+ 31 - 0
packages/cs_domain/lib/repository/labour_sg_repository.dart

@@ -692,6 +692,37 @@ class LabourSGRepository extends GetxService {
     return result.convert();
   }
 
+  /// 根据ID获取主列表的Item数据,用于刷新Item
+  Future<HttpResult<JobListSGEntity>> fetchJobListByIds(
+      String? jobId, {
+        CancelToken? cancelToken,
+      }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = "1";
+    params["page_size"] = "9999";
+
+    if (!Utils.isEmpty(jobId)) {
+      params["job_id"] = jobId!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListTableSG,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = JobListSGEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<JobListSGEntity>(data: data);
+    }
+    return result.convert();
+  }
+
   //用工请求的编辑详情(Job List)
   Future<HttpResult<JobListEditIndexSGEntity>> fetchJobListEditIndex(
     String? jobId, {

+ 10 - 10
packages/cs_plugin_platform/lib/engine/dialog/dialog_engine.dart

@@ -44,15 +44,15 @@ class DialogEngine {
       alignment = Alignment.center;
     }
 
-    SmartAnimationType? animType;
+    SmartAnimationType? smartAnimType;
     if (animType == DialogAnimation.fade) {
-      animType = SmartAnimationType.fade;
-    } else if (position == DialogAnimation.scale) {
-      animType = SmartAnimationType.scale;
-    } else if (position == DialogAnimation.centerFade_otherSlide) {
-      animType = SmartAnimationType.centerFade_otherSlide;
-    } else if (position == DialogAnimation.centerScale_otherSlide) {
-      animType = SmartAnimationType.centerScale_otherSlide;
+      smartAnimType = SmartAnimationType.fade;
+    } else if (animType == DialogAnimation.scale) {
+      smartAnimType = SmartAnimationType.scale;
+    } else if (animType == DialogAnimation.centerFade_otherSlide) {
+      smartAnimType = SmartAnimationType.centerFade_otherSlide;
+    } else if (animType == DialogAnimation.centerScale_otherSlide) {
+      smartAnimType = SmartAnimationType.centerScale_otherSlide;
     }
 
     return SmartDialog.showAttach(
@@ -62,11 +62,11 @@ class DialogEngine {
       debounce: true,
       clickMaskDismiss: clickMaskDismiss,
       backDismiss: backDismiss,
-      animationType: animType,
+      animationType: smartAnimType,
       alignment: alignment,
       onDismiss: onDismiss,
       tag: tag,
-      maskColor: maskColor,
+      maskColor: Colors.transparent,
       keepSingle: keepSingle,
     );
   }

BIN
packages/cs_resources/assets/base_service/border_widget_drop_down.webp


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

@@ -31,8 +31,10 @@ class ColorConstants {
   static const Color textYellowFFBB1B = Color(0xFFFFBB1B);
   static const Color textGreen05DC82 = Color(0xFF05DC82);
   static const Color textGreen0AC074 = Color(0xFF0AC074);
+  static const Color textGreen00FB92 = Color(0xFF00FB92);
   static const Color textRedFF6262 = Color(0xFFFF6262);
   static const Color textBlue06D9FF = Color(0xFF06D9FF);
+  static const Color textBlue5CEEFF = Color(0xFF5CEEFF);
   static const Color textYellowF8AE00 = Color(0xFFF8AE00);
 
   //黑暗模式的一些色值

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

@@ -8,6 +8,7 @@ class Assets {
   static const String baseLibDialogDeleteIcon = 'assets/base_lib/dialog_delete_icon.webp';
   static const String baseLibImageDefaultPlaceholder = 'assets/base_lib/image_default_placeholder.png';
   static const String baseLibWhiteBack = 'assets/base_lib/white_back.webp';
+  static const String baseServiceBorderWidgetDropDown = 'assets/base_service/border_widget_drop_down.webp';
   static const String baseServiceCheckBoxChecked = 'assets/base_service/check_box_checked.webp';
   static const String baseServiceCheckBoxUncheck = 'assets/base_service/check_box_uncheck.webp';
   static const String baseServiceDialogDeleteIcon = 'assets/base_service/dialog_delete_icon.webp';

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

@@ -199,6 +199,7 @@ const Map<String, String> en_US = {
   'Are you sure you want to cancel this job?': 'Are you sure you want to cancel this job?',
   'Are you sure you want to delete this job?': 'Are you sure you want to delete this job?',
   'Are you sure you want to confirm this job?': 'Are you sure you want to confirm this job?',
+  'Create New Job': 'Create New Job',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

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

@@ -199,6 +199,7 @@ const Map<String, String> vi_VN = {
   'Are you sure you want to cancel this job?': 'Bạn có chắc chắn muốn hủy bỏ công việc này?',
   'Are you sure you want to delete this job?': 'Bạn có chắc chắn muốn xóa công việc này?',
   'Are you sure you want to confirm this job?': 'Bạn có chắc chắn muốn xác nhận công việc này?',
+  'Create New Job': 'Tạo công việc mới',
 
   //插件的国际化
   "Pull to refresh": "Kéo để làm mới",

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

@@ -199,6 +199,7 @@ const Map<String, String> zh_CN = {
   'Are you sure you want to cancel this job?': '你确定要取消此工作吗?',
   'Are you sure you want to delete this job?': '你确定要删除此工作吗?',
   'Are you sure you want to confirm this job?': '你确定要完成此工作吗?',
+  'Create New Job': '创建新工作',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',

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

@@ -45,6 +45,9 @@ class RouterPath {
   //新加坡的工作列表
   static const JOB_LIST_SG = '/job/list/sg'; //工作列表(新加坡)
   static const JOB_LIST_EDIT = '/job/list/edit'; //工作列表编辑与详情(新加坡)
+  static const JOB_LIST_APPLIED_SG = '/job/list/applied'; //工作列表已申请列表(新加坡)
+  static const JOB_LIST_APPLIED_STAFF_LIST_SG = '/job/list/applied/staff/list'; //工作列表已申请列表添加员工列表(新加坡)
+  static const JOB_LIST_APPLIED_STAFF_DETAIL_SG = '/job/list/applied/staff/detail'; //工作列表已申请列表员工详情(新加坡)
 
 
   //全局其他

+ 4 - 1
packages/cs_widgets/lib/search_app_bar.dart

@@ -23,6 +23,7 @@ class SearchAppBar extends StatefulWidget {
     this.searchBarBgColor,
     this.textHintColor,
     this.searchBarBorder,
+    this.margin,
     this.textColor = Colors.white,
     this.onChanged,
     this.onSearch,
@@ -45,6 +46,8 @@ class SearchAppBar extends StatefulWidget {
 
   double searchBarBorderRadius;
 
+  EdgeInsetsGeometry? margin;
+
   Color? searchBarBgColor;
 
   Color? textHintColor;
@@ -114,7 +117,7 @@ class _SearchAppBarState extends State<SearchAppBar> {
     return Container(
       height: widget.searchBarHeight,
       padding: EdgeInsets.only(left: 15, right: 11),
-      margin: EdgeInsets.only(right: 15),
+      margin: widget.margin ?? EdgeInsets.only(right: 15),
       decoration: BoxDecoration(
         color: widget.searchBarBgColor ?? Color(0xFF4DCFF6).withOpacity(0.2), // 设置// 背景颜色和不透明度
         borderRadius: BorderRadius.circular(widget.searchBarBorderRadius), // 设置圆角

+ 53 - 0
packages/cs_widgets/lib/shatter/border_select_widget.dart

@@ -0,0 +1,53 @@
+import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/material.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+class BorderSelectWidget extends StatelessWidget {
+  final String text;
+  final Color color;
+  final double borderRadius;
+  final void Function(BuildContext targetContext)? onTap; // 点击事件
+
+  const BorderSelectWidget({
+    Key? key,
+    required this.text,
+    required this.color,
+    this.borderRadius = 15,
+    this.onTap,
+  }) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      onTap: () {
+        onTap?.call(context);
+      },
+      child: Container(
+        padding: EdgeInsets.only(left: 8.5, right: 8.5, top: 4, bottom: 4),
+        decoration: BoxDecoration(
+          border: Border.all(color: color, width: 0.5), // 边框颜色
+          borderRadius: BorderRadius.circular(borderRadius), // 圆角
+        ),
+        child: Row(
+          mainAxisSize: MainAxisSize.min, // 使 Row 根据内容大小而收缩
+          children: [
+            MyTextView(
+              text,
+              textColor: color,
+              fontSize: 14,
+              isFontRegular: true,
+              marginRight: 7,
+            ),
+            MyAssetImage(
+              Assets.baseServiceBorderWidgetDropDown,
+              color: color,
+              height: 7.5,
+              width: 4.5,
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}